#============================================================================== # ■ 此脚本来自 [url]www.66rpg.com[/url] #------------------------------------------------------------------------------ # 名称:横版战斗模板 # 作者:后知后觉([email protected]) # 版本:v1.7 2012-02-09 # 使用协议:在保留此脚本相关信息的情况下 # 可任意使用、修改及修改后发布. # 如是修改后发布.请在作者标注那里加上 某某某改 等信息 # 感谢你来这里谈谈你对这个工程的看法或报告BUG. # [url]http://bbs.66rpg.com/thread-216673-1-1.html[/url] # 使用说明: # 请来发布帖查看: # [url]http://bbs.66rpg.com/thread-216673-1-1.html[/url] #============================================================================== module Hzhj module HorizontalBattleSystem # 取得参战角色的最大数.如果要改大.需要在下面的坐标设置里增加对应的条目 MaxBattleMembers = 5 ActorsBattlePosition = {} # 设置角色战斗图形的坐标 # 等号左边的[]号里面的1 2 3 4 表示角色在队伍里的位置 # 等号右边的[]号里面的两个数字分别表示 X坐标 Y坐标 # 每次进入战斗的时候都会以这里设置的信息作为初始化位置. # 如果你把上面的 MaxBattleMembers 改大了.比如改成了 5. # 那么你需要在下面新增一行代码设置队伍中第5位置的坐标. # 就像这样 ActorsBattlePosition[5] = [X坐标, Y坐标] ActorsBattlePosition[1] = [378, 228] ActorsBattlePosition[2] = [422, 272] ActorsBattlePosition[3] = [466, 228] ActorsBattlePosition[4] = [510, 272] ActorsBattlePosition[5] = [300, 272] # 设置伤害值图形的色相 取值范围 0~360 DamageBitmapHue = 0 # 伤害值分段显示的标志SE文件名 DamageSectionDisplaySEName = "DamageSection" # 动画 Z 坐标值默认变化量 DefaultAniAddZ = 768 # 状态动画 Z 坐标值默认变化量 DefaultLoopAniAddZ = 20 # 战斗中角色的面向 ActorDirection = 4 # 真位移的帧数 RealMoveDuration = 20 # 真位移移动前会计算目标点.会获取攻防双方战斗图大小来进行计算. # 下面2个是对战斗图 width height 进行修正. # 为正则扩大 为负则缩小.单位 像素. # 一般来说不必修改.只有像梦幻群侠传那种战斗图四边有很多透明区域时才修正. RealMoveBmpAddW = 0 RealMoveBmpAddH = 0 # 使用技能、物品的过程默认使用RMVA模式 # 在该模式下.本脚本提供的很多功能受限无法使用. DefaultUseRmvaMode = false # 默认显示敌人的HP条、MP条、TP条 DefaultDisplayEnemyBar = true # 一张战斗图中有几个样式(帧、格) DynamicPatternMax = 4 # 一张战斗图中的一个样式持续多少帧 OnePatternDuration = 15 # 角色使用战斗死亡图形 UseActorDeadGraphic = false # 敌人使用战斗死亡图形 UseEnemyDeadGraphic = false # 使用挨打图形 UseBeatenGraphic = true # 挨打图形维持帧数 BeatenGraphicDuration = 30 # 是否使用角色防御图 只有同时使用了挨打图.此项才有效. UseActorGuardGraphic = true # 是否使用敌人防御图 只有同时使用了挨打图.此项才有效. UseEnemyGuardGraphic = false # 角色是否使用挨打SE UseActorWBSE = true # 敌人是否使用挨打SE UseEnemyWBSE = true # 角色是否使用防御SE UseActorGDSE = true # 敌人是否使用防御SE UseEnemyGDSE = false end end class RPG::Actor < RPG::BaseItem def battler_name return @battler_name unless @battler_name.nil? if /@btname\[(.+?)\]/ =~ @note return (@battler_name = $1.clone) else return (@battler_name = "#{@name}_#{@nickname}") end end def battler_hue return @battler_hue unless @battler_hue.nil? if /@bthue\[([0-9]+?)\]/ =~ @note return (@battler_hue = $1.to_i.abs) else return (@battler_hue = 0) end end attr_writer :battler_name attr_writer :battler_hue end #============================================================================== # ■ Game_Actor #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● 属性(新增定义) #-------------------------------------------------------------------------- attr_writer :battler_name # 战斗图形文件名 attr_writer :battler_hue # 战斗图形色相 #-------------------------------------------------------------------------- # ● 设置(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_setup_for_add_actor_battle_graphic setup def setup(actor_id) hzhj_old_setup_for_add_actor_battle_graphic(actor_id) @battler_name = actor.battler_name @battler_hue = actor.battler_hue end #-------------------------------------------------------------------------- # ● 是否使用活动块(重定义) #-------------------------------------------------------------------------- def use_sprite? return true end #-------------------------------------------------------------------------- # ● 取得战斗画面 X 坐标(新增定义) #-------------------------------------------------------------------------- def screen_x return ActorsBattlePosition[index + 1][0] end #-------------------------------------------------------------------------- # ● 取得战斗画面 Y 坐标(新增定义) #-------------------------------------------------------------------------- def screen_y return ActorsBattlePosition[index + 1][1] end #-------------------------------------------------------------------------- # ● 取得战斗画面 Z 坐标(新增定义) #-------------------------------------------------------------------------- def screen_z return real_screen_y + 100 end end #============================================================================== # ■ Game_Enemy #============================================================================== class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # ● 属性(新增定义) #-------------------------------------------------------------------------- attr_writer :battler_name # 战斗图形文件名 attr_writer :battler_hue # 战斗图形色相 #-------------------------------------------------------------------------- # ● 取得战斗画面 Z 坐标(重定义) #-------------------------------------------------------------------------- def screen_z return real_screen_y + 100 end end #============================================================================== # ■ Game_Party #============================================================================== class Game_Party < Game_Unit include Hzhj::HorizontalBattleSystem #-------------------------------------------------------------------------- # ● 取得参战角色的最大数(重定义) #-------------------------------------------------------------------------- def max_battle_members return MaxBattleMembers end end class RPG::Animation def wait_subject_duration return @wait_subject_duration unless @wait_subject_duration.nil? if /@w\[(\-??\d+?)\]/ =~ @name @wait_subject_duration = $1.to_i else @wait_subject_duration = 0 end return @wait_subject_duration end attr_writer :wait_subject_duration end class RPG::UsableItem < RPG::BaseItem include Hzhj::HorizontalBattleSystem def animation1_id return @animation1_id unless @animation1_id.nil? if /@a1id\[(\d+?)\]/i =~ @note return (@animation1_id = $1.to_i) else return (@animation1_id = 0) end end def wljn return @wljn unless @wljn.nil? if /@wljn/i =~ @note return (@wljn = true) else return (@wljn = false) end end def rmva_mode return @rmva_mode unless @rmva_mode.nil? if /@rmva/i =~ @note return (@rmva_mode = !DefaultUseRmvaMode) else return (@rmva_mode = DefaultUseRmvaMode) end end attr_writer :animation1_id attr_writer :wljn attr_writer :rmva_mode end class RPG::Weapon < RPG::EquipItem def animation1_id return @animation1_id unless @animation1_id.nil? if /@a1id\[(\d+?)\]/ =~ @note return (@animation1_id = $1.to_i) else return (@animation1_id = 0) end end attr_writer :animation1_id end class RPG::Enemy < RPG::BaseItem def animation1_id return @animation1_id unless @animation1_id.nil? if /@a1id\[(\d+?)\]/ =~ @note return (@animation1_id = $1.to_i) else return (@animation1_id = 0) end end def animation2_id return @animation2_id unless @animation2_id.nil? if /@a2id\[(\d+?)\]/ =~ @note return (@animation2_id = $1.to_i) else return (@animation2_id = 0) end end def animation3_id return @animation3_id unless @animation3_id.nil? if /@a3id\[(\d+?)\]/ =~ @note return (@animation3_id = $1.to_i) else return (@animation3_id = 0) end end attr_writer :animation1_id attr_writer :animation2_id attr_writer :animation3_id end #============================================================================== # ■ Game_Actor #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● 取得普通攻击的行动方动画 ID (新增定义) #-------------------------------------------------------------------------- def animation1_id if dual_wield? return weapons[0].animation1_id if weapons[0] return weapons[1] ? weapons[1].animation1_id : 0 else return weapons[0] ? weapons[0].animation1_id : 0 end end end #============================================================================== # ■ Game_Enemy #============================================================================== class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # ● 取得普通攻击的行动方动画 ID (新增定义) #-------------------------------------------------------------------------- def animation1_id return enemy.animation1_id end #-------------------------------------------------------------------------- # ● 取得普通攻击的动画 ID (新增定义) #-------------------------------------------------------------------------- def atk_animation_id1 return enemy.animation2_id end #-------------------------------------------------------------------------- # ● 取得普通攻击的动画 ID (二刀流:武器2)(新增定义) #-------------------------------------------------------------------------- def atk_animation_id2 return enemy.animation3_id end end #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle < Scene_Base include Hzhj::HorizontalBattleSystem #-------------------------------------------------------------------------- # ● 使用技能/物品(重定义) #-------------------------------------------------------------------------- def use_item item = @subject.current_action.item @log_window.display_use_item(@subject, item) @subject.use_item(item) refresh_status targets = @subject.current_action.make_targets.compact show_animation(targets, item.animation_id) end #-------------------------------------------------------------------------- # ● 显示动画(重定义) #-------------------------------------------------------------------------- def show_animation(targets, animation_id) item = @subject.current_action.item if item.rmva_mode show_rmva_animation(targets, animation_id, item) else show_hzhj_animation(targets, animation_id, item) end end #-------------------------------------------------------------------------- # ● RMVA模式显示动画(新增定义) #-------------------------------------------------------------------------- def show_rmva_animation(targets, animation_id, item) @subject.damage_section_displayed = false @subject.not_damage_section = true targets.each do |target| target.damage_section_displayed = false target.not_damage_section = true end if animation_id < 0 show_attack_animation(targets) else show_rmva_usable_animation(targets, animation_id, item) end end #-------------------------------------------------------------------------- # ● HZHJ模式显示动画(新增定义) #-------------------------------------------------------------------------- def show_hzhj_animation(targets, animation_id, item) if animation_id < 0 show_hzhj_attack_animation(targets, item) else if item.wljn show_wljn_skill_animation(targets, animation_id, item) else show_magic_skill_animation(targets, animation_id, item) end end end #-------------------------------------------------------------------------- # ● HZHJ模式显示攻击动画(重定义) #-------------------------------------------------------------------------- def show_hzhj_attack_animation(targets, item) ary = [] need_move = false animation1 = $data_animations[@subject.animation1_id] need_move = animation1.need_move if animation1 come_back = true targets.each_with_index do |target, i| ary[0] = target item.repeats.times do next if target.dead? && item.damage.type == 1 next if @subject.dead? next if !@subject.current_action if need_move && come_back come_back = false @subject.setup_move_info(target, RealMoveDuration, animation1.move_se) wait_for_move end damage_target = hzhj_apply_item_effects(target, item) show_subject_animation(@subject.animation1_id) show_normal_animation(ary, @subject.atk_animation_id1, false) show_normal_animation(ary, @subject.atk_animation_id2, true) @log_window.wait wait_for_animation hzhj_invoke_item(target, item, damage_target) end if need_move if target != targets[i+1] or target.dead? come_back = true @subject.come_back_self_position(RealMoveDuration) wait_for_move else come_back = false end end end end #-------------------------------------------------------------------------- # ● HZHJ模式显示物理技能类动画(新增定义) #-------------------------------------------------------------------------- def show_wljn_skill_animation(targets, animation_id, item) ary = [] need_move = false animation1 = $data_animations[item.animation1_id] need_move = animation1.need_move if animation1 come_back = true targets.each_with_index do |target, i| ary[0] = target item.repeats.times do next if target.dead? && item.damage.type == 1 next if @subject.dead? next if !@subject.current_action if need_move && come_back come_back = false @subject.setup_move_info(target, RealMoveDuration, animation1.move_se) wait_for_move end damage_target = hzhj_apply_item_effects(target, item) show_subject_animation(item.animation1_id) show_normal_animation(ary, animation_id, false) @log_window.wait wait_for_animation hzhj_invoke_item(target, item, damage_target) end if need_move if target != targets[i+1] or target.dead? come_back = true @subject.come_back_self_position(RealMoveDuration) wait_for_move else come_back = false end end end end #-------------------------------------------------------------------------- # ● HZHJ模式显示魔法技能类动画(新增定义) #-------------------------------------------------------------------------- def show_magic_skill_animation(targets, animation_id, item) ary = [] damage_targets = {} item.repeats.times do next if @subject.dead? next if !@subject.current_action ary.clear damage_targets.clear targets.each do |target| next if target.dead? && item.damage.type == 1 ary << target damage_targets[target] = hzhj_apply_item_effects(target, item) end next if ary.empty? show_subject_animation(item.animation1_id) show_normal_animation(ary, animation_id) @log_window.wait wait_for_animation ary.each do |target| hzhj_invoke_item(target, item, damage_targets[target]) end if [9, 10].include?(item.scope) ary.each do |target| if target.alive? target.come_back_self_position(RealMoveDuration) end end wait_for_move end end end #-------------------------------------------------------------------------- # ● RMVA模式显示攻击动画(重定义) #-------------------------------------------------------------------------- def show_attack_animation(targets) item = @subject.current_action.item show_subject_animation(@subject.animation1_id) show_normal_animation(targets, @subject.atk_animation_id1, false) show_normal_animation(targets, @subject.atk_animation_id2, true) @log_window.wait wait_for_animation targets.each {|target| item.repeats.times { invoke_item(target, item) } } end #-------------------------------------------------------------------------- # ● RMVA模式显示技能、物品动画 (新增定义) #-------------------------------------------------------------------------- def show_rmva_usable_animation(targets, animation_id, item) show_subject_animation(item.animation1_id) show_normal_animation(targets, animation_id) @log_window.wait wait_for_animation targets.each {|target| item.repeats.times { invoke_item(target, item) } } if [9, 10].include?(item.scope) targets.each do |target| if target.alive? target.come_back_self_position(RealMoveDuration) end end wait_for_move end end #-------------------------------------------------------------------------- # ● 显示行动方动画(新增定义) #-------------------------------------------------------------------------- def show_subject_animation(animation_id, subject = @subject, mirror = false) animation = $data_animations[animation_id] if animation subject.animation_id = animation_id subject.animation_mirror = mirror if animation.wait_subject_duration < 0 wait_for_animation elsif animation.wait_subject_duration > 0 animation.wait_subject_duration.times{update_for_wait} end end end end class RPG::Animation include Hzhj::HorizontalBattleSystem def ani_z_correction return @ani_z_correction unless @ani_z_correction.nil? if /@az\[(\-??\d+?)\]/ =~ @name return (@ani_z_correction = $1.to_i) else return (@ani_z_correction = DefaultAniAddZ) end end def loop_z_correction return @loop_z_correction unless @loop_z_correction.nil? if /@lz\[(\-??\d+?)\]/ =~ @name return (@loop_z_correction = $1.to_i) else return (@loop_z_correction = DefaultLoopAniAddZ) end end attr_writer :ani_z_correction attr_writer :loop_z_correction end class RPG::State < RPG::BaseItem def animation_id return @animation_id unless @animation_id.nil? if /@aid\[(\d+?)\]/ =~ @note return (@animation_id = $1.to_i) else return (@animation_id = 0) end end attr_writer :animation_id end #============================================================================== # ■ Game_BattlerBase #============================================================================== class Game_BattlerBase #-------------------------------------------------------------------------- # ● 实例变量(新增定义) #-------------------------------------------------------------------------- attr_reader :hzhj_add_state_id attr_reader :hzhj_remove_state_id attr_accessor :need_update_state_animation #-------------------------------------------------------------------------- # ● 初始化(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_init_for_state_ani_game_battler_base initialize def initialize @hzhj_add_state_id = [] @hzhj_remove_state_id = [] @need_update_state_animation = false @states = [] @state_turns = {} @state_steps = {} hzhj_old_init_for_state_ani_game_battler_base end #-------------------------------------------------------------------------- # ● 清除状态信息(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_clear_states_for_state_ani_game_battler_base clear_states def clear_states old_states = @states.clone hzhj_old_clear_states_for_state_ani_game_battler_base bingji = old_states | @states return if bingji.empty? set_add_state_id(bingji & @states) set_remove_state_id(bingji & old_states) end #-------------------------------------------------------------------------- # ● 消除状态(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_erase_state_for_state_ani_game_battler_base erase_state def erase_state(state_id) old_states = @states.clone hzhj_old_erase_state_for_state_ani_game_battler_base(state_id) bingji = old_states | @states return if bingji.empty? set_add_state_id(bingji & @states) set_remove_state_id(bingji & old_states) end #-------------------------------------------------------------------------- # ● 设置增加的状态(新增定义) #-------------------------------------------------------------------------- def set_add_state_id(zjdzt) for i in zjdzt if $data_states[i].animation_id > 0 if not @hzhj_add_state_id.include?(i) @hzhj_add_state_id.push(i) end end end end #-------------------------------------------------------------------------- # ● 设置解除的状态(新增定义) #-------------------------------------------------------------------------- def set_remove_state_id(jsdzt) for i in jsdzt if $data_states[i].animation_id > 0 if not @hzhj_remove_state_id.include?(i) ani_id = $data_states[i].animation_id not_end_loop_animation = false for state in self.states if state.animation_id == ani_id not_end_loop_animation = true break end end unless not_end_loop_animation @hzhj_remove_state_id.push(i) end end end end end end #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # ● 附加新的状态(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_add_new_state_for_state_ani_game_battler add_new_state def add_new_state(state_id) old_states = @states.clone hzhj_old_add_new_state_for_state_ani_game_battler(state_id) bingji = old_states | @states return if bingji.empty? set_add_state_id(bingji & @states) set_remove_state_id(bingji & old_states) end end #============================================================================== # ■ Sprite_Base #============================================================================== class Sprite_Base < Sprite #-------------------------------------------------------------------------- # ● 初始化(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_init_for_state_ani_spr_base initialize def initialize(*args) hzhj_old_init_for_state_ani_spr_base(*args) @hzhj_loop_animations = [] @hzhj_loop_durations = {} @hzhj_loop_sprites = {} @hzhj_loop_bitmap1s = {} @hzhj_loop_bitmap2s = {} @hzhj_loop_ani_oxs = {} @hzhj_loop_ani_oys = {} @flash_nil_duration = 0 end #-------------------------------------------------------------------------- # ● 释放(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_dispose_for_state_ani_spr_base dispose def dispose dispose_loop_animation hzhj_old_dispose_for_state_ani_spr_base end #-------------------------------------------------------------------------- # ● 设定动画的活动块(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_ani_set_spr_for_state_ani_spr_base animation_set_sprites def animation_set_sprites(*args) hzhj_old_ani_set_spr_for_state_ani_spr_base(*args) @ani_sprites.each{|sprite|sprite.z += @animation.ani_z_correction} end #-------------------------------------------------------------------------- # ● 判断是否有循环动画(新增定义) #-------------------------------------------------------------------------- def loop_animation? return (not @hzhj_loop_animations.empty?) end #-------------------------------------------------------------------------- # ● 开始播放循环动画(新增定义) #-------------------------------------------------------------------------- def start_loop_animation(animation) return if @hzhj_loop_animations.include?(animation) if animation.nil? dispose_loop_animation return end set_animation_rate @hzhj_loop_animations.push(animation) init_loop_animation_duration(animation) load_loop_animation_bitmap(animation) make_loop_animation_sprites(animation) set_loop_animation_origin(animation) end #-------------------------------------------------------------------------- # ● 初始化循环动画播放位置(新增定义) #-------------------------------------------------------------------------- def init_loop_animation_duration(animation) @hzhj_loop_durations[animation] = animation.frame_max * @ani_rate + 1 end #-------------------------------------------------------------------------- # ● 读取循环动画图像(新增定义) #-------------------------------------------------------------------------- def load_loop_animation_bitmap(animation) animation1_name = animation.animation1_name animation1_hue = animation.animation1_hue animation2_name = animation.animation2_name animation2_hue = animation.animation2_hue bitmap1 = Cache.animation(animation1_name, animation1_hue) bitmap2 = Cache.animation(animation2_name, animation2_hue) if @@_reference_count.include?(bitmap1) @@_reference_count[bitmap1] += 1 else @@_reference_count[bitmap1] = 1 end if @@_reference_count.include?(bitmap2) @@_reference_count[bitmap2] += 1 else @@_reference_count[bitmap2] = 1 end @hzhj_loop_bitmap1s[animation] = bitmap1 @hzhj_loop_bitmap2s[animation] = bitmap2 Graphics.frame_reset end #-------------------------------------------------------------------------- # ● 生成循环动画活动块(新增定义) #-------------------------------------------------------------------------- def make_loop_animation_sprites(animation) sprites = [] if @use_sprite 16.times do sprite = ::Sprite.new(viewport) sprite.visible = false sprites.push(sprite) end end @hzhj_loop_sprites[animation] = sprites end #-------------------------------------------------------------------------- # ● 设定循环动画的原点(新增定义) #-------------------------------------------------------------------------- def set_loop_animation_origin(animation) if animation.position == 3 if viewport == nil ani_ox = Graphics.width / 2 ani_oy = Graphics.height / 2 else ani_ox = viewport.rect.width / 2 ani_oy = viewport.rect.height / 2 end else ani_ox = x - ox + width / 2 ani_oy = y - oy + height / 2 if animation.position == 0 ani_oy -= height / 2 elsif animation.position == 2 ani_oy += height / 2 end end @hzhj_loop_ani_oxs[animation] = ani_ox @hzhj_loop_ani_oys[animation] = ani_oy end #-------------------------------------------------------------------------- # ● 释放所有循环动画(新增定义) #-------------------------------------------------------------------------- def dispose_loop_animation return unless loop_animation? for animation in @hzhj_loop_animations.clone end_loop_animation(animation) end @hzhj_loop_durations.clear @hzhj_loop_sprites.clear @hzhj_loop_bitmap1s.clear @hzhj_loop_bitmap2s.clear @hzhj_loop_ani_oxs.clear @hzhj_loop_ani_oys.clear @hzhj_loop_animations.clear end #-------------------------------------------------------------------------- # ● 结束某个循环动画(新增定义) #-------------------------------------------------------------------------- def end_loop_animation(animation) return if not @hzhj_loop_animations.include?(animation) bitmap1 = @hzhj_loop_bitmap1s[animation] @@_reference_count[bitmap1] -= 1 if @@_reference_count[bitmap1] == 0 @@_reference_count.delete(bitmap1) bitmap1.dispose end bitmap2 = @hzhj_loop_bitmap2s[animation] @@_reference_count[bitmap2] -= 1 if @@_reference_count[bitmap2] == 0 @@_reference_count.delete(bitmap2) bitmap2.dispose end sprites = @hzhj_loop_sprites[animation] for sprite in sprites sprite.dispose end @hzhj_loop_durations.delete(animation) @hzhj_loop_sprites.delete(animation) @hzhj_loop_bitmap1s.delete(animation) @hzhj_loop_bitmap2s.delete(animation) @hzhj_loop_ani_oxs.delete(animation) @hzhj_loop_ani_oys.delete(animation) @hzhj_loop_animations.delete(animation) end #-------------------------------------------------------------------------- # ● 刷新(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_update_for_state_ani_spr_base update def update hzhj_old_update_for_state_ani_spr_base update_loop_animation end #-------------------------------------------------------------------------- # ● 刷新循环动画(新增定义) #-------------------------------------------------------------------------- def update_loop_animation @flash_nil_duration -= 1 if @flash_nil_duration > 0 return unless loop_animation? for animation in @hzhj_loop_animations @hzhj_loop_durations[animation] -= 1 duration = @hzhj_loop_durations[animation] if duration % @ani_rate == 0 if duration > 0 set_loop_animation_origin(animation) frame_index = animation.frame_max frame_index -= (duration + @ani_rate - 1) / @ani_rate args = [] args[0] = @hzhj_loop_sprites[animation] args[1] = @hzhj_loop_bitmap1s[animation] args[2] = @hzhj_loop_bitmap2s[animation] args[3] = @hzhj_loop_ani_oxs[animation] args[4] = @hzhj_loop_ani_oys[animation] args[5] = animation.loop_z_correction args[6] = ((not flash_nil? or animation.to_screen?) and visible) loop_animation_set_sprites(animation.frames[frame_index], args) animation.timings.each do |timing| loop_animation_process_timing(timing) if timing.frame == frame_index end else init_loop_animation_duration(animation) redo end end end end #-------------------------------------------------------------------------- # ● 设定循环动画的活动块(新增定义) #-------------------------------------------------------------------------- def loop_animation_set_sprites(frame, args) sprites = args[0] bitmap1 = args[1] bitmap2 = args[2] ani_ox = args[3] ani_oy = args[4] loop_z_correction = args[5] state_visible = args[6] cell_data = frame.cell_data sprites.each_with_index do |sprite, i| next unless sprite pattern = cell_data[i, 0] if !pattern || pattern < 0 sprite.visible = false next end sprite.bitmap = pattern < 100 ? bitmap1 : bitmap2 sprite.visible = state_visible sprite.src_rect.set(pattern % 5 * 192, pattern % 100 / 5 * 192, 192, 192) sprite.x = ani_ox + cell_data[i, 1] sprite.y = ani_oy + cell_data[i, 2] sprite.angle = cell_data[i, 4] sprite.mirror = (cell_data[i, 5] == 1) if loop_z_correction > 9999 sprite.z = loop_z_correction % 10000 + i elsif loop_z_correction < -9999 sprite.z = loop_z_correction % -10000 + i else sprite.z = self.z + loop_z_correction + i end sprite.ox = 96 sprite.oy = 96 sprite.zoom_x = cell_data[i, 3] / 100.0 sprite.zoom_y = cell_data[i, 3] / 100.0 sprite.opacity = cell_data[i, 6] * self.opacity / 255.0 sprite.blend_type = cell_data[i, 7] end end #-------------------------------------------------------------------------- # ● 循环动画SE 和闪烁时机的处理(新增定义) #-------------------------------------------------------------------------- def loop_animation_process_timing(timing) timing.se.play case timing.flash_scope when 1 self.flash(timing.flash_color, timing.flash_duration * @ani_rate) when 2 if viewport viewport.flash(timing.flash_color, timing.flash_duration * @ani_rate) end when 3 self.flash(nil, timing.flash_duration * @ani_rate) end end #-------------------------------------------------------------------------- # ● 设置闪烁(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_flash_for_state_ani_spr_base flash def flash(*args) if args[0].nil? @flash_nil_duration = args[1] else @flash_nil_duration = 0 end hzhj_old_flash_for_state_ani_spr_base(*args) end #-------------------------------------------------------------------------- # ● 判断是否正处于【隐藏目标】(新增定义) #-------------------------------------------------------------------------- def flash_nil? return (@flash_nil_duration > 0) end end #============================================================================== # ■ Sprite_Battler #============================================================================== class Sprite_Battler < Sprite_Base #-------------------------------------------------------------------------- # ● 初始化(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_init_for_state_ani_spr_battler initialize def initialize(*args) hzhj_old_init_for_state_ani_spr_battler(*args) init_battler_add_state_id end #-------------------------------------------------------------------------- # ● 初始化战斗者要播放状态动画的状态(新增定义) #-------------------------------------------------------------------------- def init_battler_add_state_id if @battler.nil? dispose_loop_animation else @battler.hzhj_add_state_id.clear @battler.hzhj_remove_state_id.clear @battler.need_update_state_animation = true for state in @battler.states next if state.nil? next if $data_animations[state.animation_id].nil? @battler.hzhj_add_state_id.push(state.id) end end end #-------------------------------------------------------------------------- # ● 设置战斗者(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_battlerdy_for_state_ani_spr_battler battler= def battler=(value) old_battler = @battler hzhj_old_battlerdy_for_state_ani_spr_battler(value) if old_battler != @battler init_battler_add_state_id end end #-------------------------------------------------------------------------- # ● 刷新(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_update_for_state_ani_spr_battler update def update hzhj_old_update_for_state_ani_spr_battler if @battler if @battler.need_update_state_animation @battler.need_update_state_animation = false if not @battler.hzhj_add_state_id.empty? for i in @battler.hzhj_add_state_id if @battler.state?(i) ani_id = $data_states[i].animation_id animation = $data_animations[ani_id] start_loop_animation(animation) if not animation.nil? end end @battler.hzhj_add_state_id.clear end if not @battler.hzhj_remove_state_id.empty? for i in @battler.hzhj_remove_state_id if not @battler.state?(i) ani_id = $data_states[i].animation_id animation = $data_animations[ani_id] end_loop_animation(animation) if not animation.nil? end end @battler.hzhj_remove_state_id.clear end end end end end #============================================================================== # ■ Window_BattleLog #============================================================================== class Window_BattleLog < Window_Selectable #-------------------------------------------------------------------------- # ● 显示状态附加/解除(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_display_status_for_state_ani_wnd_btlog display_changed_states def display_changed_states(target) target.need_update_state_animation = true hzhj_old_display_status_for_state_ani_wnd_btlog(target) end end #============================================================================== # ■ Sprite_Damage (新增类) #============================================================================== class Sprite_Damage < Sprite include Hzhj::HorizontalBattleSystem #-------------------------------------------------------------------------- # ● 获取/生成伤害值源图 #-------------------------------------------------------------------------- @@obmp = nil def self.obmp if @@obmp.nil? or @@obmp.disposed? @@obmp = Bitmap.new(180, 256) @@obmp.font.bold = true @@obmp.font.shadow = false @@obmp.font.outline = true @@obmp.font.out_color = Color.new(255, 255, 255, 255) @@obmp.font.size = 32 colors = [] colors.push(Color.new(255, 0, 0, 255)) colors.push(Color.new(255, 128, 128, 255)) colors.push(Color.new( 0, 0, 255, 255)) colors.push(Color.new(128, 128, 255, 255)) colors.push(Color.new( 0, 255, 0, 255)) colors.push(Color.new(128, 255, 128, 255)) colors.each_with_index do |color, hi| @@obmp.font.color = color for wi in 0..9 @@obmp.draw_text(wi * 18, hi * 32, 18, 32, "#{wi}", 1) end end @@obmp.font.size = 20 @@obmp.font.italic = true @@obmp.font.out_color = Color.new(0, 0, 0, 255) @@obmp.font.color = Color.new(255, 255, 255, 255) @@obmp.draw_text( 0, 192, 90, 32, "Critical", 1) @@obmp.draw_text(90, 192, 90, 32, "Miss", 1) @@obmp.draw_text( 0, 224, 90, 32, "Evasion", 1) @@obmp.hue_change(DamageBitmapHue) end return @@obmp end #-------------------------------------------------------------------------- # ● 初始化 #-------------------------------------------------------------------------- def initialize(viewport, args) super(viewport) @type = args[0] @value = args[1] @critical = args[2] self.x = args[4] self.y = args[5] self.z = args[6] + Graphics.height * 5 make_move(args[3]) refresh end #-------------------------------------------------------------------------- # ● 生成移动数据 #-------------------------------------------------------------------------- def make_move(battler_obj_class) @move = [] case battler_obj_class when :actor make_move_actor when :enemy make_move_enemy else make_move_default end end #-------------------------------------------------------------------------- # ● 生成移动数据 默认 #-------------------------------------------------------------------------- def make_move_default 45.times do |n| if n % 3 == 0 ady = n < 21 ? -6 : -1 opa = n < 21 ? 255 : 255-(n-21)*6 @move.push([0, ady, opa]) else @move.push([0, 0, -1]) end end end #-------------------------------------------------------------------------- # ● 生成移动数据 角色 #-------------------------------------------------------------------------- def make_move_actor make_move_default end #-------------------------------------------------------------------------- # ● 生成移动数据 敌人 #-------------------------------------------------------------------------- def make_move_enemy make_move_default end #-------------------------------------------------------------------------- # ● 描绘 #-------------------------------------------------------------------------- def refresh if not self.bitmap.nil? self.bitmap.dispose self.bitmap = nil end begin @obmp = Cache.animation("damage", DamageBitmapHue) rescue Errno::ENOENT @obmp = Sprite_Damage.obmp end @numw = @obmp.width / 10 @numh = @obmp.height / 8 @strw = @obmp.width / 2 case @value when Numeric blt_obmp_numeric when Symbol blt_obmp_text end end #-------------------------------------------------------------------------- # ● 通过源图描绘数字 #-------------------------------------------------------------------------- def blt_obmp_numeric nums = @value.to_i.abs.to_s.split("") nbmpw = nums.size * @numw bmph = @numh cbmpw = 0 crect = nil dy = 0 if @critical cbmpw = @strw bmph *= 2 crect = Rect.new(0, @numh * 6, @strw, @numh) dy = @numh end self.bitmap = Bitmap.new([nbmpw, cbmpw, 32].max, [bmph, 32].max) self.ox = bitmap.width / 2 self.oy = bmph /2 bitmap.blt((bitmap.width - cbmpw) / 2, 0, @obmp, crect) if crect dx = (bitmap.width - nbmpw) / 2 ry = 0 case @type when :hp ry = @value >= 0 ? 0 : @numh when :mp ry = @value >= 0 ? @numh * 2 : @numh * 3 when :tp ry = @value >= 0 ? @numh * 4 : @numh * 5 else return end rect = Rect.new(0, ry, @numw, @numh) nums.each_with_index do |str, i| rect.x = str.to_i * @numw bitmap.blt(dx, dy, @obmp, rect) dx += @numw end end #-------------------------------------------------------------------------- # ● 通过源图描绘文字 #-------------------------------------------------------------------------- def blt_obmp_text self.bitmap = Bitmap.new([@strw, 32].max, [@numh, 32].max) self.ox = @strw / 2 self.oy = @numh / 2 rx = ry = 0 case @type when :miss rx = @strw ry = @numh * 6 when :eva ry = @numh * 7 else return end rect = Rect.new(rx, ry, @strw, @numh) bitmap.blt(0, 0, @obmp, rect) end #-------------------------------------------------------------------------- # ● 释放 #-------------------------------------------------------------------------- def dispose bitmap.dispose if bitmap super end #-------------------------------------------------------------------------- # ● 移动中判定 #-------------------------------------------------------------------------- def moving? return (not @move.empty?) end #-------------------------------------------------------------------------- # ● 刷新 #-------------------------------------------------------------------------- def update super if moving? ary = @move.shift self.x += ary[0] self.y += ary[1] self.opacity = ary[2] if ary[2] >= 0 end end end #============================================================================== # ■ Game_BattlerBase #============================================================================== class Game_BattlerBase #-------------------------------------------------------------------------- # ● 实例变量(新增定义) #-------------------------------------------------------------------------- attr_accessor :hzhj_damage #-------------------------------------------------------------------------- # ● 初始化(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_init_for_display_damage_game_battler_base initialize def initialize @hzhj_damage = [] hzhj_old_init_for_display_damage_game_battler_base end end #============================================================================== # ■ Sprite_Base #============================================================================== class Sprite_Base < Sprite #-------------------------------------------------------------------------- # ● 初始化(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_init_for_display_damage_spr_base initialize def initialize(*args) hzhj_old_init_for_display_damage_spr_base(*args) @hzhj_damage_sprites = [] end #-------------------------------------------------------------------------- # ● 释放(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_dispose_for_display_damage_spr_base dispose def dispose hzhj_old_dispose_for_display_damage_spr_base dispose_damage end #-------------------------------------------------------------------------- # ● 判断是否有伤害在显示(新增定义) #-------------------------------------------------------------------------- def damage? return (not @hzhj_damage_sprites.empty?) end #-------------------------------------------------------------------------- # ● 开始显示伤害(新增定义) #-------------------------------------------------------------------------- def start_damage(args) args[4] = x - ox + width / 2 args[5] = y - oy + height / 2 args[6] = z @hzhj_damage_sprites.push(Sprite_Damage.new(viewport, args)) end #-------------------------------------------------------------------------- # ● 释放所有伤害显示(新增定义) #-------------------------------------------------------------------------- def dispose_damage return unless damage? @hzhj_damage_sprites.each{|sprite|sprite.dispose} @hzhj_damage_sprites.clear end #-------------------------------------------------------------------------- # ● 刷新(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_update_for_display_damage_spr_base update def update hzhj_old_update_for_display_damage_spr_base update_damage end #-------------------------------------------------------------------------- # ● 刷新显示伤害(新增定义) #-------------------------------------------------------------------------- def update_damage return unless damage? @hzhj_damage_sprites.each_with_index do |sprite, i| if sprite.moving? sprite.update else sprite.dispose @hzhj_damage_sprites[i] = nil end end @hzhj_damage_sprites.delete(nil) end end #============================================================================== # ■ Sprite_Battler #============================================================================== class Sprite_Battler < Sprite_Base #-------------------------------------------------------------------------- # ● 刷新(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_update_for_display_damage_spr_battler update def update hzhj_old_update_for_display_damage_spr_battler if @battler if not @battler.hzhj_damage.empty? unless @battler.damage_section_displayed args = @battler.hzhj_damage.clone args[3] = @battler.actor? ? :actor : (@battler.enemy? ? :enemy : nil) start_damage(args) end @battler.hzhj_damage.clear end end end end #============================================================================== # ■ Window_BattleLog #============================================================================== class Window_BattleLog < Window_Selectable #-------------------------------------------------------------------------- # ● 显示 MISS (追加定义) #-------------------------------------------------------------------------- alias hzhj_old_display_miss_for_display_damage_wnd_btlog display_miss def display_miss(target, item) target.hzhj_damage = [:miss, :miss, false] hzhj_old_display_miss_for_display_damage_wnd_btlog(target, item) end #-------------------------------------------------------------------------- # ● 显示回避 (追加定义) #-------------------------------------------------------------------------- alias hzhj_old_display_evasion_for_display_damage_wnd_btlog display_evasion def display_evasion(target, item) target.hzhj_damage = [:eva, :evasion, false] hzhj_old_display_evasion_for_display_damage_wnd_btlog(target, item) end #-------------------------------------------------------------------------- # ● 显示 HP 伤害 (追加定义) #-------------------------------------------------------------------------- alias hzhj_old_display_hp_damage_for_display_damage_wnd_btlog display_hp_damage def display_hp_damage(target, item) return if target.result.hp_damage == 0 && item && !item.damage.to_hp? value = target.result.hp_damage critical = target.result.critical target.hzhj_damage = [:hp, value, critical] hzhj_old_display_hp_damage_for_display_damage_wnd_btlog(target, item) end #-------------------------------------------------------------------------- # ● 显示 MP 伤害 (追加定义) #-------------------------------------------------------------------------- alias hzhj_old_display_mp_damage_for_display_damage_wnd_btlog display_mp_damage def display_mp_damage(target, item) return if target.dead? || target.result.mp_damage == 0 value = target.result.mp_damage critical = target.result.critical target.hzhj_damage = [:mp, value, critical] hzhj_old_display_mp_damage_for_display_damage_wnd_btlog(target, item) end #-------------------------------------------------------------------------- # ● 显示 TP 伤害 (追加定义) #-------------------------------------------------------------------------- alias hzhj_old_display_tp_damage_for_display_damage_wnd_btlog display_tp_damage def display_tp_damage(target, item) return if target.dead? || target.result.tp_damage == 0 value = target.result.tp_damage critical = target.result.critical target.hzhj_damage = [:tp, value, critical] hzhj_old_display_tp_damage_for_display_damage_wnd_btlog(target, item) end end class RPG::Animation def need_move return @need_move unless @need_move.nil? if /@[Rr][Mm]/ =~ @name return (@need_move = true) else return (@need_move = false) end end def move_se return @move_se unless @move_se.nil? @move_se = RPG::SE.new if /@[Ss][Ee]\[(.+?)\]/ =~ @name @move_se.name = $1.clone end return @move_se end attr_writer :need_move attr_writer :move_se end #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler < Game_BattlerBase include Hzhj::HorizontalBattleSystem #-------------------------------------------------------------------------- # ● 属性 #-------------------------------------------------------------------------- attr_accessor :add_x # X 坐标变化量 attr_accessor :add_y # Y 坐标变化量 attr_accessor :move_speed_x # 战斗图 X 移动速度 attr_accessor :move_speed_y # 战斗图 Y 移动速度 #-------------------------------------------------------------------------- # ● 初始化(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_init_for_real_move_game_battler initialize def initialize @add_x = 0 @add_y = 0 @move_speed_x = 0 @move_speed_y = 0 hzhj_old_init_for_real_move_game_battler end #-------------------------------------------------------------------------- # ● 真实 X 坐标(新增定义) #-------------------------------------------------------------------------- def real_screen_x return screen_x + add_x end #-------------------------------------------------------------------------- # ● 真实 Y 坐标(新增定义) #-------------------------------------------------------------------------- def real_screen_y return screen_y + add_y end #-------------------------------------------------------------------------- # ● 返回自己的战斗位置(新增定义) #-------------------------------------------------------------------------- def come_back_self_position(duration) return if dead? tx = screen_x ty = screen_y addx = tx - real_screen_x addy = ty - real_screen_y return if addx == 0 && addy == 0 @add_x = 0 @add_y = 0 @move_speed_x = [(addx.abs / duration.to_f).ceil, 1].max @move_speed_y = [(addy.abs / duration.to_f).ceil, 1].max end #-------------------------------------------------------------------------- # ● 设置移动信息(新增定义) #-------------------------------------------------------------------------- def setup_move_info(target_battler, duration, move_se) return if dead? tbmp = Cache.battler(target_battler.battler_name, target_battler.battler_hue) sbmp = Cache.battler(@battler_name, @battler_hue) tbw = tbmp.width / DynamicPatternMax + RealMoveBmpAddW sbw = sbmp.width / DynamicPatternMax + RealMoveBmpAddW tbh = tbmp.height + RealMoveBmpAddH sbh = sbmp.height + RealMoveBmpAddH d = actor? ? ActorDirection : 10 - ActorDirection tx = target_battler.real_screen_x ty = target_battler.real_screen_y case d when 1 tx = tx + tbw / 2 + sbw / 2 ty = ty - sbh / 2 when 2 ty = ty - sbh / 2 when 3 tx = tx - tbw / 2 - sbw / 2 ty = ty - sbh / 2 when 4 tx = tx + tbw / 2 + sbw / 2 when 6 tx = tx - tbw / 2 - sbw / 2 when 7 tx = tx + tbw / 2 + sbw / 2 ty = ty + sbh / 2 when 8 ty = ty + sbh / 2 when 9 tx = tx - tbw / 2 - sbw / 2 ty = ty + sbh / 2 end addx = tx - real_screen_x addy = ty - real_screen_y return if addx == 0 && addy == 0 @add_x = tx - screen_x if addx != 0 @add_y = ty - screen_y if addy != 0 @move_speed_x = [(addx.abs / duration.to_f).ceil, 1].max @move_speed_y = [(addy.abs / duration.to_f).ceil, 1].max move_se.play end end #============================================================================== # ■ Sprite_Battler #============================================================================== class Sprite_Battler < Sprite_Base #-------------------------------------------------------------------------- # ● 初始化(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_init_for_real_move_spr_battler initialize def initialize(viewport, battler = nil) hzhj_old_init_for_real_move_spr_battler(viewport, battler) init_position(@battler) if @battler end #-------------------------------------------------------------------------- # ● 设置战斗者(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_set_battler_for_real_move_spr_battler battler= def battler=(value) if @battler != value && value init_position(value) end hzhj_old_set_battler_for_real_move_spr_battler(value) end #-------------------------------------------------------------------------- # ● 初始化位置(新增定义) #-------------------------------------------------------------------------- def init_position(battler) battler.add_x = 0 battler.add_y = 0 self.x = battler.real_screen_x self.y = battler.real_screen_y self.z = battler.screen_z end #-------------------------------------------------------------------------- # ● 移动中判定(新增定义) #-------------------------------------------------------------------------- def moving? return false unless @battler (x != @battler.real_screen_x or y != @battler.real_screen_y) && @battler end #-------------------------------------------------------------------------- # ● 位置的更新(重定义) #-------------------------------------------------------------------------- def update_position if !@battler.dead? if x < @battler.real_screen_x self.x = [x + @battler.move_speed_x, @battler.real_screen_x].min elsif x > @battler.real_screen_x self.x = [x - @battler.move_speed_x, @battler.real_screen_x].max end if y < @battler.real_screen_y self.y = [y + @battler.move_speed_y, @battler.real_screen_y].min elsif y > @battler.real_screen_y self.y = [y - @battler.move_speed_y, @battler.real_screen_y].max end self.z = y + 100 end end end #============================================================================== # ■ Spriteset_Battle #============================================================================== class Spriteset_Battle #-------------------------------------------------------------------------- # ● 判定是否移动中(新增定义) #-------------------------------------------------------------------------- def moving? battler_sprites.any? {|sprite| sprite.moving? } end end #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ● 等待战斗图移动的结束(新增定义) #-------------------------------------------------------------------------- def wait_for_move update_for_wait update_for_wait while @spriteset.moving? end end class RPG::Troop include Hzhj::HorizontalBattleSystem def display_enemy_bar return @display_enemy_bar unless @display_enemy_bar.nil? if /@ebar/i =~ @name return (@display_enemy_bar = !DefaultDisplayEnemyBar) else return (@display_enemy_bar = DefaultDisplayEnemyBar) end end attr_writer :display_enemy_bar end #============================================================================== # ■ Game_Troop #============================================================================== class Game_Troop < Game_Unit attr_accessor :display_enemy_bar # 是否显示敌人HP条、MP条、TP条 #-------------------------------------------------------------------------- # ● 设置 #-------------------------------------------------------------------------- alias hzhj_old_setup_for_display_enemy_bar_game_troop setup def setup(troop_id) hzhj_old_setup_for_display_enemy_bar_game_troop(troop_id) @display_enemy_bar = troop.display_enemy_bar end end #============================================================================== # ■ Window_BattleEnemy #============================================================================== class Window_BattleEnemy < Window_Selectable #-------------------------------------------------------------------------- # ● 取得列数 #-------------------------------------------------------------------------- def col_max if $game_troop.display_enemy_bar return 1 else return 2 end end #-------------------------------------------------------------------------- # ● 刷新 #-------------------------------------------------------------------------- def refresh create_contents super end #-------------------------------------------------------------------------- # ● 描画项目 #-------------------------------------------------------------------------- def draw_item(index) if $game_troop.display_enemy_bar enemy = $game_troop.alive_members[index] draw_basic_area(basic_area_rect(index), enemy) draw_gauge_area(gauge_area_rect(index), enemy) else change_color(normal_color) name = $game_troop.alive_members[index].name draw_text(item_rect_for_text(index), name) end end #-------------------------------------------------------------------------- # ● 取得基本区域的矩形 #-------------------------------------------------------------------------- def basic_area_rect(index) rect = item_rect_for_text(index) rect.width -= gauge_area_width + 10 rect end #-------------------------------------------------------------------------- # ● 取得值槽区域的矩形 #-------------------------------------------------------------------------- def gauge_area_rect(index) rect = item_rect_for_text(index) rect.x += rect.width - gauge_area_width rect.width = gauge_area_width rect end #-------------------------------------------------------------------------- # ● 取得值槽区域的宽度 #-------------------------------------------------------------------------- def gauge_area_width return 220 end #-------------------------------------------------------------------------- # ● 描画基本区域 #-------------------------------------------------------------------------- def draw_basic_area(rect, actor) draw_actor_name(actor, rect.x + 0, rect.y, 100) draw_actor_icons(actor, rect.x + 104, rect.y, rect.width - 104) end #-------------------------------------------------------------------------- # ● 描画值槽区域 #-------------------------------------------------------------------------- def draw_gauge_area(rect, actor) if $data_system.opt_display_tp draw_gauge_area_with_tp(rect, actor) else draw_gauge_area_without_tp(rect, actor) end end #-------------------------------------------------------------------------- # ● 描画值槽区域(包括 TP 值) #-------------------------------------------------------------------------- def draw_gauge_area_with_tp(rect, actor) draw_actor_hp(actor, rect.x + 0, rect.y, 72) draw_actor_mp(actor, rect.x + 82, rect.y, 64) draw_actor_tp(actor, rect.x + 156, rect.y, 64) end #-------------------------------------------------------------------------- # ● 描画值槽区域(不包括 TP 值) #-------------------------------------------------------------------------- def draw_gauge_area_without_tp(rect, actor) draw_actor_hp(actor, rect.x + 0, rect.y, 134) draw_actor_mp(actor, rect.x + 144, rect.y, 76) end end #============================================================================== # ■ Sprite_Battler #============================================================================== class Sprite_Battler < Sprite_Base include Hzhj::HorizontalBattleSystem #-------------------------------------------------------------------------- # ● 初始化(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_init_for_dynamic_spr_battler initialize def initialize(viewport, battler = nil) hzhj_old_init_for_dynamic_spr_battler(viewport, battler) @dynamic_duration = 0 @dynamic_duration_max = DynamicPatternMax * OnePatternDuration end #-------------------------------------------------------------------------- # ● 源位图(Source Bitmap)的更新(重定义) #-------------------------------------------------------------------------- def update_bitmap new_bitmap = Cache.battler(@battler.battler_name, @battler.battler_hue) if bitmap != new_bitmap self.bitmap = new_bitmap init_visibility @dynamic_duration = 0 @sx = 0 @sw = bitmap.width / DynamicPatternMax @sh = bitmap.height self.ox = @sw / 2 self.oy = @sh src_rect.set(@sx, 0, @sw, @sh) end end #-------------------------------------------------------------------------- # ● 原点的更新(重定义) #-------------------------------------------------------------------------- def update_origin if bitmap @dynamic_duration += 1 @dynamic_duration %= @dynamic_duration_max @sx = @dynamic_duration / OnePatternDuration * @sw src_rect.set(@sx, 0, @sw, @sh) end end #-------------------------------------------------------------------------- # ● 返回普通设定(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_revert_to_normal_for_dynamic_spr_battler revert_to_normal def revert_to_normal hzhj_old_revert_to_normal_for_dynamic_spr_battler self.ox = @sw / 2 if bitmap end #-------------------------------------------------------------------------- # ● BOSS 战败(崩坏)效果的更新(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_update_boss_col_for_dynamic_spr_battler update_boss_collapse def update_boss_collapse hzhj_old_update_boss_col_for_dynamic_spr_battler self.ox = @sw / 2 + @effect_duration % 2 * 4 - 2 end end #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler < Game_BattlerBase def set_normal_battler_name @battler_name = @battler_name.split(/★/)[0] end def set_beaten_battler_name if guard? if (UseActorGuardGraphic && actor?) or (UseEnemyGuardGraphic && enemy?) set_guard_battler_name return end end @battler_name = @battler_name.split(/★/)[0] + "★1" if UseActorWBSE && actor? Audio.se_play("Audio/SE/AWBSE_#{id}", 100, 100) elsif UseEnemyWBSE && enemy? Audio.se_play("Audio/SE/EWBSE_#{enemy_id}", 100, 100) end end def set_dead_battler_name @battler_name = @battler_name.split(/★/)[0] + "★2" end def set_guard_battler_name @battler_name = @battler_name.split(/★/)[0] + "★3" if UseActorGDSE && actor? Audio.se_play("Audio/SE/AGDSE_#{id}", 100, 100) elsif UseEnemyGDSE && enemy? Audio.se_play("Audio/SE/EGDSE_#{enemy_id}", 100, 100) end end end #============================================================================== # ■ Sprite_Battler #============================================================================== class Sprite_Battler < Sprite_Base #-------------------------------------------------------------------------- # ● 初始化(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_init_for_dead_spr_battler initialize def initialize(viewport, battler = nil) hzhj_old_init_for_dead_spr_battler(viewport, battler) @dead_graphic_used = false if @battler @battler.set_normal_battler_name if @battler.dead? if (UseActorDeadGraphic && @battler.actor?) or (UseEnemyDeadGraphic && @battler.enemy?) @battler.set_dead_battler_name @dead_graphic_used = true end end end @beaten_duration = -1 end #-------------------------------------------------------------------------- # ● 设置战斗者(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_set_battler_for_dead_spr_battler battler= def battler=(value) if @battler != value @dead_graphic_used = false if value value.set_normal_battler_name if value.dead? if (UseActorDeadGraphic && value.actor?) or (UseEnemyDeadGraphic && value.enemy?) value.set_dead_battler_name @dead_graphic_used = true end end end @beaten_duration = -1 end hzhj_old_set_battler_for_dead_spr_battler(value) end #-------------------------------------------------------------------------- # ● 源位图(Source Bitmap)的更新(重定义) #-------------------------------------------------------------------------- alias hzhj_old_update_bitmap_for_was_beaten_spr_battler update_bitmap def update_bitmap if @beaten_duration > 0 @beaten_duration -= 1 elsif @beaten_duration == 0 @beaten_duration = -1 set_bitmap(:normal) end hzhj_old_update_bitmap_for_was_beaten_spr_battler end #-------------------------------------------------------------------------- # ● 初始化可视状态(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_visibility_for_dead_spr_battler init_visibility def init_visibility hzhj_old_visibility_for_dead_spr_battler if @battler.dead? if (UseActorDeadGraphic && @battler.actor?) or (UseEnemyDeadGraphic && @battler.enemy?) self.opacity = 255 end end end #-------------------------------------------------------------------------- # ● 效果开始(追加定义) #-------------------------------------------------------------------------- alias hzhj_old_start_effect_for_dead_spr_battler start_effect def start_effect(effect_type) if effect_type == :appear if @dead_graphic_used set_bitmap(:normal) @effect_type = nil @effect_duration = 0 @dead_graphic_used = false @battler_visible = true return end elsif effect_type == :collapse or effect_type == :boss_collapse or effect_type == :instant_collapse if @beaten_duration >= 0 @beaten_duration = -1 set_bitmap(:normal) end if (UseActorDeadGraphic && @battler.actor?) or (UseEnemyDeadGraphic && @battler.enemy?) set_bitmap(:dead) @effect_type = nil @effect_duration = 0 @dead_graphic_used = true @battler_visible = false return end end hzhj_old_start_effect_for_dead_spr_battler(effect_type) end #-------------------------------------------------------------------------- # ● 设置新的位图(新增定义) #-------------------------------------------------------------------------- def set_bitmap(sym) case sym when :normal @battler.set_normal_battler_name when :was_beaten @battler.set_beaten_battler_name when :dead @battler.set_dead_battler_name else return end new_bitmap = Cache.battler(@battler.battler_name, @battler.battler_hue) if bitmap != new_bitmap self.bitmap = new_bitmap @dynamic_duration = 0 @sx = 0 @sw = bitmap.width / DynamicPatternMax @sh = bitmap.height self.ox = @sw / 2 self.oy = @sh src_rect.set(@sx, 0, @sw, @sh) end update_origin update_position end end #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ● 发动技能/物品(新增定义) #-------------------------------------------------------------------------- def hzhj_invoke_item(target, item, damage_target) refresh_status @log_window.display_action_results(damage_target, item) @subject.damage_section_displayed = false @subject.last_target_index = target.index return if target.dead? if rand < target.item_cnt(@subject, item) hzhj_invoke_counter_attack(target, item) elsif rand < target.item_mrf(@subject, item) hzhj_invoke_magic_reflection(target, item) end end #-------------------------------------------------------------------------- # ● 发动物理反击(新增定义) #-------------------------------------------------------------------------- def hzhj_invoke_counter_attack(target, item) @log_window.display_counter(target, item) attack_skill = $data_skills[target.attack_skill_id] @subject.item_apply(target, attack_skill) need_move = false animation1 = $data_animations[target.animation1_id] need_move = animation1.need_move if animation1 ary = [@subject] if need_move target.setup_move_info(@subject, RealMoveDuration, animation1.move_se) wait_for_move end @subject.damage_section_displayed = false @subject.not_damage_section = false show_subject_animation(target.animation1_id, target) show_normal_animation(ary, target.atk_animation_id1, false) show_normal_animation(ary, target.atk_animation_id2, true) @log_window.wait wait_for_animation if need_move && target.alive? target.come_back_self_position(RealMoveDuration) wait_for_move end refresh_status @log_window.display_action_results(@subject, attack_skill) end #-------------------------------------------------------------------------- # ● 发动魔法反射(新增定义) #-------------------------------------------------------------------------- def hzhj_invoke_magic_reflection(target, item) @subject.damage_section_displayed = false @subject.not_damage_section = false @log_window.display_reflection(target, item) @subject.item_apply(@subject, item) refresh_status @log_window.display_action_results(@subject, item) end end #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler < Game_BattlerBase attr_accessor :damage_section_displayed attr_accessor :not_damage_section end #============================================================================== # ■ Game_Actor #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● 执行伤害效果 #-------------------------------------------------------------------------- alias hzhj_old_per_damage_for_damage_section_game_actor perform_damage_effect def perform_damage_effect unless damage_section_displayed hzhj_old_per_damage_for_damage_section_game_actor end end end #============================================================================== # ■ Game_Enemy #============================================================================== class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # ● 执行伤害效果 #-------------------------------------------------------------------------- alias hzhj_old_per_damage_for_damage_section_game_enemy perform_damage_effect def perform_damage_effect unless damage_section_displayed hzhj_old_per_damage_for_damage_section_game_enemy end end end #============================================================================== # ■ Sprite_Battler #============================================================================== class Sprite_Battler < Sprite_Base #-------------------------------------------------------------------------- # ● SE 和闪烁时机的处理 #-------------------------------------------------------------------------- def animation_process_timing(timing) if timing.se.name == DamageSectionDisplaySEName hp_value = @battler.result.hp_damage mp_value = @battler.result.mp_damage tp_value = @battler.result.tp_damage value = args = nil was_beaten = false if hp_value != 0 && !@battler.not_damage_section was_beaten = true if hp_value > 0 value = hp_value * timing.flash_color.red.to_i / 100 critical = @battler.result.critical args = [:hp, value, critical] elsif mp_value != 0 && !@battler.not_damage_section was_beaten = true if mp_value > 0 value = mp_value * timing.flash_color.red.to_i / 100 critical = @battler.result.critical args = [:mp, value, critical] elsif tp_value != 0 && !@battler.not_damage_section was_beaten = true if tp_value > 0 value = tp_value * timing.flash_color.red.to_i / 100 critical = @battler.result.critical args = [:tp, value, critical] end if value && args args[3] = @battler.actor? ? :actor : (@battler.enemy? ? :enemy : nil) @battler.damage_section_displayed = true start_damage(args) if UseBeatenGraphic && was_beaten set_bitmap(:was_beaten) @beaten_duration = BeatenGraphicDuration end end return end super(timing) end end #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ● 应用技能/物品效果(新增定义) #-------------------------------------------------------------------------- def hzhj_apply_item_effects(target, item) target.damage_section_displayed = false target.not_damage_section = false target = apply_substitute(target, item) target.damage_section_displayed = false target.not_damage_section = false target.item_apply(@subject, item) return target end end #============================================================================== # ■ 此脚本来自 [url]www.66rpg.com[/url] #==============================================================================
69888.png (124.14 KB, 下载次数: 46)
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |