#==============================================================================
# ■ マップ情報のカスタマイズ+ファイルロード/セーブ時にBGM By 貪藻矢射妥←
#------------------------------------------------------------------------------
# 〜マップ情報のカスタマイズ〜
# 200Xにあったマップごとにバトルバック、パノラマ設定をXPでもやってみる方法。
# オマケであるスイッチがONの場合のBGM変更機能も追加
#
# 〜ファイルロード/セーブ時にBGM〜
# ロード/セーブ時が無音で寂しいってかたにうってつけ。
# おまけで$game_system.save_bgms(n)/$game_system.load_bgms(n)で任意の
# BGM,BGSをセーブ/ロードできます。テイルズオブファンタジアみたいな世界を
# 移動しつつその世界にてセーブ出来るってなゲームにて本領発揮
# (ちなみに1番は通常セーブ/ロード時に使用していますので、nは2以降を使用
# してください。)
#
# 〜フォグのスクロールのランダム化〜
# フォグのスクロールをランダムに変更します。
# これで一方向にしか流れないフォグの流れをランダムに変更することが可能です。
#
#==============================================================================
# 更新っぽいもの
#
# 2007:06:11
# ・アフォなミスを修正
#
# 2007:07:13
# ・ちょっとした修正
#
# 2008:04:17
# ・配列を使うことによりスクリプトを削減
#
# 2008:04:19
# ・BGM,BGSセーブスロットを拡張
#
# 2008:07:01
# ・F12でリセットした場合、マップBGM,BGSがうまく演奏されないバグを修正
#
# 2008:09:18
# ・BGM,BGS格納配列が半分しか確保できていなかったバグを修正
#
# 2008:12:24
# ・フォグのスクロールをランダム化
#
# 2009:09:14
# ・セーブした状況によっては正常にBGM/BGSが演奏されないバグを修正
#
# 2012:03:03
# ・バトルバックをif文からcase文に修正
#
# 2024:05:01
# ・固定文字列対応
module DIAMOND
FILE_BGM = "セーブ/ロード時に流すBGMファイル名"
# BGM,BGS最大格納スロット数
SAVE_MAX = 10
end
module FOG_C
# ウェイトカウンタの基礎値
# 少なくすると高速でスクロールが切り替わります
# また、0にはしないでください。
CNT_ROOT = 5
# フォグのスクロール変数
# 0:上下左右4方向
# 1:斜め4方向
# 2:8方向
FOG_SCRR = 2
end
#==============================================================================
# ■ Game_System
#------------------------------------------------------------------------------
# システム周りのデータを扱うクラスです。BGM などの管理も行います。このクラス
# のインスタンスは $game_system で参照されます。
#==============================================================================
class Game_System
include DIAMOND
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :Change_bgms # BGM,BGS格納配列
#--------------------------------------------------------------------------
# ● BGM,BGS の初期化
#--------------------------------------------------------------------------
def init_bgms
if @Change_bgms == nil
@Change_bgms = Array.new(SAVE_MAX * 2 + 1)
@Change_bgms[0] = false
end
end
#--------------------------------------------------------------------------
# ● BGM,BGS の記憶
#--------------------------------------------------------------------------
def save_bgms(n)
if n < 0 || n > SAVE_MAX
p "セーブできません"
else
init_bgms
@Change_bgms[2 * n - 1] = @playing_bgm
@Change_bgms[2 * n] = @playing_bgs
end
end
#--------------------------------------------------------------------------
# ● BGM,BGS の復帰
#--------------------------------------------------------------------------
def load_bgms(n)
if n < 0 || n > SAVE_MAX
p "ロードできません"
else
bgm_play(@Change_bgms[2 * n - 1])
bgs_play(@Change_bgms[2 * n])
end
end
end
#==============================================================================
# ■ Game_Map
#------------------------------------------------------------------------------
# マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。
# このクラスのインスタンスは $game_map で参照されます。
#==============================================================================
class Game_Map
#--------------------------------------------------------------------------
# ● セットアップ
# map_id : マップ ID
#--------------------------------------------------------------------------
def setup(map_id)
# マップ ID を @map_id に記憶
@map_id = map_id
# マップをファイルからロードし、@map に設定
@map = load_data(sprintf(FIX_PATH::PATH_DATA_MAPD, @map_id))
# 公開インスタンス変数にタイルセットの情報を設定
tileset = $data_tilesets[@map.tileset_id]
@tileset_name = tileset.tileset_name
@autotile_names = tileset.autotile_names
case @map_id
when マップID
@panorama_name = "パノラマファイル名"
@panorama_hue = 色相(0〜360)
when マップID
〜以下略〜
else
@panorama_name = tileset.panorama_name
@panorama_hue = tileset.panorama_hue
end
case @map_id
when マップID
@fog_name = "フォグファイル名"
@fog_opacity = 透明度(0〜255)
@fog_blend_type = ブレンドタイプ(0:通常 1:加算 2:減算)
@fog_zoom = 拡大率(ノーマルは200)
@fog_sx = X軸移動値
@fog_sy = Y軸移動値
when マップID
〜以下略〜
else
@fog_name = tileset.fog_name
@fog_hue = tileset.fog_hue
@fog_opacity = tileset.fog_opacity
@fog_blend_type = tileset.fog_blend_type
@fog_zoom = tileset.fog_zoom
@fog_sx = tileset.fog_sx
@fog_sy = tileset.fog_sy
end
case @map_id
when マップID
@battleback_name = "バトルバックファイル名"
when マップID
〜以下略〜
else
@battleback_name = tileset.battleback_name
end
@passages = tileset.passages
@priorities = tileset.priorities
@terrain_tags = tileset.terrain_tags
# 表示座標を初期化
@display_x = 0
@display_y = 0
# リフレッシュ要求フラグをクリア
@need_refresh = false
# マップイベントのデータを設定
@events = {}
for i in @map.events.keys
@events[i] = Game_Event.new(@map_id, @map.events[i])
end
# コモンイベントのデータを設定
@common_events = {}
for i in 1...$data_common_events.size
@common_events[i] = Game_CommonEvent.new(i)
end
# フォグの各情報を初期化
@fog_ox = 0
@fog_oy = 0
@fog_tone = Tone.new(0, 0, 0, 0)
@fog_tone_target = Tone.new(0, 0, 0, 0)
@fog_tone_duration = 0
@fog_opacity_duration = 0
@fog_opacity_target = 0
# スクロール情報を初期化
@scroll_direction = 2
@scroll_rest = 0
@scroll_speed = 4
end
include FOG_C
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
alias diamond_game_map_update update
def update
# フォグのスクロール用の配列
fog_list = [4 ,4 ,8]
# カウンタ初期化
if @cnt == nil
@cnt = 1
end
# セットランダム初期化
if @set_rnd == nil
@set_rnd = 0
end
# マップIDごとにフォグのスクロールのランダム化を設定
# ランダムじゃなくていい場合は設定しない。
case @map_id
when マップID
rnd_root = set_rnd_value(FOG_C::FOG_SCRR, 乱数基幹, 乱数の補助)
@fog_sx = rnd_root[0][@set_rnd]
@fog_sy = rnd_root[1][@set_rnd]
〜以下略〜
end
# ウェイトカウンタを回す
if @cnt > FOG_C::CNT_ROOT * 10
@cnt = 1
@set_rnd = rand(fog_list[FOG_C::FOG_SCRR])
else
@cnt += 1
end
# update処理を呼び戻す
diamond_game_map_update
end
#--------------------------------------------------------------------------
# ● 乱数配列生成
# flg : フォグスクロール用フラグ
# rnd_root : 乱数基幹
# rnd_plus : 乱数の補助(なくてもいい)
#--------------------------------------------------------------------------
def set_rnd_value(rnd_root, rnd_plus=0)
if rnd_root < 1
p "乱数を生成できる値ではありません"
return
end
if flg < 0 || flg > 2
p "スクロール用のフラグが異常です"
return
end
set1 = rand(rnd_root) + rnd_plus
set2 = set1 * -1
# 上下左右4方向の場合
if flg == 0
return [ 0, set1, 0, set2], [set2, 0, set1, 0]
# 斜め4方向の場合
elsif flg == 1
return [set1, set1, set2, set2], [set1, set2, set2, set1]
# 8方向の場合
else
return [0, set1, set1, set1, 0, set2, set2, set2], [set2, set2, 0, set1, set1, set1, 0, set2]
end
end
#--------------------------------------------------------------------------
# ● BGM / BGS 自動切り替え
#--------------------------------------------------------------------------
def autoplay
if @map.autoplay_bgm
if $game_switches[スイッチ番号] == true && (@map_id == マップID)
$game_system.bgm_play(RPG::AudioFile.new("BGMファイル名", 100, 100))
else
$game_system.bgm_play(@map.bgm)
end
end
if @map.autoplay_bgs
$game_system.bgs_play(@map.bgs)
end
end
end
#==============================================================================
# ■ Scene_Save
#------------------------------------------------------------------------------
# セーブ画面の処理を行うクラスです。
#==============================================================================
class Scene_Save < Scene_File
include DIAMOND
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super("どこにセーブするの?")
# BGM,BGS の記憶
$game_system.save_bgms(1)
# タイトル BGM を演奏
$game_system.bgm_play(RPG::AudioFile.new(FILE_BGM, 100, 100))
end
#--------------------------------------------------------------------------
# ● 決定時の処理
#--------------------------------------------------------------------------
alias diamond_on_decision on_decision
def on_decision(filename)
# 呼び戻し
diamond_on_decision
# BGM,BGS の復帰
$game_system.load_bgms(1)
end
#--------------------------------------------------------------------------
# ● キャンセル時の処理
#--------------------------------------------------------------------------
alias diamond_on_cancel on_cancel
def on_cancel
# 呼び戻し
diamond_on_cancel
# BGM,BGS の復帰
$game_system.load_bgms(1)
end
end
#==============================================================================
# ■ Scene_Load
#------------------------------------------------------------------------------
# ロード画面の処理を行うクラスです。
#==============================================================================
class Scene_Load < Scene_File
include DIAMOND
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias diamond_initialize initialize
def initialize
# タイトル BGM を演奏
$game_system.bgm_play(RPG::AudioFile.new(FILE_BGM, 100, 100))
# 呼び戻し
diamond_initialize
end
#--------------------------------------------------------------------------
# ● セーブデータの読み込み
# file : 読み込み用ファイルオブジェクト (オープン済み)
#--------------------------------------------------------------------------
def read_save_data(file)
# セーブファイル描画用のキャラクターデータを読み込む
characters = Marshal.load(file)
# プレイ時間計測用のフレームカウントを読み込む
Graphics.frame_count = Marshal.load(file)
# 各種ゲームオブジェクトを読み込む
$game_system = Marshal.load(file)
$game_switches = Marshal.load(file)
$game_variables = Marshal.load(file)
$game_self_switches = Marshal.load(file)
$game_screen = Marshal.load(file)
$game_actors = Marshal.load(file)
$game_party = Marshal.load(file)
$game_troop = Marshal.load(file)
$game_map = Marshal.load(file)
$game_player = Marshal.load(file)
# マジックナンバーがセーブ時と異なる場合
# (エディタで編集が加えられている場合)
if $game_system.magic_number != $data_system.magic_number
# マップをリロード
$game_map.setup($game_map.map_id)
$game_player.center($game_player.x, $game_player.y)
end
# マップBGM,BGS の再生
$game_system.load_bgms(1)
# パーティメンバーをリフレッシュ
$game_party.refresh
end
end
|