#============================================================================== # 本脚本来自[url]www.66RPG.com[/url],使用和转载请保留此信息 # # ■ 熊式横版战斗 by 弗雷德 真移位:神思 #============================================================================== #如果要需要Game_Battler3类的攻击、特技、物品的方法,请移至161-470行 #因为重写过这三个方法,在原方法里改是不会生效的。 #-------------------------------------------------------------------------- # ● 设定开始 #-------------------------------------------------------------------------- #伤害为0的时候是否显示无效文字,1为显示,0为不显示。 INVALIDSWITCH = 1 # 是否显示死亡图 1为显示,0为不显示。 DEADPIC = 1 # 是否显示总伤害 1为显示,0为不显示。 SHOW_TOTAL_DAMAGE = 1 # 是否显示连击数值 1为显示,0为不显示。 HITSWITCH = 1 # 是否显示SP伤害数值 1为显示,0为不显示。 SDMGSWITCH = 1 # 不是主状态的时候是否稍稍降低点透明度 1为降低,0为不降低 NACTSWITCH = 0 # 会心一击时的音效,不设置为不使用音效。 CRIVOICE = "Critital_hit" # 会心一击是否开启画面晃动 1为开启,0为关闭 CRISHAKE = 1 # 会心一击是否开启画面闪烁,1为开启,0为关闭 CRIFLASH = 1 # 攻击时不移动的属性编号 默认为29号 参考数据库的设置 # 比如职业枪兵勾上了29号属性,那么当枪兵使用普通攻击时将不会移动。技能也是如此。 UNMOVE = 29 # 攻击到与敌人同一水平线前的属性编号 默认为30号 参考数据库的设置 HOMOVE = 30 ################################################################## module Scene_BattleName # 设定移动速度 Move_Duration = 28 #设定人物的单帧图,如果不做设定,将直接使用默认的战斗图。 BattlerName = { "熊大王" => { "待机" => ["bear_s1","bear_s2","bear_s3","bear_s4"], "移动" => ["bear_r1","bear_r2","bear_r3","bear_r4"], "返回" => ["bear_b1","bear_b2","bear_b3","bear_b4"], "受伤" => ["bear_h"], "防御" => ["bear_d"], "死亡" => ["bear_die1","bear_die2"] }, "蜘蛛侠" => { "待机" => ["spider_s1"], "移动" => ["spider_r1"], "返回" => ["spider_b1"], "受伤" => ["spider_h"], "防御" => ["spider_h"], "死亡" => ["spider_die1","spider_die2"] }, "桌布侠" => { "待机" => ["ghost_s1","ghost_s2","ghost_s3","ghost_s4"], "移动" => ["ghost_r1","ghost_r2","ghost_r3","ghost_r4"], "返回" => ["ghost_b1","ghost_b2","ghost_b3","ghost_b4"], "受伤" => ["ghost_h"], "防御" => ["ghost_d"], "死亡" => ["ghost_die1","ghost_die2"] }, "山寨大帝" => { "待机" => ["qq_s1","qq_s2","qq_s3","qq_s4"], "移动" => ["qq_r1","qq_r2","qq_r3","qq_r4"], "返回" => ["qq_B1","qq_B2","qq_B3","qq_B4"], "受伤" => ["qq_h"], "防御" => ["qq_d"], "死亡" => ["qq_die1","qq_die2"] }, "女" => { "待机" => ["demon_s1","demon_s2","demon_s3","demon_s4"], "移动" => ["demon_r1","demon_r2","demon_r3","demon_r4"], "返回" => ["demon_b1","demon_b2","demon_b3","demon_b4"], "受伤" => ["demon_h"], "防御" => ["demon_d"], "死亡" => ["demon_die1","demon_die2"] }, "狗" => { "待机" => ["dog_s1","dog_s2","dog_s3","dog_s4"], "移动" => ["dog_r1","dog_r2","dog_r3","dog_r4"], "返回" => ["dog_b1","dog_b2","dog_b3","dog_b4"], "受伤" => ["dog_h"], "防御" => ["dog_h"], "死亡" => ["dog_die"] }, "弗雷德" => { "待机" => ["Fred_s1","Fred_s2","Fred_s3","Fred_s4"], "移动" => ["Fred_r1","Fred_r2","Fred_r3","Fred_r4"], "返回" => ["Fred_b1","Fred_b2","Fred_b3","Fred_b4"], "受伤" => ["Fred_h"], "防御" => ["Fred_d"], "死亡" => ["Fred_die1","Fred_die2"] }, } end #至于其它的: #HP伤害数字间距偏移在602行修改。 #SP伤害数字间距偏移在667行修改。 #连击数字间距偏移在713行修改。 #总伤害数字间距偏移在759行修改。 #-------------------------------------------------------------------------- # ● 设定结束 #-------------------------------------------------------------------------- class Game_Battler attr_accessor :movex # X坐标修正 attr_accessor :movey # Y坐标修正 attr_accessor :startactive # 行为 attr_accessor :damage_sp # 精神伤害值 alias bearrpg_initialize initialize def initialize bearrpg_initialize @damage_sp = 0 @movex = 0 @movey = 0 @startactive = "待机" end def width #获取战斗图宽 return RPG::Cache.battler(@battler_name, @battler_hue).width end def height #获取战斗图高 return RPG::Cache.battler(@battler_name, @battler_hue).height end #-------------------------------------------------------------------------- # ● 应用通常攻击效果 # attacker : 攻击者 (battler) #-------------------------------------------------------------------------- def attack_effect(attacker) # 清除会心一击标志 self.critical = false #######伤害开关初始化##################################################bearrpg $damage_hp = false $damage_sp = false # 第一命中判定 hit_result = (rand(100) < attacker.hit) # 命中的情况下 if hit_result == true # 计算基本伤害 atk = [attacker.atk - self.pdef / 2, 0].max self.damage = atk * (20 + attacker.str) / 20 # 属性修正 self.damage *= elements_correct(attacker.element_set) self.damage /= 100 # 伤害符号正确的情况下 if self.damage > 0 # 会心一击修正 if rand(100) < 4 * attacker.dex / self.agi self.damage *= 2 self.critical = true end # 防御修正 if self.guarding? self.damage /= 2 end end $damage_hp = true if self.damage.is_a?(Numeric) # $damage_sp = true if self.damage_sp != 0 SP伤害数值开关 # 分散 if self.damage.abs > 0 amp = [self.damage.abs * 15 / 100, 1].max self.damage += rand(amp+1) + rand(amp+1) - amp end # 第二命中判定 eva = 8 * self.agi / attacker.dex + self.eva hit = self.damage < 0 ? 100 : 100 - eva hit = self.cant_evade? ? 100 : hit hit_result = (rand(100) < hit) end #####################################bearrpg # 命中的情况下 if hit_result == true # 状态冲击解除 remove_states_shock # HP 的伤害计算 self.hp -= self.damage # 状态变化 @state_changed = false states_plus(attacker.plus_state_set) states_minus(attacker.minus_state_set) if self.damage == 0 self.damage = "无效" if INVALIDSWITCH >0 self.critical = false end # Miss 的情况下 else # 伤害设置为 "Miss" self.damage = "Miss" # 清除会心一击标志 self.critical = false end # 过程结束 return true end #############################################bearrpg #-------------------------------------------------------------------------- # ● 应用特技效果 # user : 特技的使用者 (battler) # skill : 特技 #-------------------------------------------------------------------------- def skill_effect(user, skill) #######伤害开关初始化##################################################bearrpg $damage_hp = false $damage_sp = false # 清除会心一击标志 self.critical = false # 特技的效果范围是 HP 1 以上的己方、自己的 HP 为 0、 # 或者特技的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下 if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1) # 过程结束 return false end # 清除有效标志 effective = false # 公共事件 ID 是有效的情况下,设置为有效标志 effective |= skill.common_event_id > 0 # 第一命中判定 hit = skill.hit if skill.atk_f > 0 hit *= user.hit / 100 end hit_result = (rand(100) < hit) # 不确定的特技的情况下设置为有效标志 effective |= hit < 100 # 命中的情况下 if hit_result == true # 计算威力 power = skill.power + user.atk * skill.atk_f / 100 if power > 0 power -= self.pdef * skill.pdef_f / 200 power -= self.mdef * skill.mdef_f / 200 power = [power, 0].max end # 计算倍率 rate = 20 rate += (user.str * skill.str_f / 100) rate += (user.dex * skill.dex_f / 100) rate += (user.agi * skill.agi_f / 100) rate += (user.int * skill.int_f / 100) # 计算基本伤害 self.damage = power * rate / 20 # 属性修正 self.damage *= elements_correct(skill.element_set) self.damage /= 100 # 伤害符号正确的情况下 if self.damage > 0 # 防御修正 if self.guarding? self.damage /= 2 end end # 分散 if skill.variance > 0 and self.damage.abs > 0 amp = [self.damage.abs * skill.variance / 100, 1].max self.damage += rand(amp+1) + rand(amp+1) - amp end # 第二命中判定 eva = 8 * self.agi / user.dex + self.eva hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100 hit = self.cant_evade? ? 100 : hit hit_result = (rand(100) < hit) # 不确定的特技的情况下设置为有效标志 effective |= hit < 100 end $damage_hp = true if self.damage.is_a?(Numeric) # $damage_sp = true if self.damage_sp != 0 SP伤害数值开关 # 命中的情况下 if hit_result == true # 威力 0 以外的物理攻击的情况下 if skill.power != 0 and skill.atk_f > 0 # 状态冲击解除 remove_states_shock # 设置有效标志 effective = true end # HP 的伤害减法运算 last_hp = self.hp self.hp -= self.damage effective |= self.hp != last_hp # 状态变化 @state_changed = false effective |= states_plus(skill.plus_state_set) effective |= states_minus(skill.minus_state_set) #############################################bearrpg # 威力为 0 的场合 if skill.power == 0 # 伤害设置为空的字串 self.damage = "" # 状态没有变化的情况下 unless @state_changed # 伤害设置为 "Miss" self.damage = "Miss" end elsif self.damage == 0 unless @state_changed self.damage = "无效" if INVALIDSWITCH >0 else self.damage = "" end end # Miss 的情况下 else # 伤害设置为 "Miss" self.damage = "Miss" end # 不在战斗中的情况下 unless $game_temp.in_battle # 伤害设置为 nil self.damage = nil end # 过程结束 return effective end #############################################bearrpg #-------------------------------------------------------------------------- # ● 应用物品效果 # item : 物品 #-------------------------------------------------------------------------- def item_effect(item) # 清除会心一击标志 self.critical = false # 物品的效果范围是 HP 1 以上的己方、自己的 HP 为 0、 # 或者物品的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下 if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or ((item.scope == 5 or item.scope == 6) and self.hp >= 1) # 过程结束 return false end # 清除有效标志 effective = false # 公共事件 ID 是有效的情况下,设置为有效标志 effective |= item.common_event_id > 0 # 命中判定 hit_result = (rand(100) < item.hit) # 不确定的特技的情况下设置为有效标志 effective |= item.hit < 100 # 命中的情况 if hit_result == true # 计算回复量 recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp recover_sp = maxsp * item.recover_sp_rate / 100 + item.recover_sp if recover_hp < 0 recover_hp += self.pdef * item.pdef_f / 20 recover_hp += self.mdef * item.mdef_f / 20 recover_hp = [recover_hp, 0].min end # 属性修正 recover_hp *= elements_correct(item.element_set) recover_hp /= 100 recover_sp *= elements_correct(item.element_set) recover_sp /= 100 # 分散 if item.variance > 0 and recover_hp.abs > 0 amp = [recover_hp.abs * item.variance / 100, 1].max recover_hp += rand(amp+1) + rand(amp+1) - amp end if item.variance > 0 and recover_sp.abs > 0 amp = [recover_sp.abs * item.variance / 100, 1].max recover_sp += rand(amp+1) + rand(amp+1) - amp end # 回复量符号为负的情况下 if recover_hp < 0 # 防御修正 if self.guarding? recover_hp /= 2 end end # HP 回复量符号的反转、设置伤害值 self.damage = -recover_hp self.damage_sp = -recover_sp # HP 以及 SP 的回复 last_hp = self.hp last_sp = self.sp self.hp += recover_hp self.sp += recover_sp ###################################################################bearrpg $damage_hp = true if self.damage.is_a?(Numeric) $damage_sp = true if self.damage_sp.is_a?(Numeric) and recover_sp != 0 ###################################################################bearrpg effective |= self.hp != last_hp effective |= self.sp != last_sp # 状态变化 @state_changed = false effective |= states_plus(item.plus_state_set) effective |= states_minus(item.minus_state_set) # 能力上升值有效的情况下 if item.parameter_type > 0 and item.parameter_points != 0 # 能力值的分支 case item.parameter_type when 1 # MaxHP @maxhp_plus += item.parameter_points when 2 # MaxSP @maxsp_plus += item.parameter_points when 3 # 力量 @str_plus += item.parameter_points when 4 # 灵巧 @dex_plus += item.parameter_points when 5 # 速度 @agi_plus += item.parameter_points when 6 # 魔力 @int_plus += item.parameter_points end # 设置有效标志 effective = true end # HP 回复率与回复量为 0 的情况下 if item.recover_hp_rate == 0 and item.recover_hp == 0 # 设置伤害为空的字符串 self.damage = "" # SP 回复率与回复量为 0、能力上升值无效的情况下 if item.recover_sp_rate == 0 and item.recover_sp == 0 and (item.parameter_type == 0 or item.parameter_points == 0) # 状态没有变化的情况下 unless @state_changed # 伤害设置为 "Miss" self.damage = "Miss" end end end # Miss 的情况下 else # 伤害设置为 "Miss" self.damage = "Miss" end # 不在战斗中的情况下 unless $game_temp.in_battle # 伤害设置为 nil self.damage = nil end # 过程结束 return effective end end class Game_Actor def screen_x if self.index != nil return (640-self.index*50)/2 + 240 + @movex else return 0 end end def screen_y return self.index*70+self.height/2 + 140 + @movey #(320-self.index*91+self.height)/2 + 100 + @movey end def screen_z return self.screen_y-self.index * 10 end end class Game_Enemy def screen_x return $data_troops[@troop_id].members[@member_index].x + @movex end def screen_y return $data_troops[@troop_id].members[@member_index].y + @movey end def screen_z return self.screen_y#+self.height end end class Sprite_Battler include Scene_BattleName end module RPG class Sprite < ::Sprite #========================================== def initialize(viewport = nil) super(viewport) @_whiten_duration = 0 @_appear_duration = 0 @_escape_duration = 0 @_collapse_duration = 0 @_damage_duration = 0 @_animation_duration = 0 @_blink = false @flash_shake = 0 @_damage = [] @_damage_sp = [] @_total_damage = 0 @_total_damage_duration = 0 @p_dam=0 @hits=0 end def animation_set_sprites(sprites, cell_data, position) for i in 0..15 sprite = sprites[i] pattern = cell_data[i, 0] if sprite == nil or pattern == nil or pattern == -1 sprite.visible = false if sprite != nil next end sprite.visible = true sprite.src_rect.set(pattern % 5 * 192, pattern / 5 * 192, 192, 192) if position == 3 if self.viewport != nil sprite.x = self.viewport.rect.width / 2 sprite.y = self.viewport.rect.height - 160 else sprite.x = 320 sprite.y = 240 end else sprite.x = self.x - self.ox + self.src_rect.width / 2 sprite.y = self.y - self.oy + self.src_rect.height / 2 sprite.y -= self.src_rect.height / 4 if position == 0 sprite.y += self.src_rect.height / 4 if position == 2 end sprite.x += cell_data[i, 1] sprite.y += cell_data[i, 2] if $scene.is_a?(Scene_Battle) sprite.z = battler.screen_z+20 else sprite.z = 9990 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.angle = cell_data[i, 4] sprite.mirror = (cell_data[i, 5] == 1) sprite.opacity = cell_data[i, 6] * self.opacity / 255.0 sprite.blend_type = cell_data[i, 7] end end def damage(value, critical) dispose_hit if value.is_a?(Numeric) damage_string = value.abs.to_s else damage_string = value.to_s end bitmap = Bitmap.new(300, 150) bitmap.font.name = ["黑体","华文行楷", "宋体"] bitmap.font.size = 32 if value.is_a?(Numeric) # 分割伤害值字符串 damage_array = damage_string.scan(/./) damage_x = 81 - damage_string.size * 9 # 会心一击标志打开的情况 if critical and value != "无效" # 显示会心一击图画 cri_bitmap = RPG::Cache.picture("Critital") bitmap.blt(damage_x+cri_bitmap.width, cri_bitmap.height*2, cri_bitmap, Rect.new(0, 0, cri_bitmap.width, cri_bitmap.height)) Audio.se_play("Audio/SE/"+CRIVOICE,100,100) if CRIVOICE != nil and CRIVOICE != "" $game_screen.start_flash(Color.new(255, 5, 5, 155), 5) if CRIFLASH >0 $game_screen.start_shake(2,9,3) if CRISHAKE >0 end # 伤害值为负的情况下 dmg_bitmap = RPG::Cache.picture("Normal_Damage") if value < 0 # 调用回复数字表 bitmap.blt(damage_x-14, 32,dmg_bitmap,Rect.new(dmg_bitmap.width/12*10, 0, dmg_bitmap.width/12, dmg_bitmap.height/2)) else # 调用伤害数字表 bitmap.blt(damage_x-14, 32, dmg_bitmap,Rect.new(dmg_bitmap.width/12*11, 0, dmg_bitmap.width/12, dmg_bitmap.height/2)) end # 循环伤害值字符串 for char in damage_array number = char.to_i # 显示伤害数字 bitmap.blt(damage_x, 32, dmg_bitmap, Rect.new(number * dmg_bitmap.width/12, 0, dmg_bitmap.width/12, dmg_bitmap.height/2)) #################################################################普通伤害数值 damage_x += dmg_bitmap.width/12 - 4#间距缩小4个像素,可以自行调整 #################################################################普通伤害数值 end else if value == "Miss" miss_dmg = RPG::Cache.picture("miss") bitmap.blt(miss_dmg.width, 0,miss_dmg, Rect.new(0, 0, miss_dmg.width, miss_dmg.height)) elsif value == "无效" invalid_dmg = RPG::Cache.picture("invalid") bitmap.blt(invalid_dmg.width, 0,invalid_dmg, Rect.new(0, 0, invalid_dmg.width,invalid_dmg.height)) #end end end # 伤害值定位 @_damage_sprite = ::Sprite.new(self.viewport) @_damage_sprite.bitmap = bitmap @_damage_sprite.ox = 80 @_damage_sprite.oy = 20 @_damage_sprite.x = self.x @_damage_sprite.y = self.y - self.oy / 2 @_damage_sprite.z = 3000 @_damage_duration = 40 @_damage.push([@_damage_sprite,@_damage_duration-10,0, rand(30) - 15, rand(3)]) make_total_damage(value) end ##################################################################sp伤害数值 def damage_sp(value, critical) dispose_hit if value.is_a?(Numeric) damage_string = value.abs.to_s else damage_string = value.to_s end bitmap = Bitmap.new(300, 150) bitmap.font.name = ["黑体","华文行楷", "宋体"] bitmap.font.size = 32 if value.is_a?(Numeric) # 分割伤害值字符串 damage_array = damage_string.scan(/./) damage_x = 81 - damage_string.size * 9 # 会心一击标志打开的情况 if critical and value != "无效" # 显示会心一击图画 cri_bitmap = RPG::Cache.picture("Critital") bitmap.blt(damage_x+cri_bitmap.width, cri_bitmap.height*2, cri_bitmap, Rect.new(0, 0, cri_bitmap.width, cri_bitmap.height)) Audio.se_play("Audio/SE/"+CRIVOICE,100,100) if CRIVOICE != nil and CRIVOICE != "" $game_screen.start_flash(Color.new(255, 5, 5, 155), 5) if CRIFLASH >0 $game_screen.start_shake(2,9,3) if CRISHAKE >0 end # 伤害值为负的情况下 dmg_bitmap = RPG::Cache.picture("Normal_Damage") if value < 0 # 调用回复数字表 bitmap.blt(damage_x-14, 32,dmg_bitmap,Rect.new(dmg_bitmap.width/12*10, dmg_bitmap.height/2, dmg_bitmap.width/12, dmg_bitmap.height/2)) else # 调用伤害数字表 bitmap.blt(damage_x-14, 32, dmg_bitmap,Rect.new(dmg_bitmap.width/12*11, dmg_bitmap.height/2, dmg_bitmap.width/12, dmg_bitmap.height/2)) end # 循环伤害值字符串 for char in damage_array number = char.to_i # 显示伤害数字 bitmap.blt(damage_x, 32, dmg_bitmap, Rect.new(number * dmg_bitmap.width/12, dmg_bitmap.height/2, dmg_bitmap.width/12, dmg_bitmap.height/2)) #################################################################普通伤害数值 damage_x += dmg_bitmap.width/12 - 4#间距缩小4个像素,可以自行调整 #################################################################普通伤害数值 end else if value == "Miss" miss_dmg = RPG::Cache.picture("miss") bitmap.blt(miss_dmg.width, 0,miss_dmg, Rect.new(0, 0, miss_dmg.width, miss_dmg.height)) elsif value == "无效" invalid_dmg = RPG::Cache.picture("invalid") bitmap.blt(invalid_dmg.width, 0,invalid_dmg, Rect.new(0, 0, invalid_dmg.width,invalid_dmg.height)) #end end end # 伤害值定位 @_damage_sprite = ::Sprite.new(self.viewport) @_damage_sprite.bitmap = bitmap @_damage_sprite.ox = 80 @_damage_sprite.oy = 20 @_damage_sprite.x = self.x @_damage_sprite.y = self.y - self.oy / 2 @_damage_sprite.z = 3000 @_damage_duration = 40 @_damage_sp.push([@_damage_sprite,@_damage_duration-10,0, rand(30) - 15, rand(3)]) # make_total_damage(value) end def hit # 如果伤害值是数值 # 转为字符串 value=@hits hits_string = value.to_s # 初始化位图 bitmap = Bitmap.new(320, 64) bitmap.font.name = "Arial Black" bitmap.font.size = 32 # 分割伤害值字符串 hits_array = hits_string.scan(/./) hits_x = 81 - hits_string.size * 18.1 rect_y = 0 # 循环伤害值字符串 for char in hits_array number = char.to_i # 显示伤害数字 combo_num = RPG::Cache.picture("combo_num") bitmap.blt(hits_x, 0, combo_num, Rect.new(number * combo_num.width/10, 0, combo_num.width/10, combo_num.height)) #################################################################连击数数值 hits_x += combo_num.width/10 - 3#间距缩小3个像素,可以自行调整 #################################################################连击数数值 end combo_tx = RPG::Cache.picture("combo_text") bitmap.blt(hits_x, 0,combo_tx , Rect.new(0, 0, combo_tx.width, combo_tx.height)) # 伤害值定位 @_hits_sprite = ::Sprite.new(self.viewport) @_hits_sprite.bitmap = bitmap @_hits_sprite.ox = 81 @_hits_sprite.oy = 20 @_hits_sprite.x = 500 @_hits_sprite.y = 100 @_hits_sprite.opacity = HITSWITCH > 0 ? 255 : 0 @_hits_sprite.z = 3000 @_hits_duration = 40 end #-------------------------------------------------------------------------- # ● 总伤害处理 #-------------------------------------------------------------------------- def make_total_damage(value) if value.is_a?(Numeric) and SHOW_TOTAL_DAMAGE > 0 @_total_damage += value # 绝对值转为字符串 damage_string = @_total_damage.abs.to_s else return end # 初始化位图 bitmap = Bitmap.new(350, 150) bitmap.font.name = "Arial Black" bitmap.font.size = 32 # 伤害值是数值的情况下 if value.is_a?(Numeric) # 分割伤害值字符串 damage_array = damage_string.scan(/./) damage_x = 40 - damage_string.size * 9 # 伤害值为负的情况下 name=RPG::Cache.picture("total_damage") # 循环伤害值字符串 for char in damage_array number = char.to_i # 显示伤害数字 bitmap.blt(damage_x, 0, name, Rect.new(number * name.width/10, 0, name.width/10, name.height)) #################################################################总伤害数值 damage_x += name.width/10 - 3 #间距缩小3个像素,可以自行调整 #################################################################总伤害数值 end end if @_total_damage_sprite.nil? @_total_damage_sprite = ::Sprite.new(self.viewport) @_total_damage_sprite.ox = 80 @_total_damage_sprite.oy = 40 @_total_damage_sprite.z = 3000 end @_total_damage_sprite.bitmap = bitmap @_total_damage_sprite.zoom_x = 1.0 @_total_damage_sprite.zoom_y = 1.0 @_total_damage_sprite.x = self.x @_total_damage_sprite.y = self.y - self.oy / 2 @_total_damage_sprite.z = 3001 @_total_damage_duration = 80 #hit数描绘 @hits+=1 if @_total_damage > 0 hit end end def animation(animation, hit, battler_damage="", battler_damage_sp="",battler_critical=false) dispose_animation @battler_damage = battler_damage @battler_damage_sp = battler_damage_sp @battler_critical = battler_critical @_animation = animation return if @_animation == nil @_animation_hit = hit @_animation_duration = @_animation.frame_max animation_name = @_animation.animation_name animation_hue = @_animation.animation_hue bitmap = RPG::Cache.animation(animation_name, animation_hue) for timing in @_animation.timings quanzhong = animation_process_timing(timing, @_animation_hit,true) @all_quanzhong += quanzhong @_last_frame = timing.frame if quanzhong != 0 end if @@_reference_count.include?(bitmap) @@_reference_count[bitmap] += 1 else @@_reference_count[bitmap] = 1 end if $scene.is_a?(Scene_Battle) if $scene.animation1_id == @battler.animation_id @battler_damage = "" @battler_damage_sp = "" end end @_animation_sprites = [] if @_animation.position != 3 or not @@_animations.include?(animation) for i in 0..15 sprite = ::Sprite.new(self.viewport) sprite.bitmap = bitmap sprite.visible = false @_animation_sprites.push(sprite) end unless @@_animations.include?(animation) @@_animations.push(animation) end end update_animation end def dispose_damage for damage in @_damage.reverse damage[0].bitmap.dispose damage[0].dispose @_damage.delete(damage) end for damage_sp in @_damage_sp.reverse damage_sp[0].bitmap.dispose damage_sp[0].dispose @_damage_sp.delete(damage_sp) end @_total_damage = 0 @_last_frame = -1 if @_total_damage_sprite != nil @_total_damage_duration = 0 @_total_damage_sprite.bitmap.dispose @_total_damage_sprite.dispose @_total_damage_sprite = nil end end def dispose_hit if @_hits_sprite != nil @_hits_sprite.bitmap.dispose @_hits_sprite.dispose @_hits_sprite = nil end end def dispose_animation @battler_damage = nil @battler_damage_sp = nil @battler_critical = nil @all_quanzhong = 1 @_total_damage = 0 @_last_frame = -1 if @_animation_sprites != nil sprite = @_animation_sprites[0] if sprite != nil @@_reference_count[sprite.bitmap] -= 1 if @@_reference_count[sprite.bitmap] == 0 sprite.bitmap.dispose end end for sprite in @_animation_sprites sprite.dispose end @_animation_sprites = nil @_animation = nil end end def update super if @_whiten_duration > 0 @_whiten_duration -= 1 self.color.alpha = 128 - (16 - @_whiten_duration) * 10 end if @_appear_duration > 0 @_appear_duration -= 1 self.opacity = (16 - @_appear_duration) * 16 end if @_escape_duration > 0 @_escape_duration -= 1 self.opacity = 256 - (32 - @_escape_duration) * 10 end if @_collapse_duration > 0 @_collapse_duration -= 1 self.opacity = 256 - (48 - @_collapse_duration) * 6 end if @_damage_duration > 0 @_damage_duration -= 1 for damage in @_damage damage[0].x = self.x + self.viewport.rect.x - self.ox + self.src_rect.width / 2 + (40 - damage[1]) * damage[3] / 10 damage[0].y -= damage[4]+damage[1]/10 damage[0].opacity = damage[1]*20 damage[1] -= 1 if damage[1]==0 damage[0].bitmap.dispose damage[0].dispose @_damage.delete(damage) next end end for damage_sp in @_damage_sp damage_sp[0].x = self.x + self.viewport.rect.x - self.ox + self.src_rect.width / 2 + (40 - damage_sp[1]) * damage_sp[3] / 10 damage_sp[0].y -= damage_sp[4]+damage_sp[1]/10 damage_sp[0].opacity = damage_sp[1]*20 damage_sp[1] -= 1 if damage_sp[1]==0 damage_sp[0].bitmap.dispose damage_sp[0].dispose @_damage_sp.delete(damage_sp) next end end end if @_total_damage_duration > 0 @_total_damage_duration -= 1 @_total_damage_sprite.y -= 1 if @_total_damage_duration % 2 == 0 if @_total_damage_sprite.zoom_x > 1.0 @_total_damage_sprite.zoom_x -= 0.05 end if @_total_damage_sprite.zoom_y > 1.0 @_total_damage_sprite.zoom_y -= 0.05 end @_total_damage_sprite.opacity = 256 - (24 - @_total_damage_duration) * 16 if @_total_damage_duration <= 0 dispose_hit @_total_damage = 0 @_total_damage_duration = 0 @_total_damage_sprite.bitmap.dispose @_total_damage_sprite.dispose @_total_damage_sprite = nil end end #======================================= if @_animation != nil and (Graphics.frame_count % 2 == 0) @_animation_duration -= 1 update_animation end if @_loop_animation != nil and (Graphics.frame_count % 2 == 0) update_loop_animation @_loop_animation_index += 1 @_loop_animation_index %= @_loop_animation.frame_max end if @_blink @_blink_count = (@_blink_count + 1) % 32 if @_blink_count < 16 alpha = (16 - @_blink_count) * 6 else alpha = (@_blink_count - 16) * 6 end self.color.set(255, 255, 255, alpha) end @@_animations.clear end def update_animation if @_animation_duration > 0 frame_index = @_animation.frame_max - @_animation_duration cell_data = @_animation.frames[frame_index].cell_data position = @_animation.position animation_set_sprites(@_animation_sprites, cell_data, position) for timing in @_animation.timings if timing.frame == frame_index t = 1.0 * animation_process_timing(timing, @_animation_hit) ts = 1.0 * animation_process_timing(timing, @_animation_hit) if timing.se.name != "" se=timing.se Audio.se_play("Audio/SE/" + se.name, se.volume, se.pitch) end if @battler_damage.is_a?(Numeric) and t != 0 if @battler.guarding? @battler.startactive = "防御" if @battler_damage > 0 else @battler.startactive = "受伤" if @battler_damage > 0 end t *= @battler_damage t /= @all_quanzhong ts *= @battler_damage_sp ts /= @all_quanzhong t = t.to_i ts = ts.to_i if frame_index != @_last_frame @p_dam+= t end if frame_index == @_last_frame t=@battler_damage-@p_dam end if frame_index == @_last_frame @_total_damage = @battler_damage - t @p_dam=0 end damage(t,@battler_critical) if $damage_hp == true damage_sp(ts,@battler_critical) if $damage_sp == true if frame_index == @_last_frame @hits=0 end elsif !@battler_damage.is_a?(Numeric) and timing.flash_scope != 0 damage(@battler_damage,@battler_critical) damage_sp(@battler_damage_sp,@battler_critical) if $damage_sp == true end end end else dispose_animation end end def animation_process_timing(timing, hit,dontflash=false) if (timing.condition == 0) or (timing.condition == 1 and hit == true) or (timing.condition == 2 and hit == false) case timing.flash_scope when 1 unless dontflash self.flash(timing.flash_color, timing.flash_duration * 2) if @_total_damage >0 @flash_shake_switch = true @flash_shake = 10 end end return timing.flash_color.alpha * timing.flash_duration when 2 unless dontflash if self.viewport != nil self.viewport.flash(timing.flash_color, timing.flash_duration * 2) end end return timing.flash_color.alpha * timing.flash_duration when 3 unless dontflash self.flash(nil, timing.flash_duration * 2) end return timing.flash_color.alpha * timing.flash_duration end end return 0 end end end class Sprite_Battler < RPG::Sprite def initialize(viewport, battler = nil) super(viewport) @battler = battler @battler_visible = false @flash_shake_switch = true @number = 0#初始化编号 end def update super # 战斗者为 nil 的情况下 if @battler == nil self.bitmap = nil loop_animation(nil) return end # 文件名和色相与当前情况有差异的情况下 if @battler.battler_name != @battler_name or @battler.battler_hue != @battler_hue # 获取、设置位图 @battler_name = @battler.battler_name @battler_hue = @battler.battler_hue self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue) @width = bitmap.width @height = bitmap.height self.ox = @width / 2 self.oy = @height # 如果是战斗不能或者是隐藏状态就把透明度设置成 0 if @battler.dead? or @battler.hidden self.opacity = 0 if DEADPIC != 1 end end ###################################万兽熊最高######################################### if @battler.startactive == "移动" or @battler.startactive == "返回" if Graphics.frame_count % 4 == 0 unless BattlerName[@battler.name].nil? @number = (@number + 1) % BattlerName[@battler.name][@battler.startactive].size self.bitmap = RPG::Cache.battler(BattlerName[@battler.name][@battler.startactive][@number], @battler_hue) end end elsif @battler.startactive == "死亡" if Graphics.frame_count % 4 == 0 unless BattlerName[@battler.name].nil? if @number +1 <= BattlerName[@battler.name][@battler.startactive].size self.bitmap = RPG::Cache.battler(BattlerName[@battler.name][@battler.startactive][@number], @battler_hue) @number += 1 else self.bitmap = RPG::Cache.battler(BattlerName[@battler.name][@battler.startactive][BattlerName[@battler.name][@battler.startactive].size-1], @battler_hue) end end end else if Graphics.frame_count % 10 == 0 unless BattlerName[@battler.name].nil? @number = (@number + 1) % BattlerName[@battler.name][@battler.startactive].size self.bitmap = RPG::Cache.battler(BattlerName[@battler.name][@battler.startactive][@number], @battler_hue) end end end ####################################################################################### # 动画 ID 与当前的情况有差异的情况下 if @battler.damage == nil and @battler.state_animation_id != @state_animation_id @state_animation_id = @battler.state_animation_id loop_animation($data_animations[@state_animation_id]) end # 应该被显示的角色的情况下 if NACTSWITCH > 0 if @battler.is_a?(Game_Actor) and @battler_visible # 不是主状态的时候稍稍降低点透明度 if $game_temp.battle_main_phase self.opacity += 3 if self.opacity < 255 else self.opacity -= 3 if self.opacity > 207 end end end if @battler.blink blink_on else blink_off end unless @battler_visible if not @battler.hidden and not @battler.dead? and (@battler.damage == nil or @battler.damage_pop) appear @battler_visible = true end end if @battler_visible if @battler.hidden $game_system.se_play($data_system.escape_se) escape @battler_visible = false end if @battler.white_flash whiten @battler.white_flash = false end if @battler.animation_id != 0 animation = $data_animations[@battler.animation_id] animation(animation, @battler.animation_hit,@battler.damage,@battler.damage_sp, @battler.critical) @battler.animation_id = 0 end if @battler.damage_pop @battler.damage = nil @battler.damage_sp = 0 @battler.critical = false @battler.damage_pop = false end if @battler.damage == nil and @battler.dead? if DEADPIC >0 @battler.startactive = "死亡" else if @battler.is_a?(Game_Enemy) $game_system.se_play($data_system.enemy_collapse_se) else $game_system.se_play($data_system.actor_collapse_se) end collapse @battler_visible = false end end end self.x = @battler.screen_x self.y = @battler.screen_y self.z = @battler.screen_z end end class Spriteset_Battle alias bearrpg_initialize initialize def initialize @enemy_sprites = [] for enemy in $game_troop.enemies.reverse #####修改敌人显示端口,与角色一样。 @enemy_sprites.push(Sprite_Battler.new(@viewport2, enemy)) end bearrpg_initialize end end class Arrow_Enemy < Arrow_Base def update super $game_troop.enemies.size.times do break if self.enemy.exist? @index += 1 @index %= $game_troop.enemies.size end if Input.repeat?(Input::UP) $game_system.se_play($data_system.cursor_se) $game_troop.enemies.size.times do @index += 1 @index %= $game_troop.enemies.size break if self.enemy.exist? end end if Input.repeat?(Input::DOWN) $game_system.se_play($data_system.cursor_se) $game_troop.enemies.size.times do @index += $game_troop.enemies.size - 1 @index %= $game_troop.enemies.size break if self.enemy.exist? end end if self.enemy != nil self.x = self.enemy.screen_x self.y = self.enemy.screen_y end end end class Arrow_Actor < Arrow_Base def update super if Input.repeat?(Input::UP) $game_system.se_play($data_system.cursor_se) @index += 1 @index %= $game_party.actors.size end if Input.repeat?(Input::DOWN) $game_system.se_play($data_system.cursor_se) @index += $game_party.actors.size - 1 @index %= $game_party.actors.size end if self.actor != nil self.x = self.actor.screen_x self.y = self.actor.screen_y end end end class Scene_Battle include Scene_BattleName attr_reader :animation1_id def main $game_temp.in_battle = true $game_temp.battle_turn = 0 $game_temp.battle_event_flags.clear $game_temp.battle_abort = false $game_temp.battle_main_phase = false $game_temp.battleback_name = $game_map.battleback_name $game_temp.forcing_battler = nil @_move_duration = 0 $game_system.battle_interpreter.setup(nil, 0) @troop_id = $game_temp.battle_troop_id $game_troop.setup(@troop_id) s1 = $data_system.words.attack s2 = $data_system.words.skill s3 = $data_system.words.guard s4 = $data_system.words.item @actor_command_window = Window_Command.new(160, [s1, s2, s3, s4]) @actor_command_window.z = 900 @actor_command_window.y = 160 @actor_command_window.back_opacity = 160 @actor_command_window.active = false @actor_command_window.visible = false @party_command_window = Window_PartyCommand.new @party_command_window.z = 910 @help_window = Window_Help.new @help_window.back_opacity = 160 @help_window.z = 920 @help_window.visible = false @status_window = Window_BattleStatus.new @status_window.z = 930 @message_window = Window_Message.new @message_window.z = 940 @spriteset = Spriteset_Battle.new @wait_count = 0 if $data_system.battle_transition == "" Graphics.transition(20) else Graphics.transition(40, "Graphics/Transitions/" + $data_system.battle_transition) end start_phase1 loop do Graphics.update Input.update update if $scene != self break end end $game_map.refresh Graphics.freeze @actor_command_window.dispose @party_command_window.dispose @help_window.dispose @status_window.dispose @message_window.dispose if @skill_window != nil @skill_window.dispose end if @item_window != nil @item_window.dispose end if @result_window != nil @result_window.dispose end @spriteset.dispose if $scene.is_a?(Scene_Title) Graphics.transition Graphics.freeze end if $BTEST and not $scene.is_a?(Scene_Gameover) $scene = nil end end def start_phase1 # 转移到回合 1 @phase = 1 # 清除全体同伴的行动 $game_party.clear_actions for actor in $game_party.actors actor.startactive = actor.hp>0? "待机" : "死亡" end # 设置战斗事件 setup_battle_event end alias bearrpg_start_phase5 start_phase5 def start_phase5 bearrpg_start_phase5 @result_window.z = 999 @phase5_wait_count = 100 end def start_enemy_select @enemy_arrow = Arrow_Enemy.new(@spriteset.viewport2) @enemy_arrow.help_window = @help_window @actor_command_window.active = false @actor_command_window.visible = false end alias bearrpg_start_skill_select start_skill_select def start_skill_select bearrpg_start_skill_select @skill_window.z = 999 end alias bearrpg_start_item_select start_item_select def start_item_select bearrpg_start_item_select @item_window.z = 999 end def move(active_battler, target, ox, oy, 返回标记 = false) ta_x = target[0] ta_y = target[1] if 返回标记 active_battler.movex = (active_battler.movex * (@_move_duration - 1) + ta_x.to_f - ox) / @_move_duration active_battler.movey = (active_battler.movey * (@_move_duration - 1) + ta_y.to_f - oy) / @_move_duration else if @active_battler.is_a?(Game_Enemy) active_battler.movex = (active_battler.movex * (@_move_duration - 1) + ta_x.to_f - ox ) / @_move_duration active_battler.movey = (active_battler.movey * (@_move_duration - 1) + ta_y.to_f - oy ) / @_move_duration else active_battler.movex = (active_battler.movex * (@_move_duration - 1) + ta_x.to_f - ox ) / @_move_duration active_battler.movey = (active_battler.movey * (@_move_duration - 1) + ta_y.to_f - oy ) / @_move_duration end end end def update_phase4_step3 ####普通攻击的场合############################################################ if @active_battler.current_action.basic == 0 and @active_battler.current_action.kind == 0 #开始执行移动 if not @active_battler.element_rate(UNMOVE)>100# 如果属性“不移动”不大于100 @active_battler.startactive = "移动" @oldxy = [@active_battler.screen_x,@active_battler.screen_y] ox,oy = @active_battler.screen_x,@active_battler.screen_y if @active_battler.element_rate(HOMOVE)>100# 如果属性“半距离”大于100 @_move_duration = Move_Duration/2 while @_move_duration > 0 Graphics.update Input.update @spriteset.update if @target_battlers[0].is_a?(Game_Actor) tag = [@target_battlers[0].screen_x-@target_battlers[0].width-(@target_battlers[0].screen_x-ox).abs/2.abs,@target_battlers[0].screen_y+1] else tag = [(@target_battlers[0].screen_x+@target_battlers[0].width/1.5)+(@target_battlers[0].screen_x-ox).abs/2,@target_battlers[0].screen_y+2] end move(@active_battler, tag, ox, oy) @_move_duration -= 1 end else @_move_duration = Move_Duration while @_move_duration > 0 Graphics.update Input.update @spriteset.update if @target_battlers[0].is_a?(Game_Actor) tag = [@target_battlers[0].screen_x-@target_battlers[0].width/2,@target_battlers[0].screen_y+1] else tag = [@target_battlers[0].screen_x+@target_battlers[0].width/1.5,@target_battlers[0].screen_y+2] end move(@active_battler, tag, ox, oy) @_move_duration -= 1 end end end ####普通攻击的场合############################################################ elsif @active_battler.current_action.kind == 1 ####使用特技的场合############################################################ if not @skill.element_set.include?(UNMOVE)# 如果技能不包含“不移动属性” @active_battler.startactive = "移动" @oldxy = [@active_battler.screen_x,@active_battler.screen_y] ox,oy = @active_battler.screen_x,@active_battler.screen_y if @skill.element_set.include?(HOMOVE)#如果技能不包含“半距离”属性 @_move_duration = Move_Duration/2 while @_move_duration > 0 Graphics.update Input.update @spriteset.update if @target_battlers[0].is_a?(Game_Actor) tag = [@target_battlers[0].screen_x-@target_battlers[0].width-(@target_battlers[0].screen_x-ox).abs/2.abs,@target_battlers[0].screen_y+1] else tag = [(@target_battlers[0].screen_x+@target_battlers[0].width/1.5)+(@target_battlers[0].screen_x-ox).abs/2,@target_battlers[0].screen_y+2] end move(@active_battler, tag, ox, oy) @_move_duration -= 1 end else @_move_duration = Move_Duration while @_move_duration > 0 Graphics.update Input.update @spriteset.update if @target_battlers[0].is_a?(Game_Actor) tag = [@target_battlers[0].screen_x-@target_battlers[0].width,@target_battlers[0].screen_y+1] else tag = [@target_battlers[0].screen_x+@target_battlers[0].width/1.5,@target_battlers[0].screen_y+2] end move(@active_battler, tag, ox, oy) @_move_duration -= 1 end end end #####使用特技的场合############################################################## end if @active_battler.startactive != "防御" @active_battler.startactive = "待机" end # 行动方动画 (ID 为 0 的情况下是白色闪烁) if @animation1_id == 0 @active_battler.white_flash = true else @active_battler.animation_id = @animation1_id @active_battler.animation_hit = true end for target in @target_battlers if target.guarding? and target.damage.is_a?(Numeric) target.startactive = "防御" if target.damage > 0 end target.animation_id = @animation2_id target.animation_hit = (target.damage != "Miss") end # 移至步骤 4 @phase4_step = 4 end ############################################################################## def update_phase4_step4 ###########################万兽熊最高######################################## # 对像方动画 for target in @target_battlers if target.damage != nil target.damage_pop = true end end # 限制动画长度、最低 8 帧 # @wait_count = 8 ############################################################################## # 移至步骤 5 @phase4_step = 5 end ####################万兽熊最高############################ def update_phase4_step5 # 隐藏帮助窗口 @help_window.visible = false if @active_battler.current_action.basic == 0 and @active_battler.current_action.kind == 0 ####普通攻击的场合############################################################ #执行返回 if not @active_battler.element_rate(UNMOVE)>100# 如果属性“不移动”不大于100 @active_battler.startactive = "返回" if @active_battler.element_rate(HOMOVE)>100# 如果属性“半距离”大于100 @_move_duration = Move_Duration/2 else @_move_duration = Move_Duration end ox,oy = @active_battler.screen_x - @active_battler.movex,\ @active_battler.screen_y - @active_battler.movey while @_move_duration > 0 Graphics.update Input.update @spriteset.update move(@active_battler, @oldxy, ox, oy, true) @_move_duration -= 1 end end ####普通攻击的场合############################################################ elsif @active_battler.current_action.kind == 1 if not @skill.element_set.include?(UNMOVE)#如果技能不包含“不移动”属性 @active_battler.startactive = "返回" if @skill.element_set.include?(HOMOVE)#如果技能包含“半距离”属性 @_move_duration = Move_Duration/2 else @_move_duration = Move_Duration end ox,oy = @active_battler.screen_x - @active_battler.movex,\ @active_battler.screen_y - @active_battler.movey while @_move_duration > 0 Graphics.update Input.update @spriteset.update move(@active_battler, @oldxy, ox, oy, true) @_move_duration -= 1 end end ####使用特技的场合############################################################ end if @active_battler.startactive != "防御" @active_battler.startactive = "待机" end # 刷新状态窗口 @status_window.refresh # 显示伤害 for target in @target_battlers target.startactive = "待机" if target.damage != nil target.damage_pop = true end end # 移至步骤 6 @phase4_step = 6 end def update_phase4_step6 # 清除强制行动对像的战斗者 $game_temp.forcing_battler = nil @active_battler.movex = 0 @active_battler.movey = 0 @active_battler.startactive = "待机" if @active_battler.startactive != "死亡" # 公共事件 ID 有效的情况下 if @common_event_id > 0 # 设置事件 common_event = $data_common_events[@common_event_id] $game_system.battle_interpreter.setup(common_event.list, 0) end # 移至步骤 1 @phase4_step = 1 end end
1111111111.jpg (73.07 KB, 下载次数: 10)
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |