# ▽△▽ XRXSv19. MeLT_Skill-B. セレクトスキル/カスタム ▽△▽ # # publish 2010/ 3/16 # update - /27 # #============================================================================== # カスタマイズポイント #============================================================================== module XRXSV19 SelectMax = 8 Skin = "Window" SkillPartsColor = Color.new(255, 255, 128, 255) SkillWordsColor = Color.new(255, 224, 64, 255) # Commands.push("カスタム") # # セレクトスキル(選択したスキルだけを使える) # SelectOnly = false end module Vocab def self.skill_parts return "スキルパーツ" end end class SkillParts Names =["", "ダメージアップ", "大ダメージアップ", "打撃力アップ", "魔法力アップ", "HP回復プラス", "成功率アップ", "大振り", "行動速度アップ", "消費MPカット", "消費MP半減", "MPブースト", "分散なし", "連続攻撃", "拡散", "全体化", "バーサーク", "", "の力", "追加 : ", "治癒 : ", "魔法剣", "MPにダメージ", "攻撃時吸収", "防御力無視" ] end #============================================================================== # スキルパーツ/セレクト #============================================================================== class Game_Actor < Game_Battler def skill_selected @skill_selected = [] if @skill_selected == nil return @skill_selected end def skill_selected_parts @skill_selected_parts = [] if @skill_selected_parts == nil return @skill_selected_parts end def skill_parts @skill_parts = [] if @skill_parts == nil return @skill_parts end def learn_skill_parts(parts_id) unless self.skill_parts.include?(parts_id) self.skill_parts.push(parts_id) self.skill_parts.sort! end end def skills_selected_objects result = [] for i in self.skill_selected result.push($data_skills[i]) if i != nil end return result end alias original_skills skills def skills set = [] basic_set = (XRXSV19::SelectOnly ? self.skills_selected_objects : self.original_skills) for original_skill in basic_set set.push(self.make_skill(original_skill)) end return set end def make_skill(original_skill) select_index = self.skill_selected.index(original_skill.id) new_skill = original_skill if select_index != nil parts_id = self.skill_selected_parts[select_index] if parts_id != nil parts = SkillParts.new(parts_id) new_skill = parts.make_skill(original_skill) end end return new_skill end end class Game_Battler def make_skill(original_skill) return original_skill end end class Game_BattleAction alias xrxsv19_skill skill def skill original_skill = xrxsv19_skill return self.battler.make_skill(original_skill) end end #============================================================================== # スキルパーツ機能 #============================================================================== # # 1:ダメージアップ # 2:大ダメージアップ # 3:打撃力アップ # 4:魔法力アップ # 5:HP回復プラス # 6:成功率アップ # 7:大振り(威力アップ/命中ダウン) # 8:行動速度アップ # 9:消費MPカット # 10:消費MP半減 # 11:MPブースト(威力大アップ/MP消費アップ) # 12:固定力(分散なし) # 13:2連続攻撃(ダメージダウン) # 14:拡散(全体化/ダメージダウン) # 15:全体化 # 16:バーサーク(対象ランダム/威力アップ) # 17: #x18: x属性追加 #x19: xステート追加 #x20: xステート解除追加 # 21:[物理攻撃]化 # 22:[MPダメージ]化+ダメージダウン # 23:[ダメージを吸収]付加 # 24:[防御力無視]付加 # #------------------------------------------------------------------------------ class SkillParts def name name = Names[self.id] case self.id when 18 name = $data_system.elements[@extra_id] + name when 19 name += $data_states[@extra_id].name when 20 name += $data_states[@extra_id].name end return name end def initialize(id) @id = id % 100 @extra_id = id / 100 end def id return @id end def key_id return @id + @extra_id * 100 end def make_skill(original_skill) skill = original_skill.dup skill.element_set = original_skill.element_set.dup skill.plus_state_set = original_skill.plus_state_set.dup skill.minus_state_set = original_skill.minus_state_set.dup case self.id when 1 if skill.base_damage >= 1 skill.name += "+" skill.base_damage += [skill.base_damage / 10, 30].max end when 2 if skill.base_damage >= 1 skill.name += "++" skill.base_damage += [skill.base_damage / 5, 60].max end when 3 skill.name += "!" skill.atk_f += 30 if skill.atk_f >= 1 when 4 skill.name += "!" skill.spi_f += 30 if skill.spi_f >= 1 when 5 if skill.base_damage <= 0 skill.name += "+" skill.base_damage += [skill.base_damage / 10, -50].max end when 6 skill.name += " - 命中+" skill.hit += 20 when 7 skill.name = "大振り" + skill.name skill.base_damage = skill.base_damage * 3 / 2 skill.hit = skill.hit * 3 / 4 when 8 skill.name += " - ファスト" skill.speed += 20 when 9 skill.mp_cost = skill.mp_cost * 4 / 5 when 10 skill.mp_cost /= 2 when 11 skill.name += " - ブースト" skill.base_damage = skill.base_damage * 7 / 5 skill.mp_cost = skill.mp_cost * 3 / 2 when 12 skill.variance = 0 when 13 if skill.scope == 1 skill.name += " x 2" skill.scope = 3 skill.base_damage = skill.base_damage * 3 / 5 end when 14 skill.name = "拡散" + skill.name if skill.scope == 1 skill.scope = 2 skill.base_damage = skill.base_damage * 3 / 4 elsif skill.scope == 7 skill.scope = 8 skill.base_damage = skill.base_damage * 3 / 4 elsif skill.scope == 9 skill.scope = 10 skill.base_damage = skill.base_damage * 3 / 4 end when 15 skill.name = "全体" + skill.name if skill.scope == 1 skill.scope = 2 elsif skill.scope == 7 skill.scope = 8 elsif skill.scope == 9 skill.scope = 10 end when 16 skill.name += " - バーサーク" if skill.scope == 1 skill.scope = 4 skill.base_damage = skill.base_damage * 4 / 3 elsif skill.scope == 2 skill.scope = 6 skill.base_damage = skill.base_damage * 4 / 3 elsif skill.scope == 3 skill.scope = 5 skill.base_damage = skill.base_damage * 4 / 3 end when 18 if @extra_id >= 1 and not skill.element_set.include?(@extra_id) skill.name = $data_system.elements[@extra_id].to_s + "の" + skill.name skill.element_set.push(@extra_id) end when 19 if @extra_id >= 1 and not skill.plus_state_set.include?(@extra_id) skill.name += " + " + $data_states[@extra_id].name skill.plus_state_set.push(@extra_id) end when 20 if @extra_id >= 1 and not skill.minus_state_set.include?(@extra_id) skill.name += " + " + $data_states[@extra_id].name + "解除" skill.minus_state_set.push(@extra_id) end when 21 skill.physical_attack = true if skill.spi_f >= 30 skill.name = "魔法剣" + skill.name end when 22 skill.name += " - MP" skill.damage_to_mp = true skill.base_damage = skill.base_damage / 2 when 23 skill.name += " - 吸収" skill.absorb_damage = true when 24 skill.name += " - 貫通" skill.ignore_defense = true end return skill end end #============================================================================== # スキルシーンへの登録 #============================================================================== module XRXSV19_SceneAdd def start super @actor = $game_party.members[@actor_index] @custom_window = Window_SkillCustom.new(@actor) @custom_window.visible = false @custom_window.active = false @customlist_window = Window_SkillPartsList.new(@actor) @customlist_window.active = false @customname_sprite = Sprite_CustomName.new @customname_sprite.visible = false end def terminate super @custom_window.dispose @customlist_window.dispose @customname_sprite.dispose end def update_extra if @customlist_window.active @customlist_window.update xl = Graphics.width - @customlist_window.width + 16 @customlist_window.x -= 32 @customlist_window.x = xl if @customlist_window.x < xl update_customlist return true else xl = Graphics.width @customlist_window.x += 32 @customlist_window.x = xl if @customlist_window.x > xl if @custom_window.active @custom_window.update update_custom return true end end return super end def update_extra_command_decide(work_id) super if work_id == 2 @custom_window.show! @customname_sprite.visible = true @custom_window.help_window = @help_window @customlist_window.help_window = @help_window end end def update_custom if Input.trigger?(Input::B) Sound.play_cancel @command_window.cancel! rescue nil @custom_window.visible = false @customname_sprite.visible = false @custom_window.index = -1 @custom_window.active = false @command_window.active = true @help_window.set_text("") @help_window.visible = !@clear_style elsif Input.trigger?(Input::R) Sound.play_cursor next_actor elsif Input.trigger?(Input::L) Sound.play_cursor prev_actor elsif Input.trigger?(Input::C) Sound.play_decision if @custom_window.index % 2 == 0 @customlist_window.set_skill else @customlist_window.set_custom end @customlist_window.index = 0 @customlist_window.active = true end end def update_customlist if Input.trigger?(Input::B) Sound.play_cancel @customlist_window.active = false elsif Input.trigger?(Input::C) skill = @customlist_window.skill Sound.play_decision @customlist_window.active = false if @custom_window.index % 2 == 0 if skill != nil for i in 0...@actor.skill_selected.size if @actor.skill_selected[i] == skill.id @actor.skill_selected[i] = nil end end id = skill.id else id = nil end @actor.skill_selected[@custom_window.index / 2] = id else if skill != nil for i in 0...@actor.skill_selected_parts.size if @actor.skill_selected_parts[i] == skill.key_id @actor.skill_selected_parts[i] = nil end end id = skill.key_id else id = nil end @actor.skill_selected_parts[@custom_window.index / 2] = id end @custom_window.refresh @customlist_window.index = -1 @skill_window.dispose_cache end end end class Scene_Skill < Scene_Base include XRXSV19_SceneAdd end #============================================================================== # スキルカスタムベース #============================================================================== class Window_SkillCustomBase < Window_Selectable def skill return @data[self.index] end def draw_item(index) rect = item_rect(index) self.contents.clear_rect(rect) skill = @data[index] draw_item_base(index) rect.width -= 4 rect.x += 2 self.contents.font.color = normal_color case skill when RPG::Skill draw_item_name(skill, rect.x, rect.y, true) when SkillParts last_color = self.contents.font.color.dup w = self.contents.text_size(skill.name).width * 4 / 5 self.contents.font.color = XRXSV19::SkillPartsColor self.contents.draw_text(rect.x, rect.y, w, WLH, skill.name) self.contents.font.color = last_color when nil self.contents.draw_text(rect.x + 24, rect.y, 140, WLH, "---") end end def draw_item_base(index) end def update_help if self.skill.is_a?(RPG::Skill) @help_window.set(self.skill) else @help_window.set_text("") end end end #============================================================================== # 用語 #============================================================================== class Sprite_CustomName < Sprite_Base def initialize super() self.x = 148 self.y = 96 self.z += 2 self.bitmap = Bitmap.new(320, 24) self.bitmap.font.size = 16 self.bitmap.font.color = XRXSV19::SkillWordsColor self.bitmap.draw_text( 0, 0, 96, 24, Vocab.skill) self.bitmap.draw_text(216, 0, 96, 24, Vocab.skill_parts) end end #============================================================================== # スキルカスタムウィンドウ #============================================================================== class Window_SkillCustom < Window_SkillCustomBase #-------------------------------------------------------------------------- # アイテムの描画 #-------------------------------------------------------------------------- def draw_item_base(index) rect = item_rect(index) skin = Cache.system(XRXSV19::Skin) skin_rect = Rect.new(0,16,64,32) self.contents.stretch_blt(rect, skin, skin_rect, 96) skin_rect = Rect.new(0,80,64,32) self.contents.stretch_blt(rect, skin, skin_rect, 192) skill = @data[index] if skill.is_a?(RPG::Skill) cost = @actor.calc_mp_cost(skill) rect.width -= 16 if cost >= 1 self.contents.draw_text(rect, cost, 2) end end end #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(actor) @actor = actor super(128, 104, 448, 272) self.opacity = 0 @column_max = 2 @refreshed = false end #-------------------------------------------------------------------------- # 表示! #-------------------------------------------------------------------------- def show! refresh unless @refreshed self.visible = true self.index = 0 self.active = true end #-------------------------------------------------------------------------- # リフレッシュ #-------------------------------------------------------------------------- def refresh @refreshed = true self.contents.clear @data = [] for i in 0...XRXSV19::SelectMax skill_id = @actor.skill_selected[i] skill = nil for skill2 in @actor.skills if skill2.id == skill_id skill = skill2 end end @data.push(skill) parts_id = @actor.skill_selected_parts[i] parts = (parts_id != nil ? SkillParts.new(parts_id) : nil) @data.push(parts) end @item_max = @data.size for i in 0...@item_max draw_item(i) end end #-------------------------------------------------------------------------- # ● 項目を描画する矩形の取得 #-------------------------------------------------------------------------- def item_rect(index) rect = Rect.new(0, 0, 0, 0) if index % @column_max == 0 rect.width = 212 rect.x = 0 else rect.x = 212 rect.width = self.contents.rect.width - rect.x end rect.height = WLH rect.y = index / @column_max * WLH return rect end end #============================================================================== # スキル/パーツリストウィンドウ #============================================================================== class Window_SkillPartsList < Window_SkillCustomBase #-------------------------------------------------------------------------- # オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(actor) @actor = actor super(544, 80, 208, 272) @data = [] @column_max = 1 end #-------------------------------------------------------------------------- # セット/リフレッシュ #-------------------------------------------------------------------------- def set_skill @data.clear for skill in @actor.original_skills + [nil] @data.push(skill) end refresh end def set_custom @data.clear for parts_id in @actor.skill_parts + [nil] parts = (parts_id != nil ? SkillParts.new(parts_id) : nil) @data.push(parts) end refresh end def refresh @item_max = @data.size create_contents for i in 0...@item_max draw_item(i) end end end