赞 | 1 |
VIP | 101 |
好人卡 | 62 |
积分 | 1 |
经验 | 34619 |
最后登录 | 2019-5-30 |
在线时间 | 270 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 270 小时
- 注册时间
- 2010-2-4
- 帖子
- 1305
|
- #==============================================================================
- # Absolute_Defense v1.0
- #--
- # Author: Kread-EX
- #==============================================================================
- # INTRODUCTION
- # Absolute Defense is a technique used in the game Breath of Fire V (Ps2).
- # It allows to nullify damage inflicted by the user under a set value.
- # Technically, you must spam your best attacks in order to wound the big tank who use this.
- # IMPORTANT NOTE
- # Absolute Defense protect only from HP damage. Not from eventual SP damage or status ailments.
- # HOW TO USE
- # Just copy this and paste above Main.
- # Then follow the configuration steps.
- # COMPATIBILITY
- # Very low compatibility with any script which modify Game_Battler, Sprite_Battler or Scene_Battle (this was one of my very first script, be indulgent).
- # I suggest to NOT make 2 enemies in the same group using Absolute Degense
- # Actors can't use this because this would unbalance the game.
- # Work with the DBS and turn-based CBS. You shouldn't use this with ATB or RTAB. Maybe CTB, but I'm not sure.
- # Will clash with custom damage displays.
- #==============================================================================
- # Configuration part
- #==============================================================================
- module KreadCFG
- # Ids of enemies using Absolute Defense
- ENEMIES_IDS = [1,5]
- # Value of the Absolute Defense. The order MUST match the order inside the ENEMIES_ID
- ABSOLUTE_VALUES = [80,650]
- # Number of turns before the Absolute Defense is recharged. Then again, the order must match ENEMIES_ID
- REFRESH_RATE = [1,3]
- # ID of the animation used when the defense is active (leave to 0 for no animation)
- FULL_ANIM_ID = 0
- # ID of the animation used when the defense breaks (leave to 0 for no animation)
- BREAK_ANIM_ID = 0
- end
- #==============================================================================
- # Game_Enemy
- #==============================================================================
- class Game_Enemy < Game_Battler
- #------------------------------------
- # Public instance variables
- #------------------------------------
- attr_accessor :absolute_defense_break
- attr_accessor :absolute_defense_value
- attr_accessor :absolute_defense_refresh_rate
- #------------------------------------
- # Object initialization
- #------------------------------------
- alias orig_enemy_init initialize
- def initialize(troop_id, member_index)
- orig_enemy_init(troop_id, member_index)
- unless KreadCFG::ENEMIES_IDS.include?(self.id)
- @absolute_defense_break = false
- @absolute_defense_value = 0
- @absolute_defense_refresh_rate = 0
- return
- end
- #Les variables d'instances prennent les valeurs des constantes.
- index = KreadCFG::ENEMIES_IDS.index(self.id)
- @absolute_defense_break = false
- @absolute_defense_value = KreadCFG::ABSOLUTE_VALUES[index]
- @absolute_defense_refresh_rate = KreadCFG::REFRESH_RATE[index]
- end
- end
- #==============================================================================
- # Game_Battler
- #==============================================================================
- class Game_Battler
- #------------------------------------
- # Apply normal attack effect
- #------------------------------------
- alias krx_absdef_attack_effect attack_effect
- def attack_effect(attacker)
- if self.class == Game_Actor or self.absolute_defense_value == 0
- return krx_absdef_attack_effect(attacker)
- end
- last_hp = self.hp
- result = krx_absdef_attack_effect(attacker)
- if self.damage.is_a?(Numeric) and self.damage >= self.absolute_defense_value and self.damage > 0
- last_damage = self.damage
- self.damage = [self.damage - self.absolute_defense_value, 0].max
- self.absolute_defense_break = true
- self.absolute_defense_value = [self.absolute_defense_value - last_damage, 0].max
- self.hp = last_hp - self.damage
- elsif self.damage.is_a?(Numeric) and self.damage > 0
- self.absolute_defense_value -= self.damage
- self.hp = last_hp
- self.damage = '-' + self.absolute_defense_value.to_s
- end
- return result
- end
- #------------------------------------
- # Apply skill effect
- #------------------------------------
- alias krx_absdef_skill_effect skill_effect
- def skill_effect(user,skill)
- if self.class == Game_Actor or self.absolute_defense_value == 0
- return krx_absdef_skill_effect(user,skill)
- end
- last_hp = self.hp
- result = krx_absdef_skill_effect(user,skill)
- if self.damage.class == Numeric and self.damage >= self.absolute_defense_value and
- self.damage > 0
- last_damage = self.damage
- self.damage = [self.damage - self.absolute_defense_value, 0].max
- self.absolute_defense_break = true
- self.absolute_defense_value = [self.absolute_defense_value - last_damage, 0].max
- self.hp = last_hp - self.damage
- elsif self.damage.class == Numeric and self.damage > 0
- self.absolute_defense_value -= self.damage
- self.damage = '-' + self.absolute_defense_value.to_s
- end
- return result
- end
- #------------------------------------
- # Apply item effect
- #------------------------------------
- alias krx_absdef_item_effect item_effect
- def item_effect(user,item)
- if self.class == Game_Actor or self.absolute_defense_value == 0
- return krx_absdef_item_effect(user,item)
- end
- last_hp = self.hp
- result = krx_absdef_item_effect(user,item)
- if self.damage.class == Numeric and self.damage >= self.absolute_defense_value and
- self.damage > 0
- last_damage = self.damage
- self.damage = [self.damage - self.absolute_defense_value, 0].max
- self.absolute_defense_break = true
- self.absolute_defense_value = [self.absolute_defense_value - last_damage, 0].max
- self.hp = last_hp - self.damage
- elsif self.damage.class == Numeric and self.damage > 0
- self.absolute_defense_value -= self.damage
- self.damage = '-' + self.absolute_defense_value.to_s
- end
- return result
- end
- end
- #==============================================================================
- # Game_Battler
- #==============================================================================
- class Sprite_Battler
- #------------------------------------
- # Display damage
- #------------------------------------
- def damage(value, critical)
- dispose_damage
- if value.is_a?(Numeric)
- damage_string = value.abs.to_s
- else
- damage_string = value.to_s
- end
- bitmap = Bitmap.new(160, 48)
- bitmap.font.name = 'Arial Black'
- bitmap.font.size = 32
- bitmap.font.color.set(0, 0, 0)
- bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
- bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
- bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
- bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)
- if value.is_a?(Numeric) and value < 0
- bitmap.font.color.set(176, 255, 144)
- elsif value.is_a?(String) and value.include?('-') and @battler.absolute_defense_value > 0 and not @battler.absolute_defense_break
- @battler.animation_id = KreadCFG::FULL_ANIM_ID
- bitmap.font.color.set(230, 230, 75)
- elsif @battler.class == Game_Enemy and @battler.absolute_defense_break
- @battler.animation_id = KreadCFG::BREAK_ANIM_ID
- @battler.absolute_defense_break = false
- bitmap.font.color.set(255, 255, 255)
- else
- @battler_animation_id = 0
- bitmap.font.color.set(255, 255, 255)
- end
- bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
- if critical
- bitmap.font.size = 20
- bitmap.font.color.set(0, 0, 0)
- bitmap.draw_text(-1, -1, 160, 20, "CRITICAL", 1)
- bitmap.draw_text(+1, -1, 160, 20, "CRITICAL", 1)
- bitmap.draw_text(-1, +1, 160, 20, "CRITICAL", 1)
- bitmap.draw_text(+1, +1, 160, 20, "CRITICAL", 1)
- bitmap.font.color.set(255, 255, 255)
- bitmap.draw_text(0, 0, 160, 20, "CRITICAL", 1)
- 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
- end
- end
- #==============================================================================
- # Scene_Battle
- #==============================================================================
- class Scene_Battle
- #------------------------------------
- # Alias the phase 1
- #------------------------------------
- alias krx_absdef_start_phase1 start_phase1
- def start_phase1
- @ad_count = {}
- $game_troop.enemies.each do |enemy|
- @ad_count[enemy.index] = enemy.absolute_defense_refresh_rate
- end
- krx_absdef_start_phase1
- end
- #------------------------------------
- # Alias the step 6 of phase 4
- #------------------------------------
- alias krx_absdef_update_step6 update_phase4_step6
- def update_phase4_step6
- if @active_battler.is_a?(Game_Enemy) and @active_battler.movable?
- @ad_count[@active_battler.index] -= 1
- if @ad_count[@active_battler.index] == 0
- @ad_count[@active_battler.index] = @active_battler.absolute_defense_refresh_rate
- r_index = KreadCFG::ENEMIES_IDS.index(@active_battler.id)
- @active_battler.absolute_defense_value = KreadCFG::ABSOLUTE_VALUES[r_index]
- end
- end
- krx_absdef_update_step6
- end
- end
复制代码 |
|