[wizs] 直覺化的虛擬物品系統
看板mud_sanc (Sanctuary - 聖殿)作者laechan (小太保)時間17年前 (2008/09/24 10:36)推噓2(2推 0噓 6→)留言8則, 2人參與討論串1/6 (看更多)
底下是幾個原則設定...
一、虛擬物品暫時不予儲存(放在玩家的 temp_data 區)
二、允許 wiz 可自訂屬於自己的虛擬物品資料庫,包括虛擬物品
指向的實體物件、虛擬物品ID、虛擬物品中文名,各自的資料
庫各自進行資料的增減(因此該資料庫存放位置由 wiz 決定).
除了該 wiz 外其它 wiz 無法去做資料的增減.
三、wiz 必須透過申請來建立自己的資料庫。會有個總資料庫由我
建置,它會去抓取各 wiz 自建的資料庫的所有資料來總存放。
四、假設我的虛擬物品資料庫為 /u/l/laechan/vobj.c, 它的內容
為...
// 檔名不一定要這麼取
====== /u/l/aechan/vobj.c ======
inherit ROOM;
// 統一定為 vobjs_data
// 所有虛擬物品必須依 key 的開頭字母做排序以避免重覆
// name 與 file 兩個子 key 必備, mark 非必要
// name 盡量等於實體物件名(無色碼與空白)
// file 指向實體物件檔名(預設 .c 檔)
// mark 是用來做特殊判斷用(也可當成 wiz 自行 remark 用), 可有可無
mapping vobjs_data=(["_maker":"laechan", // _maker:誰建置這個虛擬物品系統
"crystal" : ([ "name" : "水晶",
"file" : "/u/l/laechan/obj/crystal",
"mark" : "解盜賊任務時會用到的東西",]),
"disk" : ([ "name" : "光碟",
"file" : "/u/l/laechan/obj/disk",
"mark" : "解盜賊任務時會用到的東西",]),
]);
// 統一的函數名 set_vobjs() 一定要有
void set_vobjs()
{
// 避免產生 bug
if(file_exists("/adm/daemons/vobjs_d.c"))
"/adm/daemons/vobjs_d"->set_vobjs(vobjs_data);
}
// 一定要有
void create()
{
::create();
seteuid(getuid(this_object()));
set("light",1);
set("short","虛擬物品資料房");
set_vobjs(); // 一定要有, 保證 update 房間就去 set
}
// 統一的函數名 vobjs_data()
mapping vobjs_data()
{
return vobjs_data;
}
// 底下還可自行撰寫 void init 函數來自定 add_action 做
// show 資料用之類的, 但不能有刪改 vobjs_data 的東西
要增減或刪改資料就透過 ed 去新增然後 update 該物件即可
完成更新.
我自己的我待會就會先建好, 若我有建好, wizs 就可透過底
下方式確認...
call /u/l/laechan/vobjs;vobjs_data
去看看 vobjs 有沒有回傳東西.
各 wizs 可先完成這一部份並聯絡我向我報備自建的資料庫的完整路
徑檔名為何. 建議先弄個測試的即可.
vobj 指向的實體物品則可以是現存的任何的 obj, 如生命水晶、小
地圖、去刀粉、...
底下是你們上面邊弄, 我也邊弄的東西...
五、放在玩家 temp_data 區的虛擬物品資料...
mapping vobjs = query_vobjs(ppl);
(這個其實等於 vobjs = ppl->query_temp("vobjs"); 但不建議
使用這種呼叫)
objs 會 = (["laechan_crystal" : 3,
"laechan_disk" : 5,
.
.
]);
這樣可確保各 wiz 所定的 vobjs 其 key 都是獨特的, 因為
它們都會被加上建置者的 id, 例如我自己建的 crystal, 我
的虛擬物品 id 就會是 laechan_crystal.
所以假若 wizs 要增改玩家的 vobjs 資料, 有三種方法
1)直接讀取玩家的 vobjs 做 mapping 資料異動
讀出來的 vobjs 更動 => 玩家身上的 temp_data["vobjs"] 就會一起更動
2)直接 ppl->set_temp("vobjs/key名",數量); \
ppl->add_temp("vobjs/key名",數量); -- 不建議使用,但最直覺
ppl->delete_temp("vobjs/key名",數量); /
3)透過全域函數 set_vobjs(ppl,key名,數量);
add_vobjs(ppl,key名,數量);
delete_vobjs(ppl,key名);
請盡量使用第三種方法, 透過全域函數來做資料更動的最大優
點, 就是將來若讀取方式異動時, wizs 不用去更改呼叫方法,
只需我去更動全域函數的內容即可, 避免日後大規模異動.
(以前為了將 add("warexp" 改成 add_warexp 曾大費功夫)
這個弄好了會公告.
六、指令 vobjs
玩家操作這個指令, 跟 wiz 操作會看到不太相同的結果.
這個弄好了也會公告.
暫時先用上面的, 先弄出一個雛型, 然後測試一陣子找出可修改
的地方, 再討論看看怎麼更動較 ok.
(例如是否要確保資料更新的安全性而採用更嚴謹的處理方式等)
最後, 上面設定原則也確立了實體物品與虛擬物品的共存性, 例
如玩家身上可能有實體的生命水晶, 但可能也有 n 顆虛擬的生命
水晶. 在過渡時期這應該是最佳的設定方式.
Laechan
--
※ 發信站: 批踢踢實業坊(ptt.cc)
※ 編輯: laechan 來自: 218.170.230.61 (09/24 10:40)
推
09/26 21:29, , 1F
09/26 21:29, 1F
推
09/26 21:32, , 2F
09/26 21:32, 2F
→
09/26 23:16, , 3F
09/26 23:16, 3F
→
09/26 23:16, , 4F
09/26 23:16, 4F
→
09/26 23:16, , 5F
09/26 23:16, 5F
→
09/26 23:17, , 6F
09/26 23:17, 6F
→
09/26 23:17, , 7F
09/26 23:17, 7F
→
09/26 23:18, , 8F
09/26 23:18, 8F
討論串 (同標題文章)
mud_sanc 近期熱門文章
PTT遊戲區 即時熱門文章
-22
41