这里聊一下货币。
原本,我打算设计两种货币,并使用 wealths 与 balances 字段,以及
设定 query_set_add_del_moneys 等相关函数,现为了简化 tmi2_v3_改
的复杂度,货币的部份决定只采用一种货币。
一、修改 /include/mudlib.h
无视 tmi2_v3 在 money.h 的几个定义,新增底下几个定义
#define MONEY_UNIT "silver" // 主货币单位
// #define MONEY_UNIT2 "gold" // 如果使用者要新增新的货币就能这样做
// #define MONEY_EXCHANGE 100 // 如果使用者要设定兑换比率就能这样做
只要改这里就能让整个 mud 的货币单位更新。
然后整个 tmi2_v3_改 只会先用到 MONEY_UNIT,并预留使用者将来
要新增新的定义时的空间。
(MONEY_UNIT 在很多地方都会用到,所以放在 mudlib.h)
二、chinese 新增 silver 的中文
> chinese silver==银币
chinese: silver==银币 设定 ok.
比方使用者以后将货币改成 zeny,那就 chinese zeny==看要叫啥,
所有的显示就会全部统一采用你设定的 zeny。
三、修改 /std/body/attack.c
新增 query_moneys、set_moneys、add_moneys 三个函数。
(不需要有 del_moneys)
tmi2_v3_改 统一玩家身上的货币存取方式,不建议使用者直接使用
query("xxx") 或 set("xxx") 这种直接读取方式,透过函数才能控
管玩家的金钱流动。
(放在 /std/body/attack.c 的一些函数以后将改放到其它地方)
我也先不写银行,也就是说 tmi2_v3_改 一开始只会有“身上现款
”,query_moneys 初期也只有单纯的 query_moneys("wealth")
然后模拟底下两种情况
1.使用者想启用“银行存款”
那 query_moneys("balance") 就能读出银行存款。
2.使用者想启用“第二种货币”
那么底下的函数也将适用
// 存取钱的函数
varargs mixed query_moneys(string str,string kind)
{
mixed vars;
int v;
// 一定要有 str
if(!str || str=="") return 0;
// 对 str 做正规化
switch(str)
{
case "w":
case "we":
case "wea":
case "现金":
case "现款":
str="wealth";
break;
case "b":
case "ba":
case "bal":
case "存款":
default:
str="balance";
break;
}
// 原先 query_moneys("wealth") 的情况
// 就变成读第一种货币
if(!kind || (kind && kind==MONEY_UNIT))
{
// 只允许使用 wealth 与 balance
str=="wealth" ? vars=query("wealth") : vars=query("balance");
if(mapp(vars))
return (v=vars[MONEY_UNIT]) ? v : 0;
else if(arrayp(vars))
return (v=vars[0]) ? v : 0;
else
return intp(vars) ? vars : 0;
}
// query_moneys("wealth",MONEY_UNIT2) 等情况
#ifdef MONEY_UNIT2
if(kind && kind==MONEY_UNIT2)
{
str=="wealth" ? vars=query("wealth") : vars=query(str);
if(mapp(vars))
return (v=vars[MONEY_UNIT2]) ? v : 0;
else if(arrayp(vars))
{
if(sizeof(vars)>1)
return (v=vars[1]) ? v : 0;
}
// 要启用第二种货币, vars 一定是 mapping 或 array
else
return 0;
}
#endif
return 0;
}
四、/std/user.c 的初始化设定区
它会判断使用者是否有启用 MONEY_UNIT2,然后就对 wealth 以及
balance 做相对映的初始化。
五、wealth 与 balance 是强制的
因为它关系到很多很基本的东西,所以只有这两个字段是绝对的,
比方若你想变更为读 wealths 与 balances,那得做非常多的修改
以上已修改。money 支援三种格式,以 wealth 为例
若有启用 MONEY_UNIT2
"wealth" : ({第一种货币数量,第二种货币数量})
"wealth" : ([MONEY_UNIT : 第一种货币数量,
MONEY_UNIT2 : 第二种货币数量, ])
若无启用 MONEY_UNIT2 (单一货币)
"wealth" : 货币数量
"wealth" : ({货币数量})
"wealth" : ([MONEY_UNIT : 货币数量]),
而以上述为例,使用者架的 mud 要启用哪一种,就是修改 user.c
的 complete_setup 函数,修改将钱初始化的段落即可,目前默认
是若使用者启用第二种货币就用 mapping 的型式。
(这样 query("wealth/"+MONEY_UNIT2) 也等于读第二种货币,可
能使用者想偷懒不想用 query_moneys("wealth",MONEY_UNIT2) ..)