#============================================================================== # ■ XP-RGSS-7 スキルアップデート [Ver.5.2.2] by Claimh #------------------------------------------------------------------------------ # 再定義:Game_Battler#skill_can_use? # Scene_Battle#make_skill_action_result # Window_Skill#draw_item # Scene_Skill#update_target #============================================================================== module SkillUpdate module_function #-------------------------------------------------------------------------- # ● 連続攻撃系スクリプトとの併用化処理 # 【仕様】連続攻撃系が動作中はレベルアップさせない。 # 他の連続攻撃系との併用についてもこのメソッドで吸収させる。 #-------------------------------------------------------------------------- def can_update?(actor) # 追尾攻撃 併用時 if defined?(ExtraAttack) return false if $scene.add_atk_exercise end # スキル連撃 併用時 if defined?(ExtraSkill) return false if $scene.skill_chase_exercise end # 一人連携 併用時 if defined?(SkillLink) return false if $scene.skill_linked end # 閃きシステム 併用時 if defined?(SysFlash) return false if actor.flash_flg end return true # 有効 end #-------------------------------------------------------------------------- # ● 汎用データ取得 #-------------------------------------------------------------------------- def get_data(orgdata, data, skill_id, actor_id) return orgdata if data[skill_id].nil? or data[skill_id][0].nil? return data[skill_id][actor_id].nil? ? data[skill_id][0] : data[skill_id][actor_id] end #-------------------------------------------------------------------------- # ● スキル最大レベル取得 #-------------------------------------------------------------------------- def skill_limit_lv(skill_id, actor_id) return get_data(LEVEL_LIMIT, S_LEVEL, skill_id, actor_id) end #-------------------------------------------------------------------------- # ● スキル威力上昇率取得 #-------------------------------------------------------------------------- def skill_might(skill_id, actor_id) return get_data(MIGHT_RATE, S_MIGHT, skill_id, actor_id) end #-------------------------------------------------------------------------- # ● スキルSP消費減少率取得 #-------------------------------------------------------------------------- def skill_cost(skill_id, actor_id) return get_data(COST_RATE, S_COST, skill_id, actor_id) end #-------------------------------------------------------------------------- # ● スキル命中上昇率取得 #-------------------------------------------------------------------------- def skill_hit(skill_id, actor_id) return get_data(HIT_RATE, S_HIT, skill_id, actor_id) end #-------------------------------------------------------------------------- # ● スキルレベル上昇間隔取得 #-------------------------------------------------------------------------- def skill_lv_inter(skill_id, actor_id) return get_data(UPDATE_INTERVAL, S_INTER, skill_id, actor_id) end #-------------------------------------------------------------------------- # ● スキルレベル上昇の傾き取得 #-------------------------------------------------------------------------- def skill_lv_slope(skill_id, actor_id) return get_data(UPDATE_SLOPE, S_SLOPE, skill_id, actor_id) end #-------------------------------------------------------------------------- # ● スキルEXPリスト(詳細版)取得 #-------------------------------------------------------------------------- def skill_exp(actor_id, skill_id, lv) return S_EXP[actor_id][skill_id][lv] if !S_EXP[actor_id].nil? and !S_EXP[actor_id][skill_id].nil? and !S_EXP[actor_id][skill_id][lv].nil? return S_EXP[actor_id][0][lv] if !S_EXP[actor_id].nil? and !S_EXP[actor_id][0].nil? and !S_EXP[actor_id][0][lv].nil? return S_EXP[0][skill_id][lv] if !S_EXP[0].nil? and !S_EXP[0][skill_id].nil? and !S_EXP[0][skill_id][lv].nil? return S_EXP[0][0][lv] if !S_EXP[0].nil? and !S_EXP[0][0].nil? and !S_EXP[0][0][lv].nil? return 0 end #-------------------------------------------------------------------------- # ● スキルEXP 計算 #-------------------------------------------------------------------------- def make_skill_list(skill_id, actor_id) # 上昇間隔 up_interval = skill_lv_inter(skill_id, actor_id) # 傾き up_slope = skill_lv_slope(skill_id, actor_id) # 限界レベル limit_lv = skill_limit_lv(skill_id, actor_id) list = [] list[0] = list[1] = 0 # スキルEXPリスト作成 for lv in 2..limit_lv case SKILL_PATTERN when 0; exp = up_interval * (lv-1) when 1; exp = list[lv-1] + up_slope * (lv-1) + up_interval when 2; exp = list[lv-1] + up_slope * (lv-1) * (lv-1) + up_interval when 3; exp = skill_exp(actor_id, skill_id, lv) else; exp = 0 end list[lv] = exp.truncate end #p actor_id, skill_id, list return list end #-------------------------------------------------------------------------- # ● スキルアニメーション取得 #-------------------------------------------------------------------------- def skill_anime(skill, actor) animation_id = skill.animation2_id s_anime = S_ANIME[skill.id] # 設定がない場合はデータベース上の設定を返す return animation_id if s_anime.nil? or s_anime[0].nil? or !USE_S_ANIME # アクターごとの設定取得 s_anime_set = s_anime[actor.id].nil? ? s_anime[0] : s_anime[actor.id] for a_set in s_anime_set # 規定レベル以上ならアニメーション変化 animation_id = a_set[1] if actor.skill[skill.id].level >= a_set[0] end return animation_id end #-------------------------------------------------------------------------- # ● スキル属性取得 #-------------------------------------------------------------------------- def skill_element(skill, actor_id) return get_data(skill.element_set, S_ELEMENT, skill.id, actor_id) end #-------------------------------------------------------------------------- # ● スキルステート変化+取得 #-------------------------------------------------------------------------- def skill_state_plus(skill, actor_id) return get_data(skill.plus_state_set, S_STATE_P, skill.id, actor_id) end #-------------------------------------------------------------------------- # ● スキルステート変化−取得 #-------------------------------------------------------------------------- def skill_state_minus(skill, actor_id) return get_data(skill.minus_state_set, S_STATE_M, skill.id, actor_id) end end #============================================================================== # ■ ActorSkill : アクターごとのスキル情報クラス #------------------------------------------------------------------------------ # 備考:アクターごとのスキル管理情報について # Game_Actorにスキルの管理情報を持たせる # スキルのレベルや経験値はこのスキル管理情報(ActorSkill)で管理する # ただし、情報量の増加を防ぐため以下の対処を行う # 1.スキル管理情報はスキル習得時に初期化される # 2.スキル管理情報はスキル忘却時には破棄される # パーディー加入時にアクターの初期化をした場合、スキル管理情報も初期化される #============================================================================== class ActorSkill attr_accessor :use_cnt # スキル使用回数 attr_accessor :level # スキルレベル attr_accessor :exp_list # スキルEXPリスト #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(skill_id, actor_id) @skill_id = skill_id @actor_id = actor_id @use_cnt = 0 @level = 1 @hit = $data_skills[skill_id].hit @exp_list = SkillUpdate.make_skill_list(skill_id, actor_id) end #-------------------------------------------------------------------------- # ● スキル威力 #-------------------------------------------------------------------------- def power if SkillUpdate::SKILL_MIGHT_UP rate = SkillUpdate.skill_might(@skill_id, @actor_id) * (@level-1) # 0以下はありえない rate = 0 if rate < 0 skill_p = $data_skills[@skill_id].power return skill_p + (skill_p * rate / 100).truncate else return $data_skills[@skill_id].power end end #-------------------------------------------------------------------------- # ● SP消費減少値 #-------------------------------------------------------------------------- def down_cost if SkillUpdate::SP_COST_DOWN rate = SkillUpdate.skill_cost(@skill_id, @actor_id) * (@level-1) # SP消費率が101以上はありえない rate = 100 if rate > 100 return ($data_skills[@skill_id].sp_cost * rate / 100).truncate else return 0 end end #-------------------------------------------------------------------------- # ● SP消費値 #-------------------------------------------------------------------------- def sp_cost return ($data_skills[@skill_id].sp_cost - down_cost) end #-------------------------------------------------------------------------- # ● 命中率 #-------------------------------------------------------------------------- def hit if SkillUpdate::SKILL_HIT_UP rate = SkillUpdate.skill_hit(@skill_id, @actor_id) * (@level-1) skill_h = $data_skills[@skill_id].hit r_hit = skill_h + (skill_h * rate / 100).truncate # 101以上はありえない r_hit = 100 if r_hit > 100 # -1以下はありえない r_hit = 0 if r_hit < 0 return r_hit else return $data_skills[@skill_id].hit end end #-------------------------------------------------------------------------- # ● 使用回数のリセット(現在のLV最小値に変更) #-------------------------------------------------------------------------- def reset_use @use_cnt = @exp_list[@level] end #-------------------------------------------------------------------------- # ● 使用回数設定 #-------------------------------------------------------------------------- def use_cnt=(exp) @use_cnt = [[exp, 9999999].min, 0].max # レベルアップ while levelup? and @exp_list[@level+1] > 0 @level += 1 end # レベルダウン while @use_cnt < @exp_list[@level] @level -= 1 end end #-------------------------------------------------------------------------- # ● レベルセット #-------------------------------------------------------------------------- def level=(new_level) return if new_level > SkillUpdate.skill_limit_lv(@skill_id, @actor_id) return if new_level < 1 @level = new_level reset_use end #-------------------------------------------------------------------------- # ● レベルアップ判定 #-------------------------------------------------------------------------- def levelup? return false if level_limit? # 最大レベル到達時は無視 return (@use_cnt >= @exp_list[@level+1]) end #-------------------------------------------------------------------------- # ● レベル上限到達判定 #-------------------------------------------------------------------------- def level_limit? return (@level >= SkillUpdate.skill_limit_lv(@skill_id, @actor_id)) end #-------------------------------------------------------------------------- # ● 次のレベルアップ経験値 #-------------------------------------------------------------------------- def next_exp return @exp_list[@level+1] end #-------------------------------------------------------------------------- # ● 次のレベルアップまであといくら? #-------------------------------------------------------------------------- def diff_next_exp return @exp_list[@level+1] - @use_cnt end end #============================================================================== # ■ Game_Actor #============================================================================== class Game_Actor attr_accessor :skill # 個別スキルデータ #-------------------------------------------------------------------------- # ● セットアップ #-------------------------------------------------------------------------- alias setup_skill_update setup def setup(actor_id) @skill = [] setup_skill_update(actor_id) end #-------------------------------------------------------------------------- # ● スキルを覚える #-------------------------------------------------------------------------- alias learn_skill_skillup learn_skill def learn_skill(skill_id) if skill_id > 0 and not skill_learn?(skill_id) @skill[skill_id] = ActorSkill.new(skill_id, @actor_id) end learn_skill_skillup(skill_id) end #-------------------------------------------------------------------------- # ● スキルを忘れる #-------------------------------------------------------------------------- alias forget_skill_skillup forget_skill def forget_skill(skill_id) @skill[skill_id] = nil forget_skill_skillup(skill_id) end end #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ● スキルの効果適用 #-------------------------------------------------------------------------- alias skill_effect_update skill_effect def skill_effect(user, skill) up_flag = false if user.is_a?(Game_Actor) up_flag = true # SkillUpdate対象 skill_base = $data_skills[skill.id].dup # 威力上昇 skill.power = user.skill[skill.id].power if SkillUpdate::SKILL_MIGHT_UP # 命中率上昇 skill.hit = user.skill[skill.id].hit if SkillUpdate::SKILL_HIT_UP # 属性変化 if SkillUpdate::ELEMENT_CHANGE skill.element_set = SkillUpdate.skill_element(skill, user.id) end # ステート変化 if SkillUpdate::STATE_CHANGE skill.plus_state_set = SkillUpdate.skill_state_plus(skill, user.id) skill.minus_state_set = SkillUpdate.skill_state_minus(skill, user.id) end end ret = skill_effect_update(user, skill) # 原物 # SkillUpdate対象になった場合は元に戻す if up_flag $data_skills[skill_base.id] = skill = skill_base.dup end return ret end #-------------------------------------------------------------------------- # ● スキルの使用可能判定 [再定義] # skill_id : スキル ID #-------------------------------------------------------------------------- def skill_can_use?(skill_id) flag = true if defined?(SysFlash) and SysFlash::FLASH_COST and self.flash_flg # 閃き時は SP/BPの判定はしない。 else # SP が足りない場合は使用不可 if defined?(SkillUpdate) and self.is_a?(Game_Actor) and SkillUpdate::SP_COST_DOWN flag = false if self.skill[skill_id].sp_cost > self.sp elsif $data_skills[skill_id].sp_cost > self.sp flag = false end if defined?(SysSkill_BP) and self.is_a?(Game_Actor) and $scene.is_a?(Scene_Battle) # SP消費なしなら一旦trueにする flag = true if !SysSkill_BP::BATTLE_SP_USE # BP が足りない場合は使用不可 flag = false if self.bp < SysSkill_BP.bp_cost(skill_id) end end return false unless flag # SP/BPが足りない # SP消費以外のその他の要因を再チェック[オリジナルからSP判定以外をコピー] # 戦闘不能の場合は使用不可 return false if dead? # 沈黙状態の場合、物理スキル以外は使用不可 return false if $data_skills[skill_id].atk_f == 0 and self.restriction == 1 # 使用可能時を取得 occasion = $data_skills[skill_id].occasion # 戦闘中の場合:[常時] または [バトルのみ] なら使用可 return (occasion == 0 or occasion == 1) if $game_temp.in_battle # 戦闘中ではない場合:[常時] または [メニューのみ] なら使用可 return (occasion == 0 or occasion == 2) end end #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 2 : アクション開始) #-------------------------------------------------------------------------- alias update_phase4_step2_skillup update_phase4_step2 def update_phase4_step2 @actor_skill_lv_up = false update_phase4_step2_skillup # 原物 end #-------------------------------------------------------------------------- # ● スキルアクション 結果作成 #-------------------------------------------------------------------------- def make_skill_action_result enable_cnt = true # 閃き時には熟練度やスキルアップデートのカウントはしない if defined?(SysFlash) # 閃き判定(エネミー閃き時を考慮するとこのタイミング) SysFlash.skill_flash(@active_battler) enable_cnt = false if @active_battler.flash_flg end # スキルを取得 @skill = $data_skills[@active_battler.current_action.skill_id] # 強制アクションでなければ unless @active_battler.current_action.forcing # SP 切れなどで使用できなくなった場合 unless @active_battler.skill_can_use?(@skill.id) # アクション強制対象のバトラーをクリア $game_temp.forcing_battler = nil # ステップ 1 に移行 @phase4_step = 1 return end end if enable_cnt # 閃いてないときだけ。 enable_attr_lvup = true if defined?(SkillUpdate) and @active_battler.is_a?(Game_Actor) and SkillUpdate.can_update?(@active_battler) old_level = @active_battler.skill[@skill.id].level # スキル使用回数を加算 @active_battler.skill[@skill.id].use_cnt += 1 @actor_skill_lv_up = (old_level < @active_battler.skill[@skill.id].level ? true : false) enable_attr_lvup = false if @actor_skill_lv_up end if defined?(SysUpdate) and @active_battler.is_a?(Game_Actor) and enable_attr_lvup # 熟練度計算 SysUpdate.element_use_count(@active_battler, @skill.element_set) end end # SP 消費 if defined?(SysFlash) and SysFlash::FLASH_COST and @active_battler.flash_flg # 閃き時はSP消費なし elsif defined?(SysSkill_BP) and !SysSkill_BP::BATTLE_SP_USE # スキルBP制で戦闘中のSP消費なしなら何もしない elsif defined?(SkillUpdate) and SkillUpdate::SP_COST_DOWN and @active_battler.is_a?(Game_Actor) @active_battler.sp -= @active_battler.skill[@skill.id].sp_cost else # 原型 @active_battler.sp -= @skill.sp_cost end # BP消費 if defined?(SysSkill_BP) @active_battler.bp -= SysSkill_BP.bp_cost(@skill.id) end # ステータスウィンドウをリフレッシュ @status_window.refresh # ヘルプウィンドウにスキル名を表示 @help_window.set_text(@skill.name, 1) # アニメーション ID を設定 @animation1_id = @skill.animation1_id # アニメーション変化 if defined?(SkillUpdate) and SkillUpdate::USE_S_ANIME @animation2_id = SkillUpdate.skill_anime(@skill, @active_battler) else @animation2_id = @skill.animation2_id end # コモンイベント ID を設定 @common_event_id = @skill.common_event_id # 対象側バトラーを設定 set_target_battlers(@skill.scope) miss_flag = true # スキルの効果を適用 for target in @target_battlers target.skill_effect(@active_battler, @skill) miss_flag = false if target.damage != "Miss" # 一体でも命中ならOK. end if miss_flag and enable_cnt # ミス時はカウント戻す if defined?(SkillUpdate) and @active_battler.is_a?(Game_Actor) and SkillUpdate.can_update?(@active_battler) @active_battler.skill[@skill.id].use_cnt -= 1 @actor_skill_lv_up = false end if defined?(SysUpdate) and @active_battler.is_a?(Game_Actor) and enable_attr_lvup SysUpdate.element_use_recount(@active_battler, @skill.element_set) end end # スキル名表示を閃きアニメーションの後にする if defined?(SysFlash) and SysFlash::FLASH_SKILL_TEXT and @active_battler.flash_flg @help_window.visible = false # ヘルプ消去 @flash_skill_text = false # 消去したことを記憶 end end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ) #-------------------------------------------------------------------------- alias update_phase4_step6_skillupdate update_phase4_step6 def update_phase4_step6 @actor_skill_lv_up = false update_phase4_step6_skillupdate end end #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++# # オプション機能 # #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++# #============================================================================== # ↓↓↓レベルアップ表示部分(レベルアップ表示がいらないなら消してもOK) #============================================================================== if SkillUpdate::SHOW_SKILL_LV_UP == 1 class Scene_Battle #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 2 : アクション開始) #-------------------------------------------------------------------------- alias update_phase4_step2_skillup_lvup update_phase4_step2 def update_phase4_step2 @skill_up_window = nil update_phase4_step2_skillup_lvup # 原物 end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 3 : 行動側アニメーション) #-------------------------------------------------------------------------- alias update_phase4_step3_skillup update_phase4_step3 def update_phase4_step3 update_phase4_step3_skillup return if @active_battler.is_a?(Game_Enemy) or !@actor_skill_lv_up @skill_up_window = Window_Skillup.new(@active_battler) return if SkillUpdate::SKILLUP_SE.nil? Audio.se_play("Audio/SE/" + SkillUpdate::SKILLUP_SE) end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示) #-------------------------------------------------------------------------- alias update_phase4_step5_skillup update_phase4_step5 def update_phase4_step5 unless @skill_up_window.nil? @skill_up_window.dispose @skill_up_window = nil end update_phase4_step5_skillup # 原物 end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias update_skillup update def update unless @skill_up_window.nil? @skill_up_window.contents_opacity -= 4 end update_skillup # 原物 end end class Window_Skillup < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 # actor : アクター #-------------------------------------------------------------------------- def initialize(actor) super(actor.screen_x-60, 260, 250, 64) self.contents = Bitmap.new(width - 32, height - 32) self.opacity = 0 self.contents.font.color = Color.new(255, 64, 0) self.contents.draw_text(0, 0, 150, 32, "LEVEL UP!") end end end # SkillUpdate::SHOW_SKILL_LV_UP == 1 if SkillUpdate::SHOW_SKILL_LV_UP == 2 class Scene_Battle #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 3 : 行動側アニメーション) #-------------------------------------------------------------------------- alias update_phase4_step3_skillupdate update_phase4_step3 def update_phase4_step3 update_phase4_step3_skillupdate # Lvupアニメーション表示 if @actor_skill_lv_up # 行動側アニメーションを変更 @active_battler.animation_id = SkillUpdate::SKILLUP_ANIME # ステップ 3 に最移行 @phase4_step = 3 @actor_skill_lv_up = false # 終了 end end end end # SkillUpdate::SHOW_SKILL_LV_UP == 2 #============================================================================== # ↑↑↑レベルアップ表示部分(レベルアップ表示がいらないなら消してもOK) #============================================================================== #============================================================================== # ↓↓↓SP消費減少機能関係の再定義(いらないなら消してもOK) #============================================================================== class Window_Skill < Window_Selectable #-------------------------------------------------------------------------- # ● 項目の描画(再定義) # index : 項目番号 #-------------------------------------------------------------------------- def draw_item(index) skill = @data[index] if @actor.skill_can_use?(skill.id) self.contents.font.color = normal_color else self.contents.font.color = disabled_color end x = 4 + index % 2 * (288 + 32) y = index / 2 * 32 rect = Rect.new(x, y, self.width / @column_max - 32, 32) self.contents.fill_rect(rect, Color.new(0, 0, 0, 0)) bitmap = RPG::Cache.icon(skill.icon_name) opacity = self.contents.font.color == normal_color ? 255 : 128 self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity) #-修正----- name_level = skill.name + "(Lv." + @actor.skill[skill.id].level.to_s + ")" self.contents.draw_text(x + 28, y, 204, 32, name_level, 0) self.contents.draw_text(x + 232, y, 48, 32, @actor.skill[skill.id].sp_cost.to_s, 2) #---------- end end if SkillUpdate::SP_COST_DOWN class Scene_Skill #-------------------------------------------------------------------------- # ● フレーム更新 (ターゲットウィンドウがアクティブの場合)(再定義) #-------------------------------------------------------------------------- def update_target # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) # ターゲットウィンドウを消去 @skill_window.active = true @target_window.visible = false @target_window.active = false return end # C ボタンが押された場合 if Input.trigger?(Input::C) # SP 切れなどで使用できなくなった場合 unless @actor.skill_can_use?(@skill.id) # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) return end # ターゲットが全体の場合 if @target_window.index == -1 # パーティ全体にスキルの使用効果を適用 used = false for i in $game_party.actors used |= i.skill_effect(@actor, @skill) end end # ターゲットが使用者の場合 if @target_window.index <= -2 # ターゲットのアクターにスキルの使用効果を適用 target = $game_party.actors[@target_window.index + 10] used = target.skill_effect(@actor, @skill) end # ターゲットが単体の場合 if @target_window.index >= 0 # ターゲットのアクターにスキルの使用効果を適用 target = $game_party.actors[@target_window.index] used = target.skill_effect(@actor, @skill) end # スキルを使った場合 if used # スキルの使用時 SE を演奏 $game_system.se_play(@skill.menu_se) #-----修正------------------------------------------------------ # SP 消費 @actor.sp -= @actor.skill[@skill.id].sp_cost #--------------------------------------------------------------- # 各ウィンドウの内容を再作成 @status_window.refresh @skill_window.refresh @target_window.refresh # 全滅の場合 if $game_party.all_dead? # ゲームオーバー画面に切り替え $scene = Scene_Gameover.new return end # コモンイベント ID が有効の場合 if @skill.common_event_id > 0 # コモンイベント呼び出し予約 $game_temp.common_event_id = @skill.common_event_id # マップ画面に切り替え $scene = Scene_Map.new return end end # スキルを使わなかった場合 unless used # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) end return end end end end # SkillUpdate::SP_COST_DOWN #============================================================================== # ↑↑↑SP消費減少機能関係の再定義(いらないなら消してもOK) #==============================================================================