Project1

标题: 【★】如何做一种状态,使角色不受有害地形伤害? [打印本页]

作者: 迷糊的安安    时间: 2012-10-8 22:32
标题: 【★】如何做一种状态,使角色不受有害地形伤害?
本帖最后由 Mic_洛洛 于 2012-10-15 22:09 编辑

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

初步要求:制作出一种状态,使角色被附加该状态后,不会受到有害地形伤害。

进阶要求:使有害地形的伤害值能自由变更,例如在状态的备注中写上<MapDamage=5%,10>,于是被附加这种状态后,在有害地形里每次受到的伤害就是扣减5%HP和10点MP。HP和MP的扣减最好都能同时支持百分比和常数。如果都为0时,屏幕不闪动红色,也就是不受有害地形伤害。
dsu_plus_rewardpost_czw
作者: 咕噜    时间: 2012-10-8 22:56


数据库中,状态,新建一种状态。名字就暂且难听一点,别介意。
在特性里面增加【能力】,特殊能力,地形伤害处,默认是100%,即受到地形伤害时,伤害是默认的。
如果调成0%,就是不受到伤害,200%即双倍伤害。
解除方法推荐使用【步数】,因为这是一种益的状态,不是战斗中打打就解除的。


其他无能……
作者: 怪蜀黍    时间: 2012-10-10 16:26
本帖最后由 protosssonny 于 2012-10-13 19:33 编辑

先上范例:http://pan.baidu.com/share/link?shareid=84105&uk=875076719

初步要求按DE君的方法实现。

关于进阶要求有如下特点:
特点1——【保留默认】
当角色身上没有任何状态时,按照系统默认,依旧是扣10点HP。

特点2——【同时支持纯数字和百分比】
在状态的备注栏加入这样的备注:<MapDamage=x,y>,其中x和y均可以是数字或百分比。其中x表示对hp的作用,y表示对mp的作用。
比如<MapDamage=5%,10>表示在有害地形里每次受到的伤害就是扣减5%HP和10点MP。这里已经完全实现了进阶要求

特点3——【可叠加性】
当角色身上同时存在多个地形伤害加成状态时,HP伤害和MP伤害均可加成。
假定角色最大HP和MP均为200,现在附加3个地形伤害加成状态:
状态1:<MapDamage=8,12>;
状态2:<MapDamage=5%,10>;
状态3:<MapDamage=7%,6%>
最终的HP伤害为 8+200×5%+200×7%=32
最终的MP伤害为12+10+200×6%=34

注意
当角色同时存在没有备注<MapDamage=8,12>的状态和按DE君的方法实现的状态时,有备注的状态的优先级高于DE君的方法实现的状态。
比方说在范例中,如果26号伤害免疫状态和27号有备注的伤害加成状态同时存在时,26号免疫状态就无效了。

截图在这里:
受伤害时屏幕闪红:

HP和MP的伤害:

脚本在这里:
  1. #encoding:utf-8
  2. #==============================================================================
  3. # ■ Game_Actor
  4. #------------------------------------------------------------------------------
  5. #  管理角色的类。
  6. #   本类在 Game_Actors 类 ($game_actors) 的内部使用。
  7. #   具体使用请查看 Game_Party 类 ($game_party) 。
  8. #==============================================================================

  9. class Game_Actor < Game_Battler
  10.   #--------------------------------------------------------------------------
  11.   # ● 地形伤害的处理
  12.   #--------------------------------------------------------------------------
  13.   def execute_floor_damage
  14.     dam = compute_total_damage
  15.     damage_hp_0 = dam[0]
  16.     damage_hp_1 = self.mhp * dam[1]
  17.     damage_mp_0 = dam[2]
  18.     damage_mp_1 = self.mmp * dam[3]
  19.     damage_hp = (damage_hp_0 + damage_hp_1).to_i
  20.     damage_mp = (damage_mp_0 + damage_mp_1).to_i
  21.     damage = damage_hp + damage_mp
  22.     self.hp -= damage_hp
  23.     self.mp -= damage_mp
  24.     if damage == 0
  25.       damage = (basic_floor_damage * fdr).to_i
  26.       self.hp -= [damage, max_floor_damage].min
  27.     end
  28.     perform_map_damage_effect if damage > 0
  29.   end
  30.   
  31.   #--------------------------------------------------------------------------
  32.   # ● 自定义函数 计算叠加伤害
  33.   #--------------------------------------------------------------------------
  34.   def compute_total_damage
  35.     total_damage = [0,0,0,0]
  36.     for i in self.states
  37.       next unless $data_states[i.id].note.include?("<MapDamage=")
  38.       sta = $data_states[i.id].note
  39.       sta = sta.split(/([=,>])/) # 将备注按各种符号分解成数组
  40.       unless sta[2].include?("%")# 第一个数带有%时按百分比处理
  41.         sta[2] = sta[2].to_i
  42.         total_damage[0] += sta[2]
  43.       else
  44.         sta[2] = sta[2].to_i / 100.0
  45.         total_damage[1] += sta[2]
  46.       end
  47.       unless sta[4].include?("%")# 第二个数带有%时按百分比处理
  48.         sta[4] = sta[4].to_i
  49.         total_damage[2] += sta[4]
  50.       else
  51.         sta[4] = sta[4].to_i / 100.0
  52.         total_damage[3] += sta[4]
  53.       end
  54.     end
  55.     return total_damage          # 这是一个数组[整数,浮点数,整数,浮点数]
  56.   end  
  57. end   
复制代码

作者: Mic_洛洛    时间: 2012-10-12 22:11
protosssonny 发表于 2012-10-10 16:26
先上范例:http://pan.baidu.com/share/link?shareid=82703&uk=875076719

初步要求按DE君的方法实现。

刚测试了P叔的范例工程~
脚本有BUG喔~
血掉光了,就出错了。= =||

求P叔改善的说~






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