#==============================================================================
#                       「乱数固定化」(ACE) Ver.2.0
#   製作者:奈々(なな)
#   へぷたなすくろーる http://heptanas.mamagoto.com/
#
#   ◇使用規約
#   使用される場合はスクリプト作成者として「奈々」を明記して下さい。
#   このスクリプトを改変したり、改変したものを配布するなどは自由ですが
#   その場合も元のスクリプトの作成者として名前は載せて下さい。
#   その他、詳しい利用規約はブログを参照して下さい。
#
#------------------------------------------------------------------------------
#
#   セーブ&ロードによってランダム結果のやり直しが出来ることを防ぎます。
#   新たに追加される固定化乱数は、予め100回分の乱数結果が入っており
#   この乱数テーブルから取り出して使うため、ロードしても同じ結果が出ます。
#   また、乱数テーブルは好きな数だけ用意できるため
#   「乱数を使う別の行動をして結果を変える」というズルも防げます。
#
#   通常のrand(n)と同じようにnana_rand(n, テーブルID)が使えます。
#   ※但し実数を返すrandやrand(0)は代用できません。範囲指定はOKです。
#   テーブルIDは0番からで、省略した場合は0番選択になります。
#
#   また初心者にも分かりやすい使い方として
#   イベントコマンドのスクリプトで
#   fixed_random(変数ID, m, n, テーブルID)が使えます。
#   例えばfixed_random(1, 2, 3, 4)と入力すると
#   1番の変数に、4番の乱数テーブルを使い、2〜3の乱数を代入するとなります。
#
#==============================================================================
#------------------------------------------------------------------------------
# ◇初期設定
#------------------------------------------------------------------------------
# 使用する乱数テーブルの数を設定します。
# プレイヤーが任意の順番で起こせるイベントがある場合
# それらが乱数テーブルを共用してしまうと意味がないので
# 1つのランダム要素に1つのテーブルを割り振って下さい。
module Nana_rand

  KAZU = 1

end
#==============================================================================


#==============================================================================
# ■ Game_System
#------------------------------------------------------------------------------
#  システム周りのデータを扱うクラスです。セーブやメニューの禁止状態などを保存
# します。このクラスのインスタンスは $game_system で参照されます。
#==============================================================================
#*セーブロードの処理を改変するのを避けるために
#$game_systemにぶら下げる形で製作

class Game_System
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数(追加)
  #--------------------------------------------------------------------------
  attr_accessor :nana_rand                # 固定化乱数の親
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化(alias再定義)
  #--------------------------------------------------------------------------
  alias nana_rand_initialize initialize
  def initialize
    nana_rand_initialize
    @nana_rand = Array.new(Nana_rand::KAZU)
    @nana_rand.each_index {|i|
      @nana_rand[i] = Array.new(100)
      #*eachの使い方で二度手間になっている可能性あり
      @nana_rand[i].each_index{|i2|
        @nana_rand[i][i2] = rand(10000)
      }
    }
  end
end

module Kernel
#*関数として呼び出せるようにGame_InterpreterではなくKernelに追加
#但しテーブルは$game_system.nana_randに入っているので注意
  #--------------------------------------------------------------------------
  # ● 固定化乱数の呼び出し
  #--------------------------------------------------------------------------
  def nana_rand(x, id = 0)
    if x.is_a?(Range)
      return nana_rand_range(x.begin, x.last, id, x.exclude_end?)
    else
      return nana_rand_max(x, id)
    end
  end
  #--------------------------------------------------------------------------
  # ● 固定化乱数の呼び出し(最大値指定)
  #--------------------------------------------------------------------------
  def nana_rand_max(n, id = 0)
    n = n== 0 ? 1 : n.abs
    
    temp = $game_system.nana_rand[id][0]
    temp %= n
    $game_system.nana_rand[id].delete_at(0)
    $game_system.nana_rand[id].push(rand(10000))
    return temp
  end
  #--------------------------------------------------------------------------
  # ● 固定化乱数の呼び出し(範囲指定)
  #--------------------------------------------------------------------------
  def nana_rand_range(m, n, id = 0, ee = false)
    if m > n
      t = m
      m = n
      n = t
    end
    n -= m
    n += 1 unless ee
    
    temp = $game_system.nana_rand[id][0]
    temp %= n
    temp += m
    $game_system.nana_rand[id].delete_at(0)
    $game_system.nana_rand[id].push(rand(10000))
    return temp
  end
end

#==============================================================================
# ■ Game_Interpreter
#------------------------------------------------------------------------------
#  イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、
# Game_Troop クラス、Game_Event クラスの内部で使用されます。
#==============================================================================

class Game_Interpreter
  #--------------------------------------------------------------------------
  # ● 固定化乱数の呼び出し(イベント用に使いやすく)
  #--------------------------------------------------------------------------
  def fixed_random(v_id, m, n, id = 0)
    $game_variables[v_id] = nana_rand_range(m, n, id)
  end
end