Project1

标题: 敌人攻击我方角色,这场战斗我方角色攻击力下降 [打印本页]

作者: mkl7788    时间: 2020-6-6 16:06
标题: 敌人攻击我方角色,这场战斗我方角色攻击力下降
我自己试过,可以实现,不过有问题,
A角色atk= 10,被敌人攻击,A角色atk= 8,
战斗结束了  查看状态 ,A角色atk = 8,怎么变回战斗之前的攻击力

战斗的时候,我方被攻击的角色 攻击力减少1点,
战斗结束   ,攻击力变少的角色,回归战斗之前的那样 。
作者: Six_Fish    时间: 2020-6-6 18:37
每次战斗前先把攻击力代入变量存起来?
作者: chd114    时间: 2020-6-6 21:43
你是直接动了属性了吧···
做成状态就可以了,持续99999回合脱离战斗就解除的那种
作者: mkl7788    时间: 2020-6-6 22:37
本帖最后由 mkl7788 于 2020-6-6 22:39 编辑
chd114 发表于 2020-6-6 21:43
你是直接动了属性了吧···
做成状态就可以了,持续99999回合脱离战斗就解除的那种 ...


状态 我试过不行,
比如 角色攻击力是10
第一回合 被敌人攻击  附加了状态攻击力是90%,  现在攻击力变成了 9
第二回合 再被敌人攻击  附加了状态攻击力是90%, 仍然是9的攻击,变不了8攻击力
状态不叠加的


作者: 小姐姐一个    时间: 2020-6-6 23:11
mkl7788 发表于 2020-6-6 22:37
状态 我试过不行,
比如 角色攻击力是10
第一回合 被敌人攻击  附加了状态攻击力是90%,  现在攻击力变成 ...

搜索 状态叠加 没有的话向大佬砸钱qwq?
作者: zyzzyzzyzzyz    时间: 2020-6-6 23:20
如二楼 在战斗之前把攻击力存到变量里,然后战斗结束以后再改按数值回去?
或者做一个状态,每次被触发减攻击力1点,然后某变量+1,并消除该状态,最后在战斗结束后把攻击力再加上那个变量的数值?
(均未实测)
作者: Cupidk爱呗茶    时间: 2020-6-7 05:41
本帖最后由 Cupidk爱呗茶 于 2020-6-7 08:16 编辑

感觉这个问题很有意思就稍微研究了一下 写的比较仓促。。有什么问题就请联系层主吧
思路大概是战斗的伤害处理不在直接使用角色攻击力 新建一个战斗中的攻击力代替他 被特殊敌人攻击后降低的也是这个属性自然不会影响到真实的角色攻击  
试试看能不能满足需求
RUBY 代码复制
  1. # 使用方法: 插入脚本页Main前
  2. module SET_NEW
  3.   # 这里设置敌方每次攻击会降低多少角色攻击力
  4.   Reduce_atk = 100
  5.   # 指定攻击会降低角色攻击力的敌方ID
  6.   # 例 :[1,2,3] 即为数据库中 1,2,3号敌人
  7.   # 或者 Enemy_Reduct = 1..20 即代表1号到20号敌人攻击命中时会降低我方攻击力
  8.   Enemy_Reduct = [1,2,3]  
  9. end  
  10. # 设置结束。。下面为实现思路  ########
  11. class Game_Battler
  12.   attr_writer :atk_battler # 战斗中的攻击力
  13.   alias :new_2020607_initialize :initialize
  14.   def initialize
  15.     new_2020607_initialize
  16.     @atk_battler = 0
  17.   end
  18.   # 读取战斗中的攻击力属性
  19.   def atk_battler
  20.     atk = @atk_battler
  21.     @states.each do |i|
  22.      atk *= $data_states[i].atk_rate / 100.0
  23.     end
  24.     return Integer(atk)
  25.   end  
  26.   # 初始化战斗中攻击力
  27.   def atk_battler_init
  28.     @atk_battler = self.base_atk
  29.   end  
  30.   # 修改攻击公式
  31.   def attack_effect(attacker)
  32.     # 清除会心一击标志
  33.     self.critical = false
  34.     # 第一命中判定
  35.     hit_result = (rand(100) < attacker.hit)
  36.     # 命中的情况下
  37.     if hit_result == true
  38.       # 计算基本伤害
  39.       atk = [attacker.atk_battler - self.pdef / 2, 0].max #######
  40.       self.damage = atk * (20 + attacker.str) / 20 #######
  41.       # 属性修正
  42.       self.damage *= elements_correct(attacker.element_set)
  43.       self.damage /= 100
  44.       # 伤害符号正确的情况下
  45.       if self.damage > 0
  46.         # 会心一击修正
  47.         if rand(100) < 4 * attacker.dex / self.agi
  48.           self.damage *= 2
  49.           self.critical = true
  50.         end
  51.         # 防御修正
  52.         if self.guarding?
  53.           self.damage /= 2
  54.         end
  55.       end
  56.       # 分散
  57.       if self.damage.abs > 0
  58.         amp = [self.damage.abs * 15 / 100, 1].max
  59.         self.damage += rand(amp+1) + rand(amp+1) - amp
  60.       end
  61.       # 第二命中判定
  62.       eva = 8 * self.agi / attacker.dex + self.eva
  63.       hit = self.damage < 0 ? 100 : 100 - eva
  64.       hit = self.cant_evade? ? 100 : hit
  65.       hit_result = (rand(100) < hit)
  66.     end
  67.     # 命中的情况下
  68.     if hit_result == true
  69.       # 状态冲击解除
  70.       remove_states_shock
  71.       # HP 的伤害计算
  72.       self.hp -= self.damage
  73.       # 战斗中角色被攻击时降低攻击力 ######
  74.       if self.is_a?(Game_Actor) && SET_NEW::Enemy_Reduct.any?{|id| id === attacker.id}
  75.        self.atk_battler -= SET_NEW::Reduce_atk
  76.       end
  77.       # 状态变化
  78.       @state_changed = false
  79.       states_plus(attacker.plus_state_set)
  80.       states_minus(attacker.minus_state_set)
  81.     # Miss 的情况下
  82.     else
  83.       # 伤害设置为 "Miss"
  84.       self.damage = "Miss"
  85.       # 清除会心一击标志
  86.       self.critical = false
  87.     end
  88.     # 过程结束
  89.     return true
  90.   end
  91.  
  92.   # 修改特技公式
  93.   def skill_effect(user, skill)
  94.     # 清除会心一击标志
  95.     self.critical = false
  96.     # 特技的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
  97.     # 或者特技的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
  98.     if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
  99.        ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
  100.       # 过程结束
  101.       return false
  102.     end
  103.     # 清除有效标志
  104.     effective = false
  105.     # 公共事件 ID 是有效的情况下,设置为有效标志
  106.     effective |= skill.common_event_id > 0
  107.     # 第一命中判定
  108.     hit = skill.hit
  109.     if skill.atk_f > 0
  110.       hit *= user.hit / 100
  111.     end
  112.     hit_result = (rand(100) < hit)
  113.     # 不确定的特技的情况下设置为有效标志
  114.     effective |= hit < 100
  115.     # 命中的情况下
  116.     if hit_result == true
  117.       # 计算威力 ######
  118.       power = skill.power + user.atk_battler * skill.atk_f / 100
  119.       if power > 0
  120.         power -= self.pdef * skill.pdef_f / 200
  121.         power -= self.mdef * skill.mdef_f / 200
  122.         power = [power, 0].max
  123.       end
  124.       # 计算倍率
  125.       rate = 20
  126.       rate += (user.str * skill.str_f / 100)
  127.       rate += (user.dex * skill.dex_f / 100)
  128.       rate += (user.agi * skill.agi_f / 100)
  129.       rate += (user.int * skill.int_f / 100)
  130.       # 计算基本伤害
  131.       self.damage = power * rate / 20
  132.       # 属性修正
  133.       self.damage *= elements_correct(skill.element_set)
  134.       self.damage /= 100
  135.       # 伤害符号正确的情况下
  136.       if self.damage > 0
  137.         # 防御修正
  138.         if self.guarding?
  139.           self.damage /= 2
  140.         end
  141.       end
  142.       # 分散
  143.       if skill.variance > 0 and self.damage.abs > 0
  144.         amp = [self.damage.abs * skill.variance / 100, 1].max
  145.         self.damage += rand(amp+1) + rand(amp+1) - amp
  146.       end
  147.       # 第二命中判定
  148.       eva = 8 * self.agi / user.dex + self.eva
  149.       hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
  150.       hit = self.cant_evade? ? 100 : hit
  151.       hit_result = (rand(100) < hit)
  152.       # 不确定的特技的情况下设置为有效标志
  153.       effective |= hit < 100
  154.     end
  155.     # 命中的情况下
  156.     if hit_result == true
  157.       # 威力 0 以外的物理攻击的情况下
  158.       if skill.power != 0 and skill.atk_f > 0
  159.         # 状态冲击解除
  160.         remove_states_shock
  161.         # 设置有效标志
  162.         effective = true
  163.       end
  164.       # HP 的伤害减法运算
  165.       last_hp = self.hp
  166.       self.hp -= self.damage
  167.       effective |= self.hp != last_hp
  168.       # 状态变化
  169.       @state_changed = false
  170.       effective |= states_plus(skill.plus_state_set)
  171.       effective |= states_minus(skill.minus_state_set)
  172.       # 威力为 0 的场合
  173.       if skill.power == 0
  174.         # 伤害设置为空的字串
  175.         self.damage = ""
  176.         # 状态没有变化的情况下
  177.         unless @state_changed
  178.           # 伤害设置为 "Miss"
  179.           self.damage = "Miss"
  180.         end
  181.       end
  182.     # Miss 的情况下
  183.     else
  184.       # 伤害设置为 "Miss"
  185.       self.damage = "Miss"
  186.     end
  187.     # 不在战斗中的情况下
  188.     unless $game_temp.in_battle
  189.       # 伤害设置为 nil
  190.       self.damage = nil
  191.     end
  192.     # 过程结束
  193.     return effective
  194.   end
  195. end  
  196. # 初始化战斗中的攻击力数值
  197. class Scene_Battle
  198.   #--------------------------------------------------------------------------
  199.   # ● 主处理
  200.   #--------------------------------------------------------------------------
  201.   def main
  202.     # 初始化战斗用的各种暂时数据
  203.     $game_temp.in_battle = true
  204.     $game_temp.battle_turn = 0
  205.     $game_temp.battle_event_flags.clear
  206.     $game_temp.battle_abort = false
  207.     $game_temp.battle_main_phase = false
  208.     $game_temp.battleback_name = $game_map.battleback_name
  209.     $game_temp.forcing_battler = nil
  210.     # 初始化战斗用事件解释器
  211.     $game_system.battle_interpreter.setup(nil, 0)
  212.     # 准备队伍
  213.     @troop_id = $game_temp.battle_troop_id
  214.     $game_troop.setup(@troop_id)
  215.     # 生成角色命令窗口
  216.     s1 = $data_system.words.attack
  217.     s2 = $data_system.words.skill
  218.     s3 = $data_system.words.guard
  219.     s4 = $data_system.words.item
  220.     @actor_command_window = Window_Command.new(160, [s1, s2, s3, s4])
  221.     @actor_command_window.y = 160
  222.     @actor_command_window.back_opacity = 160
  223.     @actor_command_window.active = false
  224.     @actor_command_window.visible = false
  225.     # 生成其它窗口
  226.     @party_command_window = Window_PartyCommand.new
  227.     @help_window = Window_Help.new
  228.     @help_window.back_opacity = 160
  229.     @help_window.visible = false
  230.     @status_window = Window_BattleStatus.new
  231.     @message_window = Window_Message.new
  232.     # 生成活动块
  233.     @spriteset = Spriteset_Battle.new
  234.    # 此处为修改
  235.     # 初始化我方攻击力 ######
  236.     $game_party.actors.each {|actor| actor.atk_battler_init}
  237.     # 初始化敌方攻击力 ######
  238.     $game_troop.enemies.each {|enemy| enemy.atk_battler_init}
  239.     # 初始化等待计数
  240.     @wait_count = 0
  241.     # 执行过渡
  242.     if $data_system.battle_transition == ""
  243.       Graphics.transition(20)
  244.     else
  245.       Graphics.transition(40, "Graphics/Transitions/" +
  246.         $data_system.battle_transition)
  247.     end
  248.     # 开始自由战斗回合
  249.     start_phase1
  250.     # 主循环
  251.     loop do
  252.       # 刷新游戏画面
  253.       Graphics.update
  254.       # 刷新输入信息
  255.       Input.update
  256.       # 刷新画面
  257.       update
  258.       # 如果画面切换的话就中断循环
  259.       if $scene != self
  260.         break
  261.       end
  262.     end
  263.     # 刷新地图
  264.     $game_map.refresh
  265.     # 准备过渡
  266.     Graphics.freeze
  267.     # 释放窗口
  268.     @actor_command_window.dispose
  269.     @party_command_window.dispose
  270.     @help_window.dispose
  271.     @status_window.dispose
  272.     @message_window.dispose
  273.     if @skill_window != nil
  274.       @skill_window.dispose
  275.     end
  276.     if @item_window != nil
  277.       @item_window.dispose
  278.     end
  279.     if @result_window != nil
  280.       @result_window.dispose
  281.     end
  282.     # 释放活动块
  283.     @spriteset.dispose
  284.     # 标题画面切换中的情况
  285.     if $scene.is_a?(Scene_Title)
  286.       # 淡入淡出画面
  287.       Graphics.transition
  288.       Graphics.freeze
  289.     end
  290.     # 战斗测试或者游戏结束以外的画面切换中的情况
  291.     if $BTEST and not $scene.is_a?(Scene_Gameover)
  292.       $scene = nil
  293.     end
  294.   end
  295. end

作者: mkl7788    时间: 2020-6-7 10:04
Cupidk爱呗茶 发表于 2020-6-7 05:41
感觉这个问题很有意思就稍微研究了一下 写的比较仓促。。有什么问题就请联系层主吧
思路大概是战斗的伤害处 ...

谢谢大神,就是这样的效果
作者: SailCat    时间: 2020-6-7 22:33
之前有个需求比你这个复杂的贴子,你这个需求只是他的一个子集

https://rpg.blue/thread-481866-1-1.html

RUBY 代码复制
  1. class Game_Party
  2.         attr_reader :buffs
  3.         alias sailcat_initialize initialize
  4.         def initialize
  5.                 sailcat_initialize
  6.                 @buffs = {}
  7.         end
  8. end
  9.  
  10. class Game_Battler
  11.         alias sailcat_attack_effect attack_effect
  12.         alias sailcat_skill_effect skill_effect
  13.         def attack_effect(attacker)
  14.                 r = sailcat_attack_effect(attacker)
  15.                 if self.is_a?(Game_Actor) and attacker.is_a?(Game_Enemy)
  16.                         $game_party.buffs[[self.index, :atk]] = $game_party.buffs[[self.index, :atk]].to_i - 1
  17.                 end
  18.                 r
  19.         end
  20.         def skill_effect(user, skill)
  21.                 r = sailcat_skill_effect(user, skill)
  22.                 if self.is_a?(Game_Actor) and attacker.is_a?(Game_Enemy)
  23.                         $game_party.buffs[[self.index, :atk]] = $game_party.buffs[[self.index, :atk]].to_i - 1
  24.                 end
  25.                 r
  26.         end
  27. end
  28.  
  29. class Game_Actor
  30.         def atk;        [super + $game_party.buffs[[self.index, :atk]].to_i, 0].max;        end
  31. end


另外,在战斗之后执行一下事件脚本:$game_party.buffs.clear
如果你用默认战斗的话就把上面这行插到Scene_Battle的battle_end里面:
RUBY 代码复制
  1. class Scene_Battle
  2.     alias sailcat_battle_end battle_end
  3.     def battle_end(result)
  4.          sailcat_battle_end(result)
  5.          $game_party.buffs.clear
  6.     end
  7. end





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