# ▼▲▼ XRXS62. ダメージ表示機構 ▼▲▼ built102215 # by 桜雅 在土 #============================================================================== # --- XRXS. ダメージ表示機構 --- #============================================================================== module XRXS_DamageSettings #-------------------------------------------------------------------------- # 基本の段数の設定 #-------------------------------------------------------------------------- NORMAL = 1 # HPダメージに使う段数 MINUS = 2 # HP回復に使う段数 SP_NORMAL = 3 # SPダメージに使う段数 SP_MINUS = 4 # SP回復に使う段数 #-------------------------------------------------------------------------- # 指定文字を含む文字列の名前設定 # # 記述形式 : "指定文字列"=>"文字列" #-------------------------------------------------------------------------- SPECIAL_NAME_SETS = {"Miss"=>"Miss", "Guard"=>"Guard", } #-------------------------------------------------------------------------- # 指定文字を含む文字列の大きさ設定 # # 記述形式 : "指定文字列"=>数字 #-------------------------------------------------------------------------- SPECIAL_SIZE_SETS = {"Miss"=>32, "Guard"=>32, "EXP"=>26, "G"=>26, "Level up!"=>32 } #-------------------------------------------------------------------------- # 指定文字を含む文字列の色設定 # # 記述形式 : "指定文字列"=>Color.new(red, green, blue[, alpha]) #-------------------------------------------------------------------------- SPECIAL_COLOR_SETS = {"Miss"=>Color.new(34, 160, 255), "Guard"=>Color.new(224, 224, 34), "EXP"=>Color.new(255, 192, 64), "G"=>Color.new(255, 255, 32), "Level up!"=>Color.new(255, 255, 0) } #-------------------------------------------------------------------------- # ○ 使用段の取得 #-------------------------------------------------------------------------- def self.line(value_string) # # 条件による分岐 # value_string = value_string.to_s if value_string.is_a?(Numeric) if value_string.include?("SP") value = value_string[/[+-]?\d+/].to_i return (value >= 0 ? sp_normal : sp_minus) else value = (value_string).to_i return (value >= 0 ? normal : minus) end end #-------------------------------------------------------------------------- # ○ 段数の取得 #-------------------------------------------------------------------------- def self.line_max return [NORMAL, MINUS, SP_NORMAL, SP_MINUS].max end end #============================================================================== # --- XRXS. ダメージ表示機構 --- #============================================================================== module XRXS_DamageSettings #-------------------------------------------------------------------------- # ○ 色の取得 #-------------------------------------------------------------------------- def self.color(value_string) # # 指定文字列の検索 # for key in SPECIAL_COLOR_SETS.keys.sort! return SPECIAL_COLOR_SETS[key] unless value_string.scan(key).empty? end # # SPダメージ # unless value_string.include?("SP") value = value_string[/[+-]?\d+/].to_i color = (value >= 0 ? SPDAMAGE_COLOR : SPDAMAGE_MINUS) return color end # # 見つからなかった場合は標準 # value = (value_string).to_i color = (value >= 0 ? DEFAULT_COLOR : DEFAULT_MINUS) return color end end #============================================================================== # ● ダメージの表示 [再定義] #============================================================================== module RPG class Sprite < ::Sprite def damage(value, critical, overkill = false) return if value == "" begin numset = RPG::Cache.windowskin("Numset") critical_str = RPG::Cache.windowskin(XRXS_DamageSettings::CRITICAL_STRING) RPG::Cache.windowskin(SPECIAL_NAME_SETS["Miss"]) RPG::Cache.windowskin(SPECIAL_NAME_SETS["Level Up!"]) RPG::Cache.windowskin(SPECIAL_NAME_SETS["Guard"]) if defined?("XRXS_ResultPop") RPG::Cache.windowskin(SPECIAL_NAME_SETS["EXP"]) RPG::Cache.windowskin(SPECIAL_NAME_SETS["G"]) end if Game_Enemy.method_defined?("overkill") overkill_str = RPG::Cache.windowskin(XRXS_DamageSettings::OVERKILL_STRING) end # # 少々軽量化:文字の描画↓ # bitmap = RPG::Cache.plain(160, 72) # 文字列の設定 if value.is_a?(Numeric) or value.include?("SP") if value.is_a?(Numeric) damage_string = value.abs.to_s else damage_string = value[/\d+/] end split = damage_string.split(//) # 余白計算 numsize = numset.rect.width / 10 numheight = numset.rect.height / XRXS_DamageSettings.linemax padding = (160 - (split.size * numsize)) / 2 for d in 0...split.size bitmap.blt(padding + d * numsize, 28, numset, Rect.new(numsize * d, numheight * (XRXS_DamageSettings.line(value)), numsize, numheight)) end if critical padding = (160 - critical_str.rect.width) / 2 bitmap.blt(padding, 14, critical, critical.rect) end if overkill # 併用か padding = (160 - overkill_str.rect.width) / 2 bitmap.blt(padding, 0, overkill, overkill.rect) end elsif value != nil string = RPG::Cache.windowskin(XRXS_DamageSettings::SPECIAL_NAME_SETS[value]) padding = (160 - string.rect.width) / 2 bitmap.blt(padding, 0, string, string.rect) end # 一つでも欠けた場合(見栄えが大事です) rescue Errno::ENOENT # # まず先にフォントと色の取得 # font = XRXS_DamageSettings.font color = XRXS_DamageSettings.color(value.to_s) # # 少々軽量化:文字の描画↓ # bitmap = Bitmap.new(160, 72) bitmap.font = font bitmap.font.color = color # 文字列の設定 if value.is_a?(Numeric) or value.include?("SP") if value.is_a?(Numeric) damage_string = value.abs.to_s else damage_string = value.sub(/-/){} end split = damage_string.split(//) # 余白計算 padding = (160 - bitmap.text_size(damage_string).width) / 2 for d in 0...split.size text = RPG::Cache.hemtext(bitmap.text_size(split[d]).width, font.size + 4, split[d], color, font.size, Color.new(0, 0, 0), font.name) bitmap.blt(padding + bitmap.text_size(damage_string[/^.{#{d}}/]).width, 28, text, text.rect) end if critical critical_string = XRXS_DamageSettings::CRITICAL_STRING critical_size = XRXS_DamageSettings::CRITICAL_FONT_SIZE critical_color = XRXS_DamageSettings::CRITICAL_FONT_COLOR bitmap.font.size = critical_size padding = (160 - bitmap.text_size(critical_string).width) / 2 text = RPG::Cache.hemtext(bitmap.text_size(critical_string).width, critical_size + 4, critical_string, critical_color, critical_size, Color.new(0, 0, 0), font.name) bitmap.blt(padding, 14, text, text.rect) end if overkill # 併用か overkill_string = XRXS_DamageSettings::OVERKILL_STRING overkill_size = XRXS_DamageSettings::OVERKILL_FONT_SIZE overkill_color = XRXS_DamageSettings::OVERKILL_FONT_COLOR bitmap.font.size = overkill_size padding = (160 - bitmap.text_size(overkill_string).width) / 2 text = RPG::Cache.hemtext(bitmap.text_size(overkill_string).width, overkill_size + 4, overkill_string, overkill_color, overkill_size, Color.new(0, 0, 0), font.name) bitmap.blt(padding, 0, text, text.rect) end elsif value != nil string = XRXS_DamageSettings::SPECIAL_NAME_SETS[value] size = XRXS_DamageSettings::SPECIAL_SIZE_SETS[value] colorset = XRXS_DamageSettings::SPECIAL_COLOR_SETS[value] bitmap.font.size =size padding = (160 - bitmap.text_size(string).width) / 2 text = RPG::Cache.hemtext(bitmap.text_size(string).width, size + 4, string, colorset, size, Color.new(0, 0, 0), font.name) bitmap.blt(padding, 0, text, text.rect) 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 + 12 @_damage_sprite.y = self.y - self.oy / 2 @_damage_sprite.z = 3000 @_damage_duration = XRXS_DamageSettings::DURATION end end end #============================================================================== # □ SPダメージ表示機能 #------------------------------------------------------------------------------ # SPダメージ機能を搭載し、ダメージ時には"SP (値)"文字列を生成します。 #============================================================================== class Sprite_Battler < RPG::Sprite #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update # # バトラーがnilでない、可視、ダメージポップ、SPダメージ値有り # 通常ダメージなし  # # を全て満たす場合。 if @battler != nil and @battler_visible and @battler.damage_pop and @battler.damage_sp != nil # value = @battler.damage_sp # 解放 dispose_damage # 表示文字列の設定 damage_string = "SP " + value.to_s # ダメージ実行 damage(damage_string, @battler.critical) @battler.damage_sp = nil if @battler.damage == nil or @battler.damage == "" @battler.critical = false @battler.damage_pop = false end end # 呼び戻す xrxs62_update end end