From ebe4b2cab9f196625a080c2b92399c06b004644b Mon Sep 17 00:00:00 2001 From: scw Date: Sun, 16 May 2004 06:54:44 +0000 Subject: Asking/answering works! git-svn-id: http://opensvn.csie.org/pttbbs/branches/scw.angel@1991 63ad8ddf-47c3-0310-b6dd-a9e9d9715204 --- mbbsd/io.c | 23 +++++++++++++++++--- mbbsd/mbbsd.c | 7 ++++++- mbbsd/menu.c | 3 ++- mbbsd/talk.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++-------- mbbsd/user.c | 4 ++-- mbbsd/var.c | 9 ++++---- 6 files changed, 93 insertions(+), 20 deletions(-) diff --git a/mbbsd/io.c b/mbbsd/io.c index 6a10ffce..22de008f 100644 --- a/mbbsd/io.c +++ b/mbbsd/io.c @@ -252,7 +252,7 @@ igetch() return (ch); if (currutmp->msgs[0].pid && - WATERMODE(WATER_OFO) && wmofo == -1) { + WATERMODE(WATER_OFO) && wmofo == NOTREPLYING) { int y, x, my_newfd; screenline_t *screen0 = calloc(t_lines, sizeof(screenline_t)); memcpy(screen0, big_picture, t_lines * sizeof(screenline_t)); @@ -292,8 +292,25 @@ igetch() i_newfd = 0; show_call_in(0, 0); watermode = 0; - my_write(currutmp->msgs[0].pid, "水球丟過去 : ", - currutmp->msgs[0].userid, WATERBALL_GENERAL, NULL); +#ifndef PLAY_ANGEL + my_write(currutmp->msgs[0].pid, "水球丟過去: ", + currutmp->msgs[0].userid, WATERBALL_GENERAL, NULL); +#else + switch (currutmp->msgs[0].msgmode){ + case MSG_GENERAL: + my_write(currutmp->msgs[0].pid, "水球丟過去: ", + currutmp->msgs[0].userid, WATERBALL_GENERAL, NULL); + break; + case MSG_FROMANGEL: + my_write(currutmp->msgs[0].pid, "再問他一次: ", + currutmp->msgs[0].userid, WATERBALL_ANGEL, NULL); + break; + case MSG_TOANGEL: + my_write(currutmp->msgs[0].pid, "回答小主人: ", + currutmp->msgs[0].userid, WATERBALL_ANSWER, NULL); + break; + } +#endif i_newfd = my_newfd; /* 還原螢幕 */ diff --git a/mbbsd/mbbsd.c b/mbbsd/mbbsd.c index 14f010d6..f8d2dc31 100644 --- a/mbbsd/mbbsd.c +++ b/mbbsd/mbbsd.c @@ -310,7 +310,12 @@ add_history(msgque_t * msg) add_history_water(&water[0], msg); if (WATERMODE(WATER_NEW) || WATERMODE(WATER_OFO)) { for (i = 0; i < 5 && swater[i]; i++) - if (swater[i]->pid == msg->pid) + if (swater[i]->pid == msg->pid +#ifdef PLAY_ANGEL + && swater[i]->msg[0].msgmode == msg->msgmode + /* When throwing waterball to angel directly */ +#endif + ) break; if (i == 5) { waterinit = 1; diff --git a/mbbsd/menu.c b/mbbsd/menu.c index c621dac4..d77492ff 100644 --- a/mbbsd/menu.c +++ b/mbbsd/menu.c @@ -367,7 +367,8 @@ static commands_t talklist[] = { {t_chat, PERM_CHAT, "CChat 找家茶坊喫茶去"}, {t_display, 0, "DDisplay 顯示上幾次熱訊"}, #ifdef PLAY_ANGEL - {t_changeangel, PERM_BASIC, "AChange Angel 更換小天使"}, + {t_switchangel, PERM_ANGEL, "SSwitch Be Angl 切換是否擔任小天使"}, + {t_changeangel, PERM_BASIC, "UAChange Angel 更換小天使"}, #endif {NULL, 0, NULL} }; diff --git a/mbbsd/talk.c b/mbbsd/talk.c index a724cf03..72220fde 100644 --- a/mbbsd/talk.c +++ b/mbbsd/talk.c @@ -480,7 +480,7 @@ my_write2(void) if (swater[0] == NULL) return; - wmofo = 0; + wmofo = REPLYING; currstat0 = currstat; c0 = currutmp->chatid[0]; mode0 = currutmp->mode; @@ -551,6 +551,7 @@ my_write2(void) move(0, 0); prints("\033[m"); clrtoeol(); +#ifndef PLAY_ANGEL snprintf(genbuf, sizeof(genbuf), "攻擊 %s:", tw->userid); if (!oldgetdata(0, 0, genbuf, msg, 80 - strlen(tw->userid) - 6, DOECHO)) @@ -560,6 +561,24 @@ my_write2(void) strncpy(tw->msg[5].last_call_in, t_last_write, sizeof(tw->msg[5].last_call_in)); break; +#else + if (tw->msg[0].msgmode == MSG_GENERAL){ + snprintf(genbuf, sizeof(genbuf), "攻擊 %s:", tw->userid); + if (!oldgetdata(0, 0, genbuf, msg, + 80 - strlen(tw->userid) - 6, DOECHO)) + break; + + if (my_write(tw->pid, msg, tw->userid, WATERBALL_CONFIRM, tw->uin)) + strncpy(tw->msg[5].last_call_in, t_last_write, + sizeof(tw->msg[5].last_call_in)); + break; + }else if (tw->msg[0].msgmode == MSG_TOANGEL) + my_write(tw->pid, "回答小主人: ", tw->userid, + WATERBALL_ANSWER, tw->uin); + else /* tw->msg[0].msgmode == MSG_FROMANGEL */ + my_write(tw->pid, "再問他一次: ", tw->userid, + WATERBALL_ANGEL, tw->uin); +#endif } } while (!done); @@ -597,8 +616,10 @@ my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin) uin = (puin != NULL) ? puin : (userinfo_t *) search_ulist_pid(pid); strlcpy(destid, id, sizeof(destid)); + /* if (strcmp(id, "小主人") == 0) flag = WATERBALL_ANSWER; + */ if (!uin && !(flag == WATERBALL_GENERAL && water_which->count > 0)) { outmsg("\033[1;33;41m糟糕! 對方已落跑了(不在站上)! \033[37m~>_<~\033[m"); @@ -615,7 +636,7 @@ my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin) if (flag == WATERBALL_GENERAL #ifdef PLAY_ANGEL - || flag == WATERBALL_ANGEL + || flag == WATERBALL_ANGEL || flag == WATERBALL_ANSWER #endif ) { /* 一般水球 */ @@ -647,7 +668,7 @@ my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin) if (uin && *uin->userid && (flag == WATERBALL_GENERAL || flag == WATERBALL_CONFIRM #ifdef PLAY_ANGEL - || flag == WATERBALL_ANGEL + || flag == WATERBALL_ANGEL || flag == WATERBALL_ANSWER #endif )) { snprintf(buf, sizeof(buf), "丟給 %s : %s [Y/n]?", destid, msg); @@ -666,7 +687,7 @@ my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin) watermode = -1; if (!uin || !*uin->userid || (strcasecmp(destid, uin->userid) #ifdef PLAY_ANGEL - && strcmp(destid, "小主人") + && flag != WATERBALL_ANSWER #endif )) { outmsg("\033[1;33;41m糟糕! 對方已落跑了(不在站上)! \033[37m~>_<~\033[m"); @@ -698,8 +719,9 @@ my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin) kill(uin->pid, SIGUSR1); } else if (flag != WATERBALL_ALOHA && #ifdef PLAY_ANGEL - flag != WATERBALL_ANGEL && - /* angel accept or not is checked outside */ + flag != WATERBALL_ANGEL && flag != WATERBALL_ANSWER && + /* Angel accept or not is checked outside. + * Avoiding new users don't know what pager is. */ #endif !HAS_PERM(PERM_SYSOP) && (uin->pager == 3 || @@ -725,6 +747,18 @@ my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin) sizeof(uin->msgs[write_pos].userid)); strlcpy(uin->msgs[write_pos].last_call_in, msg, sizeof(uin->msgs[write_pos].last_call_in)); +#ifdef PLAY_ANGEL + switch (flag){ + case WATERBALL_ANGEL: + uin->msgs[write_pos].msgmode = MSG_TOANGEL; + break; + case WATERBALL_ANSWER: + uin->msgs[write_pos].msgmode = MSG_FROMANGEL; + break; + default: + uin->msgs[write_pos].msgmode = MSG_GENERAL; + } +#endif uin->pager = pager0; } else if (flag != WATERBALL_ALOHA) outmsg("\033[1;33;41m糟糕! 對方不行了! (收到太多水球) \033[37m@_@\033[m"); @@ -1893,8 +1927,11 @@ draw_pickup(int drawall, pickup_t * pickup, int pickup_way, int call_in(userinfo_t * uentp, int fri_stat) { - if( ! strcasecmp(uentp->userid, cuser.myangel) ) + static int CallInAngelWarning = 1; + if( CallInAngelWarning && ! strcasecmp(uentp->userid, cuser.myangel) ){ outmsg("直接丟水球給小天使是會被知道 ID 的喔!"); + CallInAngelWarning = 0; + } if (iswritable_stat(uentp, fri_stat)) { char genbuf[60]; @@ -2768,7 +2805,7 @@ t_changeangel(){ cuser.myangel[0] = 0; outs("小天使更新完成,下次呼叫時會選出新的小天使"); } - return 0; + return XEASY; } static int @@ -2817,7 +2854,7 @@ TalkToAngel(){ } /* TODO: complete first name-hiden waterball */ - snprintf(buf, 128, "問小天使 %s:", cuser.myangel); + snprintf(buf, 128, "問小天使 %s: ", cuser.myangel); my_write(uent->pid, buf, cuser.myangel, WATERBALL_ANGEL, uent); return; } @@ -2836,4 +2873,16 @@ CallAngel(){ free(screen0); redoscr(); } + +void SwitchBeingAngel(){ + cuser.uflag2 ^= BEING_ANGEL; + currutmp->being_angel ^= 1; +} + +int t_switchangel(){ + SwitchBeingAngel(); + outs(cuser.uflag2 & BEING_ANGEL ? + "開放小主人問問題" : "休息一會兒"); + return XEASY; +} #endif diff --git a/mbbsd/user.c b/mbbsd/user.c index 55cb1ceb..6b141c38 100644 --- a/mbbsd/user.c +++ b/mbbsd/user.c @@ -290,11 +290,11 @@ static void Customize(void) case 'F': case 'f': if( HAS_PERM(PERM_ANGEL) ){ - cuser.uflag2 ^= BEING_ANGEL; - currutmp->being_angel ^= 1; + t_switchangel(); break; } #endif + default: done = 1; } diff --git a/mbbsd/var.c b/mbbsd/var.c index f3179f37..d239fbec 100644 --- a/mbbsd/var.c +++ b/mbbsd/var.c @@ -334,13 +334,14 @@ int automargins = 1; time_t now; int KEY_ESC_arg; int watermode = -1; -int wmofo = -1; +int wmofo = NOTREPLYING; /* * WATERMODE(WATER_ORIG) | WATERMODE(WATER_NEW): * ???????????????????? - * Ptt 水球回顧 e = -1 - * 沒在回水球 = 0 在回上一顆水球 (Ctrl-R) > 0 在回前 n 顆水球 (Ctrl-R - * Ctrl-R) + * Ptt 水球回顧 (FIXME: guessed by scw) + * watermode = -1 沒在回水球 + * = 0 在回上一顆水球 (Ctrl-R) + * > 0 在回前 n 顆水球 (Ctrl-R Ctrl-R) * * WATERMODE(WATER_OFO) by in2 * wmofo = NOTREPLYING 沒在回水球 -- cgit v1.2.3