【浅谈AI】生命值相同,战役中的双重人格
本帖最后由 这只话唠菜鹰是路人 于 2016-11-22 00:40 编辑这几天考虑了一下在战役中添加精分角色,越想越兴奋,索性放手一试,做了个简单的双重人格规划。
所谓的双重人格,个人觉得在游戏中要表现出来的不仅要有两个对立的性格,也要有两个独立的身体。有了两个身体之后就可以按照两个人来设计对话了。
那么,对于这两个身体,由于是同一个本体,所以两个身体都是真正的人格,那么其中一个身体消失就要伴随着另一个身体的消失。所以制作精分的角色的两个独立的人格,实际上只需要保持两个单位的血量相同。
对于两个单位,如果想要每时每刻都要保证他们的血量相同,这个时候就要用到1.4的新型AI了。目前生命值是一个变量,凡是和变量有关的效果,用AI都可以很直观简单地实现。
(defconst hitpoint-x 101)
(defconst hitpoint-y 102)
(defconst hitpoint-diff 103)
;首先是定义新的语句,分别用hitpoint-x、hitpoint-y、hitpoint-diff来替换掉101、102、103位置的数据。
(defrule
(food-amount == 0);食物为0的时候执行
(wood-amount == 0);木材为0的时候执行
;其实这个与触发有点类似,两个条件必须同时满足才会开始执行
=>
(up-set-target-by-id c: 0) ;首先以地图上ID为0的单位为读取对象
(up-get-object-data 10 hitpoint-x) ;读取它的生命值,并储存在hitpoint-x中。这里的“10”代表的是单位的生命值
(up-set-target-by-id c: 1) ;再以地图上ID为1的单位为读取对象
(up-get-object-data 10 hitpoint-y);读取生命值,并储存在hitpoint-y中
(up-modify-goal hitpoint-x g:- hitpoint-y);这里提供的方法是利用计算的差值来检测两个单位的生命值高低,
;用hitpoint-x(读取的ID=0的单位的生命值)减去hitpoint-y(读取的ID=1的单位的生命值)来替换掉原来的hitpoint-x
(up-modify-goal hitpoint-diff g:= hitpoint-x);再定义hitpoint-diff为替换之后的hitpoint
)
(defrule
(up-compare-goal hitpoint-diff > 0) ;当hitpoint-diff为正时,也就是ID为0的单位生命值大于ID为1的单位的生命值时,执行条件
=>
(cc-add-resource wood 1);得到木材1,因为后面要用到资源法来控制血量相同 ;木材对应的是ID为0的单位损血的触发
(up-modify-goal hitpoint-diff c:- 1);这时用hitpoint-diff减掉1的数值替换掉原来的hitpoint-diff,
;这样就会暂时性的使hitpoint-diff=0,也是另一种方式防止循环执行
(up-jump-rule -1);跳过向上第一个规则
)
(defrule
(up-compare-goal hitpoint-diff < 0) ;当hitpoint-diff为负时,也就是ID为0的单位生命值小于ID为1的单位的生命值时,执行条件
=>
(cc-add-resource food 1);得到食物1
;食物对应的是ID为1的单位损血的触发
(up-modify-goal hitpoint-diff c:+ 1);用hitpoint-diff加上1的数值替换掉原来的hitpoint-diff
(up-jump-rule -2);跳过向上第二个规则
)
这样,AI就完成了,但是要调节ID为0和1的两个单位的生命值,还需要触发进行配合:
触发循环开启
条件:堆积木材(食物):……、512、256、128、64、32、16、8、4、2、1
效果:减损ID为0(1)的单位生命值:……、512、256、128、64、32、16、8、4、2、1
效果:进贡木材(食物):……、512、256、128、64、32、16、8、4、2、1
总之,利用二进制的循环触发把堆积的资源全部以扣血的形式一一对应在角色身上,需要注意的是二进制顺序由大到小。
这样,生命值时刻相同的两个单位就制作好了。
不过仍需要注意,英雄回血会无效化,并且无法用一个僧侣来达到治疗效果,所以最好的治愈效果是利用纯粹的负损血触发同时增加两个普通单位的生命值。
指导教师:@狂~劇情狂
很好的创新! 就跟僧侶治療一樣,英雄自身回復也會失效,不過換一角度來說這其實也可以成為禁止僧侶治療特定單位或取消英雄回復的特效;此外,其實要讓它們再次生效實際也不是完全沒可能,只是這樣後台要再另放單位進行逆向檢測而已,設定複雜程度要比現在翻倍。
另外,還要注意兩個部隊同時遭攻擊時,只會以較大傷害一方的生命值為準,較小傷害一方受的傷害基本會被無視。
最後補充一下,我前晚編寫那段代碼實測時,一張空白地圖上一秒內加上的資源量為二千七百多左右,雖然不知道與機器配置有否關係,但這大體應該是同一遊戲秒內觸發處理生命值差的上限了。
研究辛苦了{:149:}
简单说是一起掉血。。。
但是一起回血比较麻烦么。。。
从RPG角度考虑,这个效果如果这样做是不太好的{:146:}
常见的效果更可能是:
两个单位按着血量差值
一个回复一半,一个掉一半
这样实际打起来就是,无论谁挨打,两个人都分担一半伤害
就可以做出类似生命锁链的效果了
再进一步的话
主要角色被攻击,分身单位为其分担90%伤害
分身单位被攻击,主要角色为其分担10%伤害 很有趣的想法。突然想到另一件事:
例如個單位會忍術 ( 像是杏花宵裡的小次郎 )。
但是現在考慮本體只有一個:打分身是不會損血,打本體會損本體和分身。這樣的效果理論上也可以用AI寫出來了。 这个嘛,与其叫双重人格,不如叫“心连心”…… 我果然老了········
现在已经是一个AI的时代了········· 既然这样,大概可以引申为地图传送效果咯
页:
[1]