Project1

标题: 【★】如何嘲讽单个怪物使它只攻击我方特定角色? [打印本页]

作者: 迷糊的安安    时间: 2012-10-8 17:26
标题: 【★】如何嘲讽单个怪物使它只攻击我方特定角色?
本帖最后由 迷糊的安安 于 2012-10-25 10:57 编辑

本问题为【Ace推荐问答计划】活动问题。
详情请点击:http://rpg.blue/forum.php?mod=viewthread&tid=251118

实现要求:
“嘲讽”算是个rpg里的老牌技能了,一般都是让肉盾角色掌握此技能用来保护己方脆弱队员的。
而ace里自然是少不了这个技能,范例数据库里就有嘲讽这种状态,其效果为怪物攻击自己的频率上升。

那么问题就在这了。

怪物攻击自己的频率上升中的怪物指的是与主角队伍作战的全体怪物,那么一旦将几率调得过高,此技能一出所有的怪物都会集中火力攻击使用者,而脆弱的法师就可以放心的输出,使得战斗变得十分简单。而如果将几率设的过低,那么此技能的效果就不明显,从而成为一个残废技能。

所以我想能不能通过某种手段实现“单体嘲讽”,即“强迫对方某一敌手攻击我方使用者”,这样的话上述问题就解决了。dsu_plus_rewardpost_czw
作者: feizhaodan    时间: 2012-10-8 18:15
使用http://rpg.blue/thread-236018-1-4.html的脚本,然后制作一个无伤害的技能,然后备注栏里输入
  1. <plus_aggro 99999>
复制代码
,目标单体即可。
范例交给别人了_(:3」∠)_
作者: 怪蜀黍    时间: 2012-10-18 11:06
本帖最后由 protosssonny 于 2012-10-18 13:08 编辑

先给范例链接:http://pan.baidu.com/share/link?shareid=87287&uk=875076719

实现要求:强迫对方某一敌手攻击我方嘲讽技能使用者。范例中技能使用者是3号角色泰伦斯。
使用方法:
1、新状态设计。需要设计两个新状态,分别给技能被嘲讽的敌人和使用者附加。
(1)新状态1,给被嘲讽的敌人附加的状态,范例中默认是26号状态。敌人附加状态时的文字填上“被激怒了!”;敌人状态解除时的文字填上“不再愤怒!”。
(2)新状态2,给技能使用者附加的状态,范例中默认是27号状态。
(3)两个状态持续的回合数必须要保持一致,因为只有两个状态同事存在时,嘲讽才会有效。比如同时填1~1,持续1个回合。
有了这两个状态后,被附加“被嘲讽”状态的敌人就会强制攻击附加“嘲讽”状态的角色,也就是技能使用者。
2、新技能设计。比如范例中的第127号技能是嘲讽技能。新技能必须这样设计:
(1)速度修正为正,比如为300,这样本技能才能在回合以开始就释放出来,让指定敌人攻击自己。若不设定速度修正,有可能敌人已经攻击完毕才释放技能,达不到目的。
(2)“使用效果”栏中要设定附加状态,就是让敌人增加仇恨的状态。也是脚本设定中“BEICHAOFENG”定义的状态ID。范例中默认是26号“被嘲讽”状态。
(3)伤害计算公式的类型除了“无”以外随便填,属性随便填,但是计算公式必须填写a.add_state(P叔::CHAOFENG)。意思就是要让技能使用者(即a)附加脚本设定中“CHAOFENG”定义的状态ID。范例中默认是27号“嘲讽”状态。

按要求上图:
3号角色泰伦斯嘲讽了史莱姆B:

史莱姆B因被嘲讽而攻击3号角色泰伦斯:


按要求上脚本:
  1. #==============================================================================
  2. # ■ 系统设定
  3. #------------------------------------------------------------------------------
  4. module P叔
  5. # 请在下面设定敌人被嘲讽后附加的状态的ID,默认ID是26
  6.   BEICHAOFENG = 26
  7. # 请在下面设定角色释放嘲讽后自己附加的状态的ID,默认ID是27
  8.   CHAOFENG = 27
  9. end  
  10. #==============================================================================


  11. #==============================================================================
  12. # ■ Game_Action
  13. #------------------------------------------------------------------------------
  14. #  处理战斗中的行动的类。本类在 Game_Battler 类的内部使用。
  15. #==============================================================================

  16. class Game_Action
  17.   #--------------------------------------------------------------------------
  18.   # ● 目标为敌人  # 再定义
  19.   #--------------------------------------------------------------------------
  20.   def targets_for_opponents
  21.     if item.for_random?
  22.       Array.new(item.number_of_targets) { opponents_unit.random_target }
  23.     elsif item.for_one?
  24.       num = 1 + (attack? ? subject.atk_times_add.to_i : 0)
  25.       if @target_index < 0
  26.         # 当攻击者处于被嘲讽状态并且攻击者是敌人时
  27.         if @subject.state?(P叔::BEICHAOFENG) and @subject.is_a?(Game_Enemy)
  28.         # 攻击目标为处于嘲讽状态的角色
  29.           $game_party.alive_members.each do |actor|
  30.             return [actor] * num if actor.state?(P叔::CHAOFENG) end
  31.         end  
  32.         return [opponents_unit.random_target] * num  
  33.       else
  34.         [opponents_unit.smooth_target(@target_index)] * num
  35.       end
  36.     else
  37.       opponents_unit.alive_members
  38.     end
  39.   end
  40. end  

  41. #==============================================================================
  42. # ■ Game_ActionResult
  43. #------------------------------------------------------------------------------
  44. #  战斗行动结果的管理类。本类在 Game_Battler 类的内部使用。
  45. #==============================================================================

  46. class Game_ActionResult
  47.   #--------------------------------------------------------------------------
  48.   # ● 获取 HP 伤害的文字  # 再定义
  49.   #--------------------------------------------------------------------------
  50.   def hp_damage_text
  51.     if @hp_drain > 0
  52.       fmt = @battler.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
  53.       sprintf(fmt, @battler.name, Vocab::hp, @hp_drain)
  54.     elsif @hp_damage > 0
  55.       fmt = @battler.actor? ? Vocab::ActorDamage : Vocab::EnemyDamage
  56.       sprintf(fmt, @battler.name, @hp_damage)
  57.     elsif @hp_damage < 0
  58.       fmt = @battler.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
  59.       sprintf(fmt, @battler.name, Vocab::hp, -hp_damage)
  60.     else
  61.       fmt = @battler.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
  62.       # 修改以下脚本,以消除附加被嘲讽状态时HP伤害为0而显示“毫发无伤”的文字。
  63.       sprintf(fmt, @battler.name) unless @battler.state?(P叔::BEICHAOFENG)
  64.     end
  65.   end
  66. end  

  67. #==============================================================================
  68. # ■ Game_Battler
  69. #------------------------------------------------------------------------------
  70. #  处理战斗者的类。Game_Actor 和 Game_Enemy 类的父类。
  71. #==============================================================================

  72. class Game_Battler < Game_BattlerBase
  73.   #--------------------------------------------------------------------------
  74.   # ● 判定状态是否可以附加  # 再定义
  75.   #--------------------------------------------------------------------------
  76.   def state_addable?(state_id)
  77.     # 取消了对!state_removed?(state_id)的判断。
  78.     # 如果执行该判断将导致状态附加失败。
  79.     alive? && $data_states[state_id] && !state_resist?(state_id) &&
  80.       !state_restrict?(state_id)
  81.   end
  82. end  
复制代码

作者: 迷糊的安安    时间: 2012-10-20 12:05
protosssonny 发表于 2012-10-18 11:06
先给范例链接:http://pan.baidu.com/share/link?shareid=87287&uk=875076719

实现要求:强迫对方某一敌手 ...

这样设计的结果是,【被嘲讽】状态的持有者攻击【嘲讽】状态的持有者。如果对于队伍里有两个嘲讽者,那就不会各自认定各自的目标了。
有的一点瑕疵是,被激怒的怪物上面会出现空行。

但是不管怎么说,完成了题目要求,最佳答案。




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