#============================================================================== # ■ XP-RGSS-65 転職屋 [ウィンドウ] by Claimh #============================================================================== #============================================================================== # ■ Window_JobActors #============================================================================== class Window_JobActors < Window_Selectable LH = 96 #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 64, 240, 480-64) @item_max = $game_party.actors.size self.contents = Bitmap.new(width - 32, [height - 32, @item_max * LH].max) refresh self.index = 0 end #-------------------------------------------------------------------------- # ● 表示切替 #-------------------------------------------------------------------------- def enable self.active = self.visible = true update_help end def disable self.active = self.visible = false end #-------------------------------------------------------------------------- # ● アクター参照 #-------------------------------------------------------------------------- def actor return $game_party.actors[@index] end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear for i in 0...@item_max draw_i(i) end end #-------------------------------------------------------------------------- # ● 項目描画 #-------------------------------------------------------------------------- def draw_i(i) x = 64 y = i * LH actor = $game_party.actors[i] draw_actor_graphic(actor, x - 40, y + 80) self.contents.draw_text(x, y, 120, 32, actor.name) self.contents.draw_text(x, y+32, 120, 32, actor.class_name) if defined?(JobSystem) draw_actor_job_level(actor, x, y+64) else draw_actor_level(actor, x, y+64) end end #-------------------------------------------------------------------------- # ● 先頭の行の取得 #-------------------------------------------------------------------------- def top_row # ウィンドウ内容の転送元 Y 座標を、1 行の高さ 32 で割る return self.oy / LH end #-------------------------------------------------------------------------- # ● 先頭の行の設定 # row : 先頭に表示する行 #-------------------------------------------------------------------------- def top_row=(row) # row が 0 未満の場合は 0 に修正 if row < 0 row = 0 end # row が row_max - 1 超の場合は row_max - 1 に修正 if row > row_max - 1 row = row_max - 1 end # row に 1 行の高さ 32 を掛け、ウィンドウ内容の転送元 Y 座標とする self.oy = row * LH end #-------------------------------------------------------------------------- # ● 1 ページに表示できる行数の取得 #-------------------------------------------------------------------------- def page_row_max # ウィンドウの高さから、フレームの高さ 32 を引き、1 行の高さ 32 で割る return (self.height - 32) / LH end #-------------------------------------------------------------------------- # ● カーソルの矩形更新 #-------------------------------------------------------------------------- def update_cursor_rect # カーソル位置が 0 未満の場合 if @index < 0 self.cursor_rect.empty return end # 現在の行を取得 row = @index / @column_max # 現在の行が、表示されている先頭の行より前の場合 if row < self.top_row # 現在の行が先頭になるようにスクロール self.top_row = row end # 現在の行が、表示されている最後尾の行より後ろの場合 if row > self.top_row + (self.page_row_max - 1) # 現在の行が最後尾になるようにスクロール self.top_row = row - (self.page_row_max - 1) end # カーソルの幅を計算 cursor_width = self.width / @column_max - 32 # カーソルの座標を計算 x = @index % @column_max * (cursor_width + 32) y = @index / @column_max * LH - self.oy # カーソルの矩形を更新 self.cursor_rect.set(x, y, cursor_width, LH) end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.actor = actor end end #============================================================================== # ■ Window_JobActInfo #============================================================================== class Window_JobActInfo < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize @page_max = defined?(JobSystem) ? 2 : 1 super(240, 64, 400, 480-64) w = @page_max == 1 ? (width - 32) : (width - 32 + 10) self.contents = Bitmap.new(w, height - 32) @actor = nil @class_id = 0 @page = 0 end def fix? return (@page_max == 1) end #-------------------------------------------------------------------------- # ● アクター変更 #-------------------------------------------------------------------------- def actor=(a) return if @actor == a @actor = a @class_id = 0 self.ox = 0 refresh end #-------------------------------------------------------------------------- # ● クラス変更 #-------------------------------------------------------------------------- def class_id=(c) return if @class_id == c @class_id = c refresh end #-------------------------------------------------------------------------- # ● ページ変更 #-------------------------------------------------------------------------- def page_right @page = (@page + 1) % @page_max refresh end def page_left @page = (@page + @page_max - 1) % @page_max refresh end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear return if @actor.nil? case @page when 0; refresh_status when 1; refresh_levels end end #-------------------------------------------------------------------------- # ● リフレッシュ : アクターステータス #-------------------------------------------------------------------------- def refresh_status self.ox = 0 draw_battler_graphic(@actor) id = @class_id != 0 ? @class_id : @actor.class_id x = self.ox + 4 xx = self.ox + (self.contents.width-10) / 2 + 4 # draw_actor_name(@actor, x, 0) self.contents.draw_text(xx-20, 0, 236, 32, $data_classes[id].name) draw_actor_job_level2(@actor, id, xx+120, 0) if defined?(JobSystem) # word = [ "最大"+$data_system.words.hp, "最大"+$data_system.words.sp, $data_system.words.atk, $data_system.words.pdef, $data_system.words.mdef, $data_system.words.str, $data_system.words.dex, $data_system.words.agi, $data_system.words.int ] now = [ @actor.maxhp, @actor.maxsp, @actor.atk, @actor.pdef, @actor.mdef, @actor.str, @actor.dex, @actor.agi, @actor.int ] new = @class_id != 0 ? [ @actor.v_class(@class_id, 8), @actor.v_class(@class_id, 9), @actor.v_class(@class_id, 0), @actor.v_class(@class_id, 1), @actor.v_class(@class_id, 2), @actor.v_class(@class_id, 3), @actor.v_class(@class_id, 4), @actor.v_class(@class_id, 5), @actor.v_class(@class_id, 6) ] : now pos = [ [x, 32], [xx, 32], [x, 32*2], [x, 32*3], [xx, 32*3], [x, 32*4], [xx, 32*4], [x, 32*5], [xx, 32*5] ] # for i in 0...word.size draw_diff(pos[i][0], pos[i][1], word[i], now[i], new[i]) end # # item = [ $data_weapons[@actor.weapon_id], $data_armors[@actor.armor1_id], $data_armors[@actor.armor2_id], $data_armors[@actor.armor3_id], $data_armors[@actor.armor4_id] ] enable = @class_id != 0 ? [ $data_classes[@class_id].weapon_set.include?(@actor.weapon_id), $data_classes[@class_id].armor_set.include?(@actor.armor1_id), $data_classes[@class_id].armor_set.include?(@actor.armor2_id), $data_classes[@class_id].armor_set.include?(@actor.armor3_id), $data_classes[@class_id].armor_set.include?(@actor.armor4_id) ] : [true, true, true, true, true] # self.contents.font.color = system_color self.contents.draw_text(4, 32*6, 212, 32, "装備") self.contents.font.color = normal_color for i in 0...item.size self.contents.font.color.alpha = enable[i] ? 255 : 128 draw_item_name(item[i], x+20, 32*7+i*32, enable[i]) end end #-------------------------------------------------------------------------- # ● リフレッシュ : ジョブレベル #-------------------------------------------------------------------------- def refresh_levels self.ox = 10 column_max = 1 data = [] for i in 1...$data_classes.size data.push($data_classes[i]) if JobChange.enable(@actor.id, i) end # id = @class_id != 0 ? @class_id : @actor.class_id x = self.ox + 4 xx = self.ox + (self.contents.width-10) / 2 + 4 # draw_actor_name(@actor, x, 0) self.contents.draw_text(xx-20, 0, 236, 32, $data_classes[id].name) draw_actor_job_level2(@actor, id, xx+120, 0) if defined?(JobSystem) # self.contents.font.color = system_color self.contents.draw_text( x, 32, 80, 32, "EXP") self.contents.draw_text(xx, 32, 80, 32, "NEXT") self.contents.font.color = normal_color self.contents.draw_text( x + 40, 32, 112, 32, @actor.joblist[id].exp_s, 2) self.contents.draw_text(xx + 40, 32, 112, 32, @actor.joblist[id].next_rest_exp_s, 2) # self.contents.fill_rect(0, 80, self.contents.width, 2, normal_color) # for i in 0...data.size d = data[i] x = 24 + (i % column_max) * (self.contents.width-10) y = 32 * 3 + (i / column_max) * 32 draw_job_name(d, x, y) draw_actor_job_level_star2(@actor, d.id, x+130, y) end end #-------------------------------------------------------------------------- # ● パラメータ差分描画 #-------------------------------------------------------------------------- def draw_diff(x, y, word, now, new) self.contents.font.color = system_color self.contents.draw_text(x, y, 112, 32, word) if now < new self.contents.font.color = crisis_color elsif now > new self.contents.font.color = normal_color self.contents.font.color.alpha = 128 else self.contents.font.color = normal_color end self.contents.draw_text(x+40, y, 112, 32, new.to_s, 2) end #-------------------------------------------------------------------------- # ● アイテム描画 #-------------------------------------------------------------------------- def draw_item_name(item, x, y, enable) return if item.nil? bitmap = RPG::Cache.icon(item.icon_name) self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), enable ? 255 : 128) self.contents.draw_text(x + 28, y, 212, 32, item.name) end #-------------------------------------------------------------------------- # ● グラフィックの描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 #-------------------------------------------------------------------------- def draw_battler_graphic(actor, opacity=128) bitmap = RPG::Cache.battler(actor.battler_name, actor.battler_hue) cw = bitmap.width ch = bitmap.height src_rect = Rect.new(0, 0, cw, ch) self.contents.blt(self.ox+self.contents.width-10-cw, self.contents.height-ch, bitmap, src_rect, opacity) end end #============================================================================== # ■ Window_JobList #============================================================================== class Window_JobList < Window_Selectable include JobChange::MesCmd #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize h = JobChange::USE_GOLD ? (480-64*2) : (480-64) super(0, 64, 240, h) self.contents = Bitmap.new(width - 32, height - 32) disable end #-------------------------------------------------------------------------- # ● 表示切替 #-------------------------------------------------------------------------- def enable self.active = self.visible = true update_help end def disable self.active = self.visible = false end #-------------------------------------------------------------------------- # ● 選択可否判定 #-------------------------------------------------------------------------- def set_actor(actor) @actor = actor @data = [] @message = [] for i in 1...$data_classes.size @data.push($data_classes[i]) if JobChange.enable(@actor.id, i) end @item_max = @data.size self.contents.dispose self.contents = Bitmap.new(width - 32, [height - 32, @item_max * 32].max) # 条件チェック for i in 0...@data.size @message[i] = M_CHANGE # 条件クリア if @actor.class_id == @data[i].id # 同じ @message[i] = M_NONE next end if JobChange::USE_GOLD # 転職料金 if $game_party.gold < JobChange.price(@actor.id, @data[i].id) @message[i] = M_PRICE next end end if defined?(JobSystem) # 転職条件 cond = JobChange.cond(@actor.id, @data[i].id) next if cond.nil? for c in cond if actor.joblist[c[0]].level < c[1] @message[i] = M_COND break ### end end end end # refresh self.index = 0 end #-------------------------------------------------------------------------- # ● 選択可否 #-------------------------------------------------------------------------- def enable_i?(i) return (@message[i] == M_CHANGE) end def enable? return enable_i?(@index) end def data_i(i) return @data[i] end def data return @data[@index] end def message return @message[@index] end def cond_text return nil if message != M_COND if defined?(JobSystem) cond = JobChange.cond(@actor.id, @data[@index].id) return nil if cond.nil? for c in cond if @actor.joblist[c[0]].level < c[1] return "#{$data_classes[c[0]].name}のレベルが足りません" end end end return nil end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear for i in 0...@item_max draw_i(i) end end #-------------------------------------------------------------------------- # ● 項目描画 #-------------------------------------------------------------------------- def draw_i(i) x = 4 y = i * 32 d = @data[i] self.contents.font.color.alpha = enable_i?(i) ? 255 : 128 self.contents.draw_text(x, y, 160, 32, d.name) if JobChange::USE_GOLD self.contents.draw_text(self.contents.width-160-4, y, 160, 32, JobChange.price(@actor.id, d.id).to_s, 2) end end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.class_id = data.id end end #============================================================================== # ■ Window_JobMessage #============================================================================== class Window_JobMessage < Window_Base include JobChange::MesCmd WAIT_TIME = 40 # 表示ウェイト時間[frame] FADE_F = WAIT_TIME / 4 def xx(w) return (640-w)/2 end #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(xx(240), 200, 240, 64) self.contents = Bitmap.new(width - 32, height - 32) @wait = 0 @callback = nil self.z = 600 self.visible = false end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def set_text(type, item=nil) case type when M_CHANGE; text = "#{item.name}にクラスチェンジしました" when M_EQUIP; text = "#{item.name}の装備を外しました" when M_PRICE; text = "所持金が足りません" when M_COND; text = item when M_NONE; return else; p "bad arg", type; return end w = self.contents.text_size(text).width self.width = w + 32 self.x = xx(self.width) self.contents.dispose self.contents = Bitmap.new(w, 32) self.contents.draw_text(0, 0, w, 32, text) @wait = WAIT_TIME self.visible = true self.opacity = self.contents_opacity = 255 set_callback(nil) end #-------------------------------------------------------------------------- # ● Callback登録 #-------------------------------------------------------------------------- def set_callback(callback=nil) @callback = callback end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def update super @wait -= 1 if @wait < FADE_F self.opacity = self.contents_opacity = 255 / FADE_F * @wait if @wait == 0 self.visible = false $scene.callback(@callback) unless @callback.nil? set_callback(nil) end end end end #============================================================================== # ■ Window_JobGold #============================================================================== class Window_JobGold < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 480-64, 240, 64) self.contents = Bitmap.new(width - 32, height - 32) refresh self.visible = false end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear cx = contents.text_size($data_system.words.gold).width self.contents.font.color = normal_color self.contents.draw_text(4, 0, 200-cx-2, 32, $game_party.gold.to_s, 2) self.contents.font.color = system_color self.contents.draw_text(204-cx, 0, cx, 32, $data_system.words.gold, 2) end end