#============================================================================== # ■ RGSS3 サブ職業/転職関連システム Ver1.07 by 星潟 #------------------------------------------------------------------------------ # そのアクターの本来の職業とは別に、サブ職業を追加します。 # サブ職業は職業、ステートや装備等と同様に # そのアクターの持つ特徴の一つとして扱われます。 # # 職業名が描写される部分には、代わりにサブ職業の名前が表示されるようになります。 # (レベルアップによる能力変化は本来の職業のデータが用いられます) # # サブ職業のレベルアップはJEXPを以て行われます。 # 敵を倒す事や、JEXP獲得アイテムを使用する事でJEXPは増加します。 # 直接レベルアップするアイテムも作成出来ます。 # サブ職業レベルが上昇した時、本来職業に指定されたスキルも習得出来ます。 #============================================================================== # 職業のメモ欄に設定します。 #============================================================================== # <転職条件:S> # # この職業の転職条件を設定します。Sにはスクリプト文が入ります。 # 最低1つは設定しなければ、転職画面の一覧に表示されません。 # この設定は1つの職業につきいくつでも設定出来ます。 # # 例1.<転職条件:true> # この職業は誰でも転職出来る。 # # 例2.<転職条件:4 # この職業はアクターのレベルが4より大きい(5以上)なら転職出来る。 # # 例3.<転職条件:2 # この職業はアクターのサブ職業ID5の職業レベルが2より大きい(3以上)なら転職出来る。 # # 例4.<転職条件:$game_party.has_item?($data_items[1])> # この職業はアイテムID1を所持していれば転職出来る。 # # 例5.<転職条件:$game_switches[10]> # この職業はスイッチID10がONでなければ転職出来ない。 #------------------------------------------------------------------------------ # <最大JLV:50> # # この職業の最大職業レベルは50となります。 #------------------------------------------------------------------------------ # <転職禁止アクター:X> # # この職業への転職を禁止するアクターIDを指定します。 # Xには1つ以上のアクターIDが入ります。 # # 例1.<転職禁止アクター:1> # アクターID1はこの職業に転職出来ません。 # # 例2.<転職禁止アクター:1,2,3,4,5> # アクターID1、2、3、4、5はこの職業に転職出来ません。 #------------------------------------------------------------------------------ # <---転職画面テキスト---> # あいうえおかきくけこ # さしすせそたちつてと # なにぬねの # <---転職画面テキスト---> # # 転職画面においてこの職業にカーソルを合わせた時に # 右側の説明ウィンドウに表示する説明文を設定します。 # # この場合の説明文は下記3行となります。 # # あいうえおかきくけこ # さしすせそたちつてと # なにぬねの # # なお、アイテム説明文等と同様に\C[10]等の制御文字が使用できます。 #============================================================================== # アクターのメモ欄に設定します。 #============================================================================== # <初期職業:2> # # このアクターの初期職業として職業ID2が指定されます。 # 指定されない場合、設定項目で指定したデフォルト値になります。 # なお、本来転職出来ない職業でも設定出来ます。 #------------------------------------------------------------------------------ # <初期転職禁止> # # このアクターは初期状態から転職禁止となります。 # このアクターのサブ職業を変更する場合は # 転職禁止効果をイベントコマンドのスクリプトで解除するか # イベントコマンドのスクリプトで強制的に転職させる必要があります。 #============================================================================== # エネミーのメモ欄に設定します。 #============================================================================== # # # 対象が戦闘不能の場合、戦闘勝利時にJEXPを50獲得出来ます。 #============================================================================== # アイテム/スキルのメモ欄に設定します。 #============================================================================== # # # 対象の現在の職業EXPを50増加させます。 #------------------------------------------------------------------------------ # # # 対象の現在の職業レベルを1増加します。 #============================================================================== # 特徴を有する項目のメモ欄に設定します。 #============================================================================== # # # 敵撃破時の職業EXP入手割合を50%増加させます。 #============================================================================== # イベントコマンドのスクリプトで使用します。 #============================================================================== # call_job_change # # メニューで最後に選択したアクターの転職画面を呼び出します。 #------------------------------------------------------------------------------ # call_job_change(1) # # アクターID1の転職画面を呼び出します。 #------------------------------------------------------------------------------ # call_job_change(2,true) # # アクターID2の転職画面を呼び出します。 # こちらはアクターの切り替えが出来ません。 #------------------------------------------------------------------------------ # actor_jexp_get(A,J,E,S) # # 指定アクターの指定したサブ職業IDの職業EXPを増減します。 # AにはアクターのID、Jにはサブ職業ID(0の場合は現在の職業)、Eには職業EXP、 # Sにはレベルアップ表示を行うか否か(trueで表示、falseで非表示)を指定します。 # # 例1.actor_jexp_get(1,0,10000,true) # アクターID1の現在のサブ職業の職業EXPを+10000します。 # 職業レベルが増加した場合は表示します。 # # 例2.actor_jexp_get(2,5,5000,false) # アクターID2のサブ職業ID5の職業EXPを+5000します。 # 職業レベルが増加した場合は表示します。 #------------------------------------------------------------------------------ # actor_jlevelup(A,J,N,S) # # 指定アクターの指定したサブ職業IDのレベルを増減します。 # AにはアクターのID、Jにはサブ職業ID(0の場合は現在の職業)、Nにはレベル増減値、 # Sにはレベルアップ表示を行うか否か(trueで表示、falseで非表示)を指定します。 # # 例1.actor_jlevelup(1,0,2,true) # アクターID1の現在のサブ職業の職業レベルを+2します。 # 職業レベルが増加した場合は表示します。 # # 例2.actor_jlevelup(2,3,4,false) # アクターID2のサブ職業ID3の職業EXPを+4します。 # 職業レベルが増加した場合は表示します。 #------------------------------------------------------------------------------ # variables_get_actor_job(V,A) # # 指定IDの変数に指定アクターのサブ職業IDを格納します。 # Vには変数ID、AにはアクターIDが入ります。 # # 例.variables_get_actor_job(1,2) # 変数ID1にアクターID2のサブ職業IDを格納。 #------------------------------------------------------------------------------ # variables_get_actor_job_level(V,A,J) # # 指定IDの変数に指定アクターのサブ職業IDのレベルを格納します。 # Vには変数ID、AにはアクターのID、Jにはサブ職業ID(0の場合は現在の職業)が入ります。 # # 例.variables_get_actor_job_level(2,3,4) # 変数ID2にアクターID3のサブ職業ID4のレベルを格納。 #------------------------------------------------------------------------------ # variables_get_actor_job_exp(V,A,J) # # 指定IDの変数に指定アクターのサブ職業IDのEXPを格納します。 # Vには変数ID、AにはアクターのID、Jにはサブ職業ID(0の場合は現在の職業)が入ります。 # # 例.variables_get_actor_job_exp(5,6,0) # 変数ID5にアクターID6の現在のサブ職業のEXPを格納。 #============================================================================== # イベントコマンドの条件分岐スクリプトで使用します。 #============================================================================== # job_changeable_total(A,J) # # 指定アクターが指定したサブ職業に転職できるかを判定します。 # AにはアクターのID、Jには職業ID(0の場合は現在の職業)が入ります。 # # 例.job_changeable_total(5,3) # アクターID5はサブ職業ID3に転職出来るか? #------------------------------------------------------------------------------ # job_max_level(A,J) # # 指定アクターが指定したサブ職業の最大レベルに到達しているかを判定します。 # AにはアクターのID、Jには職業ID(0の場合は現在の職業)が入ります。 # # 例.job_max_level(5,0) # アクターID5は現在のサブ職業に転職出来るか? #============================================================================== module EasyJobSystem #転職条件設定用キーワードを指定。 Word1 = "転職条件" #最大職業レベル設定用キーワードを指定。 Word2 = "最大JLV" #この職業に転職できないアクター設定用キーワードを指定。 Word3 = "転職禁止アクター" #転職画面右下ウィンドウに表示するテキスト設定用キーワードを指定。 Word4 = "---転職画面テキスト---" #アクターに設定するデフォルトサブ職業IDを指定。 Word5 = "初期職業" #最初から転職禁止状態にする場合の設定用キーワードを指定。 Word6 = "初期転職禁止" #エネミーの持つJEXPを指定。 Word7 = "JEXP" #アイテム/スキルの持つJEXPを指定。 Word8 = "JEXPUP" #アイテム/スキルの持つサブ職業レベルアップ効果を指定。 Word9 = "JLVUP" #特徴の持つJEXP変動割合効果を指定。 Word10 = "JEXP獲得割合" #デフォルトでのJEXPを指定。 #(JEXPを指定しないエネミーのJEXPは全てこの値になる) DefPE = 1 #デフォルトでのサブ職業最大レベルを指定。 #(最大レベルを指定しない職業は全てこれが最大値になる) DefML = 5 #アクターに設定するデフォルトでのサブ職業IDを指定。 #(デフォルト職業を指定しないアクターは全てこのサブ職業になる) DefID = 1 #空のハッシュを作成。 WDraw = {} #各データのX座標調整値、Y座標調整値、描写幅を指定。 #メニュー画面の現在の職業EXP WDraw[:menu] = [172,36,56] #メニュー画面の現在の職業EXP WDraw[:status] = [72,0,56]#[72,-47,56]も有り? #メニューコマンドに職業変更を追加するスイッチIDを指定。 #0以下のIDを指定した場合、常時追加。 SID = 0 #メニュー画面での職業変更のコマンド名を指定。 JobTitle = "職業変更" #戦闘画面での職業レベルアップ時の項目名を指定。 JobName = "職業名" #転職画面での現在の職業の項目名を指定。 JobNW = "現在の職業" #戦闘画面や転職画面での職業レベルの項目名を指定。 JobLV = "職業レベル" #メニュー画面やステータス画面での職業レベルの項目名を指定。 JobLV_a = "JLV" #戦闘画面での職業経験値の名前と転職画面での表示項目名を指定。 JobEX = "職業経験値" #転職画面での次の職業レベルまでの職業EXP表示項目名を指定。 JobNX = "次のレベルまで" #戦闘画面での職業経験値獲得表示フォーマットを指定。 GJExp = "%s の%sを獲得!" #戦闘画面での職業レベルアップ表示フォーマットを指定。 JLVUp = "%sは%sの%s %s に上がった!" #職業レベル最大時の職業経験値表示内容を指定。 MaxJE = "-------" #戦闘外でのアイテム/スキルによる職業レベルアップ時 #マップ上でレベルアップ表示を行うかを指定。 Show = true #転職画面で職業レベル最大の場合に表示するアイコンを指定。 Icon = 125 #転職画面のヘルプウィンドウの内容を指定。 #0が通常時、1が職業変更禁止状態時。 HText = [] HText[0] = "%sの職業を選択して下さい。" HText[1] = "%sは職業を変更出来ません。" end class Game_Interpreter #-------------------------------------------------------------------------- # 転職画面呼び出し #-------------------------------------------------------------------------- def call_job_change(actor_id = false,fix = false) SceneManager.call(Scene_JobChange) SceneManager.scene.prepare(actor_id,fix) Fiber.yield end #-------------------------------------------------------------------------- # 指定アクタ―の指定職業のJEXPを増減 #-------------------------------------------------------------------------- def actor_jexp_get(aid,jid,exp,show = false) return if exp == 0 a = $game_actors[aid] return unless a j= jid == 0 ? a.job_class_id : jid return unless $data_classes[j] a.job_exp_gain(j,exp,false,show) end #-------------------------------------------------------------------------- # 指定アクタ―の指定職業のJLVを増減 #-------------------------------------------------------------------------- def actor_jlevelup(aid,jid,num,show = false) return if num == 0 a = $game_actors[aid] return unless a j= jid == 0 ? a.job_class_id : jid return unless $data_classes[j] a.job_level_up_num(j,num,show) end #-------------------------------------------------------------------------- # 指定アクタ―の転職禁止状態を変更 #-------------------------------------------------------------------------- def job_fix_change(aid,flag) a = $game_actors[aid] return unless a a.job_fix_change(flag) end #-------------------------------------------------------------------------- # 指定アクタ―の職業を強制変更 #-------------------------------------------------------------------------- def job_change(aid,jid) a = $game_actors[aid] return unless a j= jid == 0 ? a.job_class_id : jid return unless $data_classes[j] a.job_change(j) end #-------------------------------------------------------------------------- # 指定アクタ―の職業IDを変数に格納 #-------------------------------------------------------------------------- def variables_get_actor_job(vid,aid) a = $game_actors[aid] return unless a $game_variables[vid] = a.job_class_id end #-------------------------------------------------------------------------- # 指定アクタ―の指定職業IDのレベルを変数に格納 #-------------------------------------------------------------------------- def variables_get_actor_job_level(vid,aid,jid) a = $game_actors[aid] return unless a j= jid == 0 ? a.job_class_id : jid return unless $data_classes[j] $game_variables[vid] = a.job_level(jid) end #-------------------------------------------------------------------------- # 指定アクタ―の指定職業IDの経験値を変数に格納 #-------------------------------------------------------------------------- def variables_get_actor_job_exp(vid,aid,jid) a = $game_actors[aid] return unless a j= jid == 0 ? a.job_class_id : jid return unless $data_classes[j] $game_variables[vid] = a.job_exp(jid) end #-------------------------------------------------------------------------- # 指定アクタ―が指定した職業IDに転職できるかどうかを判定 #-------------------------------------------------------------------------- def job_changeable_total(aid,jid) a = $game_actors[aid] return false unless a j= jid == 0 ? a.job_class_id : jid return unless $data_classes[j] a.job_changeable_total(j) end #-------------------------------------------------------------------------- # 指定アクタ―が指定した職業の最大レベルに達しているかを判定 #-------------------------------------------------------------------------- def job_max_level(aid,jid) a = $game_actors[aid] return false unless a j= jid == 0 ? a.job_class_id : jid return unless $data_classes[j] a.job_max_level?(j) end end class RPG::Class < RPG::BaseItem #-------------------------------------------------------------------------- # 転職条件指定 #-------------------------------------------------------------------------- def job_class_condition @job_class_condition ||= create_job_class_condition end #-------------------------------------------------------------------------- # 転職条件作成 #-------------------------------------------------------------------------- def create_job_class_condition h = [] note.each_line {|l| h.push($1.to_s) if /<#{EasyJobSystem::Word1}[::](\S+)>/ =~ l} h.empty? ? ["false"] : h end #-------------------------------------------------------------------------- # 最大職業レベルを指定 #-------------------------------------------------------------------------- def job_max_level @job_max_level ||= /<#{EasyJobSystem::Word2}[::](\S+)>/ =~ note ? $1.to_s : EasyJobSystem::DefML.to_s end #-------------------------------------------------------------------------- # 転職禁止アクター配列 #-------------------------------------------------------------------------- def job_change_seal @job_change_seal ||= create_job_change_seal end #-------------------------------------------------------------------------- # 転職禁止アクター配列作成 #-------------------------------------------------------------------------- def create_job_change_seal (/<#{EasyJobSystem::Word3}[::](\S+)>/ =~ note ? $1.to_s : "").split(/\s*,\s*/).inject([]) {|r,i| r += [i.to_i]} end #-------------------------------------------------------------------------- # 転職禁止アクター配列 #-------------------------------------------------------------------------- def job_change_text @job_change_text ||= create_job_change_text end #-------------------------------------------------------------------------- # 転職禁止アクター配列作成 #-------------------------------------------------------------------------- def create_job_change_text t = "" flag = false note.each_line {|l| if /<#{EasyJobSystem::Word4}>/ =~ l flag = !flag else t += l if flag end} t end end class RPG::Actor < RPG::BaseItem #-------------------------------------------------------------------------- # 初期状態でのサブ職業IDを指定 #-------------------------------------------------------------------------- def default_job_class_id @default_job_class_id ||= /<#{EasyJobSystem::Word5}[::](\d+)>/ =~ note ? $1.to_i : EasyJobSystem::DefID end #-------------------------------------------------------------------------- # 初期状態でのサブ職業固定状態を指定 #-------------------------------------------------------------------------- def default_job_fix @default_job_fix ||= /<#{EasyJobSystem::Word6}>/ =~ note ? 1 : 0 end end class RPG::Enemy < RPG::BaseItem #-------------------------------------------------------------------------- # 倒す事で得られるJEXP #-------------------------------------------------------------------------- def pos_job_exp @pos_job_exp ||= /<#{EasyJobSystem::Word7}[::](\d+)>/ =~ note ? $1.to_i : EasyJobSystem::DefPE end end class RPG::UsableItem #-------------------------------------------------------------------------- # JEXP効果 #-------------------------------------------------------------------------- def job_exp_up @job_exp_up ||= /<#{EasyJobSystem::Word8}[::](\S+)>/ =~ note ? $1.to_s : "0" end #-------------------------------------------------------------------------- # JLVUP効果 #-------------------------------------------------------------------------- def job_level_up @job_level_up ||= /<#{EasyJobSystem::Word9}[::](\S+)>/ =~ note ? $1.to_s : "0" end end class RPG::BaseItem #-------------------------------------------------------------------------- # JEXP効果 #-------------------------------------------------------------------------- def job_exp_gain_rate @job_exp_gain_rate ||= /<#{EasyJobSystem::Word10}[::](\S+)>/ =~ note ? $1.to_s : "0" end end class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # スキル/アイテムの使用者側への効果 #-------------------------------------------------------------------------- alias item_user_effect_jle_effect item_user_effect def item_user_effect(user, item) if self.actor? ie = eval(item.job_exp_up) show = $game_party.in_battle ? false : EasyJobSystem::Show if ie != 0 job_exp_gain(job_class_id,ie,false,show) end il = eval(item.job_level_up) if il != 0 job_level_up_num(job_class_id,il,show) end end item_user_effect_jle_effect(user, item) end #-------------------------------------------------------------------------- # スキル/アイテムに有効な使用効果が一つでもあるかを判定 #-------------------------------------------------------------------------- alias item_has_any_valid_effects_job_exp_level? item_has_any_valid_effects? def item_has_any_valid_effects?(user, item) return true if item_has_any_valid_effects_job_exp_level?(user, item) return false if !self.actor? ie = eval(item.job_exp_up) il = eval(item.job_level_up) if ie < 0 or il < 0 job_hash[1] > 0 elsif ie > 0 or il > 0 !job_max_level? else false end end end class Game_Actor < Game_Battler attr_accessor :job_class_id attr_accessor :job_fix #-------------------------------------------------------------------------- # セットアップ #-------------------------------------------------------------------------- alias setup_job_system setup def setup(actor_id) init_job_data setup_job_system(actor_id) end #-------------------------------------------------------------------------- # JLVUp #-------------------------------------------------------------------------- def job_level_up_num(i,num,show) job_exp_change(i,job_exp_for_level(i,[[job_level(i) + num,1].max,job_max_level(i)].min),show) end #-------------------------------------------------------------------------- # 職業レベル初期化 #-------------------------------------------------------------------------- def init_job_data(i = 0) if i == 0 @job_hash = {} else @job_hash[i] = [1,0] end end #-------------------------------------------------------------------------- # スキルの初期化 #-------------------------------------------------------------------------- alias init_skills_job_system init_skills def init_skills init_skills_job_system job_skill_relearn end #-------------------------------------------------------------------------- # 特徴 #-------------------------------------------------------------------------- alias feature_objects_job_system feature_objects def feature_objects feature_objects_job_system + [job_data] end #-------------------------------------------------------------------------- # サブ職業ID #-------------------------------------------------------------------------- def job_class_id @job_class_id ||= actor.default_job_class_id end #-------------------------------------------------------------------------- # サブ職業データ #-------------------------------------------------------------------------- def job_data $data_classes[job_class_id] end #-------------------------------------------------------------------------- # サブ職業変更可否 #-------------------------------------------------------------------------- def job_changeable(i = job_class_id) c = $data_classes[i] return false if c.job_change_seal.include?(@actor_id) c.job_class_condition.all? {|c| eval(c)} end #-------------------------------------------------------------------------- # 総合的なサブ職業変更変更可否 #-------------------------------------------------------------------------- def job_changeable_total(i) !job_fix && job_changeable(i) end #-------------------------------------------------------------------------- # サブ職業変更 #-------------------------------------------------------------------------- def job_change(i) @job_class_id = i job_skill_relearn(i) refresh end #-------------------------------------------------------------------------- # サブ職業固定化 #-------------------------------------------------------------------------- def job_fix (@job_fix ||= actor.default_job_fix) == 1 end #-------------------------------------------------------------------------- # サブ職業固定化 #-------------------------------------------------------------------------- def job_fix_change(flag) @job_fix = flag ? 1 : 0 end #-------------------------------------------------------------------------- # サブ職業関係のレベルとEXPデータ #-------------------------------------------------------------------------- def job_hash(i = job_class_id) @job_hash ||= {} @job_hash[i] ||= [1,0] end #-------------------------------------------------------------------------- # JEXP変更 #-------------------------------------------------------------------------- def job_exp_change(i,exp,show) job_hash(i)[1] = exp last_level = job_level(i) last_skills = skills last_exp = job_hash(i)[1] job_level_up(i) while !job_max_level?(i) && last_exp >= job_next_level_exp(i) job_level_down(i) while last_exp < job_current_level_exp(i) display_job_level_up(i,skills - last_skills) if show && job_hash(i)[0] > last_level refresh end #-------------------------------------------------------------------------- # JEXP獲得 #-------------------------------------------------------------------------- def job_exp_gain(i,exp,flag,show) ge = (exp * (flag ? job_exp_gain_rate : 1)).to_i job_exp_change(i,job_hash(i)[1] + ge,show) end #-------------------------------------------------------------------------- # JEXP取得率特徴 #-------------------------------------------------------------------------- def job_exp_gain_rate feature_objects.inject(100) {|r,f| r += eval(f.job_exp_gain_rate)}.to_f / 100 end #-------------------------------------------------------------------------- # 指定JLVに上がるのに必要な累計JEXPの取得 #-------------------------------------------------------------------------- def job_exp_for_level(i,level) $data_classes[i].exp_for_level(level) end #-------------------------------------------------------------------------- # JEXPの初期化 #-------------------------------------------------------------------------- def job_init_exp(i = job_class_id) job_hash(i)[1] = job_current_level_exp(i) end #-------------------------------------------------------------------------- # 現在のJLVの最低JEXPを取得 #-------------------------------------------------------------------------- def job_current_level_exp(i = job_class_id) job_exp_for_level(i,job_level(i)) end #-------------------------------------------------------------------------- # 次のJLVの経験値を取得 #-------------------------------------------------------------------------- def job_next_level_exp(i = job_class_id) job_exp_for_level(i,job_level(i) + 1) end #-------------------------------------------------------------------------- # 次のJLVUPに必要な残り経験値を取得 #-------------------------------------------------------------------------- def job_next_level_exp_rest(i = job_class_id) job_next_level_exp(i) - job_hash(i)[1] end #-------------------------------------------------------------------------- # JLVを取得 #-------------------------------------------------------------------------- def job_level(i = job_class_id) job_hash(i)[0] end #-------------------------------------------------------------------------- # JEXPを取得 #-------------------------------------------------------------------------- def job_exp(i = job_class_id) job_hash(i)[1] end #-------------------------------------------------------------------------- # 最大JLV #-------------------------------------------------------------------------- def job_max_level(i = job_class_id) eval($data_classes[i].job_max_level) end #-------------------------------------------------------------------------- # 最大JLV判定 #-------------------------------------------------------------------------- def job_max_level?(i = job_class_id) job_level(i) >= job_max_level(i) end #-------------------------------------------------------------------------- # JLVUp #-------------------------------------------------------------------------- def job_level_up(i = job_class_id) job_hash(i)[0] += 1 $data_classes[i].learnings.each {|learning| learn_skill(learning.skill_id) if learning.level == job_level(i)} end #-------------------------------------------------------------------------- # JLVDown #-------------------------------------------------------------------------- def job_level_down(i = job_class_id) job_hash(i)[0] -= 1 end #-------------------------------------------------------------------------- # JSkill再習得 #-------------------------------------------------------------------------- def job_skill_relearn(i = job_class_id) v = job_hash(i) $data_classes[i].learnings.each {|learning| learn_skill(learning.skill_id) if learning.level <= v[0]} end #-------------------------------------------------------------------------- # JSkill全再習得 #-------------------------------------------------------------------------- def job_skill_relearn_all @job_hash.each {|k,v| $data_classes[k].learnings.each {|learning| learn_skill(learning.skill_id) if learning.level <= v[0]}} end #-------------------------------------------------------------------------- # JLVUpメッセージの表示 #-------------------------------------------------------------------------- def display_job_level_up(i,new_skills) $game_message.new_page $game_message.add(sprintf(EasyJobSystem::JLVUp, @name, $data_classes[i].name,EasyJobSystem::JobLV, job_level(i))) new_skills.each {|skill| $game_message.add(sprintf(Vocab::ObtainSkill, skill.name))} end end class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # JEXPの取得 #-------------------------------------------------------------------------- def jexp enemy.pos_job_exp end end class << BattleManager #-------------------------------------------------------------------------- # 獲得したJEXPの表示 #-------------------------------------------------------------------------- alias display_exp_job_system display_exp def display_exp display_exp_job_system e = $game_troop.jexp_total $game_message.add('\.' + sprintf(EasyJobSystem::GJExp, e, EasyJobSystem::JobEX)) if e > 0 end #-------------------------------------------------------------------------- # JEXPの獲得とJLVUpの表示 #-------------------------------------------------------------------------- alias gain_exp_job_system gain_exp def gain_exp gain_exp_job_system e = $game_troop.jexp_total return unless e > 0 $game_party.all_members.each {|a| a.job_exp_gain(a.job_class_id,e,true,true)} wait_for_message end end class Game_Troop < Game_Unit #-------------------------------------------------------------------------- # JEXPの合計計算 #-------------------------------------------------------------------------- def jexp_total dead_members.inject(0) {|r, enemy| r += enemy.jexp } end end class Scene_JobChange < Scene_MenuBase #-------------------------------------------------------------------------- # 準備 #-------------------------------------------------------------------------- def prepare(actor_id = nil,fix = false) $game_party.menu_actor = $game_actors[actor_id] if actor_id @actor_fix = fix end #-------------------------------------------------------------------------- # 開始処理 #-------------------------------------------------------------------------- def start super create_easy_help_window create_actor_window create_command_window create_data_window end #-------------------------------------------------------------------------- # ヘルプウィンドウの作成 #-------------------------------------------------------------------------- def create_easy_help_window @easy_help_window = Window_Help.new(1) refresh_help end #-------------------------------------------------------------------------- # ヘルプウィンドウのリフレッシュ #-------------------------------------------------------------------------- def refresh_help a = $game_party.menu_actor t = sprintf(EasyJobSystem::HText[a.job_fix ? 1 : 0],a.name) @easy_help_window.set_text(t) end #-------------------------------------------------------------------------- # アクターウィンドウの作成 #-------------------------------------------------------------------------- def create_actor_window @actor_window = Window_ActorJob.new(@easy_help_window) end #-------------------------------------------------------------------------- # コマンドウィンドウの作成 #-------------------------------------------------------------------------- def create_command_window @command_window = Window_JobChangeCommand.new(@actor_window) @command_window.set_handler(:ok, method(:job_change)) @command_window.set_handler(:cancel, method(:return_scene)) return if @actor_fix @command_window.set_handler(:pagedown, method(:next_actor)) @command_window.set_handler(:pageup, method(:prev_actor)) end #-------------------------------------------------------------------------- # データウィンドウの作成 #-------------------------------------------------------------------------- def create_data_window @data_window = Window_JobChangeData.new(@easy_help_window,@command_window) end #-------------------------------------------------------------------------- # アクターの切り替え #-------------------------------------------------------------------------- def on_actor_change @command_window.unselect [@actor_window,@command_window].each {|w| w.refresh} @command_window.index = 0 @data_window.refresh refresh_help @command_window.activate end #-------------------------------------------------------------------------- # 職業変更の実行 #-------------------------------------------------------------------------- def job_change @actor.job_change(@command_window.current_ext) [@actor_window,@command_window].each {|w| w.refresh} @command_window.index = @command_window.item_max unless @command_window.current_ext @data_window.refresh refresh_help @command_window.activate end end class Window_Base < Window #-------------------------------------------------------------------------- # 職業の描画 #-------------------------------------------------------------------------- def draw_actor_class(actor, x, y, width = 112, job_id = nil) change_color(normal_color) draw_text(x, y, width, line_height, (job_id ? actor.job_data(job_id) : actor.job_data).name) end #-------------------------------------------------------------------------- # レベルの描画 #-------------------------------------------------------------------------- def draw_actor_Job_level_easy(actor, x, y, width = 112, job_id = nil) change_color(system_color) draw_text(x, y, width, line_height, EasyJobSystem::JobLV_a) change_color(normal_color) draw_text(x, y, width, line_height, (job_id ? actor.job_level(job_id) : actor.job_level), 2) end end class Window_ActorJob < Window_Base def initialize(hw) x = 0 y = hw.y + hw.height w = Graphics.width / 2 h = 48 super(x,y,w,h) refresh end #-------------------------------------------------------------------------- # リフレッシュ #-------------------------------------------------------------------------- def refresh create_contents a = $game_party.menu_actor r = contents.rect r.x += 4 r.width -= 4 draw_actor_class(a,r.x,r.y,r.width) r.width = 80 r.x = contents_width - r.width draw_icon(EasyJobSystem::Icon,r.x,r.y) if a.job_max_level? r.width = 56 r.x = contents_width - r.width draw_actor_Job_level_easy(a, r.x, r.y, r.width) end #-------------------------------------------------------------------------- # サブ職業の描画 #-------------------------------------------------------------------------- def draw_actor_job_name(actor, x, y, width = 184) change_color(system_color) draw_text(x, y, width, line_height, EasyJobSystem::JobNW) change_color(normal_color) draw_text(x, y, width, line_height, actor.job_data.name,2) end end class Window_JobChangeCommand < Window_Command #-------------------------------------------------------------------------- # オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(aw) y = aw.y + aw.height @y_data = y super(0,y) end #-------------------------------------------------------------------------- # ウィンドウ幅 #-------------------------------------------------------------------------- def window_width Graphics.width / 2 end #-------------------------------------------------------------------------- # ウィンドウ幅 #-------------------------------------------------------------------------- def window_height Graphics.height - @y_data end #-------------------------------------------------------------------------- # 表示行数の取得 #-------------------------------------------------------------------------- def visible_line_number contents_height / line_height end #-------------------------------------------------------------------------- # コマンドリストの作成 #-------------------------------------------------------------------------- def make_command_list a = $game_party.menu_actor $data_classes.each {|c| add_command(c.name,:job_select,!(a.job_fix or a.job_class_id == c.id),c.id) if c && a.job_changeable(c.id)} end #-------------------------------------------------------------------------- # 項目の描写 #-------------------------------------------------------------------------- def draw_item(index) e = command_enabled?(index) change_color(normal_color,e) a = $game_party.menu_actor r = item_rect_for_text(index) e = @list[index][:ext] draw_text(r,command_name(index)) r.width = 80 r.x = contents_width - r.width draw_icon(EasyJobSystem::Icon,r.x,r.y) if a.job_max_level?(e) r.width = 56 r.x = contents_width - r.width draw_actor_Job_level_easy(a, r.x, r.y, r.width, e) end end class Window_JobChangeData < Window_Base #-------------------------------------------------------------------------- # オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(hw,cw) x = cw.x + cw.width y = hw.y + hw.height w = Graphics.width - x h = Graphics.height - y super(x,y,w,h) @command_window = cw @last_index = -1 end #-------------------------------------------------------------------------- # 更新 #-------------------------------------------------------------------------- def update super refresh if @last_ext != @command_window.current_ext end #-------------------------------------------------------------------------- # リフレッシュ #-------------------------------------------------------------------------- def refresh create_contents @last_ext = @command_window.current_ext return unless @last_ext draw_text_ex(0,0,$data_classes[@last_ext].job_change_text) end end class Window_MenuStatus < Window_Selectable #-------------------------------------------------------------------------- # 項目の描画 #-------------------------------------------------------------------------- alias draw_item_job_level draw_item def draw_item(index) draw_item_job_level(index) d = EasyJobSystem::WDraw[:menu] return unless d actor = $game_party.members[index] r = item_rect(index) draw_actor_Job_level_easy(actor,r.x + d[0],r.y + d[1],d[2]) end end class Window_Status < Window_Selectable #-------------------------------------------------------------------------- # レベルの描画 #-------------------------------------------------------------------------- unless method_defined?(:draw_actor_level_job_level) alias draw_actor_level_job_level draw_actor_level def draw_actor_level(actor, x, y) draw_actor_level_job_level(actor, x, y) d = EasyJobSystem::WDraw[:status] return unless d draw_actor_Job_level_easy(actor,x + d[0],y + d[1],d[2]) end end #-------------------------------------------------------------------------- # 経験値情報の描画 #-------------------------------------------------------------------------- def draw_exp_info(x, y) s1 = @actor.max_level? ? "-------" : @actor.exp s2 = @actor.max_level? ? "-------" : @actor.next_level_exp - @actor.exp s3 = @actor.job_max_level? ? "-------" : @actor.job_exp s4 = @actor.job_max_level? ? "-------" : @actor.job_next_level_exp_rest s_next = sprintf(Vocab::ExpNext, Vocab::level) change_color(system_color) draw_text(x, y + line_height * 0, 180, line_height, Vocab::ExpTotal) draw_text(x, y + line_height * 1, 180, line_height, s_next) draw_text(x, y + line_height * 2, 180, line_height, EasyJobSystem::JobEX) draw_text(x, y + line_height * 3, 180, line_height, EasyJobSystem::JobNX) change_color(normal_color) draw_text(x, y + line_height * 0, 208, line_height, s1, 2) draw_text(x, y + line_height * 1, 208, line_height, s2, 2) draw_text(x, y + line_height * 2, 208, line_height, s3, 2) draw_text(x, y + line_height * 3, 208, line_height, s4, 2) end end class Scene_Menu < Scene_MenuBase #-------------------------------------------------------------------------- # 個人コマンド[決定] #-------------------------------------------------------------------------- alias on_personal_ok_job_change on_personal_ok def on_personal_ok return SceneManager.call(Scene_JobChange) if @command_window.current_symbol == :job_change on_personal_ok_job_change end #-------------------------------------------------------------------------- # コマンドウィンドウの作成 #-------------------------------------------------------------------------- alias create_command_window_job_change create_command_window def create_command_window create_command_window_job_change @command_window.set_handler(:job_change,method(:command_personal)) end end class Window_MenuCommand < Window_Command #-------------------------------------------------------------------------- # 独自コマンドの追加用 #-------------------------------------------------------------------------- alias add_original_commands_job_change add_original_commands def add_original_commands add_original_commands_job_change sid = EasyJobSystem::SID add_command(EasyJobSystem::JobTitle,:job_change,main_commands_enabled) if sid > 0 ? $game_switches[sid] : true end end