作者laechan (小太保)
看板mud_sanc
标题Re: [闲聊] 抗性相关设定
时间Wed Jul 27 11:01:33 2011
底下是范例函数
// 各抗性共用同一份 table
mixed ant_table=({ ({...}),
({...}),
}); // 二维阵列
// 攻击对象, 原伤害值, 抗性名称,
int xxx(object tar,int dam,string ant,int lv)
{
int tar_ant_lv,table_value,ant_effect;
object ob;
// 读取怪物的抗性设定
tar_ant_lv=tar->query(相关读取); // 如 anti_lv/fire = 3
// 当读出来是 0 时可能对方没设定, 这时一律给 1
if(tar_ant_lv<1) tar_ant_lv=1;
// 读取 table 值
// 比方该火属性攻击是 Lv3, 怪物的火属性抵抗 Lv 也设 Lv3
// 那就读取 ant_table[2][2] 这个值
table_value=ant_table[lv-1][tar_ant_lv-1];
// 计算原始 dam 与 table 对应後的基本增减幅伤害值
dam = dam * table_value / 100;
// 若对方有拿盾, 穿头盔, ...
if(ob=tar->query("shield"))
ant_effect+=(int)ob->query("anti_effect/"+ant);
if(ob=tar->query_temp("armor_head"))
ant_effect+=(int)ob->query("anti_effect/"+ant);
.
.
// 这里就得到一个 total 的防具 ant_effect 值, 再跟攻击对象的
// anti_effect 值相加
ant_effect+=(int)tar->query("anti_effect/"+ant);
// 然後做上限计算
if(ant_effect>99) ant_effect=99;
// 这时就再计算 dam 参考 ant_effect 後的值
// 比方抗火 30%, 那 dam 就会剩下原先的 70%
dam = dam * (100 - ant_effect) / 100;
return dam;
}
采用上面的好处是,设在特定部位防具上的 anti_effect 不必然
要影响玩家的数值, 只要在 xxx 函数里有办法读取到它即可.
另外我的建议就是,你可以定义三种抗性模式
一、被攻击对象身上所设的抗性相关数值 -> 用在 ant_table 的数值读取上
二、防具所设定的抗性相关数值 -> 在计算上采折 % 用
三、玩家身上的 anti_effect -> 直接扣值
这样三种数值之间就不会相互影响到,方便你做控管,而且三种值
都有用到的地方,还可以决定它们的计算顺序.
(例如顺序可以是一二三,也可以是一三二,甚至三一二也可)
从上面你也可以看到 xxx 函数的内容其实也很单纯, 我的意思就是
,『这个函数本来就要写得很简单』,为什麽呢?因为它会被呼叫得
很频繁。呼叫越频繁的函数就必须写得越简单。
Laechan
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 115.80.213.15