回精華區
作者itoc.bbs@xeon.tfcis.org (看了題目就知道該放棄) 看板: plan
標題Re: [問題] 不能undef錢幣系統嗎?
時間動力核心 (Mon, 18 Aug 2003 01:39:01 +0800 (CST)) Updated: 2005/11/28
※ 引述《qask (qask)》之銘言:
> 感謝itoc大的回應,不過我還是想試試拿掉code,
> (雖然眼不見為淨,可是浪費資源在運算上面了:p)
> 可以稍微指點一下code大概分布在哪裡嗎

  首先改 struct ACCT

- int money;                    /* 銀幣 */
- int gold;                     /* 金幣 */
+ int useless1;                 /* 空欄一 */
+ int useless2;                 /* 空欄二 */

  把這二個欄位換成空欄位,這樣就無需轉換 .ACCT
  如果你是架一個新站的話,那麼可以直接刪除這二行,而不需增加 useless 欄位

  然後重新 make clean os-type
  所有出現的 error 都是相關的
  你的目標就是將所有的 error 都排除
  使能 make 成功

  ----------------------------------------------------

  [種類] 用錢買服務,直接刪除該段即可

  [範例] song.c

- if (cuser.money < 1000)
- {
-   vmsg("要 1000 銀幣才能點歌到看板喔");
-   return XO_FOOT;
- }

- cuser.money -= 1000;

  ----------------------------------------------------

  [種類] 用錢建立起來的金融制度

  bank.c 整支刪除,也要同步修改 so/Makefile

  刪除了 bank.c,那麼在 menu.c 所有呼叫 bank.so 的選單都要拿掉

  ----------------------------------------------------

  [種類] 用錢建立起來的遊戲制度

  在 menu.c 中的 menu_game2[] 的全部、menu_game3[] 的部分
  都是用錢才能玩的賭博遊戲

  刪除 menu.c 的這部分
  並刪除這些 *.so 對應的 so/*.c,也要同步修改 so/Makefile

  pip/* 全部刪除,menu.c 中的電子雞拿掉

  ----------------------------------------------------

  [種類] 顯示用的,直接刪除該段即可

  [範例] acct.c

- prints("  \033[32m我的暱稱:\033[37m%-35s\033[32m擁有銀幣:\033[37m%d\n",
-   u->username, u->money);
+ prints("  \033[32m我的暱稱:\033[37m%-35s\033[32m\n", u->username);

  ----------------------------------------------------

  [種類] 設定用的,直接刪除該段即可

  [範例] acct.c

-   sprintf(buf, "%d", u->money);
-   vget(++i, 0, "銀    幣:", buf, 10, GCARRY);
-   if ((num = atoi(buf)) >= 0)
-     x.money = num;

  ----------------------------------------------------

  [種類] 加錢用的,循線刪除

  [範例] post.c:do_post()

-     addmoney(mode);

  而 mode 顯然就不需要了

-     mode = BMIN(wordsnum, spendtime) / 10;

  而 spendtime 也是因為要算錢才新增的

- time_t spendtime;
-   spendtime = time(0);
- spendtime = time(0) - spendtime; /* itoc.010712: post 總共花的時間(秒數) */

  ----------------------------------------------------

  [種類] 因為錢幣系統,為了避免 multi 而新增的

  [範例] bbsd.c:u_exit()

-       if (cutmp->status & STATUS_COINLOCK)
-       {
-         cuser.money = tuser.money;
-         cuser.gold = tuser.gold;
-       }
-       else
-       {
-         if (cuser.money < 0)   cuser.money = 0;
-         if (cuser.gold < 0)    cuser.gold = 0;
-       }

  這些都刪除沒問題,但是 STATUS_COINLOCK 又是什麼呢?
  一路 trace 回去,就知道這是為了檢查 multi 而新增的
  所以來到 ufo.h

- #define STATUS_COINLOCK BFLAG(4)        /* 錢幣鎖定 */

  接著來到 bbsd.c:tn_login()

- int attempts, multi;
+ int attempts;

- multi = 0;

-         /* itoc.020619: 即使刪除重複的 login 還是算 multi,不能儲存金錢 */
-         multi = 1;

- if (multi)
-   cutmp->status |= STATUS_COINLOCK;

  進而來到 acct.c 以及 so/*.c

- if (cutmp->status & STATUS_COINLOCK)
- {
-   vmsg(MSG_COINLOCK);
-   return XEASY;
- }

  ----------------------------------------------------

  [種類] 其他

  一路 trace 回去,通通刪除

  [範例] talk.c:do_query()

- if (acct->money >= 1000000)
- {
-   if (acct->gold >= 100)    userno = 3;
-   else                      userno = 2;
- }
- else
- {
-   if (acct->money >= 50000) userno = 1;
-   else                      userno = 0;
- }

  顯然可看出這段是利用 gold/money 來決定 userno,所以也可以刪除下面這行

- prints(" [財產] %s", fortune[userno]);        /* 借用 userno */

  看到了 fortune,找一找也沒別的地方用,所以也可以刪除

- /* itoc.010408: query 時出現對方的財富狀況 */
- char fortune[4][5] = {"乞丐", "一般", "小康", "財閥"};


  ----------------------------------------------------
  ----------------------------------------------------

  [結論] 基本上作法就是這樣,由於錢幣制度已經深植很久了
         而且是直接寫在 .ACCT 裡面,而不是放在 .ATTR 裡面
         所以要拔除的話,的確是要花一些功夫的

         反正就是跟 STATUS_COINLOCK、MSG_COINLOCK、money、gold 相關的
         一路 trace 回去,通通不要

--
=[:摃�◣�:Origin ]|[     O�processor.tfcis.org    ]|[�搟說:]=
=[:摃�╱�:Author ]|[     itoc.dorm11.nctu.edu.tw         ]|[�:]=
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻