406 lines
No EOL
16 KiB
Ruby
406 lines
No EOL
16 KiB
Ruby
#==============================================================================
|
|
# ■ Game_System
|
|
#------------------------------------------------------------------------------
|
|
# システム周りのデータを扱うクラスです。乗り物や BGM などの管理も行います。
|
|
# このクラスのインスタンスは $game_system で参照されます。
|
|
#==============================================================================
|
|
class Game_System
|
|
#--------------------------------------------------------------------------
|
|
# ● 公開インスタンス変数
|
|
#--------------------------------------------------------------------------
|
|
attr_accessor :revive_position
|
|
attr_accessor :revive_gameover
|
|
attr_accessor :all_apply_revive
|
|
attr_accessor :stop_timer_gameover
|
|
#--------------------------------------------------------------------------
|
|
# ● インスタンスの複製
|
|
#--------------------------------------------------------------------------
|
|
alias revive_game_over_initialize initialize
|
|
#--------------------------------------------------------------------------
|
|
# ● オブジェクト初期化
|
|
#--------------------------------------------------------------------------
|
|
def initialize
|
|
# 通常の処理を実行
|
|
revive_game_over_initialize
|
|
# 都合で(!)システム情報を取得
|
|
data = load_data("Data/System.rvdata2")
|
|
# ゲームオーバーから復活する際のマップIDと座標を初期化
|
|
@revive_position = [data.start_map_id, data.start_x, data.start_y, 2]
|
|
# ゲームオーバー時の復活フラグを立てる
|
|
@revive_gameover = true
|
|
# 復活時、『透明化OFF』と『不透明度=255』を実行する設定にする
|
|
@all_apply_revive = false
|
|
# 全滅時タイマーをストップさせる?
|
|
@stop_timer_gameover = UMSSS_Setting::ReviveGameOverTimerStop
|
|
end
|
|
end
|
|
#==============================================================================
|
|
# ■ Game_Character
|
|
#------------------------------------------------------------------------------
|
|
# キャラクターを扱うクラスです。このクラスは Game_Player クラスと Game_Event
|
|
# クラスのスーパークラスとして使用されます。
|
|
#==============================================================================
|
|
class Game_Character
|
|
#--------------------------------------------------------------------------
|
|
# ● 透明化OFF&不透明度=255を実行
|
|
#--------------------------------------------------------------------------
|
|
def all_apply_character
|
|
# 透明化OFF
|
|
@transparent = false
|
|
# 不透明度=255
|
|
@opacity = 255
|
|
end
|
|
end
|
|
#==============================================================================
|
|
# ■ Game_Interpreter
|
|
#------------------------------------------------------------------------------
|
|
# イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、
|
|
# Game_Troop クラス、Game_Event クラスの内部で使用されます。
|
|
#==============================================================================
|
|
class Game_Interpreter
|
|
#--------------------------------------------------------------------------
|
|
# ● 復活しないゲームオーバーを実行
|
|
#--------------------------------------------------------------------------
|
|
def no_revive_gameover
|
|
# ゲームオーバー時の復活フラグを下ろす
|
|
$game_system.revive_gameover = false
|
|
# ゲームオーバー処理
|
|
command_353
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● 復活時、『透明化OFF』と『不透明度=255』の実行フラグを変更
|
|
#--------------------------------------------------------------------------
|
|
def all_apply_revive(value = true)
|
|
# フラグを変更
|
|
$game_system.all_apply_revive = value
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● ゲームオーバー時、復活の可否を設定
|
|
#--------------------------------------------------------------------------
|
|
def revive_gameover_set(value = true)
|
|
# ゲームオーバー時の復活フラグを変更
|
|
$game_system.revive_gameover = value
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● ゲームオーバー時の復活位置を現在の場所に設定
|
|
#--------------------------------------------------------------------------
|
|
def revive_point_here(d = $game_player.direction)
|
|
# 現在のマップID、X座標、Y座標を記憶
|
|
$game_system.revive_position[0] = $game_map.map_id
|
|
$game_system.revive_position[1] = $game_player.x
|
|
$game_system.revive_position[2] = $game_player.y
|
|
$game_system.revive_position[3] = d
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● ゲームオーバー時の復活位置を手動設定
|
|
#--------------------------------------------------------------------------
|
|
def revive_point_manual(map, px, py, d = $game_player.direction)
|
|
# マップID、X座標、Y座標を記憶
|
|
$game_system.revive_position[0] = map
|
|
$game_system.revive_position[1] = px
|
|
$game_system.revive_position[2] = py
|
|
$game_system.revive_position[3] = d
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● ゲームオーバー時、タイマーを停止させる?
|
|
#--------------------------------------------------------------------------
|
|
def stop_timer_gameover(value)
|
|
$game_system.stop_timer_gameover = value
|
|
end
|
|
end
|
|
#==============================================================================
|
|
# ■ Scene_Gameover
|
|
#------------------------------------------------------------------------------
|
|
# ゲームオーバー画面の処理を行うクラスです。
|
|
#==============================================================================
|
|
class Scene_Gameover < Scene_Base
|
|
#--------------------------------------------------------------------------
|
|
# ● インスタンスの複製
|
|
#--------------------------------------------------------------------------
|
|
alias revive_game_over_goto_title goto_title
|
|
#--------------------------------------------------------------------------
|
|
# ● タイトル画面へ遷移
|
|
#--------------------------------------------------------------------------
|
|
def goto_title
|
|
return execute_revive if $game_system.revive_gameover
|
|
# 通常の処理
|
|
revive_game_over_goto_title
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● 復活処理
|
|
#--------------------------------------------------------------------------
|
|
def execute_revive
|
|
# MEをフェードアウト
|
|
RPG::ME.fade(1000)
|
|
# MEをフェード中に少しウェイト
|
|
Graphics.wait(30)
|
|
# 復活処理
|
|
revive_player
|
|
# マップのBGM、BGSを再生
|
|
$game_map.autoplay
|
|
# 画面をフェードアウトさせる
|
|
Graphics.fadeout(60)
|
|
# MEを停止(※一応)
|
|
RPG::ME.stop
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● 復活処理
|
|
#--------------------------------------------------------------------------
|
|
def revive_player
|
|
# 経験値を調整
|
|
revive_setting_exp
|
|
# パーティの状態を調整
|
|
revive_setting_party
|
|
# 所持金を調整
|
|
revive_setting_money
|
|
# 復活位置を取得
|
|
pn = $game_system.revive_position
|
|
# 指定されたマップ&座標を復活位置に設定
|
|
$game_player.reserve_transfer(pn[0], pn[1], pn[2], pn[3])
|
|
$game_player.perform_transfer
|
|
# スイッチ操作が存在する場合
|
|
if UMSSS_Setting::ReviveGameOverMemorizeSwitch > 0
|
|
# スイッチをONにする
|
|
$game_switches[UMSSS_Setting::ReviveGameOverMemorizeSwitch] = true
|
|
end
|
|
# 全滅回数を記憶する場合
|
|
if UMSSS_Setting::ReviveGameOverCountMemorizeVariable > 0
|
|
# 変数に +1 する。
|
|
$game_variables[UMSSS_Setting::ReviveGameOverCountMemorizeVariable] += 1
|
|
end
|
|
# 『透明化OFF』と『不透明度=255』を実行する場合
|
|
if $game_system.all_apply_revive
|
|
# プレイヤーを表示
|
|
$game_player.all_apply_character
|
|
end
|
|
# タイマーを停止させる設定の場合、停止。
|
|
$game_timer.stop if $game_system.stop_timer_gameover
|
|
# 『イベントの処理を中断』を強制実行
|
|
#$game_map.interpreter.command_115
|
|
# マップ画面呼び出し
|
|
SceneManager.goto(Scene_Map)
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● 経験値を調整
|
|
#--------------------------------------------------------------------------
|
|
def revive_setting_exp
|
|
# パーティを全員チェック
|
|
for actor in $game_party.members
|
|
now = actor.class.exp_for_level(actor.level)
|
|
pre = actor.class.exp_for_level([actor.level - 1, 1].max)
|
|
aft = actor.class.exp_for_level([actor.level + 1, actor.max_level].min)
|
|
last_level = actor.level
|
|
# 設定で分岐
|
|
case UMSSS_Setting::ReviveGameOverPenaltyForExpSetting
|
|
when 0
|
|
# 特になし
|
|
when 1
|
|
n = (now - pre) / actor.level
|
|
# 経験値を減らす
|
|
actor.change_exp([actor.exp - n, 0].max, false)
|
|
when 2
|
|
n = (now - pre) / actor.level
|
|
n *= 2
|
|
# 経験値を減らす
|
|
actor.change_exp([actor.exp - n, 0].max, false)
|
|
when 3
|
|
n = (aft - now) / (actor.level + 1)
|
|
# 経験値を減らす
|
|
actor.change_exp([actor.exp - n, 0].max, false)
|
|
when 4
|
|
n = (aft - now) / (actor.level + 1)
|
|
n *= 2
|
|
# 経験値を減らす
|
|
actor.change_exp([actor.exp - n, 0].max, false)
|
|
when 5
|
|
n = actor.exp / (actor.level + 1)
|
|
# 経験値を減らす
|
|
actor.change_exp([actor.exp - n, 0].max, false)
|
|
when 6
|
|
# 失う経験値を計算
|
|
n = actor.exp / (actor.level + 1)
|
|
# 倍化
|
|
n *= 2
|
|
# 経験値を減らす
|
|
actor.change_exp([actor.exp - n, 0].max, false)
|
|
when 7
|
|
n = actor.exp / 10
|
|
# 経験値を減らす
|
|
actor.change_exp([actor.exp - n, 0].max, false)
|
|
when 8
|
|
n = actor.exp / 5
|
|
# 経験値を減らす
|
|
actor.change_exp([actor.exp - n, 0].max, false)
|
|
else
|
|
# マイナスの数値の場合
|
|
if UMSSS_Setting::ReviveGameOverPenaltyForExpSetting < 0
|
|
# ペナルティを受けた後のレベルを算出
|
|
lv = actor.level - UMSSS_Setting::ReviveGameOverPenaltyForExpSetting.abs
|
|
# アクターのレベルを下げる
|
|
actor.change_level(lv, false)
|
|
end
|
|
end
|
|
# レベルダウンメッセージがある場合
|
|
if UMSSS_Setting::ReviveGameOverPenaltyForExpMessage != ""
|
|
# レベルが下がっている場合
|
|
if actor.level < last_level
|
|
# メッセージウィンドウを作成
|
|
@message_window = Window_Message.new
|
|
# ウィンドウの背景を設定
|
|
$game_message.background = UMSSS_Setting::ReviveGameOverPenaltyMessageWindowType
|
|
# ウィンドウの表示位置を設定
|
|
$game_message.position = UMSSS_Setting::ReviveGameOverPenaltyMessageWindowPosition
|
|
# メッセージを準備
|
|
text = sprintf(UMSSS_Setting::ReviveGameOverPenaltyForExpMessage, actor.name, Vocab::level, actor.level)
|
|
# メッセージを表示
|
|
$game_message.add(text)
|
|
# メッセージウィンドウがビジーの間、ループ
|
|
while $game_message.busy?
|
|
@message_window.update
|
|
Graphics.update
|
|
Input.update
|
|
end
|
|
@message_window.dispose
|
|
@message_window = nil
|
|
end
|
|
end
|
|
end
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● パーティの状態を調整
|
|
#--------------------------------------------------------------------------
|
|
def revive_setting_party
|
|
# 復活時の設定で分岐
|
|
case UMSSS_Setting::ReviveGameOverPartyStatusSetting
|
|
when 0
|
|
# 先頭のアクターのHPを 1 に設定
|
|
$game_party.members[0].hp = 1
|
|
when 1
|
|
# パーティ全員をチェック
|
|
for actor in $game_party.members
|
|
# HPを 1 に設定
|
|
actor.hp = 1
|
|
end
|
|
when 2
|
|
# パーティ全員をチェック
|
|
for actor in $game_party.members
|
|
# 全回復処理
|
|
actor.recover_all
|
|
end
|
|
when 3
|
|
# 先頭のアクターのHPを 1 に設定
|
|
$game_party.members[0].hp = 1
|
|
# パーティ全員をチェック
|
|
for actor in $game_party.members
|
|
# MPを 0 に設定
|
|
actor.mp = 0
|
|
end
|
|
when 4
|
|
# パーティ全員をチェック
|
|
for actor in $game_party.members
|
|
# HPを 1 に設定
|
|
actor.hp = 1
|
|
# MPを 0 に設定
|
|
actor.mp = 0
|
|
end
|
|
when 5
|
|
# 先頭のアクターのHPを 1 に設定
|
|
$game_party.members[0].hp = 1
|
|
# パーティ全員をチェック
|
|
for actor in $game_party.members
|
|
# MPを全回復
|
|
actor.mp += 9999
|
|
end
|
|
when 6
|
|
# パーティ全員をチェック
|
|
for actor in $game_party.members
|
|
# HPを 1 に設定
|
|
actor.hp = 1
|
|
# MPを全回復
|
|
actor.mp += 9999
|
|
end
|
|
when 7
|
|
# 先頭のアクターだけ全回復
|
|
$game_party.members[0].recover_all
|
|
when 8
|
|
# 先頭のアクターだけ全回復
|
|
$game_party.members[0].recover_all
|
|
# 戦闘不能のアクターをチェック
|
|
for actor in $game_party.dead_members
|
|
# MPを 0 に設定
|
|
actor.mp = 0
|
|
end
|
|
end
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● 所持金を調整
|
|
#--------------------------------------------------------------------------
|
|
def revive_setting_money
|
|
# 現在の所持金を取得
|
|
g = $game_party.gold
|
|
n = 0
|
|
# 設定で分岐
|
|
case UMSSS_Setting::ReviveGameOverPenaltyForMoneySetting
|
|
when 0
|
|
# 特になし。
|
|
when 1
|
|
# 所持金の半分を取得
|
|
n = g / 2
|
|
# 所持金を減らす
|
|
$game_party.lose_gold(n)
|
|
when 2
|
|
# 所持金の4分の1を取得
|
|
n = g / 4
|
|
# 所持金を減らす
|
|
$game_party.lose_gold(n)
|
|
when 3
|
|
# 所持金の3分の1を取得
|
|
n = g / 3
|
|
# 所持金を減らす
|
|
$game_party.lose_gold(n)
|
|
when 4
|
|
# 所持金の4分の3を取得
|
|
n = g * 3 / 4
|
|
# 所持金を減らす
|
|
$game_party.lose_gold(n)
|
|
when 5
|
|
# 所持金の3分の2を取得
|
|
n = g * 2 / 3
|
|
# 所持金を減らす
|
|
$game_party.lose_gold(n)
|
|
when 6
|
|
# 所持金を取得
|
|
n = g
|
|
# 所持金をゼロにする
|
|
$game_party.lose_gold(n)
|
|
end
|
|
# メッセージがある場合
|
|
if UMSSS_Setting::ReviveGameOverPenaltyForMoneyMessage != ""
|
|
# 所持金が減っている場合
|
|
if n > 0
|
|
# メッセージウィンドウを作成
|
|
@message_window = Window_Message.new if @message_window.nil?
|
|
# ウィンドウの背景を設定
|
|
$game_message.background = UMSSS_Setting::ReviveGameOverPenaltyMessageWindowType
|
|
# ウィンドウの表示位置を設定
|
|
$game_message.position = UMSSS_Setting::ReviveGameOverPenaltyMessageWindowPosition
|
|
# メッセージを準備
|
|
text = sprintf(UMSSS_Setting::ReviveGameOverPenaltyForMoneyMessage, n, Vocab::currency_unit)
|
|
# メッセージを表示
|
|
$game_message.texts.push(text)
|
|
# メッセージウィンドウがビジーの間、ループ
|
|
while $game_message.busy?
|
|
@message_window.update
|
|
Graphics.update
|
|
Input.update
|
|
end
|
|
end
|
|
end
|
|
# メッセージウィンドウが nil ではない場合
|
|
unless @message_window.nil?
|
|
# メッセージウィンドウを解放
|
|
@message_window.dispose
|
|
@message_window = nil
|
|
end
|
|
end
|
|
end |