# ▽△▽ XRXSv33. MeLT/BaST-Result. バトルリザルト ▽△▽ # # publish 2010/ 4/ 4 # update - 11/ 1/25a # #============================================================================== # カスタマイズポイント #============================================================================== module XRXSV33 # # スキン(Graphics/System) # NumberL = "NumberL" NumberS = "NumberS" NumberS_Marks = "NumberS_Marks" MenuGoldLines = "MenuGoldLines" # # 文字列 # BGOLD_S = "獲得G" PGOLD_S = "所持金" # # メーターSE/パラメータ上昇/ドロップアイテム獲得SE # METER_SE = RPG::SE.new("Decision1", 90, 80) UPSE = RPG::SE.new("Flash1", 80, 150) ITEM_SE = RPG::SE.new("Item1", 80, 100) # # レベルアップ時に表示するアニメーションID # LvUpAnimationID = 38 # # AP獲得時の文字式(""にすると表示しません) # GainAP_S = "%s APを獲得!" # # APによりスキルを習得した時の文字 # APNewSkill_S = "%s は %s を覚えた!" # # APによりスキルを習得した時のSE # APLearnSE = RPG::SE.new("Saint9", 80, 130) end #============================================================================== # 一時保持データ #============================================================================== class Game_Temp attr_accessor :battle_result_gold attr_accessor :battle_result_tresures attr_accessor :battle_result_ap end class Game_Battler attr_accessor :battle_result_exp end #============================================================================== # バトルリザルト併用処置 #============================================================================== class Scene_Battle < Scene_Base def battle_result_enabled? return true end end #============================================================================== # Scene_BattleResult #============================================================================== class Scene_BattleResult < Scene_Base #-------------------------------------------------------------------------- # ▼ 開始処理 #-------------------------------------------------------------------------- def start $game_temp.battle_result_gold = 0 unless $game_temp.battle_result_gold $game_temp.battle_result_tresures = [] unless $game_temp.battle_result_tresures $game_temp.battle_result_ap = 0 unless $game_temp.battle_result_ap super create_menu_background @member_window = Window_ResultMembers.new @gold_window = Window_BattleResultGold.new @message_window = Window_BattleMessage.new @message_window.y = 0 @message_window.height = 32 + Window_Base::WLH * 2 @message_window.create_contents @level_up_actor = nil @levelup_target = Sprite_Base.new @step = -1 @new_skill_texts = [] @gold_speed = [$game_temp.battle_result_gold / 30, 1].max @wait_count = 0 @message_wait_count = 0 end #-------------------------------------------------------------------------- # ▼ 終了処理 #-------------------------------------------------------------------------- def terminate super dispose_menu_background @member_window.dispose @message_window.dispose @levelup_target.dispose @gold_window.dispose end #-------------------------------------------------------------------------- # ▼ フレーム更新 #-------------------------------------------------------------------------- def update super update_menu_background @message_window.update # メッセージウィンドウを更新 @levelup_target.update @levelup_window.update if @levelup_window != nil if @wait_count > 0 @wait_count -= 1 return end if @levelup_window != nil update_level_up else case @step when -1 update_first when 0 update_main_count when 1 update_ap when 2 update_drop end end end #-------------------------------------------------------------------------- # レベルアップの表示 #-------------------------------------------------------------------------- def display_level_up if @levelup_texts.size >= 1 @message_window.clear @message_window.height = 32 + Window_Base::WLH * @levelup_texts.size @message_window.create_contents end end def update_level_up_message(duration = 32) return if @levelup_texts.empty? return @message_wait_count -= 1 if @message_wait_count >= 1 text = @levelup_texts.shift if text != "\n" @message_window.add_instant_text(text) @message_wait_count = duration end end def finish_level_up_message update_level_up_message(0) while @levelup_texts.size >= 1 end #-------------------------------------------------------------------------- # 最初の確認 #-------------------------------------------------------------------------- def update_first if Input.trigger?(Input::C) or Input.trigger?(Input::B) Sound.play_decision update_main_count end end #-------------------------------------------------------------------------- # フレーム更新 - レベルアップウィンドウ #-------------------------------------------------------------------------- def update_level_up update_level_up_message if @levelup_window.done? and Input.trigger?(Input::C) if @levelup_texts.size >= 1 finish_level_up_message else @message_window.clear @levelup_window.dispose @levelup_window = nil @member_window.contents_opacity = 255 end end end #-------------------------------------------------------------------------- # フレーム更新 - メインカウント #-------------------------------------------------------------------------- def update_main_count @step = 0 if @level_up_actor != nil actor = @level_up_actor @levelup_window = Window_ResultLvUp.new(@actor_before_level_up, actor) x, y = @member_window.target_position(actor.index) @levelup_target.x = x @levelup_target.y = y animation = $data_animations[XRXSV33::LvUpAnimationID] @levelup_target.start_animation(animation) @member_window.contents_opacity = 64 display_level_up @level_up_actor = nil return end finished = true go_se = false d = Input.repeat?(Input::C) ? 4 : 1 @levelup_texts = [] for actor in $game_party.members if actor.battle_result_exp.to_i >= 1 @actor_before_level_up = actor.clone last_level = actor.level exp_speed = d * actor.exp_current_max / 60 exp_speed = [exp_speed, actor.battle_result_exp / 8, 1].max n = [actor.battle_result_exp, exp_speed].min actor.battle_result_exp -= n $game_message.texts.clear actor.gain_exp(n, true) @levelup_texts += $game_message.texts + ["\n"] $game_message.texts.clear if actor.level > last_level @level_up_actor = actor @member_window.update XRXSV33::METER_SE.play return end @actor_before_level_up = nil finished = false end end if $game_temp.battle_result_gold >= 1 n = [@gold_speed * d, $game_temp.battle_result_gold].min $game_party.gain_gold(n) $game_temp.battle_result_gold -= n finished = false end @member_window.update @gold_window.update # 終了時 if finished display_ap else XRXSV33::METER_SE.play @wait_count = 1 end end #-------------------------------------------------------------------------- # AP獲得の表示 #-------------------------------------------------------------------------- def display_ap @step = 1 if $game_temp.battle_result_ap >= 1 if XRXSV33::GainAP_S.size >= 1 text = sprintf(XRXSV33::GainAP_S, $game_temp.battle_result_ap.to_s) @message_window.add_instant_text(text) end if $game_temp.battle_result_ap >= 1 for actor in $game_party.members last_skills = actor.skills actor.ap += $game_temp.battle_result_ap rescue nil new_skills = actor.skills - last_skills for skill in new_skills @new_skill_texts.push(sprintf(XRXSV33::APNewSkill_S, actor.name, skill.name)) end end $game_temp.battle_result_ap = 0 end display_ap_learn else display_drop_items end end def display_ap_learn if @new_skill_texts.size >= 1 texts = [@new_skill_texts.shift, @new_skill_texts.shift] @message_window.add_instant_text(texts[0]) @message_window.add_instant_text(texts[1]) if texts[1] XRXSV33::APLearnSE.play else display_drop_items end end #-------------------------------------------------------------------------- # APの確認 #-------------------------------------------------------------------------- def update_ap if Input.trigger?(Input::C) Sound.play_decision @message_window.clear display_ap_learn end end #-------------------------------------------------------------------------- # 獲得したドロップアイテムの表示 #-------------------------------------------------------------------------- def display_drop_items @step = 2 if $game_temp.battle_result_tresures.size == 0 return end se_go = false items = [$game_temp.battle_result_tresures.shift, $game_temp.battle_result_tresures.shift] for item in items next unless item $game_party.gain_item(item, 1) text = sprintf(Vocab::ObtainItem, item.name) @message_window.add_instant_text(text) se_go = true end XRXSV33::ITEM_SE.play if se_go end #-------------------------------------------------------------------------- # ドロップアイテム/終了の確認 #-------------------------------------------------------------------------- def update_drop if Input.trigger?(Input::C) @message_window.clear if $game_temp.battle_result_tresures.size >= 1 Sound.play_decision display_drop_items else display_end end end end def display_end $game_temp.map_bgm.play rescue nil $game_temp.map_bgs.play rescue nil return_scene end #-------------------------------------------------------------------------- # 元の画面へ戻る #-------------------------------------------------------------------------- def return_scene $scene = Scene_Map.new end end #============================================================================== # EXPの取得 #============================================================================== class Game_Actor < Game_Battler def exp_per128 exp_next_level = @exp_list[self.level + 1] exp_now_level = @exp_list[self.level] if exp_next_level >= 1 result = 128 * (self.exp - exp_now_level) / (exp_next_level - exp_now_level) else result = 0 end return result end def next_rest_exp return @exp_list[self.level+1] > 0 ? (@exp_list[self.level+1] - self.exp) : 0 end def exp_current_max return (@exp_list[@level+1] - @exp_list[@level]) end end #============================================================================== # バトルリザルトゴールド #============================================================================== class Window_BattleResultGold < Window_Base def initialize super(368,336,192,80) self.opacity = 0 self.contents.font.size = 14 skin_s = Cache.system(XRXSV33::NumberS) skin_l = Cache.system(XRXSV33::NumberL) x1 = self.x + 16 + 64 + 80 y1 = self.y + 16 + WLH - 1 y2 = self.y + 16 + WLH * 2 - 1 @battle_gold = RapidNumber.new(x1, y1, skin_s) @party_gold = RapidNumber.new(x1, y2, skin_l) refresh update end def refresh self.contents.clear begin skin = Cache.system(XRXSV33::MenuGoldLines) self.contents.blt(0, 0, skin, skin.rect) rescue nil end self.contents.font.size = 16 self.contents.font.color = system_color self.contents.draw_text(0, WLH - 16, 64, 16, XRXSV33::BGOLD_S) self.contents.draw_text(0, WLH * 2 - 16, 64, 16, XRXSV33::PGOLD_S) end def update super @battle_gold.set($game_temp.battle_result_gold) @party_gold.set($game_party.gold) end def dispose @battle_gold.dispose @party_gold.dispose super end end #============================================================================== # 拡張イクイップステータス #============================================================================== class Window_EquipStatus < Window_Base def set_new_actor(actor) if actor set_new_parameters(actor.atk, actor.def, actor.spi, actor.agi) else set_new_parameters(nil, nil, nil, nil) end end def line_step(index) if index == 0 return false else self.contents.clear_rect(0, WLH * index, 172, WLH) draw_parameter(0, WLH * index, index-1) @done = true if index == 4 return true end end end #============================================================================== # ステータスセットウィンドウ #============================================================================== class Window_SetStatus < Window_EquipStatus end #============================================================================== # 戦闘結果:レベルアップウィンドウ #============================================================================== class Window_ResultLvUp < Window_SetStatus #-------------------------------------------------------------------------- # リフレッシュの一時禁止機能 #-------------------------------------------------------------------------- def refresh super unless @refresh_ban end #-------------------------------------------------------------------------- # 初期化 #-------------------------------------------------------------------------- def initialize(before_actor, after_actor) y = 416 - 24 * 5 - 32 - 56 super(0, y, before_actor) self.z = 105 @refresh_ban = true set_new_actor(after_actor) @refresh_ban = false @done = false @step = 0 @wait_count = 8 end #-------------------------------------------------------------------------- # ステップ進行 #-------------------------------------------------------------------------- def step return if @done changed = line_step(@step) if changed XRXSV33::UPSE.play @wait_count = 12 end @step += 1 end #-------------------------------------------------------------------------- # フレーム更新 #-------------------------------------------------------------------------- def update super if @wait_count > 0 and not Input.press?(Input::C) @wait_count -= 1 else step end end #-------------------------------------------------------------------------- # 終了確認 #-------------------------------------------------------------------------- def done? @done end end #============================================================================== # EXPバー #============================================================================== class Sprite_Slidable < Sprite_Base end class Sprite_EXPBar < Sprite_Slidable def initialize super self.bitmap = Cache.system(XRXSV33::EXPMeterSkin) set_width(0) end def set_width(width) self.src_rect.set(0, 8, width, 4) end end #============================================================================== # --- ラピッドナンバー スプライトシステム --- #============================================================================== class RapidNumber def initialize(x, y, skin, viewport = nil) @viewport = viewport @skin = skin @x = x @y = y @z = 105 @opacity = 255 @w = skin.rect.width / 10 @h = skin.rect.height @sprites = [] @number_bitmaps = [] rect = Rect.new(0, 0, @w, @h) for i in 0..9 rect.x = i * @w bitmap = Bitmap.new(@w, @h) bitmap.blt(0, 0, @skin, rect) @number_bitmaps[i] = bitmap end end def set(number) number_digits = [] loop do number_digits.push(number % 10) number /= 10 break if number == 0 end need_reset = false for i in 0...number_digits.size if @sprites[i] == nil @sprites[i] = Sprite.new(@viewport) need_reset = true end @sprites[i].bitmap = @number_bitmaps[number_digits[i]] end for i in number_digits.size...@sprites.size @sprites[i].bitmap = nil end reset if need_reset end def reset for i in 0...@sprites.size sprite = @sprites[i] sprite.x = @x - @w * i sprite.y = @y sprite.z = @z sprite.ox = @w sprite.oy = @h sprite.opacity = @opacity end end def x=(n) @x = n reset end def y=(n) @y = n reset end def z=(n) @z = n reset end def viewport=(viewport) @sprites.each{|sprite| sprite.viewport = viewport } end def dispose @sprites.each{|sprite| sprite.dispose } end def opacity=(n) @opacity = n reset end end