#============================================================================== # ■ XP-RGSS-64 ジョブシステム [main] by Claimh #============================================================================== module JobSystem #-------------------------------------------------------------------------- # ● 汎用データ取得 #-------------------------------------------------------------------------- def self.get(data, a_id, c_id, org=1) return data[a_id][c_id] if !data[a_id].nil? and !data[a_id][c_id].nil? return data[a_id][0] if !data[a_id].nil? and !data[a_id][0].nil? return data[0][c_id] if !data[0].nil? and !data[0][c_id].nil? return data[0][0] if !data[0].nil? and !data[0][0].nil? return org end ### 職業レベル設定 ############################################################ #-------------------------------------------------------------------------- # ● EXPリスト #-------------------------------------------------------------------------- def self.exp(a_id, c_id) up_i = get(UP_I, a_id, c_id) up_s = get(UP_S, a_id, c_id) list = [] list[0] = list[1] = 0 # EXPリスト作成 for lv in 2..MAX_LV case LVUP_PTN when 0; exp = up_i * (lv-1) when 1; exp = list[lv-1] + up_s * (lv-1) + up_i when 2; exp = list[lv-1] + up_s * (lv-1) * (lv-1) + up_i when 3; exp = get(A_EXP, a_id, c_id)[lv] end list[lv] = exp.truncate end #p a_id, c_id, list, get(INIT_LV, a_id, c_id) return list end #-------------------------------------------------------------------------- # ● スキル使用可否 #-------------------------------------------------------------------------- def self.skill_can_use?(s_id, c_id) return C_SKILL[s_id].include?(c_id) if !C_SKILL[s_id].nil? and return true end ############################################################################### #============================================================================== # ■ JobSystem::Job #============================================================================== class Job #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :level attr_reader :exp #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(a_id, c_id) @a_id = a_id; @id = c_id @level = ::JobSystem.get(INIT_LV, a_id, c_id) @exp_list = ::JobSystem.exp(a_id, c_id) @exp = @exp_list[@level] #p a_id, c_id, @exp_list, @level, @exp end #-------------------------------------------------------------------------- # ● クラスデータ参照 #-------------------------------------------------------------------------- def obj return $data_classes[@id] end #-------------------------------------------------------------------------- # ● EXP の文字列取得 #-------------------------------------------------------------------------- def exp_s return @exp_list[@level+1] > 0 ? @exp.to_s : "-------" end #-------------------------------------------------------------------------- # ● 次のレベルの EXP の文字列取得 #-------------------------------------------------------------------------- def next_exp_s return @exp_list[@level+1] > 0 ? @exp_list[@level+1].to_s : "-------" end #-------------------------------------------------------------------------- # ● 次のレベルまでの EXP の文字列取得 #-------------------------------------------------------------------------- def next_rest_exp_s return @exp_list[@level+1] > 0 ? (@exp_list[@level+1] - @exp).to_s : "-------" end #-------------------------------------------------------------------------- # ● EXP の変更 # exp : 新しい EXP #-------------------------------------------------------------------------- def exp=(exp) @exp = [[exp, 9999999].min, 0].max while @exp >= @exp_list[@level+1] and @exp_list[@level+1] > 0 @level += 1 # レベルアップ end while @exp < @exp_list[@level] # レベルダウン @level -= 1 end end #-------------------------------------------------------------------------- # ● レベルの変更 # level : 新しいレベル #-------------------------------------------------------------------------- def level=(level) level = [[level, MAX_LV].min, 1].max # 上下限チェック self.exp = @exp_list[level] # EXP を変更 end #-------------------------------------------------------------------------- # ● 最大HP #-------------------------------------------------------------------------- def maxhp return ::JobSystem.get(MHP, @a_id, @id) * @level end #-------------------------------------------------------------------------- # ● 最大SP #-------------------------------------------------------------------------- def maxsp return ::JobSystem.get(MSP, @a_id, @id) * @level end #-------------------------------------------------------------------------- # ● 腕力 #-------------------------------------------------------------------------- def str return ::JobSystem.get(STR, @a_id, @id) * @level end #-------------------------------------------------------------------------- # ● 器用さ #-------------------------------------------------------------------------- def dex return ::JobSystem.get(DEX, @a_id, @id) * @level end #-------------------------------------------------------------------------- # ● 素早さ #-------------------------------------------------------------------------- def agi return ::JobSystem.get(AGI, @a_id, @id) * @level end #-------------------------------------------------------------------------- # ● 魔力 #-------------------------------------------------------------------------- def int return ::JobSystem.get(INT, @a_id, @id) * @level end end #============================================================================== # ■ JobSystem::JobList #============================================================================== class JobList #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(a_id) @id = a_id reset_all end #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def reset_all @list = {} end #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def reset(c_id) return (@list[c_id] = Job.new(@id, c_id)) end #-------------------------------------------------------------------------- # ● オブジェクト参照 #-------------------------------------------------------------------------- def [](c_id) return (@list[c_id].nil? ? reset(c_id) : @list[c_id]) end end end ## module JobChange #============================================================================== # ■ Game_Actor #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● セットアップ #-------------------------------------------------------------------------- alias setup_job setup def setup(actor_id) @job = JobSystem::JobList.new(actor_id) setup_job(actor_id) learn_job_skill end #-------------------------------------------------------------------------- # ● 現在のジョブ情報取得 #-------------------------------------------------------------------------- def job return @job[@class_id] end #-------------------------------------------------------------------------- # ● ジョブ情報取得 #-------------------------------------------------------------------------- def joblist return @job end #-------------------------------------------------------------------------- # ● ジョブEXP変化 #-------------------------------------------------------------------------- def job_exp=(e) old_lv = job.level job.exp = e learn_job_skill(old_lv) if old_lv < job.level end #-------------------------------------------------------------------------- # ● ジョブLevel変化 #-------------------------------------------------------------------------- def job_level=(lv) old_lv = job.level job.level = lv learn_job_skill(old_lv) if old_lv < job.level end def job_level return job.level end #-------------------------------------------------------------------------- # ● ジョブスキル習得 #-------------------------------------------------------------------------- def learn_job_skill(old_lv=1) data = JobSystem::get(JobSystem::LEARN, @actor_id, @class_id) keys = data.keys.sort for i in old_lv..self.job.level # スキル習得 for k in keys learn_skill(data[k]) if k == i break if k > i end end end #-------------------------------------------------------------------------- # ● 基本 MaxHP の取得 #-------------------------------------------------------------------------- alias base_maxhp_job base_maxhp def base_maxhp return [base_maxhp_job + job.maxhp, 9999].min end #-------------------------------------------------------------------------- # ● 基本 MaxSP の取得 #-------------------------------------------------------------------------- alias base_maxsp_job base_maxsp def base_maxsp return [base_maxsp_job + job.maxsp, 9999].min end #-------------------------------------------------------------------------- # ● 基本腕力の取得 #-------------------------------------------------------------------------- alias base_str_job base_str def base_str return [base_str_job + job.str, 999].min end #-------------------------------------------------------------------------- # ● 基本器用さの取得 #-------------------------------------------------------------------------- alias base_dex_job base_dex def base_dex return [base_dex_job + job.dex, 999].min end #-------------------------------------------------------------------------- # ● 基本素早さの取得 #-------------------------------------------------------------------------- alias base_agi_job base_agi def base_agi return [base_agi_job + job.agi, 999].min end #-------------------------------------------------------------------------- # ● 基本魔力の取得 #-------------------------------------------------------------------------- alias base_int_job base_int def base_int return [base_int_job + job.int, 999].min end #-------------------------------------------------------------------------- # ● スキルの使用可能判定 # skill_id : スキル ID #-------------------------------------------------------------------------- alias job_skill_can_use? skill_can_use? def skill_can_use?(skill_id) return false unless JobSystem.skill_can_use?(skill_id, @class_id) return job_skill_can_use?(skill_id) end #-------------------------------------------------------------------------- # ● クラス ID の変更 # class_id : 新しいクラス ID #-------------------------------------------------------------------------- alias class_id_job class_id= def class_id=(class_id) class_id_job(class_id) c = JobSystem.get(JobSystem::CHARACTOR, @actor_id, @class_id, [@character_name, @character_hue]) @character_name = c[0] @character_hue = c[1] b = JobSystem.get(JobSystem::BATTLER, @actor_id, @class_id, [@battler_name, @battler_hue]) @battler_name = b[0] @battler_hue = b[1] end end #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● アフターバトルフェーズ開始 #-------------------------------------------------------------------------- alias start_phase5_job start_phase5 def start_phase5 start_phase5_job for actor in $game_party.actors next if actor.cant_get_exp? last_lv = actor.job.level actor.job_exp = actor.job.exp + 1 @status_window.level_up(actor.index) if last_lv < actor.job.level end end end #============================================================================== # ■ Window_Base #============================================================================== class Window_Base < Window #-------------------------------------------------------------------------- # ● ジョブ名の描画 # job : クラス # x : 描画先 X 座標 # y : 描画先 Y 座標 #-------------------------------------------------------------------------- def draw_job_name(job, x, y, enable=true) self.contents.font.color = normal_color self.contents.font.color.alpha = 128 unless enable self.contents.draw_text(x, y, 120, 32, job.name) end #-------------------------------------------------------------------------- # ● ジョブレベルの描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 #-------------------------------------------------------------------------- def draw_actor_job_level(actor, x, y, enable=true) draw_actor_job_level2(actor, actor.class_id, x, y, enable) end #-------------------------------------------------------------------------- # ● ジョブレベルの描画 # actor : アクター # class_id : クラスID # x : 描画先 X 座標 # y : 描画先 Y 座標 #-------------------------------------------------------------------------- def draw_actor_job_level2(actor, class_id, x, y, enable=true) self.contents.font.color = system_color self.contents.font.color.alpha = 128 unless enable self.contents.draw_text(x, y, 32, 32, "Lv") self.contents.font.color = normal_color self.contents.font.color.alpha = 128 unless enable self.contents.draw_text(x + 32, y, 24, 32, actor.joblist[class_id].level.to_s, 2) end #-------------------------------------------------------------------------- # ● ジョブレベルの描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 #-------------------------------------------------------------------------- def draw_actor_job_level_star(actor, x, y) return draw_actor_job_level_star2(actor, actor.class_id, x, y) end #-------------------------------------------------------------------------- # ● ジョブレベルの描画 # actor : アクター # class_id : クラスID # x : 描画先 X 座標 # y : 描画先 Y 座標 #-------------------------------------------------------------------------- def draw_actor_job_level_star2(actor, class_id, x, y) w = self.contents.text_size("★").width for i in 0...JobSystem::MAX_LV s = i < actor.joblist[class_id].level ? "★" : "☆" self.contents.draw_text(x, y, w, 32, s) x += w end end #-------------------------------------------------------------------------- # ● EXP の描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 #-------------------------------------------------------------------------- def draw_actor_job_exp(actor, x, y, enable=true) return draw_actor_job_exp2(actor, actor.class_id, x, y, enable) end #-------------------------------------------------------------------------- # ● EXP の描画 # actor : アクター # class_id : クラスID # x : 描画先 X 座標 # y : 描画先 Y 座標 #-------------------------------------------------------------------------- def draw_actor_job_exp2(actor, class_id, x, y, enable=true) self.contents.font.color = system_color self.contents.font.color.alpha = 128 unless enable self.contents.draw_text(x, y, 24, 32, "E") self.contents.font.color = normal_color self.contents.font.color.alpha = 128 unless enable self.contents.draw_text(x + 4, y, 84, 32, actor.joblist[class_id].exp_s, 2) # self.contents.draw_text(x + 88, y, 12, 32, "/", 1) # self.contents.draw_text(x + 100, y, 84, 32, actor.joblist[class_id].next_exp_s) end end