sword-princess-fine/Scripts/A1_.rb
2024-02-07 09:11:37 -06:00

1095 lines
No EOL
48 KiB
Ruby
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ===========================================================================
# ◆ A1 Scripts ◆
# A1共通処理RGSS2/RGSS3共用
#
# バージョン 4.50 (2012/01/26)
# 作者 A1
# URL      http://a1tktk.web.fc2.com/
# ---------------------------------------------------------------------------
# 更新履歴   2011/11/11 Ver1.00 新規作成
#        2011/12/22 Ver2.00 RGSS3用と同様の処理に変更
#        2011/12/30 Ver2.10 RGSS3用メソッドを追加
#        2011/12/30 Ver3.00 RGSS3用共通処理と統合
#        2011/12/31 Ver3.10 マップチップサーチの仕様を変更
#        2011/12/31 Ver3.10 拡張通行判定を追加
#        2012/01/01 Ver3.11 クラス名の取得処理を追加
# 2012/01/02 Ver3.20 配列を考慮したsplit処理を追加
# 2012/01/02 Ver3.20 配列の全ての要素を整数にする処理を追加
# 2012/01/02 Ver3.30 注釈の処理の仕様を変更
# 2012/01/02 Ver3.40 「前のイベントコマンドの取得」を追加
# 2012/01/03 Ver3.50 「フレーム更新」を追加
# 2012/01/04 Ver3.60 「指定のウィンドウが開いている間ウェイト」追加
# 2012/01/04 Ver3.70 RGSS2用処理見直し
# 2012/01/05 Ver3.80 注釈文字列にエスケープコマンド対応
# 2012/01/05 Ver3.80 多次元配列を考慮したsplit処理を追加
# 2012/01/05 Ver3.80 注釈にスクリプト処理機能を追加
# 2012/01/10 Ver3.90 文字縁取り描画を追加
# 2012/01/11 Ver4.00 テキストビットマップのキャッシュを追加
# 2012/01/13 Ver4.01 「タイルセットの変更」ができなくなる不具合を修正
# 2012/01/14 Ver4.10 split処理を強化
# 2012/01/14 Ver4.20 空白を含む注釈コマンドに対応
# 2012/01/14 Ver4.21 split処理の不具合を修正
# 2012/01/21 Ver4.30 メモの内容を取得する関数を追加
# 2012/01/24 Ver4.40 メモの内容を取得する関数を追加
# 2012/01/24 Ver4.50 メモの内容を取得する関数を追加
# ---------------------------------------------------------------------------
# 設置場所
#  なるべく上の方
#
# 必要スクリプト
# なし
#==============================================================================
$imported = {} if $imported == nil
$imported["A1_Common_Script"] = 4.50
#==============================================================================
# ■ Kernel
#==============================================================================
module Kernel
#--------------------------------------------------------------------------
# ○ RGSSのバージョン取得
#--------------------------------------------------------------------------
def rgss_version
return 3 if defined? Graphics.play_movie
return 2 if defined? Graphics.resize_screen
return 1
end
#--------------------------------------------------------------------------
# ○ コモンスクリプトのバージョン取得
#--------------------------------------------------------------------------
def common_version
$imported["A1_Common_Script"]
end
#--------------------------------------------------------------------------
# ○ コモンスクリプトのバージョンが古い
#--------------------------------------------------------------------------
def old_common_script(script_name, version)
msgbox("#{script_name}にはA1共通スクリプトVer#{version}以上が必要です")
end
end
#==============================================================================
# ■ A1_System
#==============================================================================
module A1_System
end
#==============================================================================
# ■ A1_System::CommonModule
#==============================================================================
class A1_System::CommonModule
#--------------------------------------------------------------------------
# ○ 定数
#--------------------------------------------------------------------------
TWOBYTE_LIST = {
" " => " ",
"" => "=",
"" => ":"
}
#--------------------------------------------------------------------------
# ○ オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
define_command
end
#--------------------------------------------------------------------------
# ○ 変換対象の全角文字を半角に置換
#--------------------------------------------------------------------------
def replace_twobyte(str)
for key in TWOBYTE_LIST.keys
str.gsub!(key) {TWOBYTE_LIST[key]}
end
return str
end
#--------------------------------------------------------------------------
# ○ マイナスが含まれている文字列を数値にする
#--------------------------------------------------------------------------
def minus_to_i(s)
if s[0,0] == "-"
s.gsub!("-","")
return s.to_i * -1
else
return s.to_i
end
end
#--------------------------------------------------------------------------
# ○ ミリ秒単位の現在時間
#--------------------------------------------------------------------------
def now_usec
now = Time.now
hour = now.hour * 60 * 60
min = now.min * 60
sec = now.sec
msec = (now.usec / 1000.0).round
return (hour + min + sec) * 1000 + msec
end
#--------------------------------------------------------------------------
# ○ イベントリストの作成
#--------------------------------------------------------------------------
def create_event_list(code, indent, parameters)
list = RPG::EventCommand.new
list.code = code
list.indent = indent
list.parameters = parameters
return list
end
#--------------------------------------------------------------------------
# ○ メソッド呼び出し
#--------------------------------------------------------------------------
def send_method(method_name)
return send(method_name) if respond_to?(method_name)
end
#--------------------------------------------------------------------------
# ○ オブジェクトの型を判断してStringならエンコード
#--------------------------------------------------------------------------
def encoding_string(obj)
obj.force_encoding("UTF-8") if obj.is_a?(String)
return obj
end
#--------------------------------------------------------------------------
# ○ メモの内容から必要な情報を取得
#--------------------------------------------------------------------------
def note_data(note, key)
result = []
note.each_line {|line|
next unless line =~ /<#{key}[ ]?(.*)>/
return true if $1.empty?
data = $a1_common.replace_twobyte($1).split(" ")
for st in data
result.push(st)
end
}
return false if result.empty?
return result
end
#--------------------------------------------------------------------------
# ○ メモの内容からハッシュを作成
#--------------------------------------------------------------------------
def note_data_hash(note, key, data_default = nil, default = {}, ret = {})
list = note_data_split(note, key)
return default if list.empty?
list.each {|data| ret[data[0]] = data[1] ? data[1] : data_default }
return ret
end
#--------------------------------------------------------------------------
# ○ メモの内容からカンマ区切りの多元配列を取得
#--------------------------------------------------------------------------
def note_data_split(note, key, default = [], ret = [])
data = note_data(note, key)
return default unless data.is_a?(Array)
data.each {|str| ret.push(convert_integer_from_array(split_array(str)))}
return ret
end
#--------------------------------------------------------------------------
# ○ 配列の内容から数値があれば変換
#--------------------------------------------------------------------------
def convert_integer_from_array(data, ret = [])
data.each {|str| ret.push(convert_integer(str))}
return ret
end
#--------------------------------------------------------------------------
# ○ 数値があれば変換
#--------------------------------------------------------------------------
def convert_integer(str)
return $1.to_i if str =~ /(^[-]?[0-9]+$)/
str.is_a?(Array) ? convert_integer_from_array(str) : str
end
#--------------------------------------------------------------------------
# ○ メモの内容から単項目の数値を取得
#--------------------------------------------------------------------------
def note_data_one_value(note, key, default)
data = note_data(note, key)
return data[0].to_i if data.is_a?(Array)
return default
end
#--------------------------------------------------------------------------
# ○ メモの内容から単項目を取得
#--------------------------------------------------------------------------
def note_data_one(note, key, default)
data = note_data(note, key)
return data[0] if data.is_a?(Array)
return default
end
#--------------------------------------------------------------------------
# ○ メモの内容からカンマ区切りの文字列を取得
#--------------------------------------------------------------------------
def note_data_array_str(note, key, default)
data = note_data(note, key)
return data[0].split(",") if data.is_a?(Array)
return default
end
#--------------------------------------------------------------------------
# ○ メモの内容からカンマ区切りの数値を取得
#--------------------------------------------------------------------------
def note_data_array_value(note, key, default)
data = note_data(note, key)
return default unless data.is_a?(Array)
return convert_integer_from_array(split_array(data[0]))
end
#--------------------------------------------------------------------------
# ○ カンマ区切りの文字列メモを変換
#--------------------------------------------------------------------------
def note_data_array(note, key, type, default = nil, through = true)
ret = []
default.each {|dat| ret.push(dat)} if default != nil
data = note_data(note, key)
return ret unless data.is_a?(Array)
data = data[0].split(",")
for d in data
next if ret.include?(d) if through
ret.push(d.to_i) if type.is_a?(Integer)
ret.push(d) if type.is_a?(String)
end
return ret
end
#--------------------------------------------------------------------------
# ○ ディレクトリの作成
#--------------------------------------------------------------------------
def make_directory(dir_name)
Dir::mkdir(dir_name) unless FileTest.exist?(dir_name)
end
#--------------------------------------------------------------------------
# ○ コマンドリスト
#--------------------------------------------------------------------------
def make_command(command, src = "", dect = "")
src.gsub!("/","\\")
dect.gsub!("/","\\")
cmd = "#{command} \"#{src}\" \"#{dect}\""
return cmd
end
#--------------------------------------------------------------------------
# ○ 素材の拡張子を取得
#--------------------------------------------------------------------------
def material_ext(directory, file, direct = false)
exts = []
exts = [".png",".bmp",".jpg"] if directory =~ /(.*)Graphics\/(.*)/
exts = [".mid",".ogg",".wav",".mp3",".wma"] if directory =~ /(.*)Audio(.*)/
find_file = sprintf("%s%s", directory, file) unless direct
find_file = file if direct
for ext in exts
return ext if File.exist?(sprintf("%s%s", find_file, ext))
end
return nil
end
#--------------------------------------------------------------------------
# ○ 素材が存在するかチェック
#--------------------------------------------------------------------------
def material_exist?(directory, file, direct = false)
return false if material_ext(directory, file, direct) == nil
return true
end
#--------------------------------------------------------------------------
# ○ ファイルコピー
#--------------------------------------------------------------------------
def copy_file(src, dest)
srcFile = File.open( src, "rb" )
dstFile = File.open( dest, "wb" )
dstFile.write( srcFile.read )
srcFile.close
dstFile.close
end
#--------------------------------------------------------------------------
# ○ ファイルの存在を確認してファイルコピー
#--------------------------------------------------------------------------
def material_copy(src, dest, directory)
ext = material_ext(directory, src, true)
copy_file( src + ext, dest + ext ) if ext != nil
end
#--------------------------------------------------------------------------
# ○ 配列からAudioを作成
#--------------------------------------------------------------------------
def set_audio(sound, kind)
case kind
when "BGM"; audio = RPG::BGM.new
when "BGS"; audio = RPG::BGS.new
when "ME"; audio = RPG::ME.new
when "SE"; audio = RPG::SE.new
end
audio.name = sound[0]
audio.volume = sound[1]
audio.pitch = sound[2]
return audio
end
#--------------------------------------------------------------------------
# ○ 既に準拠識別子を持っているかチェック
#--------------------------------------------------------------------------
def chk_rtp(file_name, default)
return "" if file_name =~ /^VX_.*/
return "" if file_name =~ /^XP_.*/
return "" if file_name =~ /^2000_.*/
return "" if file_name =~ /^2003_.*/
return default
end
#--------------------------------------------------------------------------
# ○ 先頭の $ を切り出す
#--------------------------------------------------------------------------
def one_character(file_name)
return file_name unless file_name[0] == "$"
tmp = file_name.clone
tmp[0] = ""
return tmp
end
#--------------------------------------------------------------------------
# ○ 配列を入れ替える
#--------------------------------------------------------------------------
def change_array(array, index1, index2)
tmp = array[index1]
array[index1] = array[index2]
array[index2] = tmp
return array
end
#--------------------------------------------------------------------------
# ○ 移動ルートの作成
#--------------------------------------------------------------------------
def create_move_route(repeat, skippable, wait, list)
move_route = RPG::MoveRoute.new
move_route.repeat = repeat
move_route.skippable = skippable
move_route.wait = wait
move_route.list = list
return move_route
end
#--------------------------------------------------------------------------
# ○ 移動ルートコマンドの作成
#--------------------------------------------------------------------------
def create_move_command(code, parameters)
list = RPG::MoveCommand.new
list.code = code
list.parameters = parameters
return list
end
#--------------------------------------------------------------------------
# ○ インタプリタ起動用リストの作成
#--------------------------------------------------------------------------
def create_list(code, indent, parameters)
list = RPG::EventCommand.new
list.code = code
list.indent = indent
list.parameters = parameters
return list
end
#--------------------------------------------------------------------------
# ○ クラス名の取得
#--------------------------------------------------------------------------
def class_name(class_instance)
return class_instance.to_s.split(":")[0].gsub("#<","")
end
#--------------------------------------------------------------------------
# ○ 配列を考慮したsplit
#--------------------------------------------------------------------------
def split_array(str)
str = convert_escape_characters(str)
ret = []
tmp_array = str.split(",")
return strip_array_str(tmp_array) unless str.include?("[")
tmp_str = ""
tmp_array.each {|s|
if char_in_str(s, "[", "]") && tmp_str.empty?
ret.push(s) unless s =~ /^\[/
ret.push([s[1...s.size-1]]) if s =~ /^\[/
else
tmp_str = "#{tmp_str}#{s},"
if char_in_str(tmp_str, "[", "]")
unless tmp_str =~ /^\[/
ret.push(tmp_str[0...tmp_str.size-1])
tmp_str = ""
else
tmp_str = tmp_str[1...tmp_str.size-2]
tmp_str = split_array(tmp_str) if tmp_str.include?("[")
tmp_str = tmp_str.split(",") if tmp_str.include?(",")
ret.push(tmp_str) if tmp_str.is_a?(Array)
ret.push([tmp_str]) if !tmp_str.is_a?(Array)
tmp_str = ""
end
end
end
}
return strip_array_str(ret)
end
#--------------------------------------------------------------------------
# ○ 配列の中の文字列の先頭と末尾の空白を除去
#--------------------------------------------------------------------------
def strip_array_str(array, ret = [])
array.each {|str| ret.push(strip_array_str(str)) if str.is_a?(Array); next if str.is_a?(Array); ret.push(str.strip) }
return ret
end
#--------------------------------------------------------------------------
# ○ 文字列の中に文字が何文字含まれているか調べて同数ならtrueを返す
#--------------------------------------------------------------------------
def char_in_str(str, c1, c2)
num1 = 0
num2 = 0
(0...str.size).each {|i| num1 += 1 if str[i] == c1; num2 += 1 if str[i] == c2 }
return num1 == num2
end
#--------------------------------------------------------------------------
# ○ 制御文字の変換
#--------------------------------------------------------------------------
def convert_escape_characters(text)
result = text.to_s.clone
result.gsub!(/\\/) { "\e" }
result.gsub!(/\e\e/) { "\\" }
result.gsub!(/\eV\[(\d+)\]/i) { $game_variables[$1.to_i] }
result.gsub!(/\eV\[(\d+)\]/i) { $game_variables[$1.to_i] }
result.gsub!(/\eN\[(\d+)\]/i) { actor_name($1.to_i) }
result.gsub!(/\eP\[(\d+)\]/i) { party_member_name($1.to_i) }
result.gsub!(/\eG/i) { Vocab::currency_unit }
loop { result = result.sub(/<s>(.+?)<\/s>/i) { eval($1) }; break unless $1 }
result
end
#--------------------------------------------------------------------------
# ○ アクター n 番の名前を取得
#--------------------------------------------------------------------------
def actor_name(n)
actor = n >= 1 ? $game_actors[n] : nil
actor ? actor.name : ""
end
#--------------------------------------------------------------------------
# ○ パーティメンバー n 番の名前を取得
#--------------------------------------------------------------------------
def party_member_name(n)
actor = n >= 1 ? $game_party.members[n - 1] : nil
actor ? actor.name : ""
end
#--------------------------------------------------------------------------
# ○ 配列を全て整数にする
#--------------------------------------------------------------------------
def params_to_i(params)
ret = []
params.each {|param| ret.push(param.to_i)}
return ret
end
#--------------------------------------------------------------------------
# ○ 注釈コマンド定義
#--------------------------------------------------------------------------
def define_command
@cmd_108 = {}
end
#--------------------------------------------------------------------------
# ○ 注釈コマンド定義取得
#--------------------------------------------------------------------------
def cmd_108
@cmd_108
end
#--------------------------------------------------------------------------
# ○ フレーム更新
#--------------------------------------------------------------------------
def update
end
#--------------------------------------------------------------------------
# ○ 文字の幅と高さを取得
#--------------------------------------------------------------------------
def text_size(font, size, text)
bitmap = Cache.system("")
bitmap.font.name = font
bitmap.font.size = size
tw = bitmap.text_size(text).width
th = bitmap.text_size(text).height
bitmap.dispose
return [tw, th]
end
#--------------------------------------------------------------------------
# ○ 文字の幅を取得
#--------------------------------------------------------------------------
def text_width(font, text)
texts = text.split("\n")
@max_width = 0
texts.each {|text|
width = text_size(font.name, font.size, text)[0]
@max_width = @max_width < width ? width : @max_width
}
return @max_width
end
end
#==============================================================================
# ◆ RGSS3用処理
#==============================================================================
if rgss_version == 3
#==============================================================================
# ■ RPG::Tileset
#==============================================================================
class RPG::Tileset
#--------------------------------------------------------------------------
# ○ 拡張通行判定
#--------------------------------------------------------------------------
def ex_flags
@ex_flags ||= Table.new(8192)
return @ex_flags
end
#--------------------------------------------------------------------------
# ○ 拡張通行判定初期化
#--------------------------------------------------------------------------
def init_ex_flags
@ex_flags = Table.new(8192)
end
end
#==============================================================================
# ■ Game_Interpreter
#------------------------------------------------------------------------------
#  イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、
# Game_Troop クラス、Game_Event クラスの内部で使用されます。
#==============================================================================
class Game_Interpreter
#--------------------------------------------------------------------------
# ☆ オブジェクト初期化
# depth : ネストの深さ
#--------------------------------------------------------------------------
alias a1_common_gi_rgss3_initialize initialize
def initialize(depth = 0, sub_interpreter = false)
@sub_interpreter = sub_interpreter
a1_common_gi_rgss3_initialize(depth)
end
#--------------------------------------------------------------------------
# ☆ メッセージ表示がビジー状態の間ウェイト
#--------------------------------------------------------------------------
alias a1_common_gi_wait_for_message wait_for_message
def wait_for_message
return if @sub_interpreter
a1_common_gi_wait_for_message
end
end
#==============================================================================
# ■ Window_Message
#------------------------------------------------------------------------------
#  文章表示に使うメッセージウィンドウです。
#==============================================================================
class Window_Message < Window_Base
#--------------------------------------------------------------------------
# ☆ 通常文字の処理
#--------------------------------------------------------------------------
alias a1_common_wm_process_normal_character process_normal_character
def process_normal_character(c, pos)
wait_for_one_character_before
a1_common_wm_process_normal_character(c, pos)
end
#--------------------------------------------------------------------------
# ○ 一文字出力前のウェイト
#--------------------------------------------------------------------------
def wait_for_one_character_before
end
end
#==============================================================================
# ■ RPG::Map
#==============================================================================
class RPG::Map
#--------------------------------------------------------------------------
# ○ マップチップを調べるか判定する
#--------------------------------------------------------------------------
def search_map_chip?
return true if $a1_common.note_data(self.note, "マップチップサーチ")
return false
end
end
#==============================================================================
# ■ Game_Map
#------------------------------------------------------------------------------
#  マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。
# このクラスのインスタンスは $game_map で参照されます。
#==============================================================================
class Game_Map
#--------------------------------------------------------------------------
# ☆ セットアップ
#--------------------------------------------------------------------------
alias a1_common_gm_setup setup
def setup(map_id)
a1_common_gm_setup(map_id)
setup_tileset
map_chip_search if search_map_chip?
end
#--------------------------------------------------------------------------
# ★ タイルセットの取得
#--------------------------------------------------------------------------
def tileset
setup_tileset unless @tileset && @now_tileset_id == @tileset_id
return @tileset
end
#--------------------------------------------------------------------------
# ○ タイルセットのセットアップ
#--------------------------------------------------------------------------
def setup_tileset
@tileset = $data_tilesets[@tileset_id].clone
@tileset.flags = $data_tilesets[@tileset_id].flags.clone
@now_tileset_id = @tileset_id
end
#--------------------------------------------------------------------------
# ○ マップチップを調べるか判定する
#--------------------------------------------------------------------------
def search_map_chip?
return @map.search_map_chip?
end
#--------------------------------------------------------------------------
# ○ 指定座標の全レイヤーのフラグ判定(イベント含む)
#--------------------------------------------------------------------------
def all_tiles_flag?(x, y, bit)
all_tiles(x, y).any? {|tile_id| tileset.flags[tile_id] & bit != 0 }
end
#--------------------------------------------------------------------------
# ○ 指定座標の全レイヤーの拡張フラグ判定(イベント含む)
#--------------------------------------------------------------------------
def all_tiles_flag_ex?(x, y, bit)
all_tiles(x, y).any? {|tile_id| tileset.ex_flags[tile_id] & bit != 0 }
end
#--------------------------------------------------------------------------
# ○ 指定座標の全レイヤーの拡張フラグ判定
#--------------------------------------------------------------------------
def layered_tiles_flag_ex?(x, y, bit)
layered_tiles(x, y).any? {|tile_id| tileset.ex_flags[tile_id] & bit != 0 }
end
#--------------------------------------------------------------------------
# ○ 地形タグの取得(イベント含む)
#--------------------------------------------------------------------------
def terrain_tag_all_tailes(x, y)
return 0 unless valid?(x, y)
all_tiles(x, y).each do |tile_id|
tag = tileset.flags[tile_id] >> 12
return tag if tag > 0
end
return 0
end
end
#==============================================================================
# ■ DataManager
#------------------------------------------------------------------------------
#  データベースとゲームオブジェクトを管理するモジュールです。ゲームで使用する
# ほぼ全てのグローバル変数はこのモジュールで初期化されます。
#==============================================================================
module DataManager
#--------------------------------------------------------------------------
# ○ エイリアス用特異メソッド
#--------------------------------------------------------------------------
class << self
alias :a1_common_create_game_objects :create_game_objects
end
#--------------------------------------------------------------------------
# ☆ 各種ゲームオブジェクトの作成
#--------------------------------------------------------------------------
def self.create_game_objects
$a1_common ||= A1_System::CommonModule.new
a1_common_create_game_objects
end
end
#==============================================================================
# ■ Scene_Base
#------------------------------------------------------------------------------
#  ゲーム中の全てのシーンのスーパークラスです。
#==============================================================================
class Scene_Base
#--------------------------------------------------------------------------
# ☆ フレーム更新(基本)
#--------------------------------------------------------------------------
alias a1_common_sb_update_basic update_basic
def update_basic
a1_common_sb_update_basic
$a1_common.update
end
#--------------------------------------------------------------------------
# ○ 指定のウィンドウが開いている間ウェイト
#--------------------------------------------------------------------------
def wait_for_window_open(window)
update_basic until window.openness == 0
end
end
#==============================================================================
# ■ Window_Base
#------------------------------------------------------------------------------
#  ゲーム中の全てのウィンドウのスーパークラスです。
#==============================================================================
class Window_Base < Window
#--------------------------------------------------------------------------
# ★ 制御文字の事前変換
# 実際の描画を始める前に、原則として文字列に変わるものだけを置き換える。
# 文字「\」はエスケープ文字(\eに変換。
#--------------------------------------------------------------------------
def convert_escape_characters(text)
return $a1_common.convert_escape_characters(text)
end
end
#==============================================================================
# ◆ RGSS2用処理
#==============================================================================
elsif rgss_version == 2
#==============================================================================
# ■ Window
#==============================================================================
class Window
#--------------------------------------------------------------------------
# ○ ウィンドウが開いている?
#--------------------------------------------------------------------------
def open?
return self.openness == 255
end
#--------------------------------------------------------------------------
# ○ ウィンドウが閉じている?
#--------------------------------------------------------------------------
def close?
return self.openness == 0
end
end
#==============================================================================
# ■ Cache
#------------------------------------------------------------------------------
#  各種グラフィックを読み込み、Bitmap オブジェクトを作成、保持するモジュール
# です。読み込みの高速化とメモリ節約のため、作成した Bitmap オブジェクトを内部
# のハッシュに保存し、同じビットマップが再度要求されたときに既存のオブジェクト
# を返すようになっています。
#==============================================================================
module Cache
#--------------------------------------------------------------------------
# ○ キャッシュ存在チェック
#--------------------------------------------------------------------------
def self.include?(key)
@cache[key] && !@cache[key].disposed?
end
end
#==============================================================================
# ■ Game_Interpreter
#------------------------------------------------------------------------------
#  イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、
# Game_Troop クラス、Game_Event クラスの内部で使用されます。
#==============================================================================
class Game_Interpreter
#--------------------------------------------------------------------------
# ○ 注釈
#--------------------------------------------------------------------------
def command_108
@comments = [@params[0]]
while next_event_code == 408
@index += 1
@comments.push(@list[@index].parameters[0])
end
end
#--------------------------------------------------------------------------
# ★ イベントコマンドの実行
#--------------------------------------------------------------------------
def execute_command
return rgss3_execute_command unless @index >= @list.size-1
command_end
return true
end
#--------------------------------------------------------------------------
# ○ RGSS3風「イベントコマンドの実行」
#--------------------------------------------------------------------------
def rgss3_execute_command
command = @list[@index]
@params = command.parameters
@indent = command.indent
method_name = "command_#{command.code}"
send(method_name) if respond_to?(method_name)
end
#--------------------------------------------------------------------------
# ○ 次のイベントコマンドのコードを取得
#--------------------------------------------------------------------------
def next_event_code
@list[@index + 1].code
end
end
#==============================================================================
# ■ Game_Map
#------------------------------------------------------------------------------
#  マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。
# このクラスのインスタンスは $game_map で参照されます。
#==============================================================================
class Game_Map
#--------------------------------------------------------------------------
# ○ マップチップを調べるか判定する
#--------------------------------------------------------------------------
def search_map_chip?
return $data_map_infos[@map_id].name =~ /\[サーチ\]/
end
#--------------------------------------------------------------------------
# ○ 指定座標に存在するタイル扱いイベント(すり抜け以外)の配列取得
#--------------------------------------------------------------------------
def tile_events_xy(x, y)
@tile_events.select {|event| event.pos_nt?(x, y) }
end
#--------------------------------------------------------------------------
# ○ タイル扱いイベントの配列をリフレッシュ
#--------------------------------------------------------------------------
def refresh_tile_events
@tile_events = @events.values.select {|event| event.tile? }
end
end
#==============================================================================
# ■ Game_Character
#------------------------------------------------------------------------------
#  キャラクターを扱うクラスです。このクラスは Game_Player クラスと Game_Event
# クラスのスーパークラスとして使用されます。
#==============================================================================
class Game_Character
#--------------------------------------------------------------------------
# ○ タイル判定
#--------------------------------------------------------------------------
def tile?
@tile_id > 0 && @priority_type == 0
end
end
#==============================================================================
# ■ Scene_Title
#------------------------------------------------------------------------------
#  タイトル画面の処理を行うクラスです。
#==============================================================================
class Scene_Title < Scene_Base
#--------------------------------------------------------------------------
# ☆ データベースのロード
#--------------------------------------------------------------------------
alias a1_common_st_load_database load_database
def load_database
a1_common_st_load_database
$data_map_infos = load_data("Data/MapInfos.rvdata")
end
#--------------------------------------------------------------------------
# ☆ 各種ゲームオブジェクトの作成
#--------------------------------------------------------------------------
alias a1_common_st_create_game_objects create_game_objects
def create_game_objects
$a1_common ||= A1_System::CommonModule.new
a1_common_st_create_game_objects
end
end
#==============================================================================
# ◆ RGSS用処理
#==============================================================================
elsif rgss_version == 1
end
#==============================================================================
# ■ Cache
#------------------------------------------------------------------------------
#  各種グラフィックを読み込み、Bitmap オブジェクトを作成、保持するモジュール
# です。読み込みの高速化とメモリ節約のため、作成した Bitmap オブジェクトを内部
# のハッシュに保存し、同じビットマップが再度要求されたときに既存のオブジェクト
# を返すようになっています。
#==============================================================================
module Cache
#--------------------------------------------------------------------------
# ○ 拡大縮小したビットマップのロード
#--------------------------------------------------------------------------
def self.load_resize_bitmap(load_path, key, resize = nil)
@cache ||= {}
key = load_path if key == nil
return @cache[key] if include?(key)
@cache[key] = Bitmap.new(load_path)
return @cache[key] if resize == nil
return @cache[key] if @cache[key].width == resize[0] and @cache[key].height == resize[1]
info = calc_size(resize, key)
return resize_bitmap(@cache[key], info[0], info[1], key)
end
#--------------------------------------------------------------------------
# ○ 拡大縮小した色相変化済みビットマップを作成/取得
#--------------------------------------------------------------------------
def self.load_resize_hue_changed_bitmap(load_path, path, hue, resize)
key = [path, hue]
return @cache[key] if include?(key)
@cache[key] = load_resize_bitmap(load_path, path, resize).clone
@cache[key].hue_change(hue)
return @cache[key]
end
#--------------------------------------------------------------------------
# ○ リサイズするサイズを取得
#--------------------------------------------------------------------------
def self.calc_size(resize, key)
width = resize[0]
width = @cache[key].width * width.abs if width < 0
height = resize[1]
height = @cache[key].height * height.abs if height < 0
height = Integer(@cache[key].height * (width.to_f / @cache[key].width.to_f)) if height == 0
return [width, height]
end
#--------------------------------------------------------------------------
# ○ ビットマップの拡大縮小
#--------------------------------------------------------------------------
def self.resize_bitmap(bitmap, width, height, key)
resize = Bitmap.new(width, height)
resize.stretch_blt(resize.rect, bitmap, bitmap.rect)
@cache[key] = resize
return resize
end
#--------------------------------------------------------------------------
# ○ テキストビットマップの取得
#--------------------------------------------------------------------------
def self.text_picture(text, font)
load_text_bitmap(text, font)
end
#--------------------------------------------------------------------------
# ○ フォントのキーを作成
#--------------------------------------------------------------------------
def self.make_font_key(text, font)
[text, font.name, font.size, font.bold, font.italic, font.outline, font.shadow, font.color.to_s, font.out_color.to_s]
end
#--------------------------------------------------------------------------
# ○ テキストビットマップの作成
#--------------------------------------------------------------------------
def self.load_text_bitmap(text, font)
@cache ||= {}
key = make_font_key(text, font)
return @cache[key] if include?(key)
# 計算用ダミービットマップ
bitmap = Cache.system("")
bitmap.font = font
tw = bitmap.text_size(text).width + 8
# ビットマップ作成
bitmap = Bitmap.new(tw, bitmap.font.size + 4)
bitmap.font = font
bitmap.draw_text(0, 0, bitmap.width, bitmap.height, text, 1)
@cache[key] = bitmap
return @cache[key]
end
end
#==============================================================================
# ■ Game_Interpreter
#------------------------------------------------------------------------------
#  イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、
# Game_Troop クラス、Game_Event クラスの内部で使用されます。
#==============================================================================
class Game_Interpreter
#--------------------------------------------------------------------------
# ○ 注釈
#--------------------------------------------------------------------------
alias a1_common_command_108 command_108
def command_108
a1_common_command_108
proc_comment(@comments)
end
#--------------------------------------------------------------------------
# ○ 注釈の処理
#--------------------------------------------------------------------------
def proc_comment(comments)
param = ""
comments.each {|comment| param += comment }
params = param.sub(/^(\S+)/, "")
command = $1
comment_parameters = $a1_common.split_array(params) if params
proc_comment_command(command, comment_parameters)
end
#--------------------------------------------------------------------------
# ○ 注釈の実行
#--------------------------------------------------------------------------
def proc_comment_command(command, params)
cmd_108 = $a1_common.cmd_108[command]
method(cmd_108).call(params) if cmd_108 != nil
end
#--------------------------------------------------------------------------
# ○ 前のイベントコマンドを取得
#--------------------------------------------------------------------------
def prev_event
@list[@index - 1]
end
end
#==============================================================================
# ■ Game_Map
#------------------------------------------------------------------------------
#  マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。
# このクラスのインスタンスは $game_map で参照されます。
#==============================================================================
class Game_Map
#--------------------------------------------------------------------------
# ○ 全マップチップを調べる
#--------------------------------------------------------------------------
def map_chip_search
tileset.init_ex_flags
(0...@map.data.xsize).each {|x| map_chip_search_y(x) }
end
#--------------------------------------------------------------------------
# ○ x座標にあるy座標のマップチップを調べる
#--------------------------------------------------------------------------
def map_chip_search_y(x)
(0...@map.data.ysize).each {|y| map_pos_proc(x, y); map_chip_search_z(x, y) }
end
#--------------------------------------------------------------------------
# ○ x,y座標にあるz座標のマップチップを調べる
#--------------------------------------------------------------------------
def map_chip_search_z(x, y)
(0...@map.data.zsize).each {|z| map_chip_proc(x, y, z) }
tile_events_xy(x, y).collect {|ev| tile_event_proc(ev.tile_id) }
end
#--------------------------------------------------------------------------
# ○ 座標に対して処理を行う
#--------------------------------------------------------------------------
def map_pos_proc(x, y)
end
#--------------------------------------------------------------------------
# ○ マップチップに対して処理を行う
#--------------------------------------------------------------------------
def map_chip_proc(x, y, z)
end
#--------------------------------------------------------------------------
# ○ タイルのイベントに対して処理を行う
#--------------------------------------------------------------------------
def tile_event_proc(tile_id)
end
end
#==============================================================================
# ■ Window_Base
#------------------------------------------------------------------------------
#  ゲーム中の全てのウィンドウのスーパークラスです。
#==============================================================================
class Window_Base < Window
#--------------------------------------------------------------------------
# ○ 入力を受け付けるか?
#--------------------------------------------------------------------------
def can_input?
@can_input
end
#--------------------------------------------------------------------------
# ○ 入力受け付け設定
#--------------------------------------------------------------------------
def can_input=(flag)
@can_input = flag
end
end
#==============================================================================
# ■ Bitmap
#==============================================================================
class Bitmap
#--------------------------------------------------------------------------
# ○ 文字縁取り描画
#--------------------------------------------------------------------------
def draw_text_f(x, y, width, height, str, align = 0, color = Color.new(64,32,128))
shadow = self.font.shadow
b_color = self.font.color.dup
font.shadow = false
font.color = color
draw_text(x + 1, y, width, height, str, align)
draw_text(x - 1, y, width, height, str, align)
draw_text(x, y + 1, width, height, str, align)
draw_text(x, y - 1, width, height, str, align)
font.color = b_color
draw_text(x, y, width, height, str, align)
font.shadow = shadow
end
#--------------------------------------------------------------------------
# ○ 文字縁取り描画の矩形を取得
#--------------------------------------------------------------------------
def draw_text_f_rect(r, str, align = 0, color = Color.new(64,32,128))
draw_text_f(r.x, r.y, r.width, r.height, str, align = 0, color)
end
end