拍謝,最近計劃比較多,實作比較少,12 號之前我會盡量把
一些東西都實裝。
=====================================================
首先會做的,是設定資料 mapping 格式。
mapping objs = ([
"potion_01" : 數量, ...
]);
list 時...
生命藥水 : 10 ....
因此必須有個 "potion_01" -> "生命藥水" 的函數與儲存資
料..
/d/obj/data.c
==================================================
mapping data = ([
"potion_01" : "/d/obj/potion/01", ...
]);
mapping get_obj_data(string key_name)
{
object obj=find_object_or_load(data[key_name]);
return obj->query_ob_data();
}
問題就在於,當 potion_01 後面接的檔名變更時,因為儲存
在玩家身上的 key_name 是 potion_01,這將造成可能之前玩
家是擁有 生命藥水 10 瓶 ,卻變成擁有 巨大生命藥水 10
瓶的情況。
因此還需要一個東西...
#define OBJ_DATA_CHANGE_TIMES 1 // 代表改變次數
mapping obj_key_name_change = ([
"potion_01" : "potion_02", // 代表舊的 potion_01 要變成 potion_02
]);
int check_key_name_change(object me)
{
if(me->query("record_data/obj_data_change_times")<OBJ_DATA_CHANGE_TIMES)
{
me->set(record_data/obj_data_change_times",OBJ_DATA_CHANGE_TIMES);
// 底下開始執行變更
}
這樣就可以維持資料的更新。
=================================================================
以下是重點...
一、每一個虛擬物件,都會指向一個實體物件。該實體物件不是存在於
玩家身上,而是要讀取資料時才會去 find_object_or_load 出來.
實際上被儲存的資料是 ([ key_name : 數量 , ... ])
二、虛擬物品分為兩種
1)可使用的。例如 potion。
2)不可使用的。例如打怪掉的一般收集品。
需要有「觀看虛擬物品專用指令」(可能是 obj or i)、「虛擬物品
專賣店」(會寫成可繼承型式)、「虛擬物品使用指令」(可能會寫在
obj 指令中或者 useobj 指令)。
三、虛擬物品的數量變更,必須有專門的函數處理。
四、必須為虛擬物品做分類,並撰寫物件。
可以先做的是四。
我舉例,假設以後推出固定補充底下效果的藥水...
小型生命藥水 : 基本10%+con影響
中型生命藥水 : 基本25%+con影響
大型生命藥水 : 基本40%+con影響
在 con 影響下即使你不買大型生命藥水,你也可能可以只喝中型藥水
,就達到「逼近甚至超過 40% 補充值」的效果。
(當然這時你喝大型的就補越多)
/d/obj/potion/potion_02.c
======================================================
inherit ROOM;
void create()
{
set("short","中型生命藥水");
set("long",@LONG
可以補充較多生命力的藥水,可補充40%的生命力。
LONG
);
set("value",5000);
}
string useobj_func(object ppl)
{
int hp=ppl->query("hp_src");
if((int)ppl->query("hp")>=hp)
return "你現在沒有受傷, 不用喝喔.\n";
hp=(hp*40)/100 + con;
ppl->add_3p("hp",hp,hp);
return "ok";
}
在判斷時...
check_str=obj->useobj_func(ppl);
if(check_str!="ok")
return notify_fail(check_str);
Laechan
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.225.187.195