#====================================================================== #■RPGツクールVXAce 満タンコマンド #■Ver 0.91(β) 作:Lib #====================================================================== # ステータスをできるだけ解除し、HPをできるだけ回復します。 # # ■配布について # 導入に関しては自己責任で行って下さい。 # このスクリプト導入によって起こった不具合、不都合に関しては # 作者(Lib)には一切の責任は無いものとします。 # 使用に関して年齢制限作品、シェア、フリー等は問いません。 # # 二次配布は禁止です。 # 作品に使用した場合はreadmeに以下を明記して下さい。 # # MappingLife 満タンコマンド # http://librpg.blog.fc2.com/ # # ■準備 #  適当な位置に貼り付けて下さい。 # # ■使い方 # メニューの一番上に満タンコマンドが追加されます。 # 使用するとステータス異常とHPを # 実際にスキルを使用して満タンまで回復させます。 # # ■高度な設定と解説(通常は読み飛ばしても構いません。) # MP効率についてはある程度考慮しています。 # 効率が最高になる回復行動より、 # MP残量が多いキャラクターの行動が優先されるようになっています。 # # 「1MP消費に対しての回復量が多く、かつ回復総量が少ないスキル」 # # を一つ覚えさせておくと効率が上がります。 # # 乱数、使用者、使用対象、残MP等、使用スキル決定に影響を与えるものが多いため、 # 最高効率にならない事が多々あります。 # MP効率を考えるならば自力でスキルを使用し回復する事を # 前提とした設計になっており、あくまで補助程度に考えて下さい。 # # 使用効果にコモンイベントが含まれているスキルは使用対象になりません。 # # ■更新履歴 # Ver0.91(β) ステート変化が起こるスキルを使用しないように修正 # Ver0.90(β) 公開 #============================================================================== #============================================================================== # ■ Vocab #------------------------------------------------------------------------------ #  用語とメッセージを定義するモジュールです。定数でメッセージなどを直接定義す # るほか、グローバル変数 $data_system から用語データを取得します。 #============================================================================== module Vocab # まんたん HpFull = "まんたん" end #============================================================================== # ■ Window_MenuCommand #------------------------------------------------------------------------------ #  メニュー画面で表示するコマンドウィンドウです。 #============================================================================== class Window_MenuCommand < Window_Command #-------------------------------------------------------------------------- # ● 独自コマンドの追加用 #-------------------------------------------------------------------------- alias add_original_commands_Lib add_original_commands def add_original_commands add_original_commands_Lib add_command(Vocab::HpFull, :hpfull, main_commands_enabled) end end #============================================================================== # ■ Scene_Menu #------------------------------------------------------------------------------ #  メニュー画面の処理を行うクラスです。 #============================================================================== class Scene_Menu < Scene_MenuBase #-------------------------------------------------------------------------- # ● コマンドウィンドウの作成 #-------------------------------------------------------------------------- alias create_command_window_LS_Scene_Menu create_command_window def create_command_window create_command_window_LS_Scene_Menu @command_window.set_handler(:hpfull, method(:command_hp_full)) end #-------------------------------------------------------------------------- # ● 満タン #-------------------------------------------------------------------------- def command_hp_full p sprintf("==============================================") state_cure damage_cure @command_window.activate end #-------------------------------------------------------------------------- # ● ステート解除ルーチン #-------------------------------------------------------------------------- def state_cure while 1 clear_target state_member break unless @state_array[0] state_skill break unless @user #治療できるメンバーが居るか? use_skill(@user,$data_skills[@skill_id]) end end #-------------------------------------------------------------------------- # ● ダメージ回復ルーチン #-------------------------------------------------------------------------- def damage_cure while 1 break if hp_full? clear_target heal_member break unless @temp_target[0] #HPが減っているメンバーが居るか? heal_skill break unless @user #回復できるメンバーが居るか? use_skill(@user,$data_skills[@skill_id]) end end #-------------------------------------------------------------------------- # ● スキルの使用 #-------------------------------------------------------------------------- def use_skill(user,skill) p sprintf("%s → %s(%s)",user.name,@target[0].name,skill.name) play_se_for_item user.use_item(skill) use_item_to_actors(user) @status_window.refresh end #-------------------------------------------------------------------------- # ● 満タンかどうか? #-------------------------------------------------------------------------- def hp_full? num = 0 $game_party.alive_members.each do |actor| num += 1 if actor.hp == actor.mhp end return num == $game_party.members.size ? true : false end #-------------------------------------------------------------------------- # ● HPの減っているメンバーを取得 #-------------------------------------------------------------------------- def heal_member $game_party.alive_members.each do |actor| @temp_target.push(actor) if actor.hp < actor.mhp #全員を取得 end @temp_target.sort! {|a, b| (b.mhp-b.hp) - (a.mhp-a.hp) } end #-------------------------------------------------------------------------- # ● HPを回復できるメンバーを探す #-------------------------------------------------------------------------- def heal_skill #使用者の残MP,MP効率をレートに加算して #最もレートの高いスキルを使用する。 user_array = [] data0 = Struct.new(:user, :skill_id, :rate, :target) #全ての使用可能者とスキルとレートのデータを格納 $game_party.movable_members.each do |actor| actor.skills.each do |skill| if usable_data?(actor,$data_skills[skill.id]) data = data0.new(actor,skill.id,0,nil) #ターゲット修正 item = $data_skills[skill.id] if item.scope == 8 data.target = @temp_target elsif item.scope == 11 data.target = [data.user] else data.target = [@temp_target[0]] end #レート計算 data.rate += (actor.mp*100) if skill.mp_cost > 0 data.rate += (actor.tp*100) if skill.tp_cost > 0 data.rate += (item_recover_hp_one(actor,item,data.target) * 10) user_array.push(data) #p sprintf("%s %s %d",data.user.name,$data_skills[data.skill_id].name,data.rate) end end end return if user_array[0] == nil #レートから使用者と使用スキルとターゲットを決定 user_determination(user_array) end #-------------------------------------------------------------------------- # ● レートから使用者と使用スキルとターゲットを決定 #-------------------------------------------------------------------------- def user_determination(user_array) @user = user_array[0].user @skill_id = user_array[0].skill_id @target = user_array[0].target rate = user_array[0].rate user_array.each do | obj | if rate < obj.rate @user = obj.user @skill_id = obj.skill_id @target = obj.target rate = obj.rate end end end #-------------------------------------------------------------------------- # ● 使用者とスキルの候補になるか? #-------------------------------------------------------------------------- def usable_data?(actor,item) item_recover?(item) && actor.usable?(item) && item_common_event?(item) end #-------------------------------------------------------------------------- # ● 回復するスキルか? #-------------------------------------------------------------------------- def item_recover?(item) return false if item.scope == 9 || item.scope == 10 return true if item.damage.type == 3 item.effects.each do |effect| return true if effect.code == Game_Battler::EFFECT_RECOVER_HP end return false end #-------------------------------------------------------------------------- # ● コモンイベントが含まれるか? #-------------------------------------------------------------------------- def item_common_event?(item) item.effects.each do |effect| return false if effect.code == Game_Battler::EFFECT_COMMON_EVENT end return true end #-------------------------------------------------------------------------- # ● 1MP当たりの回復量を取得 #-------------------------------------------------------------------------- def item_recover_hp_one(user,item,target) @dummy_party = Marshal.load(Marshal.dump($game_party.members)) @dummy_party.each do |actor| @dummy_user = actor if actor.id == user.id end @dummy_target = [] target.each do |tag| @dummy_party.each do |actor| @dummy_target.push(actor) if actor.id == tag.id end end @dummy_user.use_item(item) use_item_to_actors_d(@dummy_user,item) old_hp = 0 now_hp = 0 $game_party.members.each {|actor| old_hp += actor.hp } @dummy_party.each {|actor| now_hp += actor.hp } ret = (now_hp - old_hp) / (item.mp_cost + item.tp_cost) return ret end #-------------------------------------------------------------------------- # ● アイテムをアクターに対して使用(ダミー) #-------------------------------------------------------------------------- def use_item_to_actors_d(user,item) item_target_actors_d(item).each do |target| item.repeats.times { target.item_apply(user, item) } end end #-------------------------------------------------------------------------- # ● アイテムの使用対象となるアクターを配列で取得(ダミー) #-------------------------------------------------------------------------- def item_target_actors_d(item) if !item.for_friend? [] elsif item.for_all? @dummy_party else @dummy_target #これは配列のはず end end #-------------------------------------------------------------------------- # ● ターゲットの初期化 #-------------------------------------------------------------------------- def clear_target @user = nil @target = nil @temp_target = [] @state_id = nil @skill_id = nil end #-------------------------------------------------------------------------- # ● ステートにかかっているメンバーを取得 #-------------------------------------------------------------------------- def state_member data0 = Struct.new(:target, :states) @state_array = [] $game_party.members.each do |actor| data = data0.new(actor,[]) $data_states.each do |state| next if state == nil data.states.push(state.id) if actor.state?(state.id) end @state_array.push(data) end end #-------------------------------------------------------------------------- # ● 使用者とスキルの候補になるか? #-------------------------------------------------------------------------- def usable_data_state?(actor,item,state_id,target) item_remove_state?(item,state_id) && actor.usable?(item) && target_check?(actor,target,item) && item_common_event?(item) && item_add_state?(item) end #-------------------------------------------------------------------------- # ● 指定したステートを解除するスキルか? #-------------------------------------------------------------------------- def item_remove_state?(item,state_id) item.effects.each do |effect| if effect.code == Game_Battler::EFFECT_REMOVE_STATE && effect.data_id == state_id return true end end return false end #-------------------------------------------------------------------------- # ● 何らかのステートを付加するスキルか? #-------------------------------------------------------------------------- def item_add_state?(item) item.effects.each do |effect| return false if effect.code == Game_Battler::EFFECT_ADD_STATE end return true end #-------------------------------------------------------------------------- # ● 指定したアクターをターゲットにできるか? #-------------------------------------------------------------------------- def target_check?(user,target,item) case item.scope when 7 return true when 8 return true when 9 return true #if item_remove_state?(item,1) when 10 return true #if item_remove_state?(item,1) when 11 #p sprintf("%s %d,%d",item.name,target[0].id,user.id) return true if target[0].id == user.id end return false end #-------------------------------------------------------------------------- # ● ステートを回復できるメンバーを探す #-------------------------------------------------------------------------- def state_skill user_array = [] data0 = Struct.new(:user, :skill_id, :rate, :target) $game_party.movable_members.each do |act| act.skills.each do |skill| data = data0.new(act,skill.id,0,[]) ret = false @state_array.each do |obj| obj.states.each do |state| if usable_data_state?(act,skill,state,[obj.target]) #どうせ後でターゲット修正するので一人取れればいい data.target.push(obj.target) if data.target[0] == nil data.rate += 10 end end break if data.rate > 0 end #p sprintf("%s %s %d",data.user.name,$data_skills[data.skill_id].name,data.rate) next if data.rate == 0 data.rate += (act.mp*100) if skill.mp_cost > 0 data.rate += (act.tp*100) if skill.tp_cost > 0 data.rate -= (skill.mp_cost + skill.tp_cost) data.rate += (data.target.size * 10) if scope_all?(skill) user_array.push(data) end end return if user_array[0] == nil #ユーザーとスキルIDとターゲットの決定 user_determination(user_array) end #-------------------------------------------------------------------------- # ● 効果範囲判定 #-------------------------------------------------------------------------- def scope_all?(skill) skill.scope == 8 || skill.scope == 10 ? true : false end #-------------------------------------------------------------------------- # ● 現在選択されているアイテムの取得 #-------------------------------------------------------------------------- def item $data_skills[@skill_id] end #-------------------------------------------------------------------------- # ● アイテムをアクターに対して使用 #-------------------------------------------------------------------------- def use_item_to_actors(user) item_target_actors.each do |target| item.repeats.times { target.item_apply(user, item) } end end #-------------------------------------------------------------------------- # ● アイテムの使用対象となるアクターを配列で取得 #-------------------------------------------------------------------------- def item_target_actors if !item.for_friend? [] elsif item.for_all? $game_party.members else @target #これは配列のはず end end #-------------------------------------------------------------------------- # ● アイテム使用時の SE 演奏 #-------------------------------------------------------------------------- def play_se_for_item Sound.play_use_item end end