マップ情報カスタマイズ+(原始的手法)



・200Xにあったマップごとにバトルバック、パノラマ設定をXPでもやってみる方法
(オマケであるスイッチがONの場合のBGM変更機能も追加)
・セーブ/ロード時にBGMを流す
・フォグのスクロールをランダムにする。

の3つを統合したスクリプト。

※ただし、これはあくまで原始的な手法であって、もしかしたらもっと手軽な方法があるかもしれません。
 また、スクリプトを導入後は、ニューゲームから開始してください。

メリット
・ツクールXPの仕様。『タイルセットは同じでBGMやバトルバックなどが違う場合』いちいち新しくタイル
 セットを造らなければならないという点の解消
・セーブ/ロード時に無音なのは何か寂しい・・・ってな点の解消(解消!?)

デメリット
・マップIDごとに設定するため大長編RPGだと設定が面倒くさくなるかも・・・
・フォグスクロールランダムを設定したいけど、大本のタイルセットにフォグを設定してない場合はフォグも
 設定しないといけない。

変更点
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文に修正

#==============================================================================
# ■ マップ情報のカスタマイズ+ファイルロード/セーブ時に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文に修正

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("Data/Map%03d.rxdata", @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
薄緑色の部分でマップごとのパノラマの設定を、薄黄色の部分でマップごとのフォグの設定を、 薄紫色の部分でマップごとのバトルバックの設定を、薄赤色の部分であるスイッチがONの場合のBGMを、 薄橙色の部分でマップごとのフォグのランダムスクロールの設定を行います 余計なものがいらないって人はこっちの旧スクリプトを・・・

戻る