Project1

标题: 制作有多个部位的boss [打印本页]

作者: 洛林    时间: 2016-3-26 23:57
标题: 制作有多个部位的boss
本帖最后由 洛林 于 2016-3-27 00:09 编辑

需求: 一个boss有多个部位,部位受到伤害时本体也会减少同样生命值,如果不管部位直接击破本体,那么会直接获得战斗胜利,但是无法得到击破部位的奖励。(当然,因为部位也会行动,所以直接击破本体难度很大)

我目前是用的这样的方法:部位和本体用不同的敌人,比如一个boss有2个部位,那么就在敌群里放一个boss,再放2个 设定好的“部位”敌人。
然后为了让本体死亡时直接胜利,我自己连蒙带猜弄了个脚本:
  1. $gameTroop.members().forEach( function(member) {
  2.     if (member.hp>0) {
  3.        member.hide();
  4.      }
  5. });
复制代码
在本体死亡时启动,将部位全部隐藏,这样可以胜利又不会得到部位的经验和掉落。目前貌似没问题。

现在还有一个问题没有解决,就是部位受到的伤害也要体现到本体身上,求大神帮助
作者: 洛林    时间: 2016-3-27 02:26
本帖最后由 洛林 于 2016-3-27 02:27 编辑

想到了一个原始的方法,就是用 state 标记哪些是部位,哪个是boss,然后改一下 Game_Action.prototype.apply 函数
JAVASCRIPT 代码复制
  1. Game_Action.prototype.apply = function(target) {
  2.     var result = target.result();
  3.     this.subject().clearResult();
  4.     result.clear();
  5.     result.used = this.testApply(target);
  6.     result.missed = (result.used && Math.random() >= this.itemHit(target));
  7.     result.evaded = (!result.missed && Math.random() < this.itemEva(target));
  8.     result.physical = this.isPhysical();
  9.     result.drain = this.isDrain();
  10.     if (result.isHit()) {
  11.         if (this.item().damage.type > 0) {
  12.             result.critical = (Math.random() < this.itemCri(target));
  13.             var value = this.makeDamageValue(target, result.critical);
  14.             this.executeDamage(target, value);
  15.  
  16.             //BOSS hp 同步
  17.            if (target.isStateAffected(15)) {
  18.                 $gameTroop.members().forEach( function(member) {
  19.                     if (member.isStateAffected(14)) {member.gainHp(-value);}
  20.                 }
  21.                 );
  22.             }
  23.         }
  24.         this.item().effects.forEach(function(effect) {
  25.             this.applyItemEffect(target, effect);
  26.         }, this);
  27.         this.applyItemUserEffect(target);
  28.     }
  29. };

作者: 洛林    时间: 2016-3-27 03:03
后来又想了下,治疗啊,其他脚本伤害也要算进去,于是直接改 gaibHp() 了。。
JAVASCRIPT 代码复制
  1. Game_Battler.prototype.gainHp = function(value) {
  2.     //fix: BOSS hp synchronization
  3.     if (this._states.contains(15)) {
  4.         $gameTroop.members().forEach( function (member) {
  5.             if (member._states.contains(14)) {member.gainHp(value);}
  6.         }
  7.         );
  8.     }
  9.     this._result.hpDamage = -value;
  10.     this._result.hpAffected = true;
  11.     this.setHp(this.hp + value);
  12. };

作者: LHY4118    时间: 2016-3-27 17:05
有一个理论思路。拆掉部位对boss上debuff,部位相当于外挂装备生命不和主体联动,不然群体伤害就是打多倍了,除非你的游戏没有群伤(囧)
作者: 洛林    时间: 2016-3-27 18:26
LHY4118 发表于 2016-3-27 17:05
有一个理论思路。拆掉部位对boss上debuff,部位相当于外挂装备生命不和主体联动,不然群体伤害就是打多倍了 ...

群体伤害就是要多倍啊
作者: 洛林    时间: 2016-4-2 23:02
LHY4118 发表于 2016-3-27 17:05
有一个理论思路。拆掉部位对boss上debuff,部位相当于外挂装备生命不和主体联动,不然群体伤害就是打多倍了 ...

在设计BOSS血量的时候就会考虑这个,实际还是一样的,本体的血量相当于本体和所有部位的血量之和。

想一下:如果按你说的,不共享伤害,假如本体 3w 血, 部位 2w 血,那岂不是直接打本体只要打3w伤害就打死了?

而如果伤害共享,就会设计成 本体 5w血,部位 2w血,这样AOE伤害虽然翻倍,但是效果还是一样的,而且直接打本体要打 5w伤害,增加了不管部位的难度
作者: LHY4118    时间: 2016-4-3 12:29
洛林 发表于 2016-4-2 23:02
在设计BOSS血量的时候就会考虑这个,实际还是一样的,本体的血量相当于本体和所有部位的血量之和。

想一 ...

对本体设置点防御类的buff,血量不共享,击破部位就去除本体的buff(不过创意真不错)
作者: 1181770261    时间: 2016-4-3 19:44
不负责任的站着说话不腰疼一下:如果是说BOSS可以被划分成几个小怪,然后战斗图里面拼接起来呢?这也省下了很多功夫吧,物品掉落可以直接分部位算了。
(其实一直想这么干,但是苦于不知道怎么写来整合各个部分的总HP,所以一直没实践,而且拼接这活还必须仔细认真,所以这么想想大概我也算在水楼)
作者: 小叮鈴    时间: 2016-4-3 20:13
本帖最后由 小叮鈴 于 2016-4-3 20:14 编辑

不必這麼麻煩阿 所有部位都不要掉東西和經驗就好了

不過應班這種有部位的敵人 擊敗一個部位就贏了很奇怪吧? 參考FF13之類的

多部位的敵人通常是比自己體積大很多的敵人 消滅其他部位可以減少敵人的特殊能力之類的
作者: 洛林    时间: 2016-4-4 13:52
来举个例子,说明一下多部位的玩法

2016-04-04_13-51-31.png (59.36 KB, 下载次数: 24)

2016-04-04_13-51-31.png

作者: 洛林    时间: 2016-4-4 14:57
效果展示一下 并不是上面那个boss,【学姐打法好

Bamami.gif (993.16 KB, 下载次数: 14)

Bamami.gif

作者: joepie    时间: 2016-4-4 18:45
不错呀!我也做了类似这样的多部位系统 如下


请问script神,如果要把死亡collapse改成animation的话会很难吗?




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1