# ▽△▽ XRXSv25. ダメージ・ポップ ▽△▽ # # publish 2010/ 3/18 # update - 4/28 # #============================================================================== # □ カスタマイズポイント #============================================================================== module XRXSV25 # # 数値として使う画像ファイル(Graphics/System) # Skin = "NumberL" # # 各ケタの表示タイミングのずれ # PopD = 2 # # 初期ズーム値 # Zoom = 1.0 # # ポップ初速/落下速度 # PopYStart = 10 PopYFall = 1 # # 各種文字表示 (""を指定すると表示しません) # Critical = "Critical!" Miss = "Miss!!" end #============================================================================== # 数値カラーの取得 #============================================================================== class Sprites_Pop end class Sprites_Damage < Sprites_Pop def get_color(mp_mode, recovering) return (mp_mode ? (recovering ? text_color(23) : # MP回復 text_color(10)) : # MPダメージ (recovering ? text_color(24) : # HP回復 nil)) # HPダメージ end end #============================================================================== # ダメージポップ機能 #============================================================================== class Game_Battler attr_accessor :damage_pops def damage_pops @damage_pops = [] if @damage_pops == nil return @damage_pops end end class Sprites_Pop def initialize @duration = 80 @sprites = [] end def dispose @sprites.each{|sprite| sprite.dispose } end def done? return @duration <= 0 end def update if @duration >= 1 @duration -= 1 for i in 0...@sprites.size update_sprites(i) end end end def update_sprites(i) end def rize(oy) for sprite in @sprites sprite.y -= oy end @y -= oy end end class Sprites_Damage < Sprites_Pop def initialize(x, y, z, pop_s) mp_mode = pop_s.to_s.include?(Vocab.mp_a) if mp_mode string = Vocab.mp_a number = pop_s.gsub(Vocab.mp_a, "").to_i elsif pop_s.is_a?(Numeric) string = "" number = pop_s else string = pop_s number = 0 end @recovering = (number < 0) number = number.abs @x = x @y = y - 16 @z = z @color = get_color(mp_mode, @recovering) @color.alpha = 128 if @color @number = number super() skin = Cache.system(XRXSV25::Skin) rescue Bitmap.new(10,10) @w = skin.width / 10 @h = skin.height @speeds = [] displays = [] if number >= 1 or string == "" loop do n = number % 10 displays.push(n) number /= 10 break if number <= 0 end end displays.push(string) for i in 0...displays.size n = displays[i] sprite = Sprite_Base.new sprite.x = @x - (i - 1) * @w sprite.y = @y sprite.z = @z + 401 sprite.opacity = 0 sprite.zoom_x = XRXSV25::Zoom sprite.zoom_y = XRXSV25::Zoom if n.is_a?(Integer) sprite.bitmap = Bitmap.new(@w, @h) rect = Rect.new(0, 0, @w, @h) rect.x = n * @w sprite.bitmap.blt(0, 0, skin, rect) else sprite.bitmap = Bitmap.new(96, 16) sprite.bitmap.font.size = 16 sprite.bitmap.draw_text(sprite.bitmap.rect, string, 2) end sprite.color = @color if @color sprite.ox = sprite.bitmap.width sprite.oy = sprite.bitmap.height @sprites[i] = sprite @speeds[i] = XRXSV25::PopYStart end end def update_sprites(i) sprite = @sprites[i] count = @duration + XRXSV25::PopD * (@sprites.size - i) if count == 79 sprite.opacity = 255 elsif count <= 78 and count >= 12 sprite.y = [sprite.y - @speeds[i], @y - @h].min @speeds[i] -= XRXSV25::PopYFall sprite.zoom_x = [sprite.zoom_x - 0.2, 1.0].max sprite.zoom_y = [sprite.zoom_y - 0.2, 1.0].max elsif count < 12 sprite.opacity -= 22 end end def text_color(n) x = 64 + (n % 8) * 8 y = 96 + (n / 8) * 8 return Cache.system("Window").get_pixel(x, y) end end module XRXSV25_POPS def pops @pops = [] if @pops == nil return @pops end def dispose super self.pops.each{|pop| pop.dispose } end def update super for i in 0...self.pops.size pop = self.pops[i] pop.update if pop.done? pop.dispose self.pops[i] = nil end end self.pops.compact! end end class Sprite_Battler < Sprite_Base include XRXSV25_POPS alias xrxsv25_setup_new_effect setup_new_effect def setup_new_effect xrxsv25_setup_new_effect if @use_sprite and @battler.damage_pops.size >= 1 for pop_s in @battler.damage_pops next if pop_s.to_s.empty? for sprite in self.pops sprite.rize(24) end sprite = Sprites_Damage.new(self.x, y, self.z, pop_s) self.pops.push(sprite) end @battler.damage_pops.clear end end end #============================================================================== # ダメージポップの指定 #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ● クリティカルの表示 #-------------------------------------------------------------------------- alias xrxsv25_display_critical display_critical def display_critical(target, obj = nil) if target.critical target.damage_pops.push(XRXSV25::Critical) end xrxsv25_display_critical(target, obj) end #-------------------------------------------------------------------------- # ● HPダメージの表示 #-------------------------------------------------------------------------- alias xrxsv25_display_hp_damage display_hp_damage def display_hp_damage(target, obj = nil) if (target.hp_damage != 0) or (target.hp_damage == 0 and (obj and obj.base_damage != 0 and !obj.damage_to_mp)) target.damage_pops.push(target.hp_damage) if target.absorbed @active_battler.damage_pops.push(-1 * target.hp_damage) end end xrxsv25_display_hp_damage(target, obj) end #-------------------------------------------------------------------------- # ● MPダメージ表示 #-------------------------------------------------------------------------- alias xrxsv25_display_mp_damage display_mp_damage def display_mp_damage(target, obj = nil) if (target.mp_damage != 0) target.damage_pops.push(Vocab.mp_a + target.mp_damage.to_s) if target.absorbed @active_battler.damage_pops.push(Vocab.mp_a + (-1 * target.mp_damage).to_s) end end xrxsv25_display_mp_damage(target, obj) end #-------------------------------------------------------------------------- # ● ミスの表示 #-------------------------------------------------------------------------- alias xrxsv25_display_miss display_miss def display_miss(target, obj = nil) if obj == nil or obj.physical_attack target.damage_pops.push(XRXSV25::Miss) end xrxsv25_display_miss(target, obj) end #-------------------------------------------------------------------------- # ● 回避の表示 #-------------------------------------------------------------------------- alias xrxsv25_display_evasion display_evasion def display_evasion(target, obj = nil) target.damage_pops.push(XRXSV25::Miss) xrxsv25_display_evasion(target, obj) end end