回精華區
作者itoc, 信區: itoc
標題[功能] NPC 自動回水球 (1.主程式)
時間03/08/17
作者: itoc (不太發展實驗室) 看板: plan
標題: [功能] 無聊的 NPC
時間: Tue Sep  3 11:54:28 2002                          Updated: 2006/01/07

  丟水球給 userlevel=0 (也就是 guest) 的 NPC (non-player-char.)
  NPC 會回水球給你

  如果丟 NPC 這 ID 水球
  問 "請問如何開板"  NPC 會答 "開板請至 [newboard] 板 post"
  問 "請問站長是誰"  NPC 會答 "本站的站長是 sysop"
  如果跟 NPC 隨便丟水球,NPC 也會回你話

: bmw.c:bmw_rqst()

  int i, j, userno, locus;
  BMW bmw[BMW_PER_USER], *mptr, **mslot;
+ char fpath[64];

    do
    {
      mptr = &bmw[i];

      ...
      ...

      bmw_lslot[locus++] = *mptr;       /* structure copy */

+     /* 當 NPC 收到別人丟來的水球時,自動回話 */
+     if (!strcmp(cuser.userid, "NPC"))  /* NPC 的 ID 是 "NPC" */
+     {
+       if (mptr->caller)
+       {
+         BMW new;
+
+         time(&new.btime);
+         new.caller = cutmp;
+         new.sender = cuser.userno;
+         new.recver = mptr->sender;
+         strcpy(new.userid, cuser.userid);
+         strcpy(new.msg, mptr->msg);
+         bmw_npcAI(new.msg);
+         bmw_send(mptr->caller, &new);
+
+         usr_fpath(fpath, cuser.userid, fn_bmw);
+         rec_add(fpath, &new, sizeof(BMW));
+
+         usr_fpath(fpath, cuser.userid, fn_amw);
+         if (fp = fopen(fpath, "a"))
+         {
+           fprintf(fp, BMW_FORMAT2 " %s\n",
+             new.userid, new.msg, Btime(&new.btime));
+           fclose(fp);
+         }
+       }
+     }
    } while (++i < j);

: bmw.c:bmw_npcAI() 新增於 bmw_edit() 前面

static void
bmw_npcAI(msg)      /* Non-Player-Char 的人工智慧 */
  char *msg;        /* bmw.msg 長度是 69 */
{
  /* input msg 是使用者所輸入要給 guest 的水球 */
  /* output 也用 msg,是 NPC 回給 cuser.userid 的水球 */

  int find;
  FILE *fp;
  char rule[80], ans[80], *str;

  find = 0;
  if (fp = fopen("etc/npc", "r"))
  {
    while (fgets(rule, 80, fp) && fgets(ans, 80, fp))  /* 一次 fget 二行 */
    {
      if (str = strchr(rule, '\n'))
        *str = '\0';
      if (strstr(msg, rule))
      {
        if (str = strchr(ans, '\n'))
          *str = '\0';
        str_ncpy(msg, ans, 60);
        find = 1;
        break;
      }
    }

    fclose(fp);
  }

  if (!find)        /* 如果 rule 裡面沒有,就隨便回答 */
    strcpy(msg, "講太小聲了,我聽不到");
}

: etc/npc 新增這個檔案:奇數行是規則,偶數行是要回答的話,範例如下:
: 如果要改 NPC 的 AI,就改 etc/npc 即可

> ---------- 範例從下一行開始,不包括本行 ---------- <
早安
不早了啊,我每天都睡到中午的說
天氣
今天天氣可好的很呢~
為什麼
你這麼聰明都不知道了,我怎麼可能會知道
開板
開板請至 [newboard] 板 post
站長
本站的站長是 sysop
> ---------- 範例到上一行結束,不包括本行 ---------- <

--
□ 本文章由 itocpc512-5.EE.NCTU.edu.tw 發表
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻