This commit is contained in:
Dazed 2024-01-12 00:13:02 -06:00
parent f7547739d1
commit cabb4cdc28
144 changed files with 118273 additions and 96582 deletions

1
.gitignore vendored
View file

@ -13,6 +13,7 @@
!*.tjs
!*.yaml
!*.rvdata2
!*.rb
!version.dll
!.gitignore
!patch.bat

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

392
Scripts/BattleManager.rb Normal file
View file

@ -0,0 +1,392 @@
#==============================================================================
# ■ BattleManager
#------------------------------------------------------------------------------
#  戦闘の進行を管理するモジュールです。
#==============================================================================
module BattleManager
#--------------------------------------------------------------------------
# ● セットアップ
#--------------------------------------------------------------------------
def self.setup(troop_id, can_escape = true, can_lose = false)
init_members
$game_troop.setup(troop_id)
@can_escape = can_escape
@can_lose = can_lose
make_escape_ratio
end
#--------------------------------------------------------------------------
# ● メンバ変数の初期化
#--------------------------------------------------------------------------
def self.init_members
@phase = :init # 戦闘進行フェーズ
@can_escape = false # 逃走可能フラグ
@can_lose = false # 敗北可能フラグ
@event_proc = nil # イベント用コールバック
@preemptive = false # 先制攻撃フラグ
@surprise = false # 不意打ちフラグ
@actor_index = -1 # コマンド入力中のアクター
@action_forced = nil # 戦闘行動の強制
@map_bgm = nil # 戦闘前の BGM 記憶用
@map_bgs = nil # 戦闘前の BGS 記憶用
@action_battlers = [] # 行動順序リスト
end
#--------------------------------------------------------------------------
# ● エンカウント時の処理
#--------------------------------------------------------------------------
def self.on_encounter
@preemptive = (rand < rate_preemptive)
@surprise = (rand < rate_surprise && !@preemptive)
end
#--------------------------------------------------------------------------
# ● 先制攻撃の確率取得
#--------------------------------------------------------------------------
def self.rate_preemptive
$game_party.rate_preemptive($game_troop.agi)
end
#--------------------------------------------------------------------------
# ● 不意打ちの確率取得
#--------------------------------------------------------------------------
def self.rate_surprise
$game_party.rate_surprise($game_troop.agi)
end
#--------------------------------------------------------------------------
# ● BGM と BGS の保存
#--------------------------------------------------------------------------
def self.save_bgm_and_bgs
@map_bgm = RPG::BGM.last
@map_bgs = RPG::BGS.last
end
#--------------------------------------------------------------------------
# ● 戦闘 BGM の演奏
#--------------------------------------------------------------------------
def self.play_battle_bgm
$game_system.battle_bgm.play
RPG::BGS.stop
end
#--------------------------------------------------------------------------
# ● 戦闘終了 ME の演奏
#--------------------------------------------------------------------------
def self.play_battle_end_me
$game_system.battle_end_me.play
end
#--------------------------------------------------------------------------
# ● BGM と BGS の再開
#--------------------------------------------------------------------------
def self.replay_bgm_and_bgs
@map_bgm.replay unless $BTEST
@map_bgs.replay unless $BTEST
end
#--------------------------------------------------------------------------
# ● 逃走成功率の作成
#--------------------------------------------------------------------------
def self.make_escape_ratio
@escape_ratio = 1.5 - 1.0 * $game_troop.agi / $game_party.agi
end
#--------------------------------------------------------------------------
# ● ターン実行中判定
#--------------------------------------------------------------------------
def self.in_turn?
@phase == :turn
end
#--------------------------------------------------------------------------
# ● ターン終了中判定
#--------------------------------------------------------------------------
def self.turn_end?
@phase == :turn_end
end
#--------------------------------------------------------------------------
# ● 戦闘中断判定
#--------------------------------------------------------------------------
def self.aborting?
@phase == :aborting
end
#--------------------------------------------------------------------------
# ● 逃走許可の取得
#--------------------------------------------------------------------------
def self.can_escape?
@can_escape
end
#--------------------------------------------------------------------------
# ● コマンド入力中のアクターを取得
#--------------------------------------------------------------------------
def self.actor
@actor_index >= 0 ? $game_party.members[@actor_index] : nil
end
#--------------------------------------------------------------------------
# ● コマンド入力中のアクターをクリア
#--------------------------------------------------------------------------
def self.clear_actor
@actor_index = -1
end
#--------------------------------------------------------------------------
# ● 次のコマンド入力へ
#--------------------------------------------------------------------------
def self.next_command
begin
if !actor || !actor.next_command
@actor_index += 1
return false if @actor_index >= $game_party.members.size
end
end until actor.inputable?
return true
end
#--------------------------------------------------------------------------
# ● 前のコマンド入力へ
#--------------------------------------------------------------------------
def self.prior_command
begin
if !actor || !actor.prior_command
@actor_index -= 1
return false if @actor_index < 0
end
end until actor.inputable?
return true
end
#--------------------------------------------------------------------------
# ● イベントへのコールバック用 Proc の設定
#--------------------------------------------------------------------------
def self.event_proc=(proc)
@event_proc = proc
end
#--------------------------------------------------------------------------
# ● ウェイト用メソッドの設定
#--------------------------------------------------------------------------
def self.method_wait_for_message=(method)
@method_wait_for_message = method
end
#--------------------------------------------------------------------------
# ● メッセージ表示が終わるまでウェイト
#--------------------------------------------------------------------------
def self.wait_for_message
@method_wait_for_message.call if @method_wait_for_message
end
#--------------------------------------------------------------------------
# ● 戦闘開始
#--------------------------------------------------------------------------
def self.battle_start
$game_system.battle_count += 1
$game_party.on_battle_start
$game_troop.on_battle_start
$game_troop.enemy_names.each do |name|
$game_message.add(sprintf(Vocab::Emerge, name))
end
if @preemptive
$game_message.add(sprintf(Vocab::Preemptive, $game_party.name))
elsif @surprise
$game_message.add(sprintf(Vocab::Surprise, $game_party.name))
end
wait_for_message
end
#--------------------------------------------------------------------------
# ● 戦闘中断
#--------------------------------------------------------------------------
def self.abort
@phase = :aborting
end
#--------------------------------------------------------------------------
# ● 勝敗判定
#--------------------------------------------------------------------------
def self.judge_win_loss
if @phase
return process_abort if $game_party.members.empty?
return process_defeat if $game_party.all_dead?
return process_victory if $game_troop.all_dead?
return process_abort if aborting?
end
return false
end
#--------------------------------------------------------------------------
# ● 勝利の処理
#--------------------------------------------------------------------------
def self.process_victory
play_battle_end_me
replay_bgm_and_bgs
$game_message.add(sprintf(Vocab::Victory, $game_party.name))
display_exp
gain_gold
gain_drop_items
gain_exp
SceneManager.return
battle_end(0)
return true
end
#--------------------------------------------------------------------------
# ● 逃走の処理
#--------------------------------------------------------------------------
def self.process_escape
$game_message.add(sprintf(Vocab::EscapeStart, $game_party.name))
success = @preemptive ? true : (rand < @escape_ratio)
Sound.play_escape
if success
process_abort
else
@escape_ratio += 0.1
$game_message.add('\.' + Vocab::EscapeFailure)
$game_party.clear_actions
end
wait_for_message
return success
end
#--------------------------------------------------------------------------
# ● 中断の処理
#--------------------------------------------------------------------------
def self.process_abort
replay_bgm_and_bgs
SceneManager.return
battle_end(1)
return true
end
#--------------------------------------------------------------------------
# ● 敗北の処理
#--------------------------------------------------------------------------
def self.process_defeat
$game_message.add(sprintf(Vocab::Defeat, $game_party.name))
wait_for_message
if @can_lose
revive_battle_members
replay_bgm_and_bgs
SceneManager.return
else
SceneManager.goto(Scene_Gameover)
end
battle_end(2)
return true
end
#--------------------------------------------------------------------------
# ● 戦闘メンバーの復活(敗北時)
#--------------------------------------------------------------------------
def self.revive_battle_members
$game_party.battle_members.each do |actor|
actor.hp = 1 if actor.dead?
end
end
#--------------------------------------------------------------------------
# ● 戦闘終了
# result : 結果0:勝利 1:逃走 2:敗北)
#--------------------------------------------------------------------------
def self.battle_end(result)
@phase = nil
@event_proc.call(result) if @event_proc
$game_party.on_battle_end
$game_troop.on_battle_end
SceneManager.exit if $BTEST
end
#--------------------------------------------------------------------------
# ● コマンド入力開始
#--------------------------------------------------------------------------
def self.input_start
if @phase != :input
@phase = :input
$game_party.make_actions
$game_troop.make_actions
clear_actor
end
return !@surprise && $game_party.inputable?
end
#--------------------------------------------------------------------------
# ● ターン開始
#--------------------------------------------------------------------------
def self.turn_start
@phase = :turn
clear_actor
$game_troop.increase_turn
make_action_orders
end
#--------------------------------------------------------------------------
# ● ターン終了
#--------------------------------------------------------------------------
def self.turn_end
@phase = :turn_end
@preemptive = false
@surprise = false
end
#--------------------------------------------------------------------------
# ● 獲得した経験値の表示
#--------------------------------------------------------------------------
def self.display_exp
if $game_troop.exp_total > 0
text = sprintf(Vocab::ObtainExp, $game_troop.exp_total)
$game_message.add('\.' + text)
end
end
#--------------------------------------------------------------------------
# ● お金の獲得と表示
#--------------------------------------------------------------------------
def self.gain_gold
if $game_troop.gold_total > 0
text = sprintf(Vocab::ObtainGold, $game_troop.gold_total)
$game_message.add('\.' + text)
$game_party.gain_gold($game_troop.gold_total)
end
wait_for_message
end
#--------------------------------------------------------------------------
# ● ドロップアイテムの獲得と表示
#--------------------------------------------------------------------------
def self.gain_drop_items
$game_troop.make_drop_items.each do |item|
$game_party.gain_item(item, 1)
$game_message.add(sprintf(Vocab::ObtainItem, item.name))
end
wait_for_message
end
#--------------------------------------------------------------------------
# ● 経験値の獲得とレベルアップの表示
#--------------------------------------------------------------------------
def self.gain_exp
$game_party.all_members.each do |actor|
actor.gain_exp($game_troop.exp_total)
end
wait_for_message
end
#--------------------------------------------------------------------------
# ● 行動順序の作成
#--------------------------------------------------------------------------
def self.make_action_orders
@action_battlers = []
@action_battlers += $game_party.members unless @surprise
@action_battlers += $game_troop.members unless @preemptive
@action_battlers.each {|battler| battler.make_speed }
@action_battlers.sort! {|a,b| b.speed - a.speed }
end
#--------------------------------------------------------------------------
# ● 戦闘行動の強制
#--------------------------------------------------------------------------
def self.force_action(battler)
@action_forced = battler
@action_battlers.delete(battler)
end
#--------------------------------------------------------------------------
# ● 戦闘行動の強制状態を取得
#--------------------------------------------------------------------------
def self.action_forced?
@action_forced != nil
end
#--------------------------------------------------------------------------
# ● 戦闘行動が強制されたバトラーを取得
#--------------------------------------------------------------------------
def self.action_forced_battler
@action_forced
end
#--------------------------------------------------------------------------
# ● 戦闘行動の強制をクリア
#--------------------------------------------------------------------------
def self.clear_action_force
@action_forced = nil
end
#--------------------------------------------------------------------------
# ● 次の行動主体の取得
# 行動順序リストの先頭からバトラーを取得する。
# 現在パーティにいないアクターを取得した場合index が nil, バトルイベ
# ントでの離脱直後などに発生)は、それをスキップする。
#--------------------------------------------------------------------------
def self.next_subject
loop do
battler = @action_battlers.shift
return nil unless battler
next unless battler.index && battler.alive?
return battler
end
end
end

134
Scripts/Cache.rb Normal file
View file

@ -0,0 +1,134 @@
#==============================================================================
# ■ Cache
#------------------------------------------------------------------------------
#  各種グラフィックを読み込み、Bitmap オブジェクトを作成、保持するモジュール
# です。読み込みの高速化とメモリ節約のため、作成した Bitmap オブジェクトを内部
# のハッシュに保存し、同じビットマップが再度要求されたときに既存のオブジェクト
# を返すようになっています。
#==============================================================================
module Cache
#--------------------------------------------------------------------------
# ● アニメーション グラフィックの取得
#--------------------------------------------------------------------------
def self.animation(filename, hue)
load_bitmap("Graphics/Animations/", filename, hue)
end
#--------------------------------------------------------------------------
# ● 戦闘背景(床)グラフィックの取得
#--------------------------------------------------------------------------
def self.battleback1(filename)
load_bitmap("Graphics/Battlebacks1/", filename)
end
#--------------------------------------------------------------------------
# ● 戦闘背景(壁)グラフィックの取得
#--------------------------------------------------------------------------
def self.battleback2(filename)
load_bitmap("Graphics/Battlebacks2/", filename)
end
#--------------------------------------------------------------------------
# ● 戦闘グラフィックの取得
#--------------------------------------------------------------------------
def self.battler(filename, hue)
load_bitmap("Graphics/Battlers/", filename, hue)
end
#--------------------------------------------------------------------------
# ● 歩行グラフィックの取得
#--------------------------------------------------------------------------
def self.character(filename)
load_bitmap("Graphics/Characters/", filename)
end
#--------------------------------------------------------------------------
# ● 顔グラフィックの取得
#--------------------------------------------------------------------------
def self.face(filename)
load_bitmap("Graphics/Faces/", filename)
end
#--------------------------------------------------------------------------
# ● 遠景グラフィックの取得
#--------------------------------------------------------------------------
def self.parallax(filename)
load_bitmap("Graphics/Parallaxes/", filename)
end
#--------------------------------------------------------------------------
# ● ピクチャ グラフィックの取得
#--------------------------------------------------------------------------
def self.picture(filename)
load_bitmap("Graphics/Pictures/", filename)
end
#--------------------------------------------------------------------------
# ● システム グラフィックの取得
#--------------------------------------------------------------------------
def self.system(filename)
load_bitmap("Graphics/System/", filename)
end
#--------------------------------------------------------------------------
# ● タイルセット グラフィックの取得
#--------------------------------------------------------------------------
def self.tileset(filename)
load_bitmap("Graphics/Tilesets/", filename)
end
#--------------------------------------------------------------------------
# ● タイトル(背景)グラフィックの取得
#--------------------------------------------------------------------------
def self.title1(filename)
load_bitmap("Graphics/Titles1/", filename)
end
#--------------------------------------------------------------------------
# ● タイトル(枠)グラフィックの取得
#--------------------------------------------------------------------------
def self.title2(filename)
load_bitmap("Graphics/Titles2/", filename)
end
#--------------------------------------------------------------------------
# ● ビットマップの読み込み
#--------------------------------------------------------------------------
def self.load_bitmap(folder_name, filename, hue = 0)
@cache ||= {}
if filename.empty?
empty_bitmap
elsif hue == 0
normal_bitmap(folder_name + filename)
else
hue_changed_bitmap(folder_name + filename, hue)
end
end
#--------------------------------------------------------------------------
# ● 空のビットマップを作成
#--------------------------------------------------------------------------
def self.empty_bitmap
Bitmap.new(32, 32)
end
#--------------------------------------------------------------------------
# ● 通常のビットマップを作成/取得
#--------------------------------------------------------------------------
def self.normal_bitmap(path)
@cache[path] = Bitmap.new(path) unless include?(path)
@cache[path]
end
#--------------------------------------------------------------------------
# ● 色相変化済みビットマップを作成/取得
#--------------------------------------------------------------------------
def self.hue_changed_bitmap(path, hue)
key = [path, hue]
unless include?(key)
@cache[key] = normal_bitmap(path).clone
@cache[key].hue_change(hue)
end
@cache[key]
end
#--------------------------------------------------------------------------
# ● キャッシュ存在チェック
#--------------------------------------------------------------------------
def self.include?(key)
@cache[key] && !@cache[key].disposed?
end
#--------------------------------------------------------------------------
# ● キャッシュのクリア
#--------------------------------------------------------------------------
def self.clear
@cache ||= {}
@cache.clear
GC.start
end
end

267
Scripts/DataManager.rb Normal file
View file

@ -0,0 +1,267 @@
#==============================================================================
# ■ DataManager
#------------------------------------------------------------------------------
#  データベースとゲームオブジェクトを管理するモジュールです。ゲームで使用する
# ほぼ全てのグローバル変数はこのモジュールで初期化されます。
#==============================================================================
module DataManager
#--------------------------------------------------------------------------
# ● モジュールのインスタンス変数
#--------------------------------------------------------------------------
@last_savefile_index = 0 # 最後にアクセスしたファイル
#--------------------------------------------------------------------------
# ● モジュール初期化
#--------------------------------------------------------------------------
def self.init
@last_savefile_index = 0
load_database
create_game_objects
setup_battle_test if $BTEST
end
#--------------------------------------------------------------------------
# ● データベースのロード
#--------------------------------------------------------------------------
def self.load_database
if $BTEST
load_battle_test_database
else
load_normal_database
check_player_location
end
end
#--------------------------------------------------------------------------
# ● 通常のデータベースをロード
#--------------------------------------------------------------------------
def self.load_normal_database
$data_actors = load_data("Data/Actors.rvdata2")
$data_classes = load_data("Data/Classes.rvdata2")
$data_skills = load_data("Data/Skills.rvdata2")
$data_items = load_data("Data/Items.rvdata2")
$data_weapons = load_data("Data/Weapons.rvdata2")
$data_armors = load_data("Data/Armors.rvdata2")
$data_enemies = load_data("Data/Enemies.rvdata2")
$data_troops = load_data("Data/Troops.rvdata2")
$data_states = load_data("Data/States.rvdata2")
$data_animations = load_data("Data/Animations.rvdata2")
$data_tilesets = load_data("Data/Tilesets.rvdata2")
$data_common_events = load_data("Data/CommonEvents.rvdata2")
$data_system = load_data("Data/System.rvdata2")
$data_mapinfos = load_data("Data/MapInfos.rvdata2")
end
#--------------------------------------------------------------------------
# ● 戦闘テスト用のデータベースをロード
#--------------------------------------------------------------------------
def self.load_battle_test_database
$data_actors = load_data("Data/BT_Actors.rvdata2")
$data_classes = load_data("Data/BT_Classes.rvdata2")
$data_skills = load_data("Data/BT_Skills.rvdata2")
$data_items = load_data("Data/BT_Items.rvdata2")
$data_weapons = load_data("Data/BT_Weapons.rvdata2")
$data_armors = load_data("Data/BT_Armors.rvdata2")
$data_enemies = load_data("Data/BT_Enemies.rvdata2")
$data_troops = load_data("Data/BT_Troops.rvdata2")
$data_states = load_data("Data/BT_States.rvdata2")
$data_animations = load_data("Data/BT_Animations.rvdata2")
$data_tilesets = load_data("Data/BT_Tilesets.rvdata2")
$data_common_events = load_data("Data/BT_CommonEvents.rvdata2")
$data_system = load_data("Data/BT_System.rvdata2")
end
#--------------------------------------------------------------------------
# ● プレイヤーの初期位置存在チェック
#--------------------------------------------------------------------------
def self.check_player_location
if $data_system.start_map_id == 0
msgbox(Vocab::PlayerPosError)
exit
end
end
#--------------------------------------------------------------------------
# ● 各種ゲームオブジェクトの作成
#--------------------------------------------------------------------------
def self.create_game_objects
$game_temp = Game_Temp.new
$game_system = Game_System.new
$game_timer = Game_Timer.new
$game_message = Game_Message.new
$game_switches = Game_Switches.new
$game_variables = Game_Variables.new
$game_self_switches = Game_SelfSwitches.new
$game_actors = Game_Actors.new
$game_party = Game_Party.new
$game_troop = Game_Troop.new
$game_map = Game_Map.new
$game_player = Game_Player.new
end
#--------------------------------------------------------------------------
# ● ニューゲームのセットアップ
#--------------------------------------------------------------------------
def self.setup_new_game
create_game_objects
$game_party.setup_starting_members
$game_map.setup($data_system.start_map_id)
$game_player.moveto($data_system.start_x, $data_system.start_y)
$game_player.refresh
Graphics.frame_count = 0
end
#--------------------------------------------------------------------------
# ● 戦闘テストのセットアップ
#--------------------------------------------------------------------------
def self.setup_battle_test
$game_party.setup_battle_test
BattleManager.setup($data_system.test_troop_id)
BattleManager.play_battle_bgm
end
#--------------------------------------------------------------------------
# ● セーブファイルの存在判定
#--------------------------------------------------------------------------
def self.save_file_exists?
!Dir.glob('Save*.rvdata2').empty?
end
#--------------------------------------------------------------------------
# ● セーブファイルの最大数
#--------------------------------------------------------------------------
def self.savefile_max
return 16
end
#--------------------------------------------------------------------------
# ● ファイル名の作成
# index : ファイルインデックス
#--------------------------------------------------------------------------
def self.make_filename(index)
sprintf("Save%02d.rvdata2", index + 1)
end
#--------------------------------------------------------------------------
# ● セーブの実行
#--------------------------------------------------------------------------
def self.save_game(index)
begin
save_game_without_rescue(index)
rescue
delete_save_file(index)
false
end
end
#--------------------------------------------------------------------------
# ● ロードの実行
#--------------------------------------------------------------------------
def self.load_game(index)
load_game_without_rescue(index) rescue false
end
#--------------------------------------------------------------------------
# ● セーブヘッダのロード
#--------------------------------------------------------------------------
def self.load_header(index)
load_header_without_rescue(index) rescue nil
end
#--------------------------------------------------------------------------
# ● セーブの実行(例外処理なし)
#--------------------------------------------------------------------------
def self.save_game_without_rescue(index)
File.open(make_filename(index), "wb") do |file|
$game_system.on_before_save
Marshal.dump(make_save_header, file)
Marshal.dump(make_save_contents, file)
@last_savefile_index = index
end
return true
end
#--------------------------------------------------------------------------
# ● ロードの実行(例外処理なし)
#--------------------------------------------------------------------------
def self.load_game_without_rescue(index)
File.open(make_filename(index), "rb") do |file|
Marshal.load(file)
extract_save_contents(Marshal.load(file))
reload_map_if_updated
@last_savefile_index = index
end
return true
end
#--------------------------------------------------------------------------
# ● セーブヘッダのロード(例外処理なし)
#--------------------------------------------------------------------------
def self.load_header_without_rescue(index)
File.open(make_filename(index), "rb") do |file|
return Marshal.load(file)
end
return nil
end
#--------------------------------------------------------------------------
# ● セーブファイルの削除
#--------------------------------------------------------------------------
def self.delete_save_file(index)
File.delete(make_filename(index)) rescue nil
end
#--------------------------------------------------------------------------
# ● セーブヘッダの作成
#--------------------------------------------------------------------------
def self.make_save_header
header = {}
header[:characters] = $game_party.characters_for_savefile
header[:playtime_s] = $game_system.playtime_s
header
end
#--------------------------------------------------------------------------
# ● セーブ内容の作成
#--------------------------------------------------------------------------
def self.make_save_contents
contents = {}
contents[:system] = $game_system
contents[:timer] = $game_timer
contents[:message] = $game_message
contents[:switches] = $game_switches
contents[:variables] = $game_variables
contents[:self_switches] = $game_self_switches
contents[:actors] = $game_actors
contents[:party] = $game_party
contents[:troop] = $game_troop
contents[:map] = $game_map
contents[:player] = $game_player
contents
end
#--------------------------------------------------------------------------
# ● セーブ内容の展開
#--------------------------------------------------------------------------
def self.extract_save_contents(contents)
$game_system = contents[:system]
$game_timer = contents[:timer]
$game_message = contents[:message]
$game_switches = contents[:switches]
$game_variables = contents[:variables]
$game_self_switches = contents[:self_switches]
$game_actors = contents[:actors]
$game_party = contents[:party]
$game_troop = contents[:troop]
$game_map = contents[:map]
$game_player = contents[:player]
end
#--------------------------------------------------------------------------
# ● データが更新されている場合はマップを再読み込み
#--------------------------------------------------------------------------
def self.reload_map_if_updated
if $game_system.version_id != $data_system.version_id
$game_map.setup($game_map.map_id)
$game_player.center($game_player.x, $game_player.y)
$game_player.make_encounter_count
end
end
#--------------------------------------------------------------------------
# ● セーブファイルの更新日時を取得
#--------------------------------------------------------------------------
def self.savefile_time_stamp(index)
File.mtime(make_filename(index)) rescue Time.at(0)
end
#--------------------------------------------------------------------------
# ● 更新日時が最新のファイルインデックスを取得
#--------------------------------------------------------------------------
def self.latest_savefile_index
savefile_max.times.max_by {|i| savefile_time_stamp(i) }
end
#--------------------------------------------------------------------------
# ● 最後にアクセスしたファイルのインデックスを取得
#--------------------------------------------------------------------------
def self.last_savefile_index
@last_savefile_index
end
end

131
Scripts/Double_State.rb Normal file
View file

@ -0,0 +1,131 @@
=begin
#===============================================================================
Title: Conditional States
Author: Hime
Date: Mar 23, 2014
URL: http://www.himeworks.com/2014/01/11/conditional-states/
--------------------------------------------------------------------------------
** Change log
Mar 23, 2014
- added support for resisting the placeholder state itself
Jan 11, 2014
- initial release
--------------------------------------------------------------------------------
** Terms of Use
* Free to use in non-commercial projects
* Contact me for commercial use
* No real support. The script is provided as-is
* Will do bug fixes, but no compatibility patches
* Features may be requested but no guarantees, especially if it is non-trivial
* Credits to Hime Works in your project
* Preserve this header
--------------------------------------------------------------------------------
** Description
This script allows you to create "conditional states".
A conditional state is simply a placeholder for other states, depending on the
conditions at the time the state is applied.
For example, suppose you have a skill that adds a Weak Poison state to a target
if it is not already poisoned, and adds a Strong Poison state if it has Weak
Poison inflicted. You can use a formula to determine whether the weak poison
has been added or not to determine which state should be added.
--------------------------------------------------------------------------------
** Installation
In the script editor, place this script below Materials and above Main
--------------------------------------------------------------------------------
** Usage
To create a conditional state, note-tag a state with
<conditional state>
FORMULA
</conditional state>
Where the formula returns a number, which is the state ID that will be applied.
If you don't want a state to be applied, you can use 0.
The following formula variables are available
a - the battler that the state will be added to
p - game party
t - game troop
s - game switches
v - game variables
--------------------------------------------------------------------------------
** Example
Assuming you have two states Weak Poison (12) and Strong Poison (13), you can
create a conditional state (14) that will add Strong Poison if Weak Poison is
already applied, or apply Weak Poison otherwise.
<conditional state>
if a.state?(12)
13
else
12
end
</conditional state>
#===============================================================================
=end
$imported = {} if $imported.nil?
$imported[:TH_ConditionalStates] = true
#===============================================================================
# ** Configuration
#===============================================================================
module TH
module Conditional_States
Regex = /<conditional[-_ ]state>(.*?)<\/conditional[-_ ]state>/im
end
end
#===============================================================================
# ** Rest of script
#===============================================================================
module RPG
class State < BaseItem
def conditional_state_formula
load_notetag_conditional_state unless @conditional_state_formula
return @conditional_state_formula
end
def conditional_state?
load_notetag_conditional_state if @is_conditional_state.nil?
@is_conditional_state
end
def load_notetag_conditional_state
@conditional_state_formula = "0"
@is_conditional_state = false
res = self.note.match(TH::Conditional_States::Regex)
if res
@conditional_state_formula = res[1]
@is_conditional_state = true
end
end
def eval_conditional_state(a, p=$game_party, t=$game_troop, v=$game_variables, s=$game_switches)
eval(self.conditional_state_formula)
end
end
end
class Game_Battler < Game_BattlerBase
alias :th_conditional_states_add_state :add_state
def add_state(state_id)
new_state_id = get_conditional_state(state_id)
th_conditional_states_add_state(new_state_id)
end
def get_conditional_state(state_id)
state = $data_states[state_id]
return state_id unless state.conditional_state? && state_addable?(state_id)
return state.eval_conditional_state(self)
end
end

261
Scripts/Game_Action.rb Normal file
View file

@ -0,0 +1,261 @@
#==============================================================================
# ■ Game_Action
#------------------------------------------------------------------------------
#  戦闘行動を扱うクラスです。このクラスは Game_Battler クラスの内部で使用され
# ます。
#==============================================================================
class Game_Action
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :subject # 行動主体
attr_reader :forcing # 戦闘行動の強制フラグ
attr_reader :item # スキル / アイテム
attr_accessor :target_index # 対象インデックス
attr_reader :value # 自動戦闘用 評価値
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(subject, forcing = false)
@subject = subject
@forcing = forcing
clear
end
#--------------------------------------------------------------------------
# ● クリア
#--------------------------------------------------------------------------
def clear
@item = Game_BaseItem.new
@target_index = -1
@value = 0
end
#--------------------------------------------------------------------------
# ● 味方ユニットを取得
#--------------------------------------------------------------------------
def friends_unit
subject.friends_unit
end
#--------------------------------------------------------------------------
# ● 敵ユニットを取得
#--------------------------------------------------------------------------
def opponents_unit
subject.opponents_unit
end
#--------------------------------------------------------------------------
# ● 敵キャラの戦闘行動を設定
# action : RPG::Enemy::Action
#--------------------------------------------------------------------------
def set_enemy_action(action)
if action
set_skill(action.skill_id)
else
clear
end
end
#--------------------------------------------------------------------------
# ● 通常攻撃を設定
#--------------------------------------------------------------------------
def set_attack
set_skill(subject.attack_skill_id)
self
end
#--------------------------------------------------------------------------
# ● 防御を設定
#--------------------------------------------------------------------------
def set_guard
set_skill(subject.guard_skill_id)
self
end
#--------------------------------------------------------------------------
# ● スキルを設定
#--------------------------------------------------------------------------
def set_skill(skill_id)
@item.object = $data_skills[skill_id]
self
end
#--------------------------------------------------------------------------
# ● アイテムを設定
#--------------------------------------------------------------------------
def set_item(item_id)
@item.object = $data_items[item_id]
self
end
#--------------------------------------------------------------------------
# ● アイテムオブジェクト取得
#--------------------------------------------------------------------------
def item
@item.object
end
#--------------------------------------------------------------------------
# ● 通常攻撃判定
#--------------------------------------------------------------------------
def attack?
item == $data_skills[subject.attack_skill_id]
end
#--------------------------------------------------------------------------
# ● ランダムターゲット
#--------------------------------------------------------------------------
def decide_random_target
if item.for_dead_friend?
target = friends_unit.random_dead_target
elsif item.for_friend?
target = friends_unit.random_target
else
target = opponents_unit.random_target
end
if target
@target_index = target.index
else
clear
end
end
#--------------------------------------------------------------------------
# ● 混乱行動を設定
#--------------------------------------------------------------------------
def set_confusion
set_attack
end
#--------------------------------------------------------------------------
# ● 行動準備
#--------------------------------------------------------------------------
def prepare
set_confusion if subject.confusion? && !forcing
end
#--------------------------------------------------------------------------
# ● 行動が有効か否かの判定
# イベントコマンドによる [戦闘行動の強制] ではないとき、ステートの制限
# やアイテム切れなどで予定の行動ができなければ false を返す。
#--------------------------------------------------------------------------
def valid?
(forcing && item) || subject.usable?(item)
end
#--------------------------------------------------------------------------
# ● 行動速度の計算
#--------------------------------------------------------------------------
def speed
speed = subject.agi + rand(5 + subject.agi / 4)
speed += item.speed if item
speed += subject.atk_speed if attack?
speed
end
#--------------------------------------------------------------------------
# ● ターゲットの配列作成
#--------------------------------------------------------------------------
def make_targets
if !forcing && subject.confusion?
[confusion_target]
elsif item.for_opponent?
targets_for_opponents
elsif item.for_friend?
targets_for_friends
else
[]
end
end
#--------------------------------------------------------------------------
# ● 混乱時のターゲット
#--------------------------------------------------------------------------
def confusion_target
case subject.confusion_level
when 1
opponents_unit.random_target
when 2
if rand(2) == 0
opponents_unit.random_target
else
friends_unit.random_target
end
else
friends_unit.random_target
end
end
#--------------------------------------------------------------------------
# ● 敵に対するターゲット
#--------------------------------------------------------------------------
def targets_for_opponents
if item.for_random?
Array.new(item.number_of_targets) { opponents_unit.random_target }
elsif item.for_one?
num = 1 + (attack? ? subject.atk_times_add.to_i : 0)
if @target_index < 0
[opponents_unit.random_target] * num
else
[opponents_unit.smooth_target(@target_index)] * num
end
else
opponents_unit.alive_members
end
end
#--------------------------------------------------------------------------
# ● 味方に対するターゲット
#--------------------------------------------------------------------------
def targets_for_friends
if item.for_user?
[subject]
elsif item.for_dead_friend?
if item.for_one?
[friends_unit.smooth_dead_target(@target_index)]
else
friends_unit.dead_members
end
elsif item.for_friend?
if item.for_one?
[friends_unit.smooth_target(@target_index)]
else
friends_unit.alive_members
end
end
end
#--------------------------------------------------------------------------
# ● 行動の価値評価(自動戦闘用)
# @value および @target_index を自動的に設定する。
#--------------------------------------------------------------------------
def evaluate
@value = 0
evaluate_item if valid?
@value += rand if @value > 0
self
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの評価
#--------------------------------------------------------------------------
def evaluate_item
item_target_candidates.each do |target|
value = evaluate_item_with_target(target)
if item.for_all?
@value += value
elsif value > @value
@value = value
@target_index = target.index
end
end
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの使用対象候補を取得
#--------------------------------------------------------------------------
def item_target_candidates
if item.for_opponent?
opponents_unit.alive_members
elsif item.for_user?
[subject]
elsif item.for_dead_friend?
friends_unit.dead_members
else
friends_unit.alive_members
end
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの評価(ターゲット指定)
#--------------------------------------------------------------------------
def evaluate_item_with_target(target)
target.result.clear
target.make_damage_value(subject, item)
if item.for_opponent?
return target.result.hp_damage.to_f / [target.hp, 1].max
else
recovery = [-target.result.hp_damage, target.mhp - target.hp].min
return recovery.to_f / target.mhp
end
end
end

View file

@ -0,0 +1,158 @@
#==============================================================================
# ■ Game_ActionResult
#------------------------------------------------------------------------------
#  戦闘行動の結果を扱うクラスです。このクラスは Game_Battler クラスの内部で
# 使用されます。
#==============================================================================
class Game_ActionResult
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :used # 使用フラグ
attr_accessor :missed # 命中失敗フラグ
attr_accessor :evaded # 回避成功フラグ
attr_accessor :critical # クリティカルフラグ
attr_accessor :success # 成功フラグ
attr_accessor :hp_damage # HP ダメージ
attr_accessor :mp_damage # MP ダメージ
attr_accessor :tp_damage # TP ダメージ
attr_accessor :hp_drain # HP 吸収
attr_accessor :mp_drain # MP 吸収
attr_accessor :added_states # 付加されたステート
attr_accessor :removed_states # 解除されたステート
attr_accessor :added_buffs # 付加された能力強化
attr_accessor :added_debuffs # 付加された能力弱体
attr_accessor :removed_buffs # 解除された強化/弱体
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(battler)
@battler = battler
clear
end
#--------------------------------------------------------------------------
# ● クリア
#--------------------------------------------------------------------------
def clear
clear_hit_flags
clear_damage_values
clear_status_effects
end
#--------------------------------------------------------------------------
# ● 命中系フラグのクリア
#--------------------------------------------------------------------------
def clear_hit_flags
@used = false
@missed = false
@evaded = false
@critical = false
@success = false
end
#--------------------------------------------------------------------------
# ● ダメージ値のクリア
#--------------------------------------------------------------------------
def clear_damage_values
@hp_damage = 0
@mp_damage = 0
@tp_damage = 0
@hp_drain = 0
@mp_drain = 0
end
#--------------------------------------------------------------------------
# ● ダメージの作成
#--------------------------------------------------------------------------
def make_damage(value, item)
@critical = false if value == 0
@hp_damage = value if item.damage.to_hp?
@mp_damage = value if item.damage.to_mp?
@hp_drain = @hp_damage if item.damage.drain?
@mp_drain = @mp_damage if item.damage.drain?
@hp_drain = [@battler.hp, @hp_drain].min
@success = true if item.damage.to_hp? || @mp_damage != 0
end
#--------------------------------------------------------------------------
# ● ステータス効果のクリア
#--------------------------------------------------------------------------
def clear_status_effects
@added_states = []
@removed_states = []
@added_buffs = []
@added_debuffs = []
@removed_buffs = []
end
#--------------------------------------------------------------------------
# ● 付加されたステートをオブジェクトの配列で取得
#--------------------------------------------------------------------------
def added_state_objects
@added_states.collect {|id| $data_states[id] }
end
#--------------------------------------------------------------------------
# ● 解除されたステートをオブジェクトの配列で取得
#--------------------------------------------------------------------------
def removed_state_objects
@removed_states.collect {|id| $data_states[id] }
end
#--------------------------------------------------------------------------
# ● 何らかのステータス(能力値かステート)が影響を受けたかの判定
#--------------------------------------------------------------------------
def status_affected?
!(@added_states.empty? && @removed_states.empty? &&
@added_buffs.empty? && @added_debuffs.empty? && @removed_buffs.empty?)
end
#--------------------------------------------------------------------------
# ● 最終的に命中したか否かを判定
#--------------------------------------------------------------------------
def hit?
@used && !@missed && !@evaded
end
#--------------------------------------------------------------------------
# ● HP ダメージの文章を取得
#--------------------------------------------------------------------------
def hp_damage_text
if @hp_drain > 0
fmt = @battler.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
sprintf(fmt, @battler.name, Vocab::hp, @hp_drain)
elsif @hp_damage > 0
fmt = @battler.actor? ? Vocab::ActorDamage : Vocab::EnemyDamage
sprintf(fmt, @battler.name, @hp_damage)
elsif @hp_damage < 0
fmt = @battler.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
sprintf(fmt, @battler.name, Vocab::hp, -hp_damage)
else
fmt = @battler.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
sprintf(fmt, @battler.name)
end
end
#--------------------------------------------------------------------------
# ● MP ダメージの文章を取得
#--------------------------------------------------------------------------
def mp_damage_text
if @mp_drain > 0
fmt = @battler.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
sprintf(fmt, @battler.name, Vocab::mp, @mp_drain)
elsif @mp_damage > 0
fmt = @battler.actor? ? Vocab::ActorLoss : Vocab::EnemyLoss
sprintf(fmt, @battler.name, Vocab::mp, @mp_damage)
elsif @mp_damage < 0
fmt = @battler.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
sprintf(fmt, @battler.name, Vocab::mp, -@mp_damage)
else
""
end
end
#--------------------------------------------------------------------------
# ● TP ダメージの文章を取得
#--------------------------------------------------------------------------
def tp_damage_text
if @tp_damage > 0
fmt = @battler.actor? ? Vocab::ActorLoss : Vocab::EnemyLoss
sprintf(fmt, @battler.name, Vocab::tp, @tp_damage)
elsif @tp_damage < 0
fmt = @battler.actor? ? Vocab::ActorGain : Vocab::EnemyGain
sprintf(fmt, @battler.name, Vocab::tp, -@tp_damage)
else
""
end
end
end

692
Scripts/Game_Actor.rb Normal file
View file

@ -0,0 +1,692 @@
#==============================================================================
# ■ Game_Actor
#------------------------------------------------------------------------------
#  アクターを扱うクラスです。このクラスは Game_Actors クラス($game_actors
# の内部で使用され、Game_Party クラス($game_partyからも参照されます。
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :name # 名前
attr_accessor :nickname # 二つ名
attr_reader :character_name # 歩行グラフィック ファイル名
attr_reader :character_index # 歩行グラフィック インデックス
attr_reader :face_name # 顔グラフィック ファイル名
attr_reader :face_index # 顔グラフィック インデックス
attr_reader :class_id # 職業 ID
attr_reader :level # レベル
attr_reader :action_input_index # 入力中の戦闘行動番号
attr_reader :last_skill # カーソル記憶用 : スキル
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(actor_id)
super()
setup(actor_id)
@last_skill = Game_BaseItem.new
end
#--------------------------------------------------------------------------
# ● セットアップ
#--------------------------------------------------------------------------
def setup(actor_id)
@actor_id = actor_id
@name = actor.name
@nickname = actor.nickname
init_graphics
@class_id = actor.class_id
@level = actor.initial_level
@exp = {}
@equips = []
init_exp
init_skills
init_equips(actor.equips)
clear_param_plus
recover_all
end
#--------------------------------------------------------------------------
# ● アクターオブジェクト取得
#--------------------------------------------------------------------------
def actor
$data_actors[@actor_id]
end
#--------------------------------------------------------------------------
# ● グラフィックの初期化
#--------------------------------------------------------------------------
def init_graphics
@character_name = actor.character_name
@character_index = actor.character_index
@face_name = actor.face_name
@face_index = actor.face_index
end
#--------------------------------------------------------------------------
# ● 指定レベルに上がるのに必要な累計経験値の取得
#--------------------------------------------------------------------------
def exp_for_level(level)
self.class.exp_for_level(level)
end
#--------------------------------------------------------------------------
# ● 経験値の初期化
#--------------------------------------------------------------------------
def init_exp
@exp[@class_id] = current_level_exp
end
#--------------------------------------------------------------------------
# ● 経験値の取得
#--------------------------------------------------------------------------
def exp
@exp[@class_id]
end
#--------------------------------------------------------------------------
# ● 現在のレベルの最低経験値を取得
#--------------------------------------------------------------------------
def current_level_exp
exp_for_level(@level)
end
#--------------------------------------------------------------------------
# ● 次のレベルの経験値を取得
#--------------------------------------------------------------------------
def next_level_exp
exp_for_level(@level + 1)
end
#--------------------------------------------------------------------------
# ● 最大レベル
#--------------------------------------------------------------------------
def max_level
actor.max_level
end
#--------------------------------------------------------------------------
# ● 最大レベル判定
#--------------------------------------------------------------------------
def max_level?
@level >= max_level
end
#--------------------------------------------------------------------------
# ● スキルの初期化
#--------------------------------------------------------------------------
def init_skills
@skills = []
self.class.learnings.each do |learning|
learn_skill(learning.skill_id) if learning.level <= @level
end
end
#--------------------------------------------------------------------------
# ● 装備品の初期化
# equips : 初期装備の配列
#--------------------------------------------------------------------------
def init_equips(equips)
@equips = Array.new(equip_slots.size) { Game_BaseItem.new }
equips.each_with_index do |item_id, i|
etype_id = index_to_etype_id(i)
slot_id = empty_slot(etype_id)
@equips[slot_id].set_equip(etype_id == 0, item_id) if slot_id
end
refresh
end
#--------------------------------------------------------------------------
# ● エディタで設定されたインデックスを装備タイプ ID に変換
#--------------------------------------------------------------------------
def index_to_etype_id(index)
index == 1 && dual_wield? ? 0 : index
end
#--------------------------------------------------------------------------
# ● 装備タイプからスロット ID のリストに変換
#--------------------------------------------------------------------------
def slot_list(etype_id)
result = []
equip_slots.each_with_index {|e, i| result.push(i) if e == etype_id }
result
end
#--------------------------------------------------------------------------
# ● 装備タイプからスロット ID に変換(空きを優先)
#--------------------------------------------------------------------------
def empty_slot(etype_id)
list = slot_list(etype_id)
list.find {|i| @equips[i].is_nil? } || list[0]
end
#--------------------------------------------------------------------------
# ● 装備スロットの配列を取得
#--------------------------------------------------------------------------
def equip_slots
return [0,0,2,3,4] if dual_wield? # 二刀流
return [0,1,2,3,4] # 通常
end
#--------------------------------------------------------------------------
# ● 武器オブジェクトの配列取得
#--------------------------------------------------------------------------
def weapons
@equips.select {|item| item.is_weapon? }.collect {|item| item.object }
end
#--------------------------------------------------------------------------
# ● 防具オブジェクトの配列取得
#--------------------------------------------------------------------------
def armors
@equips.select {|item| item.is_armor? }.collect {|item| item.object }
end
#--------------------------------------------------------------------------
# ● 装備品オブジェクトの配列取得
#--------------------------------------------------------------------------
def equips
@equips.collect {|item| item.object }
end
#--------------------------------------------------------------------------
# ● 装備変更の可能判定
# slot_id : 装備スロット ID
#--------------------------------------------------------------------------
def equip_change_ok?(slot_id)
return false if equip_type_fixed?(equip_slots[slot_id])
return false if equip_type_sealed?(equip_slots[slot_id])
return true
end
#--------------------------------------------------------------------------
# ● 装備の変更
# slot_id : 装備スロット ID
# item : 武器防具nil なら装備解除)
#--------------------------------------------------------------------------
def change_equip(slot_id, item)
return unless trade_item_with_party(item, equips[slot_id])
return if item && equip_slots[slot_id] != item.etype_id
@equips[slot_id].object = item
refresh
end
#--------------------------------------------------------------------------
# ● 装備の強制変更
# slot_id : 装備スロット ID
# item : 武器防具nil なら装備解除)
#--------------------------------------------------------------------------
def force_change_equip(slot_id, item)
@equips[slot_id].object = item
release_unequippable_items(false)
refresh
end
#--------------------------------------------------------------------------
# ● パーティとアイテムを交換する
# new_item : パーティから取り出すアイテム
# old_item : パーティに返すアイテム
#--------------------------------------------------------------------------
def trade_item_with_party(new_item, old_item)
return false if new_item && !$game_party.has_item?(new_item)
$game_party.gain_item(old_item, 1)
$game_party.lose_item(new_item, 1)
return true
end
#--------------------------------------------------------------------------
# ● 装備の変更ID で指定)
# slot_id : 装備スロット ID
# item_id : 武器/防具 ID
#--------------------------------------------------------------------------
def change_equip_by_id(slot_id, item_id)
if equip_slots[slot_id] == 0
change_equip(slot_id, $data_weapons[item_id])
else
change_equip(slot_id, $data_armors[item_id])
end
end
#--------------------------------------------------------------------------
# ● 装備の破棄
# item : 破棄する武器/防具
#--------------------------------------------------------------------------
def discard_equip(item)
slot_id = equips.index(item)
@equips[slot_id].object = nil if slot_id
end
#--------------------------------------------------------------------------
# ● 装備できない装備品を外す
# item_gain : 外した装備品をパーティに戻す
#--------------------------------------------------------------------------
def release_unequippable_items(item_gain = true)
@equips.each_with_index do |item, i|
if !equippable?(item.object) || item.object.etype_id != equip_slots[i]
trade_item_with_party(nil, item.object) if item_gain
item.object = nil
end
end
end
#--------------------------------------------------------------------------
# ● 装備を全て外す
#--------------------------------------------------------------------------
def clear_equipments
equip_slots.size.times do |i|
change_equip(i, nil) if equip_change_ok?(i)
end
end
#--------------------------------------------------------------------------
# ● 最強装備
#--------------------------------------------------------------------------
def optimize_equipments
clear_equipments
equip_slots.size.times do |i|
next if !equip_change_ok?(i)
items = $game_party.equip_items.select do |item|
item.etype_id == equip_slots[i] &&
equippable?(item) && item.performance >= 0
end
change_equip(i, items.max_by {|item| item.performance })
end
end
#--------------------------------------------------------------------------
# ● スキルの必要武器を装備しているか
#--------------------------------------------------------------------------
def skill_wtype_ok?(skill)
wtype_id1 = skill.required_wtype_id1
wtype_id2 = skill.required_wtype_id2
return true if wtype_id1 == 0 && wtype_id2 == 0
return true if wtype_id1 > 0 && wtype_equipped?(wtype_id1)
return true if wtype_id2 > 0 && wtype_equipped?(wtype_id2)
return false
end
#--------------------------------------------------------------------------
# ● 特定のタイプの武器を装備しているか
#--------------------------------------------------------------------------
def wtype_equipped?(wtype_id)
weapons.any? {|weapon| weapon.wtype_id == wtype_id }
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
release_unequippable_items
super
end
#--------------------------------------------------------------------------
# ● アクターか否かの判定
#--------------------------------------------------------------------------
def actor?
return true
end
#--------------------------------------------------------------------------
# ● 味方ユニットを取得
#--------------------------------------------------------------------------
def friends_unit
$game_party
end
#--------------------------------------------------------------------------
# ● 敵ユニットを取得
#--------------------------------------------------------------------------
def opponents_unit
$game_troop
end
#--------------------------------------------------------------------------
# ● アクター ID 取得
#--------------------------------------------------------------------------
def id
@actor_id
end
#--------------------------------------------------------------------------
# ● インデックス取得
#--------------------------------------------------------------------------
def index
$game_party.members.index(self)
end
#--------------------------------------------------------------------------
# ● バトルメンバー判定
#--------------------------------------------------------------------------
def battle_member?
$game_party.battle_members.include?(self)
end
#--------------------------------------------------------------------------
# ● 職業オブジェクト取得
#--------------------------------------------------------------------------
def class
$data_classes[@class_id]
end
#--------------------------------------------------------------------------
# ● スキルオブジェクトの配列取得
#--------------------------------------------------------------------------
def skills
(@skills | added_skills).sort.collect {|id| $data_skills[id] }
end
#--------------------------------------------------------------------------
# ● 現在使用できるスキルの配列取得
#--------------------------------------------------------------------------
def usable_skills
skills.select {|skill| usable?(skill) }
end
#--------------------------------------------------------------------------
# ● 特徴を保持する全オブジェクトの配列取得
#--------------------------------------------------------------------------
def feature_objects
super + [actor] + [self.class] + equips.compact
end
#--------------------------------------------------------------------------
# ● 攻撃時属性の取得
#--------------------------------------------------------------------------
def atk_elements
set = super
set |= [1] if weapons.compact.empty? # 素手:物理属性
return set
end
#--------------------------------------------------------------------------
# ● 通常能力値の最大値取得
#--------------------------------------------------------------------------
def param_max(param_id)
return 9999 if param_id == 0 # MHP
return super
end
#--------------------------------------------------------------------------
# ● 通常能力値の基本値取得
#--------------------------------------------------------------------------
def param_base(param_id)
self.class.params[param_id, @level]
end
#--------------------------------------------------------------------------
# ● 通常能力値の加算値取得
#--------------------------------------------------------------------------
def param_plus(param_id)
equips.compact.inject(super) {|r, item| r += item.params[param_id] }
end
#--------------------------------------------------------------------------
# ● 通常攻撃 アニメーション ID の取得
#--------------------------------------------------------------------------
def atk_animation_id1
if dual_wield?
return weapons[0].animation_id if weapons[0]
return weapons[1] ? 0 : 1
else
return weapons[0] ? weapons[0].animation_id : 1
end
end
#--------------------------------------------------------------------------
# ● 通常攻撃 アニメーション ID の取得(二刀流:武器2)
#--------------------------------------------------------------------------
def atk_animation_id2
if dual_wield?
return weapons[1] ? weapons[1].animation_id : 0
else
return 0
end
end
#--------------------------------------------------------------------------
# ● 経験値の変更
# show : レベルアップ表示フラグ
#--------------------------------------------------------------------------
def change_exp(exp, show)
@exp[@class_id] = [exp, 0].max
last_level = @level
last_skills = skills
level_up while !max_level? && self.exp >= next_level_exp
level_down while self.exp < current_level_exp
display_level_up(skills - last_skills) if show && @level > last_level
refresh
end
#--------------------------------------------------------------------------
# ● 経験値の取得
#--------------------------------------------------------------------------
def exp
@exp[@class_id]
end
#--------------------------------------------------------------------------
# ● レベルアップ
#--------------------------------------------------------------------------
def level_up
@level += 1
self.class.learnings.each do |learning|
learn_skill(learning.skill_id) if learning.level == @level
end
end
#--------------------------------------------------------------------------
# ● レベルダウン
#--------------------------------------------------------------------------
def level_down
@level -= 1
end
#--------------------------------------------------------------------------
# ● レベルアップメッセージの表示
# new_skills : 新しく習得したスキルの配列
#--------------------------------------------------------------------------
def display_level_up(new_skills)
$game_message.new_page
$game_message.add(sprintf(Vocab::LevelUp, @name, Vocab::level, @level))
new_skills.each do |skill|
$game_message.add(sprintf(Vocab::ObtainSkill, skill.name))
end
end
#--------------------------------------------------------------------------
# ● 経験値の獲得(経験獲得率を考慮)
#--------------------------------------------------------------------------
def gain_exp(exp)
change_exp(self.exp + (exp * final_exp_rate).to_i, true)
end
#--------------------------------------------------------------------------
# ● 最終的な経験獲得率の計算
#--------------------------------------------------------------------------
def final_exp_rate
exr * (battle_member? ? 1 : reserve_members_exp_rate)
end
#--------------------------------------------------------------------------
# ● 控えメンバーの経験獲得率を取得
#--------------------------------------------------------------------------
def reserve_members_exp_rate
$data_system.opt_extra_exp ? 1 : 0
end
#--------------------------------------------------------------------------
# ● レベルの変更
# show : レベルアップ表示フラグ
#--------------------------------------------------------------------------
def change_level(level, show)
level = [[level, max_level].min, 1].max
change_exp(exp_for_level(level), show)
end
#--------------------------------------------------------------------------
# ● スキルを覚える
#--------------------------------------------------------------------------
def learn_skill(skill_id)
unless skill_learn?($data_skills[skill_id])
@skills.push(skill_id)
@skills.sort!
end
end
#--------------------------------------------------------------------------
# ● スキルを忘れる
#--------------------------------------------------------------------------
def forget_skill(skill_id)
@skills.delete(skill_id)
end
#--------------------------------------------------------------------------
# ● スキルの習得済み判定
#--------------------------------------------------------------------------
def skill_learn?(skill)
skill.is_a?(RPG::Skill) && @skills.include?(skill.id)
end
#--------------------------------------------------------------------------
# ● 説明の取得
#--------------------------------------------------------------------------
def description
actor.description
end
#--------------------------------------------------------------------------
# ● 職業の変更
# keep_exp : 経験値を引き継ぐ
#--------------------------------------------------------------------------
def change_class(class_id, keep_exp = false)
@exp[class_id] = exp if keep_exp
@class_id = class_id
change_exp(@exp[@class_id] || 0, false)
refresh
end
#--------------------------------------------------------------------------
# ● グラフィックの変更
#--------------------------------------------------------------------------
def set_graphic(character_name, character_index, face_name, face_index)
@character_name = character_name
@character_index = character_index
@face_name = face_name
@face_index = face_index
end
#--------------------------------------------------------------------------
# ● スプライトを使うか?
#--------------------------------------------------------------------------
def use_sprite?
return false
end
#--------------------------------------------------------------------------
# ● ダメージ効果の実行
#--------------------------------------------------------------------------
def perform_damage_effect
$game_troop.screen.start_shake(5, 5, 10)
@sprite_effect_type = :blink
Sound.play_actor_damage
end
#--------------------------------------------------------------------------
# ● コラプス効果の実行
#--------------------------------------------------------------------------
def perform_collapse_effect
if $game_party.in_battle
@sprite_effect_type = :collapse
Sound.play_actor_collapse
end
end
#--------------------------------------------------------------------------
# ● 自動戦闘用の行動候補リストを作成
#--------------------------------------------------------------------------
def make_action_list
list = []
list.push(Game_Action.new(self).set_attack.evaluate)
usable_skills.each do |skill|
list.push(Game_Action.new(self).set_skill(skill.id).evaluate)
end
list
end
#--------------------------------------------------------------------------
# ● 自動戦闘時の戦闘行動を作成
#--------------------------------------------------------------------------
def make_auto_battle_actions
@actions.size.times do |i|
@actions[i] = make_action_list.max {|action| action.value }
end
end
#--------------------------------------------------------------------------
# ● 混乱時の戦闘行動を作成
#--------------------------------------------------------------------------
def make_confusion_actions
@actions.size.times do |i|
@actions[i].set_confusion
end
end
#--------------------------------------------------------------------------
# ● 戦闘行動の作成
#--------------------------------------------------------------------------
def make_actions
super
if auto_battle?
make_auto_battle_actions
elsif confusion?
make_confusion_actions
end
end
#--------------------------------------------------------------------------
# ● プレイヤーが 1 歩動いたときの処理
#--------------------------------------------------------------------------
def on_player_walk
@result.clear
check_floor_effect
if $game_player.normal_walk?
turn_end_on_map
states.each {|state| update_state_steps(state) }
show_added_states
show_removed_states
end
end
#--------------------------------------------------------------------------
# ● ステートの歩数カウントを更新
#--------------------------------------------------------------------------
def update_state_steps(state)
if state.remove_by_walking
@state_steps[state.id] -= 1 if @state_steps[state.id] > 0
remove_state(state.id) if @state_steps[state.id] == 0
end
end
#--------------------------------------------------------------------------
# ● 付加されたステートの表示
#--------------------------------------------------------------------------
def show_added_states
@result.added_state_objects.each do |state|
$game_message.add(name + state.message1) unless state.message1.empty?
end
end
#--------------------------------------------------------------------------
# ● 解除されたステートの表示
#--------------------------------------------------------------------------
def show_removed_states
@result.removed_state_objects.each do |state|
$game_message.add(name + state.message4) unless state.message4.empty?
end
end
#--------------------------------------------------------------------------
# ● 何歩歩いたときに戦闘中の 1 ターン相当とみなすか
#--------------------------------------------------------------------------
def steps_for_turn
return 20
end
#--------------------------------------------------------------------------
# ● マップ画面上でのターン終了処理
#--------------------------------------------------------------------------
def turn_end_on_map
if $game_party.steps % steps_for_turn == 0
on_turn_end
perform_map_damage_effect if @result.hp_damage > 0
end
end
#--------------------------------------------------------------------------
# ● 床効果判定
#--------------------------------------------------------------------------
def check_floor_effect
execute_floor_damage if $game_player.on_damage_floor?
end
#--------------------------------------------------------------------------
# ● 床ダメージの処理
#--------------------------------------------------------------------------
def execute_floor_damage
damage = (basic_floor_damage * fdr).to_i
self.hp -= [damage, max_floor_damage].min
perform_map_damage_effect if damage > 0
end
#--------------------------------------------------------------------------
# ● 床ダメージの基本値を取得
#--------------------------------------------------------------------------
def basic_floor_damage
return 10
end
#--------------------------------------------------------------------------
# ● 床ダメージの最大値を取得
#--------------------------------------------------------------------------
def max_floor_damage
$data_system.opt_floor_death ? hp : [hp - 1, 0].max
end
#--------------------------------------------------------------------------
# ● マップ上でのダメージ効果の実行
#--------------------------------------------------------------------------
def perform_map_damage_effect
$game_map.screen.start_flash_for_damage
end
#--------------------------------------------------------------------------
# ● 戦闘行動のクリア
#--------------------------------------------------------------------------
def clear_actions
super
@action_input_index = 0
end
#--------------------------------------------------------------------------
# ● 入力中の戦闘行動を取得
#--------------------------------------------------------------------------
def input
@actions[@action_input_index]
end
#--------------------------------------------------------------------------
# ● 次のコマンド入力へ
#--------------------------------------------------------------------------
def next_command
return false if @action_input_index >= @actions.size - 1
@action_input_index += 1
return true
end
#--------------------------------------------------------------------------
# ● 前のコマンド入力へ
#--------------------------------------------------------------------------
def prior_command
return false if @action_input_index <= 0
@action_input_index -= 1
return true
end
end

22
Scripts/Game_Actors.rb Normal file
View file

@ -0,0 +1,22 @@
#==============================================================================
# ■ Game_Actors
#------------------------------------------------------------------------------
#  アクターの配列のラッパーです。このクラスのインスタンスは $game_actors で参
# 照されます。
#==============================================================================
class Game_Actors
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
@data = []
end
#--------------------------------------------------------------------------
# ● アクターの取得
#--------------------------------------------------------------------------
def [](actor_id)
return nil unless $data_actors[actor_id]
@data[actor_id] ||= Game_Actor.new(actor_id)
end
end

50
Scripts/Game_BaseItem.rb Normal file
View file

@ -0,0 +1,50 @@
#==============================================================================
# ■ Game_BaseItem
#------------------------------------------------------------------------------
#  スキル、アイテム、武器、防具を統一的に扱うクラスです。セーブデータに含める
# ことができるように、データベースオブジェクト自体への参照は保持しません。
#==============================================================================
class Game_BaseItem
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
@class = nil
@item_id = 0
end
#--------------------------------------------------------------------------
# ● クラス判定
#--------------------------------------------------------------------------
def is_skill?; @class == RPG::Skill; end
def is_item?; @class == RPG::Item; end
def is_weapon?; @class == RPG::Weapon; end
def is_armor?; @class == RPG::Armor; end
def is_nil?; @class == nil; end
#--------------------------------------------------------------------------
# ● アイテムオブジェクトの取得
#--------------------------------------------------------------------------
def object
return $data_skills[@item_id] if is_skill?
return $data_items[@item_id] if is_item?
return $data_weapons[@item_id] if is_weapon?
return $data_armors[@item_id] if is_armor?
return nil
end
#--------------------------------------------------------------------------
# ● アイテムオブジェクトの設定
#--------------------------------------------------------------------------
def object=(item)
@class = item ? item.class : nil
@item_id = item ? item.id : 0
end
#--------------------------------------------------------------------------
# ● 装備品を ID で設定
# is_weapon : 武器かどうか
# item_id : 武器/防具 ID
#--------------------------------------------------------------------------
def set_equip(is_weapon, item_id)
@class = is_weapon ? RPG::Weapon : RPG::Armor
@item_id = item_id
end
end

822
Scripts/Game_Battler.rb Normal file
View file

@ -0,0 +1,822 @@
#==============================================================================
# ■ Game_Battler
#------------------------------------------------------------------------------
#  スプライトや行動に関するメソッドを追加したバトラーのクラスです。このクラス
# は Game_Actor クラスと Game_Enemy クラスのスーパークラスとして使用されます。
#==============================================================================
class Game_Battler < Game_BattlerBase
#--------------------------------------------------------------------------
# ● 定数(使用効果)
#--------------------------------------------------------------------------
EFFECT_RECOVER_HP = 11 # HP 回復
EFFECT_RECOVER_MP = 12 # MP 回復
EFFECT_GAIN_TP = 13 # TP 増加
EFFECT_ADD_STATE = 21 # ステート付加
EFFECT_REMOVE_STATE = 22 # ステート解除
EFFECT_ADD_BUFF = 31 # 能力強化
EFFECT_ADD_DEBUFF = 32 # 能力弱体
EFFECT_REMOVE_BUFF = 33 # 能力強化の解除
EFFECT_REMOVE_DEBUFF = 34 # 能力弱体の解除
EFFECT_SPECIAL = 41 # 特殊効果
EFFECT_GROW = 42 # 成長
EFFECT_LEARN_SKILL = 43 # スキル習得
EFFECT_COMMON_EVENT = 44 # コモンイベント
#--------------------------------------------------------------------------
# ● 定数(特殊効果)
#--------------------------------------------------------------------------
SPECIAL_EFFECT_ESCAPE = 0 # 逃げる
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :battler_name # 戦闘グラフィック ファイル名
attr_reader :battler_hue # 戦闘グラフィック 色相
attr_reader :action_times # 行動回数
attr_reader :actions # 戦闘行動(行動側)
attr_reader :speed # 行動速度
attr_reader :result # 行動結果(対象側)
attr_accessor :last_target_index # ラストターゲット
attr_accessor :animation_id # アニメーション ID
attr_accessor :animation_mirror # アニメーション 左右反転フラグ
attr_accessor :sprite_effect_type # スプライトのエフェクト
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
@battler_name = ""
@battler_hue = 0
@actions = []
@speed = 0
@result = Game_ActionResult.new(self)
@last_target_index = 0
@guarding = false
clear_sprite_effects
super
end
#--------------------------------------------------------------------------
# ● スプライトのエフェクトをクリア
#--------------------------------------------------------------------------
def clear_sprite_effects
@animation_id = 0
@animation_mirror = false
@sprite_effect_type = nil
end
#--------------------------------------------------------------------------
# ● 戦闘行動のクリア
#--------------------------------------------------------------------------
def clear_actions
@actions.clear
end
#--------------------------------------------------------------------------
# ● ステート情報をクリア
#--------------------------------------------------------------------------
def clear_states
super
@result.clear_status_effects
end
#--------------------------------------------------------------------------
# ● ステートの付加
#--------------------------------------------------------------------------
def add_state(state_id)
if state_addable?(state_id)
add_new_state(state_id) unless state?(state_id)
reset_state_counts(state_id)
@result.added_states.push(state_id).uniq!
end
end
#--------------------------------------------------------------------------
# ● ステートの付加可能判定
#--------------------------------------------------------------------------
def state_addable?(state_id)
alive? && $data_states[state_id] && !state_resist?(state_id) &&
!state_removed?(state_id) && !state_restrict?(state_id)
end
#--------------------------------------------------------------------------
# ● 同一行動内で解除済みのステートを判定
#--------------------------------------------------------------------------
def state_removed?(state_id)
@result.removed_states.include?(state_id)
end
#--------------------------------------------------------------------------
# ● 行動制約によって無効化されるステートを判定
#--------------------------------------------------------------------------
def state_restrict?(state_id)
$data_states[state_id].remove_by_restriction && restriction > 0
end
#--------------------------------------------------------------------------
# ● 新しいステートの付加
#--------------------------------------------------------------------------
def add_new_state(state_id)
die if state_id == death_state_id
@states.push(state_id)
on_restrict if restriction > 0
sort_states
refresh
end
#--------------------------------------------------------------------------
# ● 行動制約が生じたときの処理
#--------------------------------------------------------------------------
def on_restrict
clear_actions
states.each do |state|
remove_state(state.id) if state.remove_by_restriction
end
end
#--------------------------------------------------------------------------
# ● ステートのカウント(ターン数および歩数)をリセット
#--------------------------------------------------------------------------
def reset_state_counts(state_id)
state = $data_states[state_id]
variance = 1 + [state.max_turns - state.min_turns, 0].max
@state_turns[state_id] = state.min_turns + rand(variance)
@state_steps[state_id] = state.steps_to_remove
end
#--------------------------------------------------------------------------
# ● ステートの解除
#--------------------------------------------------------------------------
def remove_state(state_id)
if state?(state_id)
revive if state_id == death_state_id
erase_state(state_id)
refresh
@result.removed_states.push(state_id).uniq!
end
end
#--------------------------------------------------------------------------
# ● 戦闘不能になる
#--------------------------------------------------------------------------
def die
@hp = 0
clear_states
clear_buffs
end
#--------------------------------------------------------------------------
# ● 戦闘不能から復活
#--------------------------------------------------------------------------
def revive
@hp = 1 if @hp == 0
end
#--------------------------------------------------------------------------
# ● 逃げる
#--------------------------------------------------------------------------
def escape
hide if $game_party.in_battle
clear_actions
clear_states
Sound.play_escape
end
#--------------------------------------------------------------------------
# ● 能力強化
#--------------------------------------------------------------------------
def add_buff(param_id, turns)
return unless alive?
@buffs[param_id] += 1 unless buff_max?(param_id)
erase_buff(param_id) if debuff?(param_id)
overwrite_buff_turns(param_id, turns)
@result.added_buffs.push(param_id).uniq!
refresh
end
#--------------------------------------------------------------------------
# ● 能力弱体
#--------------------------------------------------------------------------
def add_debuff(param_id, turns)
return unless alive?
@buffs[param_id] -= 1 unless debuff_max?(param_id)
erase_buff(param_id) if buff?(param_id)
overwrite_buff_turns(param_id, turns)
@result.added_debuffs.push(param_id).uniq!
refresh
end
#--------------------------------------------------------------------------
# ● 能力強化/弱体の解除
#--------------------------------------------------------------------------
def remove_buff(param_id)
return unless alive?
return if @buffs[param_id] == 0
erase_buff(param_id)
@buff_turns.delete(param_id)
@result.removed_buffs.push(param_id).uniq!
refresh
end
#--------------------------------------------------------------------------
# ● 能力強化/弱体の消去
#--------------------------------------------------------------------------
def erase_buff(param_id)
@buffs[param_id] = 0
@buff_turns[param_id] = 0
end
#--------------------------------------------------------------------------
# ● 能力強化状態の判定
#--------------------------------------------------------------------------
def buff?(param_id)
@buffs[param_id] > 0
end
#--------------------------------------------------------------------------
# ● 能力弱体状態の判定
#--------------------------------------------------------------------------
def debuff?(param_id)
@buffs[param_id] < 0
end
#--------------------------------------------------------------------------
# ● 能力強化が最大の段階か否かを判定
#--------------------------------------------------------------------------
def buff_max?(param_id)
@buffs[param_id] == 2
end
#--------------------------------------------------------------------------
# ● 能力弱体が最大の段階か否かを判定
#--------------------------------------------------------------------------
def debuff_max?(param_id)
@buffs[param_id] == -2
end
#--------------------------------------------------------------------------
# ● 能力強化/弱体のターン数上書き
# ターン数が短くなる場合は上書きしない。
#--------------------------------------------------------------------------
def overwrite_buff_turns(param_id, turns)
@buff_turns[param_id] = turns if @buff_turns[param_id].to_i < turns
end
#--------------------------------------------------------------------------
# ● ステートのターンカウント更新
#--------------------------------------------------------------------------
def update_state_turns
states.each do |state|
@state_turns[state.id] -= 1 if @state_turns[state.id] > 0
end
end
#--------------------------------------------------------------------------
# ● 強化/弱体のターンカウント更新
#--------------------------------------------------------------------------
def update_buff_turns
@buff_turns.keys.each do |param_id|
@buff_turns[param_id] -= 1 if @buff_turns[param_id] > 0
end
end
#--------------------------------------------------------------------------
# ● 戦闘用ステートの解除
#--------------------------------------------------------------------------
def remove_battle_states
states.each do |state|
remove_state(state.id) if state.remove_at_battle_end
end
end
#--------------------------------------------------------------------------
# ● 強化/弱体の全解除
#--------------------------------------------------------------------------
def remove_all_buffs
@buffs.size.times {|param_id| remove_buff(param_id) }
end
#--------------------------------------------------------------------------
# ● ステート自動解除
# timing : タイミング1:行動終了 2:ターン終了)
#--------------------------------------------------------------------------
def remove_states_auto(timing)
states.each do |state|
if @state_turns[state.id] == 0 && state.auto_removal_timing == timing
remove_state(state.id)
end
end
end
#--------------------------------------------------------------------------
# ● 強化/弱体の自動解除
#--------------------------------------------------------------------------
def remove_buffs_auto
@buffs.size.times do |param_id|
next if @buffs[param_id] == 0 || @buff_turns[param_id] > 0
remove_buff(param_id)
end
end
#--------------------------------------------------------------------------
# ● ダメージによるステート解除
#--------------------------------------------------------------------------
def remove_states_by_damage
states.each do |state|
if state.remove_by_damage && rand(100) < state.chance_by_damage
remove_state(state.id)
end
end
end
#--------------------------------------------------------------------------
# ● 行動回数の決定
#--------------------------------------------------------------------------
def make_action_times
action_plus_set.inject(1) {|r, p| rand < p ? r + 1 : r }
end
#--------------------------------------------------------------------------
# ● 戦闘行動の作成
#--------------------------------------------------------------------------
def make_actions
clear_actions
return unless movable?
@actions = Array.new(make_action_times) { Game_Action.new(self) }
end
#--------------------------------------------------------------------------
# ● 行動速度の決定
#--------------------------------------------------------------------------
def make_speed
@speed = @actions.collect {|action| action.speed }.min || 0
end
#--------------------------------------------------------------------------
# ● 現在の戦闘行動を取得
#--------------------------------------------------------------------------
def current_action
@actions[0]
end
#--------------------------------------------------------------------------
# ● 現在の戦闘行動を除去
#--------------------------------------------------------------------------
def remove_current_action
@actions.shift
end
#--------------------------------------------------------------------------
# ● 戦闘行動の強制
#--------------------------------------------------------------------------
def force_action(skill_id, target_index)
clear_actions
action = Game_Action.new(self, true)
action.set_skill(skill_id)
if target_index == -2
action.target_index = last_target_index
elsif target_index == -1
action.decide_random_target
else
action.target_index = target_index
end
@actions.push(action)
end
#--------------------------------------------------------------------------
# ● ダメージ計算
#--------------------------------------------------------------------------
def make_damage_value(user, item)
value = item.damage.eval(user, self, $game_variables)
value *= item_element_rate(user, item)
value *= pdr if item.physical?
value *= mdr if item.magical?
value *= rec if item.damage.recover?
value = apply_critical(value) if @result.critical
value = apply_variance(value, item.damage.variance)
value = apply_guard(value)
@result.make_damage(value.to_i, item)
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの属性修正値を取得
#--------------------------------------------------------------------------
def item_element_rate(user, item)
if item.damage.element_id < 0
user.atk_elements.empty? ? 1.0 : elements_max_rate(user.atk_elements)
else
element_rate(item.damage.element_id)
end
end
#--------------------------------------------------------------------------
# ● 属性の最大修正値の取得
# elements : 属性 ID の配列
# 与えられた属性の中で最も有効な修正値を返す
#--------------------------------------------------------------------------
def elements_max_rate(elements)
elements.inject([0.0]) {|r, i| r.push(element_rate(i)) }.max
end
#--------------------------------------------------------------------------
# ● クリティカルの適用
#--------------------------------------------------------------------------
def apply_critical(damage)
damage * 3
end
#--------------------------------------------------------------------------
# ● 分散度の適用
#--------------------------------------------------------------------------
def apply_variance(damage, variance)
amp = [damage.abs * variance / 100, 0].max.to_i
var = rand(amp + 1) + rand(amp + 1) - amp
damage >= 0 ? damage + var : damage - var
end
#--------------------------------------------------------------------------
# ● 防御修正の適用
#--------------------------------------------------------------------------
def apply_guard(damage)
damage / (damage > 0 && guard? ? 2 * grd : 1)
end
#--------------------------------------------------------------------------
# ● ダメージの処理
# 呼び出し前に @result.hp_damage @result.mp_damage @result.hp_drain
# @result.mp_drain が設定されていること。
#--------------------------------------------------------------------------
def execute_damage(user)
on_damage(@result.hp_damage) if @result.hp_damage > 0
self.hp -= @result.hp_damage
self.mp -= @result.mp_damage
user.hp += @result.hp_drain
user.mp += @result.mp_drain
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの使用
# 行動側に対して呼び出され、使用対象以外に対する効果を適用する。
#--------------------------------------------------------------------------
def use_item(item)
pay_skill_cost(item) if item.is_a?(RPG::Skill)
consume_item(item) if item.is_a?(RPG::Item)
item.effects.each {|effect| item_global_effect_apply(effect) }
end
#--------------------------------------------------------------------------
# ● アイテムの消耗
#--------------------------------------------------------------------------
def consume_item(item)
$game_party.consume_item(item)
end
#--------------------------------------------------------------------------
# ● 使用対象以外に対する使用効果の適用
#--------------------------------------------------------------------------
def item_global_effect_apply(effect)
if effect.code == EFFECT_COMMON_EVENT
$game_temp.reserve_common_event(effect.data_id)
end
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの適用テスト
# 使用対象が全快しているときの回復禁止などを判定する。
#--------------------------------------------------------------------------
def item_test(user, item)
return false if item.for_dead_friend? != dead?
return true if $game_party.in_battle
return true if item.for_opponent?
return true if item.damage.recover? && item.damage.to_hp? && hp < mhp
return true if item.damage.recover? && item.damage.to_mp? && mp < mmp
return true if item_has_any_valid_effects?(user, item)
return false
end
#--------------------------------------------------------------------------
# ● スキル/アイテムに有効な使用効果が一つでもあるかを判定
#--------------------------------------------------------------------------
def item_has_any_valid_effects?(user, item)
item.effects.any? {|effect| item_effect_test(user, item, effect) }
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの反撃率計算
#--------------------------------------------------------------------------
def item_cnt(user, item)
return 0 unless item.physical? # 命中タイプが物理ではない
return 0 unless opposite?(user) # 味方には反撃しない
return cnt # 反撃率を返す
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの反射率計算
#--------------------------------------------------------------------------
def item_mrf(user, item)
return mrf if item.magical? # 魔法攻撃なら魔法反射率を返す
return 0
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの命中率計算
#--------------------------------------------------------------------------
def item_hit(user, item)
rate = item.success_rate * 0.01 # 成功率を取得
rate *= user.hit if item.physical? # 物理攻撃:命中率を乗算
return rate # 計算した命中率を返す
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの回避率計算
#--------------------------------------------------------------------------
def item_eva(user, item)
return eva if item.physical? # 物理攻撃なら回避率を返す
return mev if item.magical? # 魔法攻撃なら魔法回避率を返す
return 0
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの会心率計算
#--------------------------------------------------------------------------
def item_cri(user, item)
item.damage.critical ? user.cri * (1 - cev) : 0
end
#--------------------------------------------------------------------------
# ● 通常攻撃の効果適用
#--------------------------------------------------------------------------
def attack_apply(attacker)
item_apply(attacker, $data_skills[attacker.attack_skill_id])
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの効果適用
#--------------------------------------------------------------------------
def item_apply(user, item)
@result.clear
@result.used = item_test(user, item)
@result.missed = (@result.used && rand >= item_hit(user, item))
@result.evaded = (!@result.missed && rand < item_eva(user, item))
if @result.hit?
unless item.damage.none?
@result.critical = (rand < item_cri(user, item))
make_damage_value(user, item)
execute_damage(user)
end
item.effects.each {|effect| item_effect_apply(user, item, effect) }
item_user_effect(user, item)
end
end
#--------------------------------------------------------------------------
# ● 使用効果のテスト
#--------------------------------------------------------------------------
def item_effect_test(user, item, effect)
case effect.code
when EFFECT_RECOVER_HP
hp < mhp || effect.value1 < 0 || effect.value2 < 0
when EFFECT_RECOVER_MP
mp < mmp || effect.value1 < 0 || effect.value2 < 0
when EFFECT_ADD_STATE
!state?(effect.data_id)
when EFFECT_REMOVE_STATE
state?(effect.data_id)
when EFFECT_ADD_BUFF
!buff_max?(effect.data_id)
when EFFECT_ADD_DEBUFF
!debuff_max?(effect.data_id)
when EFFECT_REMOVE_BUFF
buff?(effect.data_id)
when EFFECT_REMOVE_DEBUFF
debuff?(effect.data_id)
when EFFECT_LEARN_SKILL
actor? && !skills.include?($data_skills[effect.data_id])
else
true
end
end
#--------------------------------------------------------------------------
# ● 使用効果の適用
#--------------------------------------------------------------------------
def item_effect_apply(user, item, effect)
method_table = {
EFFECT_RECOVER_HP => :item_effect_recover_hp,
EFFECT_RECOVER_MP => :item_effect_recover_mp,
EFFECT_GAIN_TP => :item_effect_gain_tp,
EFFECT_ADD_STATE => :item_effect_add_state,
EFFECT_REMOVE_STATE => :item_effect_remove_state,
EFFECT_ADD_BUFF => :item_effect_add_buff,
EFFECT_ADD_DEBUFF => :item_effect_add_debuff,
EFFECT_REMOVE_BUFF => :item_effect_remove_buff,
EFFECT_REMOVE_DEBUFF => :item_effect_remove_debuff,
EFFECT_SPECIAL => :item_effect_special,
EFFECT_GROW => :item_effect_grow,
EFFECT_LEARN_SKILL => :item_effect_learn_skill,
EFFECT_COMMON_EVENT => :item_effect_common_event,
}
method_name = method_table[effect.code]
send(method_name, user, item, effect) if method_name
end
#--------------------------------------------------------------------------
# ● 使用効果HP 回復]
#--------------------------------------------------------------------------
def item_effect_recover_hp(user, item, effect)
value = (mhp * effect.value1 + effect.value2) * rec
value *= user.pha if item.is_a?(RPG::Item)
value = value.to_i
@result.hp_damage -= value
@result.success = true
self.hp += value
end
#--------------------------------------------------------------------------
# ● 使用効果MP 回復]
#--------------------------------------------------------------------------
def item_effect_recover_mp(user, item, effect)
value = (mmp * effect.value1 + effect.value2) * rec
value *= user.pha if item.is_a?(RPG::Item)
value = value.to_i
@result.mp_damage -= value
@result.success = true if value != 0
self.mp += value
end
#--------------------------------------------------------------------------
# ● 使用効果TP 増加]
#--------------------------------------------------------------------------
def item_effect_gain_tp(user, item, effect)
value = effect.value1.to_i
@result.tp_damage -= value
@result.success = true if value != 0
self.tp += value
end
#--------------------------------------------------------------------------
# ● 使用効果[ステート付加]
#--------------------------------------------------------------------------
def item_effect_add_state(user, item, effect)
if effect.data_id == 0
item_effect_add_state_attack(user, item, effect)
else
item_effect_add_state_normal(user, item, effect)
end
end
#--------------------------------------------------------------------------
# ● 使用効果[ステート付加]:通常攻撃
#--------------------------------------------------------------------------
def item_effect_add_state_attack(user, item, effect)
user.atk_states.each do |state_id|
chance = effect.value1
chance *= state_rate(state_id)
chance *= user.atk_states_rate(state_id)
chance *= luk_effect_rate(user)
if rand < chance
add_state(state_id)
@result.success = true
end
end
end
#--------------------------------------------------------------------------
# ● 使用効果[ステート付加]:通常
#--------------------------------------------------------------------------
def item_effect_add_state_normal(user, item, effect)
chance = effect.value1
chance *= state_rate(effect.data_id) if opposite?(user)
chance *= luk_effect_rate(user) if opposite?(user)
if rand < chance
add_state(effect.data_id)
@result.success = true
end
end
#--------------------------------------------------------------------------
# ● 使用効果[ステート解除]
#--------------------------------------------------------------------------
def item_effect_remove_state(user, item, effect)
chance = effect.value1
if rand < chance
remove_state(effect.data_id)
@result.success = true
end
end
#--------------------------------------------------------------------------
# ● 使用効果[能力強化]
#--------------------------------------------------------------------------
def item_effect_add_buff(user, item, effect)
add_buff(effect.data_id, effect.value1)
@result.success = true
end
#--------------------------------------------------------------------------
# ● 使用効果[能力弱体]
#--------------------------------------------------------------------------
def item_effect_add_debuff(user, item, effect)
chance = debuff_rate(effect.data_id) * luk_effect_rate(user)
if rand < chance
add_debuff(effect.data_id, effect.value1)
@result.success = true
end
end
#--------------------------------------------------------------------------
# ● 使用効果[能力強化の解除]
#--------------------------------------------------------------------------
def item_effect_remove_buff(user, item, effect)
remove_buff(effect.data_id) if @buffs[effect.data_id] > 0
@result.success = true
end
#--------------------------------------------------------------------------
# ● 使用効果[能力弱体の解除]
#--------------------------------------------------------------------------
def item_effect_remove_debuff(user, item, effect)
remove_buff(effect.data_id) if @buffs[effect.data_id] < 0
@result.success = true
end
#--------------------------------------------------------------------------
# ● 使用効果[特殊効果]
#--------------------------------------------------------------------------
def item_effect_special(user, item, effect)
case effect.data_id
when SPECIAL_EFFECT_ESCAPE
escape
end
@result.success = true
end
#--------------------------------------------------------------------------
# ● 使用効果[成長]
#--------------------------------------------------------------------------
def item_effect_grow(user, item, effect)
add_param(effect.data_id, effect.value1.to_i)
@result.success = true
end
#--------------------------------------------------------------------------
# ● 使用効果[スキル習得]
#--------------------------------------------------------------------------
def item_effect_learn_skill(user, item, effect)
learn_skill(effect.data_id) if actor?
@result.success = true
end
#--------------------------------------------------------------------------
# ● 使用効果[コモンイベント]
#--------------------------------------------------------------------------
def item_effect_common_event(user, item, effect)
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの使用者側への効果
#--------------------------------------------------------------------------
def item_user_effect(user, item)
user.tp += item.tp_gain * user.tcr
end
#--------------------------------------------------------------------------
# ● 運による有効度変化率の取得
#--------------------------------------------------------------------------
def luk_effect_rate(user)
[1.0 + (user.luk - luk) * 0.001, 0.0].max
end
#--------------------------------------------------------------------------
# ● 敵対関係の判定
#--------------------------------------------------------------------------
def opposite?(battler)
actor? != battler.actor?
end
#--------------------------------------------------------------------------
# ● マップ上でダメージを受けたときの効果
#--------------------------------------------------------------------------
def perform_map_damage_effect
end
#--------------------------------------------------------------------------
# ● TP の初期化
#--------------------------------------------------------------------------
def init_tp
self.tp = rand * 25
end
#--------------------------------------------------------------------------
# ● TP のクリア
#--------------------------------------------------------------------------
def clear_tp
self.tp = 0
end
#--------------------------------------------------------------------------
# ● 被ダメージによる TP チャージ
#--------------------------------------------------------------------------
def charge_tp_by_damage(damage_rate)
self.tp += 50 * damage_rate * tcr
end
#--------------------------------------------------------------------------
# ● HP の再生
#--------------------------------------------------------------------------
def regenerate_hp
damage = -(mhp * hrg).to_i
perform_map_damage_effect if $game_party.in_battle && damage > 0
@result.hp_damage = [damage, max_slip_damage].min
self.hp -= @result.hp_damage
end
#--------------------------------------------------------------------------
# ● スリップダメージの最大値を取得
#--------------------------------------------------------------------------
def max_slip_damage
$data_system.opt_slip_death ? hp : [hp - 1, 0].max
end
#--------------------------------------------------------------------------
# ● MP の再生
#--------------------------------------------------------------------------
def regenerate_mp
@result.mp_damage = -(mmp * mrg).to_i
self.mp -= @result.mp_damage
end
#--------------------------------------------------------------------------
# ● TP の再生
#--------------------------------------------------------------------------
def regenerate_tp
self.tp += 100 * trg
end
#--------------------------------------------------------------------------
# ● 全ての再生
#--------------------------------------------------------------------------
def regenerate_all
if alive?
regenerate_hp
regenerate_mp
regenerate_tp
end
end
#--------------------------------------------------------------------------
# ● 戦闘開始処理
#--------------------------------------------------------------------------
def on_battle_start
init_tp unless preserve_tp?
end
#--------------------------------------------------------------------------
# ● 戦闘行動終了時の処理
#--------------------------------------------------------------------------
def on_action_end
@result.clear
remove_states_auto(1)
remove_buffs_auto
end
#--------------------------------------------------------------------------
# ● ターン終了処理
#--------------------------------------------------------------------------
def on_turn_end
@result.clear
regenerate_all
update_state_turns
update_buff_turns
remove_states_auto(2)
end
#--------------------------------------------------------------------------
# ● 戦闘終了処理
#--------------------------------------------------------------------------
def on_battle_end
@result.clear
remove_battle_states
remove_all_buffs
clear_actions
clear_tp unless preserve_tp?
appear
end
#--------------------------------------------------------------------------
# ● 被ダメージ時の処理
#--------------------------------------------------------------------------
def on_damage(value)
remove_states_by_damage
charge_tp_by_damage(value.to_f / mhp)
end
end

730
Scripts/Game_BattlerBase.rb Normal file
View file

@ -0,0 +1,730 @@
#==============================================================================
# ■ Game_BattlerBase
#------------------------------------------------------------------------------
#  バトラーを扱う基本のクラスです。主に能力値計算のメソッドを含んでいます。こ
# のクラスは Game_Battler クラスのスーパークラスとして使用されます。
#==============================================================================
class Game_BattlerBase
#--------------------------------------------------------------------------
# ● 定数(特徴)
#--------------------------------------------------------------------------
FEATURE_ELEMENT_RATE = 11 # 属性有効度
FEATURE_DEBUFF_RATE = 12 # 弱体有効度
FEATURE_STATE_RATE = 13 # ステート有効度
FEATURE_STATE_RESIST = 14 # ステート無効化
FEATURE_PARAM = 21 # 通常能力値
FEATURE_XPARAM = 22 # 追加能力値
FEATURE_SPARAM = 23 # 特殊能力値
FEATURE_ATK_ELEMENT = 31 # 攻撃時属性
FEATURE_ATK_STATE = 32 # 攻撃時ステート
FEATURE_ATK_SPEED = 33 # 攻撃速度補正
FEATURE_ATK_TIMES = 34 # 攻撃追加回数
FEATURE_STYPE_ADD = 41 # スキルタイプ追加
FEATURE_STYPE_SEAL = 42 # スキルタイプ封印
FEATURE_SKILL_ADD = 43 # スキル追加
FEATURE_SKILL_SEAL = 44 # スキル封印
FEATURE_EQUIP_WTYPE = 51 # 武器タイプ装備
FEATURE_EQUIP_ATYPE = 52 # 防具タイプ装備
FEATURE_EQUIP_FIX = 53 # 装備固定
FEATURE_EQUIP_SEAL = 54 # 装備封印
FEATURE_SLOT_TYPE = 55 # スロットタイプ
FEATURE_ACTION_PLUS = 61 # 行動回数追加
FEATURE_SPECIAL_FLAG = 62 # 特殊フラグ
FEATURE_COLLAPSE_TYPE = 63 # 消滅エフェクト
FEATURE_PARTY_ABILITY = 64 # パーティ能力
#--------------------------------------------------------------------------
# ● 定数(特殊フラグ)
#--------------------------------------------------------------------------
FLAG_ID_AUTO_BATTLE = 0 # 自動戦闘
FLAG_ID_GUARD = 1 # 防御
FLAG_ID_SUBSTITUTE = 2 # 身代わり
FLAG_ID_PRESERVE_TP = 3 # TP持ち越し
#--------------------------------------------------------------------------
# ● 定数(能力強化/弱体アイコンの開始番号)
#--------------------------------------------------------------------------
ICON_BUFF_START = 64 # 強化16 個)
ICON_DEBUFF_START = 80 # 弱体16 個)
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :hp # HP
attr_reader :mp # MP
attr_reader :tp # TP
#--------------------------------------------------------------------------
# ● 各種能力値の略称によるアクセスメソッド
#--------------------------------------------------------------------------
def mhp; param(0); end # 最大HP Maximum Hit Point
def mmp; param(1); end # 最大MP Maximum Magic Point
def atk; param(2); end # 攻撃力 ATtacK power
def def; param(3); end # 防御力 DEFense power
def mat; param(4); end # 魔法力 Magic ATtack power
def mdf; param(5); end # 魔法防御 Magic DeFense power
def agi; param(6); end # 敏捷性 AGIlity
def luk; param(7); end # 運 LUcK
def hit; xparam(0); end # 命中率 HIT rate
def eva; xparam(1); end # 回避率 EVAsion rate
def cri; xparam(2); end # 会心率 CRItical rate
def cev; xparam(3); end # 会心回避率 Critical EVasion rate
def mev; xparam(4); end # 魔法回避率 Magic EVasion rate
def mrf; xparam(5); end # 魔法反射率 Magic ReFlection rate
def cnt; xparam(6); end # 反撃率 CouNTer attack rate
def hrg; xparam(7); end # HP再生率 Hp ReGeneration rate
def mrg; xparam(8); end # MP再生率 Mp ReGeneration rate
def trg; xparam(9); end # TP再生率 Tp ReGeneration rate
def tgr; sparam(0); end # 狙われ率 TarGet Rate
def grd; sparam(1); end # 防御効果率 GuaRD effect rate
def rec; sparam(2); end # 回復効果率 RECovery effect rate
def pha; sparam(3); end # 薬の知識 PHArmacology
def mcr; sparam(4); end # MP消費率 Mp Cost Rate
def tcr; sparam(5); end # TPチャージ率 Tp Charge Rate
def pdr; sparam(6); end # 物理ダメージ率 Physical Damage Rate
def mdr; sparam(7); end # 魔法ダメージ率 Magical Damage Rate
def fdr; sparam(8); end # 床ダメージ率 Floor Damage Rate
def exr; sparam(9); end # 経験獲得率 EXperience Rate
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
@hp = @mp = @tp = 0
@hidden = false
clear_param_plus
clear_states
clear_buffs
end
#--------------------------------------------------------------------------
# ● 能力値に加算する値をクリア
#--------------------------------------------------------------------------
def clear_param_plus
@param_plus = [0] * 8
end
#--------------------------------------------------------------------------
# ● ステート情報をクリア
#--------------------------------------------------------------------------
def clear_states
@states = []
@state_turns = {}
@state_steps = {}
end
#--------------------------------------------------------------------------
# ● ステートの消去
#--------------------------------------------------------------------------
def erase_state(state_id)
@states.delete(state_id)
@state_turns.delete(state_id)
@state_steps.delete(state_id)
end
#--------------------------------------------------------------------------
# ● 能力強化情報をクリア
#--------------------------------------------------------------------------
def clear_buffs
@buffs = Array.new(8) { 0 }
@buff_turns = {}
end
#--------------------------------------------------------------------------
# ● ステートの検査
#--------------------------------------------------------------------------
def state?(state_id)
@states.include?(state_id)
end
#--------------------------------------------------------------------------
# ● 戦闘不能ステートの検査
#--------------------------------------------------------------------------
def death_state?
state?(death_state_id)
end
#--------------------------------------------------------------------------
# ● 戦闘不能のステート ID を取得
#--------------------------------------------------------------------------
def death_state_id
return 1
end
#--------------------------------------------------------------------------
# ● 現在のステートをオブジェクトの配列で取得
#--------------------------------------------------------------------------
def states
@states.collect {|id| $data_states[id] }
end
#--------------------------------------------------------------------------
# ● 現在のステートをアイコン番号の配列で取得
#--------------------------------------------------------------------------
def state_icons
icons = states.collect {|state| state.icon_index }
icons.delete(0)
icons
end
#--------------------------------------------------------------------------
# ● 現在の強化/弱体をアイコン番号の配列で取得
#--------------------------------------------------------------------------
def buff_icons
icons = []
@buffs.each_with_index {|lv, i| icons.push(buff_icon_index(lv, i)) }
icons.delete(0)
icons
end
#--------------------------------------------------------------------------
# ● 強化/弱体に対応するアイコン番号を取得
#--------------------------------------------------------------------------
def buff_icon_index(buff_level, param_id)
if buff_level > 0
return ICON_BUFF_START + (buff_level - 1) * 8 + param_id
elsif buff_level < 0
return ICON_DEBUFF_START + (-buff_level - 1) * 8 + param_id
else
return 0
end
end
#--------------------------------------------------------------------------
# ● 特徴を保持する全オブジェクトの配列取得
#--------------------------------------------------------------------------
def feature_objects
states
end
#--------------------------------------------------------------------------
# ● 全ての特徴オブジェクトの配列取得
#--------------------------------------------------------------------------
def all_features
feature_objects.inject([]) {|r, obj| r + obj.features }
end
#--------------------------------------------------------------------------
# ● 特徴オブジェクトの配列取得(特徴コードを限定)
#--------------------------------------------------------------------------
def features(code)
all_features.select {|ft| ft.code == code }
end
#--------------------------------------------------------------------------
# ● 特徴オブジェクトの配列取得(特徴コードとデータ ID を限定)
#--------------------------------------------------------------------------
def features_with_id(code, id)
all_features.select {|ft| ft.code == code && ft.data_id == id }
end
#--------------------------------------------------------------------------
# ● 特徴値の総乗計算
#--------------------------------------------------------------------------
def features_pi(code, id)
features_with_id(code, id).inject(1.0) {|r, ft| r *= ft.value }
end
#--------------------------------------------------------------------------
# ● 特徴値の総和計算(データ ID を指定)
#--------------------------------------------------------------------------
def features_sum(code, id)
features_with_id(code, id).inject(0.0) {|r, ft| r += ft.value }
end
#--------------------------------------------------------------------------
# ● 特徴値の総和計算(データ ID は非指定)
#--------------------------------------------------------------------------
def features_sum_all(code)
features(code).inject(0.0) {|r, ft| r += ft.value }
end
#--------------------------------------------------------------------------
# ● 特徴の集合和計算
#--------------------------------------------------------------------------
def features_set(code)
features(code).inject([]) {|r, ft| r |= [ft.data_id] }
end
#--------------------------------------------------------------------------
# ● 通常能力値の基本値取得
#--------------------------------------------------------------------------
def param_base(param_id)
return 0
end
#--------------------------------------------------------------------------
# ● 通常能力値の加算値取得
#--------------------------------------------------------------------------
def param_plus(param_id)
@param_plus[param_id]
end
#--------------------------------------------------------------------------
# ● 通常能力値の最小値取得
#--------------------------------------------------------------------------
def param_min(param_id)
return 0 if param_id == 1 # MMP
return 1
end
#--------------------------------------------------------------------------
# ● 通常能力値の最大値取得
#--------------------------------------------------------------------------
def param_max(param_id)
return 999999 if param_id == 0 # MHP
return 9999 if param_id == 1 # MMP
return 999
end
#--------------------------------------------------------------------------
# ● 通常能力値の変化率取得
#--------------------------------------------------------------------------
def param_rate(param_id)
features_pi(FEATURE_PARAM, param_id)
end
#--------------------------------------------------------------------------
# ● 通常能力値の強化/弱体による変化率取得
#--------------------------------------------------------------------------
def param_buff_rate(param_id)
@buffs[param_id] * 0.25 + 1.0
end
#--------------------------------------------------------------------------
# ● 通常能力値の取得
#--------------------------------------------------------------------------
def param(param_id)
value = param_base(param_id) + param_plus(param_id)
value *= param_rate(param_id) * param_buff_rate(param_id)
[[value, param_max(param_id)].min, param_min(param_id)].max.to_i
end
#--------------------------------------------------------------------------
# ● 追加能力値の取得
#--------------------------------------------------------------------------
def xparam(xparam_id)
features_sum(FEATURE_XPARAM, xparam_id)
end
#--------------------------------------------------------------------------
# ● 特殊能力値の取得
#--------------------------------------------------------------------------
def sparam(sparam_id)
features_pi(FEATURE_SPARAM, sparam_id)
end
#--------------------------------------------------------------------------
# ● 属性有効度の取得
#--------------------------------------------------------------------------
def element_rate(element_id)
features_pi(FEATURE_ELEMENT_RATE, element_id)
end
#--------------------------------------------------------------------------
# ● 弱体有効度の取得
#--------------------------------------------------------------------------
def debuff_rate(param_id)
features_pi(FEATURE_DEBUFF_RATE, param_id)
end
#--------------------------------------------------------------------------
# ● ステート有効度の取得
#--------------------------------------------------------------------------
def state_rate(state_id)
features_pi(FEATURE_STATE_RATE, state_id)
end
#--------------------------------------------------------------------------
# ● 無効化するステートの配列を取得
#--------------------------------------------------------------------------
def state_resist_set
features_set(FEATURE_STATE_RESIST)
end
#--------------------------------------------------------------------------
# ● 無効化されているステートの判定
#--------------------------------------------------------------------------
def state_resist?(state_id)
state_resist_set.include?(state_id)
end
#--------------------------------------------------------------------------
# ● 攻撃時属性の取得
#--------------------------------------------------------------------------
def atk_elements
features_set(FEATURE_ATK_ELEMENT)
end
#--------------------------------------------------------------------------
# ● 攻撃時ステートの取得
#--------------------------------------------------------------------------
def atk_states
features_set(FEATURE_ATK_STATE)
end
#--------------------------------------------------------------------------
# ● 攻撃時ステートの発動率取得
#--------------------------------------------------------------------------
def atk_states_rate(state_id)
features_sum(FEATURE_ATK_STATE, state_id)
end
#--------------------------------------------------------------------------
# ● 攻撃速度補正の取得
#--------------------------------------------------------------------------
def atk_speed
features_sum_all(FEATURE_ATK_SPEED)
end
#--------------------------------------------------------------------------
# ● 攻撃追加回数の取得
#--------------------------------------------------------------------------
def atk_times_add
[features_sum_all(FEATURE_ATK_TIMES), 0].max
end
#--------------------------------------------------------------------------
# ● 追加スキルタイプの取得
#--------------------------------------------------------------------------
def added_skill_types
features_set(FEATURE_STYPE_ADD)
end
#--------------------------------------------------------------------------
# ● スキルタイプ封印の判定
#--------------------------------------------------------------------------
def skill_type_sealed?(stype_id)
features_set(FEATURE_STYPE_SEAL).include?(stype_id)
end
#--------------------------------------------------------------------------
# ● 追加スキルの取得
#--------------------------------------------------------------------------
def added_skills
features_set(FEATURE_SKILL_ADD)
end
#--------------------------------------------------------------------------
# ● スキル封印の判定
#--------------------------------------------------------------------------
def skill_sealed?(skill_id)
features_set(FEATURE_SKILL_SEAL).include?(skill_id)
end
#--------------------------------------------------------------------------
# ● 武器装備可能の判定
#--------------------------------------------------------------------------
def equip_wtype_ok?(wtype_id)
features_set(FEATURE_EQUIP_WTYPE).include?(wtype_id)
end
#--------------------------------------------------------------------------
# ● 防具装備可能の判定
#--------------------------------------------------------------------------
def equip_atype_ok?(atype_id)
features_set(FEATURE_EQUIP_ATYPE).include?(atype_id)
end
#--------------------------------------------------------------------------
# ● 装備固定の判定
#--------------------------------------------------------------------------
def equip_type_fixed?(etype_id)
features_set(FEATURE_EQUIP_FIX).include?(etype_id)
end
#--------------------------------------------------------------------------
# ● 装備封印の判定
#--------------------------------------------------------------------------
def equip_type_sealed?(etype_id)
features_set(FEATURE_EQUIP_SEAL).include?(etype_id)
end
#--------------------------------------------------------------------------
# ● スロットタイプの取得
#--------------------------------------------------------------------------
def slot_type
features_set(FEATURE_SLOT_TYPE).max || 0
end
#--------------------------------------------------------------------------
# ● 二刀流の判定
#--------------------------------------------------------------------------
def dual_wield?
slot_type == 1
end
#--------------------------------------------------------------------------
# ● 行動回数追加確率の配列を取得
#--------------------------------------------------------------------------
def action_plus_set
features(FEATURE_ACTION_PLUS).collect {|ft| ft.value }
end
#--------------------------------------------------------------------------
# ● 特殊フラグ判定
#--------------------------------------------------------------------------
def special_flag(flag_id)
features(FEATURE_SPECIAL_FLAG).any? {|ft| ft.data_id == flag_id }
end
#--------------------------------------------------------------------------
# ● 消滅エフェクトの取得
#--------------------------------------------------------------------------
def collapse_type
features_set(FEATURE_COLLAPSE_TYPE).max || 0
end
#--------------------------------------------------------------------------
# ● パーティ能力判定
#--------------------------------------------------------------------------
def party_ability(ability_id)
features(FEATURE_PARTY_ABILITY).any? {|ft| ft.data_id == ability_id }
end
#--------------------------------------------------------------------------
# ● 自動戦闘の判定
#--------------------------------------------------------------------------
def auto_battle?
special_flag(FLAG_ID_AUTO_BATTLE)
end
#--------------------------------------------------------------------------
# ● 防御の判定
#--------------------------------------------------------------------------
def guard?
special_flag(FLAG_ID_GUARD) && movable?
end
#--------------------------------------------------------------------------
# ● 身代わりの判定
#--------------------------------------------------------------------------
def substitute?
special_flag(FLAG_ID_SUBSTITUTE) && movable?
end
#--------------------------------------------------------------------------
# ● TP持ち越しの判定
#--------------------------------------------------------------------------
def preserve_tp?
special_flag(FLAG_ID_PRESERVE_TP)
end
#--------------------------------------------------------------------------
# ● 能力値の加算
#--------------------------------------------------------------------------
def add_param(param_id, value)
@param_plus[param_id] += value
refresh
end
#--------------------------------------------------------------------------
# ● HP の変更
#--------------------------------------------------------------------------
def hp=(hp)
@hp = hp
refresh
end
#--------------------------------------------------------------------------
# ● MP の変更
#--------------------------------------------------------------------------
def mp=(mp)
@mp = mp
refresh
end
#--------------------------------------------------------------------------
# ● HP の増減(イベント用)
# value : 増減値
# enable_death : 戦闘不能を許可
#--------------------------------------------------------------------------
def change_hp(value, enable_death)
if !enable_death && @hp + value <= 0
self.hp = 1
else
self.hp += value
end
end
#--------------------------------------------------------------------------
# ● TP の変更
#--------------------------------------------------------------------------
def tp=(tp)
@tp = [[tp, max_tp].min, 0].max
end
#--------------------------------------------------------------------------
# ● TP の最大値を取得
#--------------------------------------------------------------------------
def max_tp
return 100
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
state_resist_set.each {|state_id| erase_state(state_id) }
@hp = [[@hp, mhp].min, 0].max
@mp = [[@mp, mmp].min, 0].max
@hp == 0 ? add_state(death_state_id) : remove_state(death_state_id)
end
#--------------------------------------------------------------------------
# ● 全回復
#--------------------------------------------------------------------------
def recover_all
clear_states
@hp = mhp
@mp = mmp
end
#--------------------------------------------------------------------------
# ● HP の割合を取得
#--------------------------------------------------------------------------
def hp_rate
@hp.to_f / mhp
end
#--------------------------------------------------------------------------
# ● MP の割合を取得
#--------------------------------------------------------------------------
def mp_rate
mmp > 0 ? @mp.to_f / mmp : 0
end
#--------------------------------------------------------------------------
# ● TP の割合を取得
#--------------------------------------------------------------------------
def tp_rate
@tp.to_f / 100
end
#--------------------------------------------------------------------------
# ● 隠れる
#--------------------------------------------------------------------------
def hide
@hidden = true
end
#--------------------------------------------------------------------------
# ● 現れる
#--------------------------------------------------------------------------
def appear
@hidden = false
end
#--------------------------------------------------------------------------
# ● 隠れ状態取得
#--------------------------------------------------------------------------
def hidden?
@hidden
end
#--------------------------------------------------------------------------
# ● 存在判定
#--------------------------------------------------------------------------
def exist?
!hidden?
end
#--------------------------------------------------------------------------
# ● 戦闘不能判定
#--------------------------------------------------------------------------
def dead?
exist? && death_state?
end
#--------------------------------------------------------------------------
# ● 生存判定
#--------------------------------------------------------------------------
def alive?
exist? && !death_state?
end
#--------------------------------------------------------------------------
# ● 正常判定
#--------------------------------------------------------------------------
def normal?
exist? && restriction == 0
end
#--------------------------------------------------------------------------
# ● コマンド入力可能判定
#--------------------------------------------------------------------------
def inputable?
normal? && !auto_battle?
end
#--------------------------------------------------------------------------
# ● 行動可能判定
#--------------------------------------------------------------------------
def movable?
exist? && restriction < 4
end
#--------------------------------------------------------------------------
# ● 混乱状態判定
#--------------------------------------------------------------------------
def confusion?
exist? && restriction >= 1 && restriction <= 3
end
#--------------------------------------------------------------------------
# ● 混乱レベル取得
#--------------------------------------------------------------------------
def confusion_level
confusion? ? restriction : 0
end
#--------------------------------------------------------------------------
# ● アクターか否かの判定
#--------------------------------------------------------------------------
def actor?
return false
end
#--------------------------------------------------------------------------
# ● 敵キャラか否かの判定
#--------------------------------------------------------------------------
def enemy?
return false
end
#--------------------------------------------------------------------------
# ● ステートの並び替え
# 配列 @states の内容を表示優先度の大きい順に並び替える。
#--------------------------------------------------------------------------
def sort_states
@states = @states.sort_by {|id| [-$data_states[id].priority, id] }
end
#--------------------------------------------------------------------------
# ● 制約の取得
# 現在付加されているステートから最大の restriction を取得する。
#--------------------------------------------------------------------------
def restriction
states.collect {|state| state.restriction }.push(0).max
end
#--------------------------------------------------------------------------
# ● 最重要のステート継続メッセージを取得
#--------------------------------------------------------------------------
def most_important_state_text
states.each {|state| return state.message3 unless state.message3.empty? }
return ""
end
#--------------------------------------------------------------------------
# ● スキルの必要武器を装備しているか
#--------------------------------------------------------------------------
def skill_wtype_ok?(skill)
return true
end
#--------------------------------------------------------------------------
# ● スキルの消費 MP 計算
#--------------------------------------------------------------------------
def skill_mp_cost(skill)
(skill.mp_cost * mcr).to_i
end
#--------------------------------------------------------------------------
# ● スキルの消費 TP 計算
#--------------------------------------------------------------------------
def skill_tp_cost(skill)
skill.tp_cost
end
#--------------------------------------------------------------------------
# ● スキル使用コストの支払い可能判定
#--------------------------------------------------------------------------
def skill_cost_payable?(skill)
tp >= skill_tp_cost(skill) && mp >= skill_mp_cost(skill)
end
#--------------------------------------------------------------------------
# ● スキル使用コストの支払い
#--------------------------------------------------------------------------
def pay_skill_cost(skill)
self.mp -= skill_mp_cost(skill)
self.tp -= skill_tp_cost(skill)
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの使用可能時チェック
#--------------------------------------------------------------------------
def occasion_ok?(item)
$game_party.in_battle ? item.battle_ok? : item.menu_ok?
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの共通使用可能条件チェック
#--------------------------------------------------------------------------
def usable_item_conditions_met?(item)
movable? && occasion_ok?(item)
end
#--------------------------------------------------------------------------
# ● スキルの使用可能条件チェック
#--------------------------------------------------------------------------
def skill_conditions_met?(skill)
usable_item_conditions_met?(skill) &&
skill_wtype_ok?(skill) && skill_cost_payable?(skill) &&
!skill_sealed?(skill.id) && !skill_type_sealed?(skill.stype_id)
end
#--------------------------------------------------------------------------
# ● アイテムの使用可能条件チェック
#--------------------------------------------------------------------------
def item_conditions_met?(item)
usable_item_conditions_met?(item) && $game_party.has_item?(item)
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの使用可能判定
#--------------------------------------------------------------------------
def usable?(item)
return skill_conditions_met?(item) if item.is_a?(RPG::Skill)
return item_conditions_met?(item) if item.is_a?(RPG::Item)
return false
end
#--------------------------------------------------------------------------
# ● 装備可能判定
#--------------------------------------------------------------------------
def equippable?(item)
return false unless item.is_a?(RPG::EquipItem)
return false if equip_type_sealed?(item.etype_id)
return equip_wtype_ok?(item.wtype_id) if item.is_a?(RPG::Weapon)
return equip_atype_ok?(item.atype_id) if item.is_a?(RPG::Armor)
return false
end
#--------------------------------------------------------------------------
# ● 通常攻撃のスキル ID を取得
#--------------------------------------------------------------------------
def attack_skill_id
return 1
end
#--------------------------------------------------------------------------
# ● 防御のスキル ID を取得
#--------------------------------------------------------------------------
def guard_skill_id
return 2
end
#--------------------------------------------------------------------------
# ● 通常攻撃の使用可能判定
#--------------------------------------------------------------------------
def attack_usable?
usable?($data_skills[attack_skill_id])
end
#--------------------------------------------------------------------------
# ● 防御の使用可能判定
#--------------------------------------------------------------------------
def guard_usable?
usable?($data_skills[guard_skill_id])
end
end

395
Scripts/Game_Character.rb Normal file
View file

@ -0,0 +1,395 @@
#==============================================================================
# ■ Game_Character
#------------------------------------------------------------------------------
#  主に移動ルートなどの処理を追加したキャラクターのクラスです。Game_Player、
# Game_Follower、GameVehicle、Game_Event のスーパークラスとして使用されます。
#==============================================================================
class Game_Character < Game_CharacterBase
#--------------------------------------------------------------------------
# ● 定数
#--------------------------------------------------------------------------
ROUTE_END = 0 # 移動ルートの終端
ROUTE_MOVE_DOWN = 1 # 下に移動
ROUTE_MOVE_LEFT = 2 # 左に移動
ROUTE_MOVE_RIGHT = 3 # 右に移動
ROUTE_MOVE_UP = 4 # 上に移動
ROUTE_MOVE_LOWER_L = 5 # 左下に移動
ROUTE_MOVE_LOWER_R = 6 # 右下に移動
ROUTE_MOVE_UPPER_L = 7 # 左上に移動
ROUTE_MOVE_UPPER_R = 8 # 右上に移動
ROUTE_MOVE_RANDOM = 9 # ランダムに移動
ROUTE_MOVE_TOWARD = 10 # プレイヤーに近づく
ROUTE_MOVE_AWAY = 11 # プレイヤーから遠ざかる
ROUTE_MOVE_FORWARD = 12 # 一歩前進
ROUTE_MOVE_BACKWARD = 13 # 一歩後退
ROUTE_JUMP = 14 # ジャンプ
ROUTE_WAIT = 15 # ウェイト
ROUTE_TURN_DOWN = 16 # 下を向く
ROUTE_TURN_LEFT = 17 # 左を向く
ROUTE_TURN_RIGHT = 18 # 右を向く
ROUTE_TURN_UP = 19 # 上を向く
ROUTE_TURN_90D_R = 20 # 右に 90 度回転
ROUTE_TURN_90D_L = 21 # 左に 90 度回転
ROUTE_TURN_180D = 22 # 180 度回転
ROUTE_TURN_90D_R_L = 23 # 右か左に 90 度回転
ROUTE_TURN_RANDOM = 24 # ランダムに方向転換
ROUTE_TURN_TOWARD = 25 # プレイヤーの方を向く
ROUTE_TURN_AWAY = 26 # プレイヤーの逆を向く
ROUTE_SWITCH_ON = 27 # スイッチ ON
ROUTE_SWITCH_OFF = 28 # スイッチ OFF
ROUTE_CHANGE_SPEED = 29 # 移動速度の変更
ROUTE_CHANGE_FREQ = 30 # 移動頻度の変更
ROUTE_WALK_ANIME_ON = 31 # 歩行アニメ ON
ROUTE_WALK_ANIME_OFF = 32 # 歩行アニメ OFF
ROUTE_STEP_ANIME_ON = 33 # 足踏みアニメ ON
ROUTE_STEP_ANIME_OFF = 34 # 足踏みアニメ OFF
ROUTE_DIR_FIX_ON = 35 # 向き固定 ON
ROUTE_DIR_FIX_OFF = 36 # 向き固定 OFF
ROUTE_THROUGH_ON = 37 # すり抜け ON
ROUTE_THROUGH_OFF = 38 # すり抜け OFF
ROUTE_TRANSPARENT_ON = 39 # 透明化 ON
ROUTE_TRANSPARENT_OFF = 40 # 透明化 OFF
ROUTE_CHANGE_GRAPHIC = 41 # グラフィック変更
ROUTE_CHANGE_OPACITY = 42 # 不透明度の変更
ROUTE_CHANGE_BLENDING = 43 # 合成方法の変更
ROUTE_PLAY_SE = 44 # SE の演奏
ROUTE_SCRIPT = 45 # スクリプト
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :move_route_forcing # 移動ルート強制フラグ
#--------------------------------------------------------------------------
# ● 公開メンバ変数の初期化
#--------------------------------------------------------------------------
def init_public_members
super
@move_route_forcing = false
end
#--------------------------------------------------------------------------
# ● 非公開メンバ変数の初期化
#--------------------------------------------------------------------------
def init_private_members
super
@move_route = nil # 移動ルート
@move_route_index = 0 # 移動ルートの実行位置
@original_move_route = nil # 元の移動ルート
@original_move_route_index = 0 # 元の移動ルートの実行位置
@wait_count = 0 # ウェイトカウント
end
#--------------------------------------------------------------------------
# ● 移動ルートの記憶
#--------------------------------------------------------------------------
def memorize_move_route
@original_move_route = @move_route
@original_move_route_index = @move_route_index
end
#--------------------------------------------------------------------------
# ● 移動ルートの復帰
#--------------------------------------------------------------------------
def restore_move_route
@move_route = @original_move_route
@move_route_index = @original_move_route_index
@original_move_route = nil
end
#--------------------------------------------------------------------------
# ● 移動ルートの強制
#--------------------------------------------------------------------------
def force_move_route(move_route)
memorize_move_route unless @original_move_route
@move_route = move_route
@move_route_index = 0
@move_route_forcing = true
@prelock_direction = 0
@wait_count = 0
end
#--------------------------------------------------------------------------
# ● 停止時の更新
#--------------------------------------------------------------------------
def update_stop
super
update_routine_move if @move_route_forcing
end
#--------------------------------------------------------------------------
# ● ルートに沿った移動の更新
#--------------------------------------------------------------------------
def update_routine_move
if @wait_count > 0
@wait_count -= 1
else
@move_succeed = true
command = @move_route.list[@move_route_index]
if command
process_move_command(command)
advance_move_route_index
end
end
end
#--------------------------------------------------------------------------
# ● 移動コマンドの処理
#--------------------------------------------------------------------------
def process_move_command(command)
params = command.parameters
case command.code
when ROUTE_END; process_route_end
when ROUTE_MOVE_DOWN; move_straight(2)
when ROUTE_MOVE_LEFT; move_straight(4)
when ROUTE_MOVE_RIGHT; move_straight(6)
when ROUTE_MOVE_UP; move_straight(8)
when ROUTE_MOVE_LOWER_L; move_diagonal(4, 2)
when ROUTE_MOVE_LOWER_R; move_diagonal(6, 2)
when ROUTE_MOVE_UPPER_L; move_diagonal(4, 8)
when ROUTE_MOVE_UPPER_R; move_diagonal(6, 8)
when ROUTE_MOVE_RANDOM; move_random
when ROUTE_MOVE_TOWARD; move_toward_player
when ROUTE_MOVE_AWAY; move_away_from_player
when ROUTE_MOVE_FORWARD; move_forward
when ROUTE_MOVE_BACKWARD; move_backward
when ROUTE_JUMP; jump(params[0], params[1])
when ROUTE_WAIT; @wait_count = params[0] - 1
when ROUTE_TURN_DOWN; set_direction(2)
when ROUTE_TURN_LEFT; set_direction(4)
when ROUTE_TURN_RIGHT; set_direction(6)
when ROUTE_TURN_UP; set_direction(8)
when ROUTE_TURN_90D_R; turn_right_90
when ROUTE_TURN_90D_L; turn_left_90
when ROUTE_TURN_180D; turn_180
when ROUTE_TURN_90D_R_L; turn_right_or_left_90
when ROUTE_TURN_RANDOM; turn_random
when ROUTE_TURN_TOWARD; turn_toward_player
when ROUTE_TURN_AWAY; turn_away_from_player
when ROUTE_SWITCH_ON; $game_switches[params[0]] = true
when ROUTE_SWITCH_OFF; $game_switches[params[0]] = false
when ROUTE_CHANGE_SPEED; @move_speed = params[0]
when ROUTE_CHANGE_FREQ; @move_frequency = params[0]
when ROUTE_WALK_ANIME_ON; @walk_anime = true
when ROUTE_WALK_ANIME_OFF; @walk_anime = false
when ROUTE_STEP_ANIME_ON; @step_anime = true
when ROUTE_STEP_ANIME_OFF; @step_anime = false
when ROUTE_DIR_FIX_ON; @direction_fix = true
when ROUTE_DIR_FIX_OFF; @direction_fix = false
when ROUTE_THROUGH_ON; @through = true
when ROUTE_THROUGH_OFF; @through = false
when ROUTE_TRANSPARENT_ON; @transparent = true
when ROUTE_TRANSPARENT_OFF; @transparent = false
when ROUTE_CHANGE_GRAPHIC; set_graphic(params[0], params[1])
when ROUTE_CHANGE_OPACITY; @opacity = params[0]
when ROUTE_CHANGE_BLENDING; @blend_type = params[0]
when ROUTE_PLAY_SE; params[0].play
when ROUTE_SCRIPT; eval(params[0])
end
end
#--------------------------------------------------------------------------
# ● X 方向の距離計算
#--------------------------------------------------------------------------
def distance_x_from(x)
result = @x - x
if $game_map.loop_horizontal? && result.abs > $game_map.width / 2
if result < 0
result += $game_map.width
else
result -= $game_map.width
end
end
result
end
#--------------------------------------------------------------------------
# ● Y 方向の距離計算
#--------------------------------------------------------------------------
def distance_y_from(y)
result = @y - y
if $game_map.loop_vertical? && result.abs > $game_map.height / 2
if result < 0
result += $game_map.height
else
result -= $game_map.height
end
end
result
end
#--------------------------------------------------------------------------
# ● ランダムに移動
#--------------------------------------------------------------------------
def move_random
move_straight(2 + rand(4) * 2, false)
end
#--------------------------------------------------------------------------
# ● キャラクターに近づく
#--------------------------------------------------------------------------
def move_toward_character(character)
sx = distance_x_from(character.x)
sy = distance_y_from(character.y)
if sx.abs > sy.abs
move_straight(sx > 0 ? 4 : 6)
move_straight(sy > 0 ? 8 : 2) if !@move_succeed && sy != 0
elsif sy != 0
move_straight(sy > 0 ? 8 : 2)
move_straight(sx > 0 ? 4 : 6) if !@move_succeed && sx != 0
end
end
#--------------------------------------------------------------------------
# ● キャラクターから遠ざかる
#--------------------------------------------------------------------------
def move_away_from_character(character)
sx = distance_x_from(character.x)
sy = distance_y_from(character.y)
if sx.abs > sy.abs
move_straight(sx > 0 ? 6 : 4)
move_straight(sy > 0 ? 2 : 8) if !@move_succeed && sy != 0
elsif sy != 0
move_straight(sy > 0 ? 2 : 8)
move_straight(sx > 0 ? 6 : 4) if !@move_succeed && sx != 0
end
end
#--------------------------------------------------------------------------
# ● キャラクターの方を向く
#--------------------------------------------------------------------------
def turn_toward_character(character)
sx = distance_x_from(character.x)
sy = distance_y_from(character.y)
if sx.abs > sy.abs
set_direction(sx > 0 ? 4 : 6)
elsif sy != 0
set_direction(sy > 0 ? 8 : 2)
end
end
#--------------------------------------------------------------------------
# ● キャラクターの逆を向く
#--------------------------------------------------------------------------
def turn_away_from_character(character)
sx = distance_x_from(character.x)
sy = distance_y_from(character.y)
if sx.abs > sy.abs
set_direction(sx > 0 ? 6 : 4)
elsif sy != 0
set_direction(sy > 0 ? 2 : 8)
end
end
#--------------------------------------------------------------------------
# ● プレイヤーの方を向く
#--------------------------------------------------------------------------
def turn_toward_player
turn_toward_character($game_player)
end
#--------------------------------------------------------------------------
# ● プレイヤーの逆を向く
#--------------------------------------------------------------------------
def turn_away_from_player
turn_away_from_character($game_player)
end
#--------------------------------------------------------------------------
# ● プレイヤーに近づく
#--------------------------------------------------------------------------
def move_toward_player
move_toward_character($game_player)
end
#--------------------------------------------------------------------------
# ● プレイヤーから遠ざかる
#--------------------------------------------------------------------------
def move_away_from_player
move_away_from_character($game_player)
end
#--------------------------------------------------------------------------
# ● 一歩前進
#--------------------------------------------------------------------------
def move_forward
move_straight(@direction)
end
#--------------------------------------------------------------------------
# ● 一歩後退
#--------------------------------------------------------------------------
def move_backward
last_direction_fix = @direction_fix
@direction_fix = true
move_straight(reverse_dir(@direction), false)
@direction_fix = last_direction_fix
end
#--------------------------------------------------------------------------
# ● ジャンプ
# x_plus : X 座標加算値
# y_plus : Y 座標加算値
#--------------------------------------------------------------------------
def jump(x_plus, y_plus)
if x_plus.abs > y_plus.abs
set_direction(x_plus < 0 ? 4 : 6) if x_plus != 0
else
set_direction(y_plus < 0 ? 8 : 2) if y_plus != 0
end
@x += x_plus
@y += y_plus
distance = Math.sqrt(x_plus * x_plus + y_plus * y_plus).round
@jump_peak = 10 + distance - @move_speed
@jump_count = @jump_peak * 2
@stop_count = 0
straighten
end
#--------------------------------------------------------------------------
# ● 移動ルート終端の処理
#--------------------------------------------------------------------------
def process_route_end
if @move_route.repeat
@move_route_index = -1
elsif @move_route_forcing
@move_route_forcing = false
restore_move_route
end
end
#--------------------------------------------------------------------------
# ● 移動ルートの実行位置を進める
#--------------------------------------------------------------------------
def advance_move_route_index
@move_route_index += 1 if @move_succeed || @move_route.skippable
end
#--------------------------------------------------------------------------
# ● 右に 90 度回転
#--------------------------------------------------------------------------
def turn_right_90
case @direction
when 2; set_direction(4)
when 4; set_direction(8)
when 6; set_direction(2)
when 8; set_direction(6)
end
end
#--------------------------------------------------------------------------
# ● 左に 90 度回転
#--------------------------------------------------------------------------
def turn_left_90
case @direction
when 2; set_direction(6)
when 4; set_direction(2)
when 6; set_direction(8)
when 8; set_direction(4)
end
end
#--------------------------------------------------------------------------
# ● 180 度回転
#--------------------------------------------------------------------------
def turn_180
set_direction(reverse_dir(@direction))
end
#--------------------------------------------------------------------------
# ● 右か左に 90 度回転
#--------------------------------------------------------------------------
def turn_right_or_left_90
case rand(2)
when 0; turn_right_90
when 1; turn_left_90
end
end
#--------------------------------------------------------------------------
# ● ランダムに方向転換
#--------------------------------------------------------------------------
def turn_random
set_direction(2 + rand(4) * 2)
end
#--------------------------------------------------------------------------
# ● キャラクターの位置を交換
#--------------------------------------------------------------------------
def swap(character)
new_x = character.x
new_y = character.y
character.moveto(x, y)
moveto(new_x, new_y)
end
end

View file

@ -0,0 +1,443 @@
#==============================================================================
# ■ Game_CharacterBase
#------------------------------------------------------------------------------
#  キャラクターを扱う基本のクラスです。全てのキャラクターに共通する、座標やグ
# ラフィックなどの基本的な情報を保持します。
#==============================================================================
class Game_CharacterBase
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :id # ID
attr_reader :x # マップ X 座標(論理座標)
attr_reader :y # マップ Y 座標(論理座標)
attr_reader :real_x # マップ X 座標(実座標)
attr_reader :real_y # マップ Y 座標(実座標)
attr_reader :tile_id # タイル ID0 なら無効)
attr_reader :character_name # 歩行グラフィック ファイル名
attr_reader :character_index # 歩行グラフィック インデックス
attr_reader :move_speed # 移動速度
attr_reader :move_frequency # 移動頻度
attr_reader :walk_anime # 歩行アニメ
attr_reader :step_anime # 足踏みアニメ
attr_reader :direction_fix # 向き固定
attr_reader :opacity # 不透明度
attr_reader :blend_type # 合成方法
attr_reader :direction # 向き
attr_reader :pattern # パターン
attr_reader :priority_type # プライオリティタイプ
attr_reader :through # すり抜け
attr_reader :bush_depth # 茂み深さ
attr_accessor :animation_id # アニメーション ID
attr_accessor :balloon_id # フキダシアイコン ID
attr_accessor :transparent # 透明状態
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
init_public_members
init_private_members
end
#--------------------------------------------------------------------------
# ● 公開メンバ変数の初期化
#--------------------------------------------------------------------------
def init_public_members
@id = 0
@x = 0
@y = 0
@real_x = 0
@real_y = 0
@tile_id = 0
@character_name = ""
@character_index = 0
@move_speed = 4
@move_frequency = 6
@walk_anime = true
@step_anime = false
@direction_fix = false
@opacity = 255
@blend_type = 0
@direction = 2
@pattern = 1
@priority_type = 1
@through = false
@bush_depth = 0
@animation_id = 0
@balloon_id = 0
@transparent = false
end
#--------------------------------------------------------------------------
# ● 非公開メンバ変数の初期化
#--------------------------------------------------------------------------
def init_private_members
@original_direction = 2 # 元の向き
@original_pattern = 1 # 元のパターン
@anime_count = 0 # アニメカウント
@stop_count = 0 # 停止カウント
@jump_count = 0 # ジャンプカウント
@jump_peak = 0 # ジャンプの頂点のカウント
@locked = false # ロックフラグ
@prelock_direction = 0 # ロック前の向き
@move_succeed = true # 移動成功フラグ
end
#--------------------------------------------------------------------------
# ● 座標一致判定
#--------------------------------------------------------------------------
def pos?(x, y)
@x == x && @y == y
end
#--------------------------------------------------------------------------
# ● 座標一致と「すり抜け OFF」判定nt = No Through
#--------------------------------------------------------------------------
def pos_nt?(x, y)
pos?(x, y) && !@through
end
#--------------------------------------------------------------------------
# ● プライオリティ[通常キャラと同じ]判定
#--------------------------------------------------------------------------
def normal_priority?
@priority_type == 1
end
#--------------------------------------------------------------------------
# ● 移動中判定
#--------------------------------------------------------------------------
def moving?
@real_x != @x || @real_y != @y
end
#--------------------------------------------------------------------------
# ● ジャンプ中判定
#--------------------------------------------------------------------------
def jumping?
@jump_count > 0
end
#--------------------------------------------------------------------------
# ● ジャンプの高さを計算
#--------------------------------------------------------------------------
def jump_height
(@jump_peak * @jump_peak - (@jump_count - @jump_peak).abs ** 2) / 2
end
#--------------------------------------------------------------------------
# ● 停止中判定
#--------------------------------------------------------------------------
def stopping?
!moving? && !jumping?
end
#--------------------------------------------------------------------------
# ● 移動速度の取得(ダッシュを考慮)
#--------------------------------------------------------------------------
def real_move_speed
@move_speed + (dash? ? 1 : 0)
end
#--------------------------------------------------------------------------
# ● 1 フレームあたりの移動距離を計算
#--------------------------------------------------------------------------
def distance_per_frame
2 ** real_move_speed / 256.0
end
#--------------------------------------------------------------------------
# ● ダッシュ状態判定
#--------------------------------------------------------------------------
def dash?
return false
end
#--------------------------------------------------------------------------
# ● デバッグすり抜け状態判定
#--------------------------------------------------------------------------
def debug_through?
return false
end
#--------------------------------------------------------------------------
# ● 姿勢の矯正
#--------------------------------------------------------------------------
def straighten
@pattern = 1 if @walk_anime || @step_anime
@anime_count = 0
end
#--------------------------------------------------------------------------
# ● 逆方向の取得
# d : 方向2,4,6,8
#--------------------------------------------------------------------------
def reverse_dir(d)
return 10 - d
end
#--------------------------------------------------------------------------
# ● 通行可能判定
# d : 方向2,4,6,8
#--------------------------------------------------------------------------
def passable?(x, y, d)
x2 = $game_map.round_x_with_direction(x, d)
y2 = $game_map.round_y_with_direction(y, d)
return false unless $game_map.valid?(x2, y2)
return true if @through || debug_through?
return false unless map_passable?(x, y, d)
return false unless map_passable?(x2, y2, reverse_dir(d))
return false if collide_with_characters?(x2, y2)
return true
end
#--------------------------------------------------------------------------
# ● 斜めの通行可能判定
# horz : 横方向4 or 6
# vert : 縦方向2 or 8
#--------------------------------------------------------------------------
def diagonal_passable?(x, y, horz, vert)
x2 = $game_map.round_x_with_direction(x, horz)
y2 = $game_map.round_y_with_direction(y, vert)
(passable?(x, y, vert) && passable?(x, y2, horz)) ||
(passable?(x, y, horz) && passable?(x2, y, vert))
end
#--------------------------------------------------------------------------
# ● マップ通行可能判定
# d : 方向2,4,6,8
#--------------------------------------------------------------------------
def map_passable?(x, y, d)
$game_map.passable?(x, y, d)
end
#--------------------------------------------------------------------------
# ● キャラクターとの衝突判定
#--------------------------------------------------------------------------
def collide_with_characters?(x, y)
collide_with_events?(x, y) || collide_with_vehicles?(x, y)
end
#--------------------------------------------------------------------------
# ● イベントとの衝突判定
#--------------------------------------------------------------------------
def collide_with_events?(x, y)
$game_map.events_xy_nt(x, y).any? do |event|
event.normal_priority? || self.is_a?(Game_Event)
end
end
#--------------------------------------------------------------------------
# ● 乗り物との衝突判定
#--------------------------------------------------------------------------
def collide_with_vehicles?(x, y)
$game_map.boat.pos_nt?(x, y) || $game_map.ship.pos_nt?(x, y)
end
#--------------------------------------------------------------------------
# ● 指定位置に移動
#--------------------------------------------------------------------------
def moveto(x, y)
@x = x % $game_map.width
@y = y % $game_map.height
@real_x = @x
@real_y = @y
@prelock_direction = 0
straighten
update_bush_depth
end
#--------------------------------------------------------------------------
# ● 指定方向に向き変更
# d : 方向2,4,6,8
#--------------------------------------------------------------------------
def set_direction(d)
@direction = d if !@direction_fix && d != 0
@stop_count = 0
end
#--------------------------------------------------------------------------
# ● タイル判定
#--------------------------------------------------------------------------
def tile?
@tile_id > 0 && @priority_type == 0
end
#--------------------------------------------------------------------------
# ● オブジェクトキャラクター判定
#--------------------------------------------------------------------------
def object_character?
@tile_id > 0 || @character_name[0, 1] == '!'
end
#--------------------------------------------------------------------------
# ● タイルの位置から上にずらすピクセル数を取得
#--------------------------------------------------------------------------
def shift_y
object_character? ? 0 : 4
end
#--------------------------------------------------------------------------
# ● 画面 X 座標の取得
#--------------------------------------------------------------------------
def screen_x
$game_map.adjust_x(@real_x) * 32 + 16
end
#--------------------------------------------------------------------------
# ● 画面 Y 座標の取得
#--------------------------------------------------------------------------
def screen_y
$game_map.adjust_y(@real_y) * 32 + 32 - shift_y - jump_height
end
#--------------------------------------------------------------------------
# ● 画面 Z 座標の取得
#--------------------------------------------------------------------------
def screen_z
@priority_type * 100
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
update_animation
return update_jump if jumping?
return update_move if moving?
return update_stop
end
#--------------------------------------------------------------------------
# ● ジャンプ時の更新
#--------------------------------------------------------------------------
def update_jump
@jump_count -= 1
@real_x = (@real_x * @jump_count + @x) / (@jump_count + 1.0)
@real_y = (@real_y * @jump_count + @y) / (@jump_count + 1.0)
update_bush_depth
if @jump_count == 0
@real_x = @x = $game_map.round_x(@x)
@real_y = @y = $game_map.round_y(@y)
end
end
#--------------------------------------------------------------------------
# ● 移動時の更新
#--------------------------------------------------------------------------
def update_move
@real_x = [@real_x - distance_per_frame, @x].max if @x < @real_x
@real_x = [@real_x + distance_per_frame, @x].min if @x > @real_x
@real_y = [@real_y - distance_per_frame, @y].max if @y < @real_y
@real_y = [@real_y + distance_per_frame, @y].min if @y > @real_y
update_bush_depth unless moving?
end
#--------------------------------------------------------------------------
# ● 停止時の更新
#--------------------------------------------------------------------------
def update_stop
@stop_count += 1 unless @locked
end
#--------------------------------------------------------------------------
# ● 歩行/足踏みアニメの更新
#--------------------------------------------------------------------------
def update_animation
update_anime_count
if @anime_count > 18 - real_move_speed * 2
update_anime_pattern
@anime_count = 0
end
end
#--------------------------------------------------------------------------
# ● アニメカウントの更新
#--------------------------------------------------------------------------
def update_anime_count
if moving? && @walk_anime
@anime_count += 1.5
elsif @step_anime || @pattern != @original_pattern
@anime_count += 1
end
end
#--------------------------------------------------------------------------
# ● アニメパターンの更新
#--------------------------------------------------------------------------
def update_anime_pattern
if !@step_anime && @stop_count > 0
@pattern = @original_pattern
else
@pattern = (@pattern + 1) % 4
end
end
#--------------------------------------------------------------------------
# ● 梯子判定
#--------------------------------------------------------------------------
def ladder?
$game_map.ladder?(@x, @y)
end
#--------------------------------------------------------------------------
# ● 茂み深さの更新
#--------------------------------------------------------------------------
def update_bush_depth
if normal_priority? && !object_character? && bush? && !jumping?
@bush_depth = 8 unless moving?
else
@bush_depth = 0
end
end
#--------------------------------------------------------------------------
# ● 茂み判定
#--------------------------------------------------------------------------
def bush?
$game_map.bush?(@x, @y)
end
#--------------------------------------------------------------------------
# ● 地形タグの取得
#--------------------------------------------------------------------------
def terrain_tag
$game_map.terrain_tag(@x, @y)
end
#--------------------------------------------------------------------------
# ● リージョン ID の取得
#--------------------------------------------------------------------------
def region_id
$game_map.region_id(@x, @y)
end
#--------------------------------------------------------------------------
# ● 歩数増加
#--------------------------------------------------------------------------
def increase_steps
set_direction(8) if ladder?
@stop_count = 0
update_bush_depth
end
#--------------------------------------------------------------------------
# ● グラフィックの変更
# character_name : 新しい歩行グラフィック ファイル名
# character_index : 新しい歩行グラフィック インデックス
#--------------------------------------------------------------------------
def set_graphic(character_name, character_index)
@tile_id = 0
@character_name = character_name
@character_index = character_index
@original_pattern = 1
end
#--------------------------------------------------------------------------
# ● 正面の接触イベントの起動判定
#--------------------------------------------------------------------------
def check_event_trigger_touch_front
x2 = $game_map.round_x_with_direction(@x, @direction)
y2 = $game_map.round_y_with_direction(@y, @direction)
check_event_trigger_touch(x2, y2)
end
#--------------------------------------------------------------------------
# ● 接触イベントの起動判定
#--------------------------------------------------------------------------
def check_event_trigger_touch(x, y)
return false
end
#--------------------------------------------------------------------------
# ● まっすぐに移動
# d : 方向2,4,6,8
# turn_ok : その場での向き変更を許可
#--------------------------------------------------------------------------
def move_straight(d, turn_ok = true)
@move_succeed = passable?(@x, @y, d)
if @move_succeed
set_direction(d)
@x = $game_map.round_x_with_direction(@x, d)
@y = $game_map.round_y_with_direction(@y, d)
@real_x = $game_map.x_with_direction(@x, reverse_dir(d))
@real_y = $game_map.y_with_direction(@y, reverse_dir(d))
increase_steps
elsif turn_ok
set_direction(d)
check_event_trigger_touch_front
end
end
#--------------------------------------------------------------------------
# ● 斜めに移動
# horz : 横方向4 or 6
# vert : 縦方向2 or 8
#--------------------------------------------------------------------------
def move_diagonal(horz, vert)
@move_succeed = diagonal_passable?(x, y, horz, vert)
if @move_succeed
@x = $game_map.round_x_with_direction(@x, horz)
@y = $game_map.round_y_with_direction(@y, vert)
@real_x = $game_map.x_with_direction(@x, reverse_dir(horz))
@real_y = $game_map.y_with_direction(@y, reverse_dir(vert))
increase_steps
end
set_direction(horz) if @direction == reverse_dir(horz)
set_direction(vert) if @direction == reverse_dir(vert)
end
end

View file

@ -0,0 +1,41 @@
#==============================================================================
# ■ Game_CommonEvent
#------------------------------------------------------------------------------
#  コモンイベントを扱うクラスです。並列処理イベントを実行する機能を持っていま
# す。このクラスは Game_Map クラス($game_mapの内部で使用されます。
#==============================================================================
class Game_CommonEvent
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(common_event_id)
@event = $data_common_events[common_event_id]
refresh
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
if active?
@interpreter ||= Game_Interpreter.new
else
@interpreter = nil
end
end
#--------------------------------------------------------------------------
# ● 有効状態判定
#--------------------------------------------------------------------------
def active?
@event.parallel? && $game_switches[@event.switch_id]
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
if @interpreter
@interpreter.setup(@event.list) unless @interpreter.running?
@interpreter.update
end
end
end

264
Scripts/Game_Enemy.rb Normal file
View file

@ -0,0 +1,264 @@
#==============================================================================
# ■ Game_Enemy
#------------------------------------------------------------------------------
#  敵キャラを扱うクラスです。このクラスは Game_Troop クラス($game_troop
# 内部で使用されます。
#==============================================================================
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :index # 敵グループ内インデックス
attr_reader :enemy_id # 敵キャラ ID
attr_reader :original_name # 元の名前
attr_accessor :letter # 名前につける ABC の文字
attr_accessor :plural # 複数出現フラグ
attr_accessor :screen_x # バトル画面 X 座標
attr_accessor :screen_y # バトル画面 Y 座標
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(index, enemy_id)
super()
@index = index
@enemy_id = enemy_id
enemy = $data_enemies[@enemy_id]
@original_name = enemy.name
@letter = ""
@plural = false
@screen_x = 0
@screen_y = 0
@battler_name = enemy.battler_name
@battler_hue = enemy.battler_hue
@hp = mhp
@mp = mmp
end
#--------------------------------------------------------------------------
# ● 敵キャラか否かの判定
#--------------------------------------------------------------------------
def enemy?
return true
end
#--------------------------------------------------------------------------
# ● 味方ユニットを取得
#--------------------------------------------------------------------------
def friends_unit
$game_troop
end
#--------------------------------------------------------------------------
# ● 敵ユニットを取得
#--------------------------------------------------------------------------
def opponents_unit
$game_party
end
#--------------------------------------------------------------------------
# ● 敵キャラオブジェクト取得
#--------------------------------------------------------------------------
def enemy
$data_enemies[@enemy_id]
end
#--------------------------------------------------------------------------
# ● 特徴を保持する全オブジェクトの配列取得
#--------------------------------------------------------------------------
def feature_objects
super + [enemy]
end
#--------------------------------------------------------------------------
# ● 表示名の取得
#--------------------------------------------------------------------------
def name
@original_name
end
#--------------------------------------------------------------------------
# ● 通常能力値の基本値取得
#--------------------------------------------------------------------------
def param_base(param_id)
enemy.params[param_id]
end
#--------------------------------------------------------------------------
# ● 経験値の取得
#--------------------------------------------------------------------------
def exp
enemy.exp
end
#--------------------------------------------------------------------------
# ● お金の取得
#--------------------------------------------------------------------------
def gold
enemy.gold
end
#--------------------------------------------------------------------------
# ● ドロップアイテムの配列作成
#--------------------------------------------------------------------------
def make_drop_items
enemy.drop_items.inject([]) do |r, di|
if di.kind > 0 && rand * di.denominator < drop_item_rate
r.push(item_object(di.kind, di.data_id))
else
r
end
end
end
#--------------------------------------------------------------------------
# ● ドロップアイテム取得率の倍率を取得
#--------------------------------------------------------------------------
def drop_item_rate
$game_party.drop_item_double? ? 2 : 1
end
#--------------------------------------------------------------------------
# ● アイテムオブジェクトの取得
#--------------------------------------------------------------------------
def item_object(kind, data_id)
return $data_items [data_id] if kind == 1
return $data_weapons[data_id] if kind == 2
return $data_armors [data_id] if kind == 3
return nil
end
#--------------------------------------------------------------------------
# ● スプライトを使うか?
#--------------------------------------------------------------------------
def use_sprite?
return true
end
#--------------------------------------------------------------------------
# ● バトル画面 Z 座標の取得
#--------------------------------------------------------------------------
def screen_z
return 100
end
#--------------------------------------------------------------------------
# ● ダメージ効果の実行
#--------------------------------------------------------------------------
def perform_damage_effect
@sprite_effect_type = :blink
Sound.play_enemy_damage
end
#--------------------------------------------------------------------------
# ● コラプス効果の実行
#--------------------------------------------------------------------------
def perform_collapse_effect
case collapse_type
when 0
@sprite_effect_type = :collapse
Sound.play_enemy_collapse
when 1
@sprite_effect_type = :boss_collapse
Sound.play_boss_collapse1
when 2
@sprite_effect_type = :instant_collapse
end
end
#--------------------------------------------------------------------------
# ● 変身
#--------------------------------------------------------------------------
def transform(enemy_id)
@enemy_id = enemy_id
if enemy.name != @original_name
@original_name = enemy.name
@letter = ""
@plural = false
end
@battler_name = enemy.battler_name
@battler_hue = enemy.battler_hue
refresh
make_actions unless @actions.empty?
end
#--------------------------------------------------------------------------
# ● 行動条件合致判定
# action : RPG::Enemy::Action
#--------------------------------------------------------------------------
def conditions_met?(action)
method_table = {
1 => :conditions_met_turns?,
2 => :conditions_met_hp?,
3 => :conditions_met_mp?,
4 => :conditions_met_state?,
5 => :conditions_met_party_level?,
6 => :conditions_met_switch?,
}
method_name = method_table[action.condition_type]
if method_name
send(method_name, action.condition_param1, action.condition_param2)
else
true
end
end
#--------------------------------------------------------------------------
# ● 行動条件合致判定[ターン数]
#--------------------------------------------------------------------------
def conditions_met_turns?(param1, param2)
n = $game_troop.turn_count
if param2 == 0
n == param1
else
n > 0 && n >= param1 && n % param2 == param1 % param2
end
end
#--------------------------------------------------------------------------
# ● 行動条件合致判定HP
#--------------------------------------------------------------------------
def conditions_met_hp?(param1, param2)
hp_rate >= param1 && hp_rate <= param2
end
#--------------------------------------------------------------------------
# ● 行動条件合致判定MP
#--------------------------------------------------------------------------
def conditions_met_mp?(param1, param2)
mp_rate >= param1 && mp_rate <= param2
end
#--------------------------------------------------------------------------
# ● 行動条件合致判定[ステート]
#--------------------------------------------------------------------------
def conditions_met_state?(param1, param2)
state?(param1)
end
#--------------------------------------------------------------------------
# ● 行動条件合致判定[パーティレベル]
#--------------------------------------------------------------------------
def conditions_met_party_level?(param1, param2)
$game_party.highest_level >= param1
end
#--------------------------------------------------------------------------
# ● 行動条件合致判定[スイッチ]
#--------------------------------------------------------------------------
def conditions_met_switch?(param1, param2)
$game_switches[param1]
end
#--------------------------------------------------------------------------
# ● 現在の状況で戦闘行動が有効か否かを判定
# action : RPG::Enemy::Action
#--------------------------------------------------------------------------
def action_valid?(action)
conditions_met?(action) && usable?($data_skills[action.skill_id])
end
#--------------------------------------------------------------------------
# ● 戦闘行動をランダムに選択
# action_list : RPG::Enemy::Action の配列
# rating_zero : ゼロとみなすレーティング値
#--------------------------------------------------------------------------
def select_enemy_action(action_list, rating_zero)
sum = action_list.inject(0) {|r, a| r += a.rating - rating_zero }
return nil if sum <= 0
value = rand(sum)
action_list.each do |action|
return action if value < action.rating - rating_zero
value -= action.rating - rating_zero
end
end
#--------------------------------------------------------------------------
# ● 戦闘行動の作成
#--------------------------------------------------------------------------
def make_actions
super
return if @actions.empty?
action_list = enemy.actions.select {|a| action_valid?(a) }
return if action_list.empty?
rating_max = action_list.collect {|a| a.rating }.max
rating_zero = rating_max - 3
action_list.reject! {|a| a.rating <= rating_zero }
@actions.each do |action|
action.set_enemy_action(select_enemy_action(action_list, rating_zero))
end
end
end

307
Scripts/Game_Event.rb Normal file
View file

@ -0,0 +1,307 @@
#==============================================================================
# ■ Game_Event
#------------------------------------------------------------------------------
#  イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理
# イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。
#==============================================================================
class Game_Event < Game_Character
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :trigger # トリガー
attr_reader :list # 実行内容
attr_reader :starting # 起動中フラグ
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# event : RPG::Event
#--------------------------------------------------------------------------
def initialize(map_id, event)
super()
@map_id = map_id
@event = event
@id = @event.id
moveto(@event.x, @event.y)
refresh
end
#--------------------------------------------------------------------------
# ● 公開メンバ変数の初期化
#--------------------------------------------------------------------------
def init_public_members
super
@trigger = 0
@list = nil
@starting = false
end
#--------------------------------------------------------------------------
# ● 非公開メンバ変数の初期化
#--------------------------------------------------------------------------
def init_private_members
super
@move_type = 0 # 移動タイプ
@erased = false # 一時消去フラグ
@page = nil # イベントページ
end
#--------------------------------------------------------------------------
# ● キャラクターとの衝突判定
#--------------------------------------------------------------------------
def collide_with_characters?(x, y)
super || collide_with_player_characters?(x, y)
end
#--------------------------------------------------------------------------
# ● プレイヤーとの衝突判定(フォロワーを含む)
#--------------------------------------------------------------------------
def collide_with_player_characters?(x, y)
normal_priority? && $game_player.collide?(x, y)
end
#--------------------------------------------------------------------------
# ● ロック(実行中のイベントが立ち止まる処理)
#--------------------------------------------------------------------------
def lock
unless @locked
@prelock_direction = @direction
turn_toward_player
@locked = true
end
end
#--------------------------------------------------------------------------
# ● ロック解除
#--------------------------------------------------------------------------
def unlock
if @locked
@locked = false
set_direction(@prelock_direction)
end
end
#--------------------------------------------------------------------------
# ● 停止時の更新
#--------------------------------------------------------------------------
def update_stop
super
update_self_movement unless @move_route_forcing
end
#--------------------------------------------------------------------------
# ● 自律移動の更新
#--------------------------------------------------------------------------
def update_self_movement
if near_the_screen? && @stop_count > stop_count_threshold
case @move_type
when 1; move_type_random
when 2; move_type_toward_player
when 3; move_type_custom
end
end
end
#--------------------------------------------------------------------------
# ● 画面の可視領域付近にいるか判定
# dx : 画面中央から左右何マス以内を判定するか
# dy : 画面中央から上下何マス以内を判定するか
#--------------------------------------------------------------------------
def near_the_screen?(dx = 12, dy = 8)
ax = $game_map.adjust_x(@real_x) - Graphics.width / 2 / 32
ay = $game_map.adjust_y(@real_y) - Graphics.height / 2 / 32
ax >= -dx && ax <= dx && ay >= -dy && ay <= dy
end
#--------------------------------------------------------------------------
# ● 自律移動を開始する停止カウントの閾値を計算
#--------------------------------------------------------------------------
def stop_count_threshold
30 * (5 - @move_frequency)
end
#--------------------------------------------------------------------------
# ● 移動タイプ : ランダム
#--------------------------------------------------------------------------
def move_type_random
case rand(6)
when 0..1; move_random
when 2..4; move_forward
when 5; @stop_count = 0
end
end
#--------------------------------------------------------------------------
# ● 移動タイプ : 近づく
#--------------------------------------------------------------------------
def move_type_toward_player
if near_the_player?
case rand(6)
when 0..3; move_toward_player
when 4; move_random
when 5; move_forward
end
else
move_random
end
end
#--------------------------------------------------------------------------
# ● プレイヤーの近くにいるか判定
#--------------------------------------------------------------------------
def near_the_player?
sx = distance_x_from($game_player.x).abs
sy = distance_y_from($game_player.y).abs
sx + sy < 20
end
#--------------------------------------------------------------------------
# ● 移動タイプ : カスタム
#--------------------------------------------------------------------------
def move_type_custom
update_routine_move
end
#--------------------------------------------------------------------------
# ● 起動中フラグのクリア
#--------------------------------------------------------------------------
def clear_starting_flag
@starting = false
end
#--------------------------------------------------------------------------
# ● 実行内容が空か否かを判定
#--------------------------------------------------------------------------
def empty?
!@list || @list.size <= 1
end
#--------------------------------------------------------------------------
# ● 指定されたトリガーのいずれかか否かを判定
# triggers : トリガーの配列
#--------------------------------------------------------------------------
def trigger_in?(triggers)
triggers.include?(@trigger)
end
#--------------------------------------------------------------------------
# ● イベント起動
#--------------------------------------------------------------------------
def start
return if empty?
@starting = true
lock if trigger_in?([0,1,2])
end
#--------------------------------------------------------------------------
# ● 一時消去
#--------------------------------------------------------------------------
def erase
@erased = true
refresh
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
new_page = @erased ? nil : find_proper_page
setup_page(new_page) if !new_page || new_page != @page
end
#--------------------------------------------------------------------------
# ● 条件に合うイベントページを見つける
#--------------------------------------------------------------------------
def find_proper_page
@event.pages.reverse.find {|page| conditions_met?(page) }
end
#--------------------------------------------------------------------------
# ● イベントページの条件合致判定
#--------------------------------------------------------------------------
def conditions_met?(page)
c = page.condition
if c.switch1_valid
return false unless $game_switches[c.switch1_id]
end
if c.switch2_valid
return false unless $game_switches[c.switch2_id]
end
if c.variable_valid
return false if $game_variables[c.variable_id] < c.variable_value
end
if c.self_switch_valid
key = [@map_id, @event.id, c.self_switch_ch]
return false if $game_self_switches[key] != true
end
if c.item_valid
item = $data_items[c.item_id]
return false unless $game_party.has_item?(item)
end
if c.actor_valid
actor = $game_actors[c.actor_id]
return false unless $game_party.members.include?(actor)
end
return true
end
#--------------------------------------------------------------------------
# ● イベントページのセットアップ
#--------------------------------------------------------------------------
def setup_page(new_page)
@page = new_page
if @page
setup_page_settings
else
clear_page_settings
end
update_bush_depth
clear_starting_flag
check_event_trigger_auto
end
#--------------------------------------------------------------------------
# ● イベントページの設定をクリア
#--------------------------------------------------------------------------
def clear_page_settings
@tile_id = 0
@character_name = ""
@character_index = 0
@move_type = 0
@through = true
@trigger = nil
@list = nil
@interpreter = nil
end
#--------------------------------------------------------------------------
# ● イベントページの設定をセットアップ
#--------------------------------------------------------------------------
def setup_page_settings
@tile_id = @page.graphic.tile_id
@character_name = @page.graphic.character_name
@character_index = @page.graphic.character_index
if @original_direction != @page.graphic.direction
@direction = @page.graphic.direction
@original_direction = @direction
@prelock_direction = 0
end
if @original_pattern != @page.graphic.pattern
@pattern = @page.graphic.pattern
@original_pattern = @pattern
end
@move_type = @page.move_type
@move_speed = @page.move_speed
@move_frequency = @page.move_frequency
@move_route = @page.move_route
@move_route_index = 0
@move_route_forcing = false
@walk_anime = @page.walk_anime
@step_anime = @page.step_anime
@direction_fix = @page.direction_fix
@through = @page.through
@priority_type = @page.priority_type
@trigger = @page.trigger
@list = @page.list
@interpreter = @trigger == 4 ? Game_Interpreter.new : nil
end
#--------------------------------------------------------------------------
# ● 接触イベントの起動判定
#--------------------------------------------------------------------------
def check_event_trigger_touch(x, y)
return if $game_map.interpreter.running?
if @trigger == 2 && $game_player.pos?(x, y)
start if !jumping? && normal_priority?
end
end
#--------------------------------------------------------------------------
# ● 自動イベントの起動判定
#--------------------------------------------------------------------------
def check_event_trigger_auto
start if @trigger == 3
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
super
check_event_trigger_auto
return unless @interpreter
@interpreter.setup(@list, @event.id) unless @interpreter.running?
@interpreter.update
end
end

73
Scripts/Game_Follower.rb Normal file
View file

@ -0,0 +1,73 @@
#==============================================================================
# ■ Game_Follower
#------------------------------------------------------------------------------
#  フォロワーを扱うクラスです。フォロワーとは、隊列歩行で表示する、先頭以外の
# 仲間キャラクターのことです。Game_Followers クラスの内部で参照されます。
#==============================================================================
class Game_Follower < Game_Character
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(member_index, preceding_character)
super()
@member_index = member_index
@preceding_character = preceding_character
@transparent = $data_system.opt_transparent
@through = true
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
@character_name = visible? ? actor.character_name : ""
@character_index = visible? ? actor.character_index : 0
end
#--------------------------------------------------------------------------
# ● 対応するアクターの取得
#--------------------------------------------------------------------------
def actor
$game_party.battle_members[@member_index]
end
#--------------------------------------------------------------------------
# ● 可視判定
#--------------------------------------------------------------------------
def visible?
actor && $game_player.followers.visible
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
@move_speed = $game_player.real_move_speed
@transparent = $game_player.transparent
@walk_anime = $game_player.walk_anime
@step_anime = $game_player.step_anime
@direction_fix = $game_player.direction_fix
@opacity = $game_player.opacity
@blend_type = $game_player.blend_type
super
end
#--------------------------------------------------------------------------
# ● 先導キャラクターを追う
#--------------------------------------------------------------------------
def chase_preceding_character
unless moving?
sx = distance_x_from(@preceding_character.x)
sy = distance_y_from(@preceding_character.y)
if sx != 0 && sy != 0
move_diagonal(sx > 0 ? 4 : 6, sy > 0 ? 8 : 2)
elsif sx != 0
move_straight(sx > 0 ? 4 : 6)
elsif sy != 0
move_straight(sy > 0 ? 8 : 2)
end
end
end
#--------------------------------------------------------------------------
# ● 先導キャラクターと同位置にいるかを判定
#--------------------------------------------------------------------------
def gather?
!moving? && pos?(@preceding_character.x, @preceding_character.y)
end
end

111
Scripts/Game_Followers.rb Normal file
View file

@ -0,0 +1,111 @@
#==============================================================================
# ■ Game_Followers
#------------------------------------------------------------------------------
#  フォロワーの配列のラッパーです。このクラスは Game_Player クラスの内部で使
# 用されます。
#==============================================================================
class Game_Followers
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :visible # 可視状態 (真なら隊列歩行 ON)
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# leader : 先頭のキャラクター
#--------------------------------------------------------------------------
def initialize(leader)
@visible = $data_system.opt_followers
@gathering = false # 集合処理中フラグ
@data = []
@data.push(Game_Follower.new(1, leader))
(2...$game_party.max_battle_members).each do |index|
@data.push(Game_Follower.new(index, @data[-1]))
end
end
#--------------------------------------------------------------------------
# ● フォロワーの取得
#--------------------------------------------------------------------------
def [](index)
@data[index]
end
#--------------------------------------------------------------------------
# ● イテレータ
#--------------------------------------------------------------------------
def each
@data.each {|follower| yield follower } if block_given?
end
#--------------------------------------------------------------------------
# ● イテレータ(逆順)
#--------------------------------------------------------------------------
def reverse_each
@data.reverse.each {|follower| yield follower } if block_given?
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
each {|follower| follower.refresh }
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
if gathering?
move unless moving? || moving?
@gathering = false if gather?
end
each {|follower| follower.update }
end
#--------------------------------------------------------------------------
# ● 移動
#--------------------------------------------------------------------------
def move
reverse_each {|follower| follower.chase_preceding_character }
end
#--------------------------------------------------------------------------
# ● 同期
#--------------------------------------------------------------------------
def synchronize(x, y, d)
each do |follower|
follower.moveto(x, y)
follower.set_direction(d)
end
end
#--------------------------------------------------------------------------
# ● 集合
#--------------------------------------------------------------------------
def gather
@gathering = true
end
#--------------------------------------------------------------------------
# ● 集合中判定
#--------------------------------------------------------------------------
def gathering?
@gathering
end
#--------------------------------------------------------------------------
# ● 表示中のフォロワーの配列を取得
#--------------------------------------------------------------------------
def visible_folloers
@data.select {|follower| follower.visible? }
end
#--------------------------------------------------------------------------
# ● 移動中判定
#--------------------------------------------------------------------------
def moving?
visible_folloers.any? {|follower| follower.moving? }
end
#--------------------------------------------------------------------------
# ● 集合済み判定
#--------------------------------------------------------------------------
def gather?
visible_folloers.all? {|follower| follower.gather? }
end
#--------------------------------------------------------------------------
# ● 衝突判定
#--------------------------------------------------------------------------
def collide?(x, y)
visible_folloers.any? {|follower| follower.pos?(x, y) }
end
end

1411
Scripts/Game_Interpreter.rb Normal file

File diff suppressed because it is too large Load diff

698
Scripts/Game_Map.rb Normal file
View file

@ -0,0 +1,698 @@
#==============================================================================
# ■ Game_Map
#------------------------------------------------------------------------------
#  マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。
# このクラスのインスタンスは $game_map で参照されます。
#==============================================================================
class Game_Map
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :screen # マップ画面の状態
attr_reader :interpreter # マップイベント用インタプリタ
attr_reader :events # イベント
attr_reader :display_x # 表示 X 座標
attr_reader :display_y # 表示 Y 座標
attr_reader :parallax_name # 遠景 ファイル名
attr_reader :vehicles # 乗り物
attr_reader :battleback1_name # 戦闘背景(床)ファイル名
attr_reader :battleback2_name # 戦闘背景(壁)ファイル名
attr_accessor :name_display # マップ名表示フラグ
attr_accessor :need_refresh # リフレッシュ要求フラグ
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
@screen = Game_Screen.new
@interpreter = Game_Interpreter.new
@map_id = 0
@events = {}
@display_x = 0
@display_y = 0
create_vehicles
@name_display = true
end
#--------------------------------------------------------------------------
# ● セットアップ
#--------------------------------------------------------------------------
def setup(map_id)
@map_id = map_id
@map = load_data(sprintf("Data/Map%03d.rvdata2", @map_id))
@tileset_id = @map.tileset_id
@display_x = 0
@display_y = 0
referesh_vehicles
setup_events
setup_scroll
setup_parallax
setup_battleback
@need_refresh = false
end
#--------------------------------------------------------------------------
# ● 乗り物の作成
#--------------------------------------------------------------------------
def create_vehicles
@vehicles = []
@vehicles[0] = Game_Vehicle.new(:boat)
@vehicles[1] = Game_Vehicle.new(:ship)
@vehicles[2] = Game_Vehicle.new(:airship)
end
#--------------------------------------------------------------------------
# ● 乗り物のリフレッシュ
#--------------------------------------------------------------------------
def referesh_vehicles
@vehicles.each {|vehicle| vehicle.refresh }
end
#--------------------------------------------------------------------------
# ● 乗り物の取得
#--------------------------------------------------------------------------
def vehicle(type)
return @vehicles[0] if type == :boat
return @vehicles[1] if type == :ship
return @vehicles[2] if type == :airship
return nil
end
#--------------------------------------------------------------------------
# ● 小型船の取得
#--------------------------------------------------------------------------
def boat
@vehicles[0]
end
#--------------------------------------------------------------------------
# ● 大型船の取得
#--------------------------------------------------------------------------
def ship
@vehicles[1]
end
#--------------------------------------------------------------------------
# ● 飛行船の取得
#--------------------------------------------------------------------------
def airship
@vehicles[2]
end
#--------------------------------------------------------------------------
# ● イベントのセットアップ
#--------------------------------------------------------------------------
def setup_events
@events = {}
@map.events.each do |i, event|
@events[i] = Game_Event.new(@map_id, event)
end
@common_events = parallel_common_events.collect do |common_event|
Game_CommonEvent.new(common_event.id)
end
refresh_tile_events
end
#--------------------------------------------------------------------------
# ● 並列処理コモンイベントの配列を取得
#--------------------------------------------------------------------------
def parallel_common_events
$data_common_events.select {|event| event && event.parallel? }
end
#--------------------------------------------------------------------------
# ● スクロールのセットアップ
#--------------------------------------------------------------------------
def setup_scroll
@scroll_direction = 2
@scroll_rest = 0
@scroll_speed = 4
end
#--------------------------------------------------------------------------
# ● 遠景のセットアップ
#--------------------------------------------------------------------------
def setup_parallax
@parallax_name = @map.parallax_name
@parallax_loop_x = @map.parallax_loop_x
@parallax_loop_y = @map.parallax_loop_y
@parallax_sx = @map.parallax_sx
@parallax_sy = @map.parallax_sy
@parallax_x = 0
@parallax_y = 0
end
#--------------------------------------------------------------------------
# ● 戦闘背景のセットアップ
#--------------------------------------------------------------------------
def setup_battleback
if @map.specify_battleback
@battleback1_name = @map.battleback1_name
@battleback2_name = @map.battleback2_name
else
@battleback1_name = nil
@battleback2_name = nil
end
end
#--------------------------------------------------------------------------
# ● 表示位置の設定
#--------------------------------------------------------------------------
def set_display_pos(x, y)
x = [0, [x, width - screen_tile_x].min].max unless loop_horizontal?
y = [0, [y, height - screen_tile_y].min].max unless loop_vertical?
@display_x = (x + width) % width
@display_y = (y + height) % height
@parallax_x = x
@parallax_y = y
end
#--------------------------------------------------------------------------
# ● 遠景表示の原点 X 座標の計算
#--------------------------------------------------------------------------
def parallax_ox(bitmap)
if @parallax_loop_x
@parallax_x * 16
else
w1 = [bitmap.width - Graphics.width, 0].max
w2 = [width * 32 - Graphics.width, 1].max
@parallax_x * 16 * w1 / w2
end
end
#--------------------------------------------------------------------------
# ● 遠景表示の原点 Y 座標の計算
#--------------------------------------------------------------------------
def parallax_oy(bitmap)
if @parallax_loop_y
@parallax_y * 16
else
h1 = [bitmap.height - Graphics.height, 0].max
h2 = [height * 32 - Graphics.height, 1].max
@parallax_y * 16 * h1 / h2
end
end
#--------------------------------------------------------------------------
# ● マップ ID の取得
#--------------------------------------------------------------------------
def map_id
@map_id
end
#--------------------------------------------------------------------------
# ● タイルセットの取得
#--------------------------------------------------------------------------
def tileset
$data_tilesets[@tileset_id]
end
#--------------------------------------------------------------------------
# ● 表示名の取得
#--------------------------------------------------------------------------
def display_name
@map.display_name
end
#--------------------------------------------------------------------------
# ● 幅の取得
#--------------------------------------------------------------------------
def width
@map.width
end
#--------------------------------------------------------------------------
# ● 高さの取得
#--------------------------------------------------------------------------
def height
@map.height
end
#--------------------------------------------------------------------------
# ● 横方向にループするか?
#--------------------------------------------------------------------------
def loop_horizontal?
@map.scroll_type == 2 || @map.scroll_type == 3
end
#--------------------------------------------------------------------------
# ● 縦方向にループするか?
#--------------------------------------------------------------------------
def loop_vertical?
@map.scroll_type == 1 || @map.scroll_type == 3
end
#--------------------------------------------------------------------------
# ● ダッシュ禁止か否かの取得
#--------------------------------------------------------------------------
def disable_dash?
@map.disable_dashing
end
#--------------------------------------------------------------------------
# ● エンカウントリストの取得
#--------------------------------------------------------------------------
def encounter_list
@map.encounter_list
end
#--------------------------------------------------------------------------
# ● エンカウント歩数の取得
#--------------------------------------------------------------------------
def encounter_step
@map.encounter_step
end
#--------------------------------------------------------------------------
# ● マップデータの取得
#--------------------------------------------------------------------------
def data
@map.data
end
#--------------------------------------------------------------------------
# ● フィールドタイプか否か
#--------------------------------------------------------------------------
def overworld?
tileset.mode == 0
end
#--------------------------------------------------------------------------
# ● 画面の横タイル数
#--------------------------------------------------------------------------
def screen_tile_x
Graphics.width / 32
end
#--------------------------------------------------------------------------
# ● 画面の縦タイル数
#--------------------------------------------------------------------------
def screen_tile_y
Graphics.height / 32
end
#--------------------------------------------------------------------------
# ● 表示座標を差し引いた X 座標の計算
#--------------------------------------------------------------------------
def adjust_x(x)
if loop_horizontal? && x < @display_x - (width - screen_tile_x) / 2
x - @display_x + @map.width
else
x - @display_x
end
end
#--------------------------------------------------------------------------
# ● 表示座標を差し引いた Y 座標の計算
#--------------------------------------------------------------------------
def adjust_y(y)
if loop_vertical? && y < @display_y - (height - screen_tile_y) / 2
y - @display_y + @map.height
else
y - @display_y
end
end
#--------------------------------------------------------------------------
# ● ループ補正後の X 座標計算
#--------------------------------------------------------------------------
def round_x(x)
loop_horizontal? ? (x + width) % width : x
end
#--------------------------------------------------------------------------
# ● ループ補正後の Y 座標計算
#--------------------------------------------------------------------------
def round_y(y)
loop_vertical? ? (y + height) % height : y
end
#--------------------------------------------------------------------------
# ● 特定の方向に 1 マスずらした X 座標の計算(ループ補正なし)
#--------------------------------------------------------------------------
def x_with_direction(x, d)
x + (d == 6 ? 1 : d == 4 ? -1 : 0)
end
#--------------------------------------------------------------------------
# ● 特定の方向に 1 マスずらした Y 座標の計算(ループ補正なし)
#--------------------------------------------------------------------------
def y_with_direction(y, d)
y + (d == 2 ? 1 : d == 8 ? -1 : 0)
end
#--------------------------------------------------------------------------
# ● 特定の方向に 1 マスずらした X 座標の計算(ループ補正あり)
#--------------------------------------------------------------------------
def round_x_with_direction(x, d)
round_x(x + (d == 6 ? 1 : d == 4 ? -1 : 0))
end
#--------------------------------------------------------------------------
# ● 特定の方向に 1 マスずらした Y 座標の計算(ループ補正あり)
#--------------------------------------------------------------------------
def round_y_with_direction(y, d)
round_y(y + (d == 2 ? 1 : d == 8 ? -1 : 0))
end
#--------------------------------------------------------------------------
# ● BGM / BGS 自動切り替え
#--------------------------------------------------------------------------
def autoplay
@map.bgm.play if @map.autoplay_bgm
@map.bgs.play if @map.autoplay_bgs
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
@events.each_value {|event| event.refresh }
@common_events.each {|event| event.refresh }
refresh_tile_events
@need_refresh = false
end
#--------------------------------------------------------------------------
# ● タイル扱いイベントの配列をリフレッシュ
#--------------------------------------------------------------------------
def refresh_tile_events
@tile_events = @events.values.select {|event| event.tile? }
end
#--------------------------------------------------------------------------
# ● 指定座標に存在するイベントの配列取得
#--------------------------------------------------------------------------
def events_xy(x, y)
@events.values.select {|event| event.pos?(x, y) }
end
#--------------------------------------------------------------------------
# ● 指定座標に存在するイベント(すり抜け以外)の配列取得
#--------------------------------------------------------------------------
def events_xy_nt(x, y)
@events.values.select {|event| event.pos_nt?(x, y) }
end
#--------------------------------------------------------------------------
# ● 指定座標に存在するタイル扱いイベント(すり抜け以外)の配列取得
#--------------------------------------------------------------------------
def tile_events_xy(x, y)
@tile_events.select {|event| event.pos_nt?(x, y) }
end
#--------------------------------------------------------------------------
# ● 指定座標に存在するイベントの ID 取得(一つのみ)
#--------------------------------------------------------------------------
def event_id_xy(x, y)
list = events_xy(x, y)
list.empty? ? 0 : list[0].id
end
#--------------------------------------------------------------------------
# ● 下にスクロール
#--------------------------------------------------------------------------
def scroll_down(distance)
if loop_vertical?
@display_y += distance
@display_y %= @map.height
@parallax_y += distance if @parallax_loop_y
else
last_y = @display_y
@display_y = [@display_y + distance, height - screen_tile_y].min
@parallax_y += @display_y - last_y
end
end
#--------------------------------------------------------------------------
# ● 左にスクロール
#--------------------------------------------------------------------------
def scroll_left(distance)
if loop_horizontal?
@display_x += @map.width - distance
@display_x %= @map.width
@parallax_x -= distance if @parallax_loop_x
else
last_x = @display_x
@display_x = [@display_x - distance, 0].max
@parallax_x += @display_x - last_x
end
end
#--------------------------------------------------------------------------
# ● 右にスクロール
#--------------------------------------------------------------------------
def scroll_right(distance)
if loop_horizontal?
@display_x += distance
@display_x %= @map.width
@parallax_x += distance if @parallax_loop_x
else
last_x = @display_x
@display_x = [@display_x + distance, (width - screen_tile_x)].min
@parallax_x += @display_x - last_x
end
end
#--------------------------------------------------------------------------
# ● 上にスクロール
#--------------------------------------------------------------------------
def scroll_up(distance)
if loop_vertical?
@display_y += @map.height - distance
@display_y %= @map.height
@parallax_y -= distance if @parallax_loop_y
else
last_y = @display_y
@display_y = [@display_y - distance, 0].max
@parallax_y += @display_y - last_y
end
end
#--------------------------------------------------------------------------
# ● 有効座標判定
#--------------------------------------------------------------------------
def valid?(x, y)
x >= 0 && x < width && y >= 0 && y < height
end
#--------------------------------------------------------------------------
# ● 通行チェック
# bit : 調べる通行禁止ビット
#--------------------------------------------------------------------------
def check_passage(x, y, bit)
all_tiles(x, y).each do |tile_id|
flag = tileset.flags[tile_id]
next if flag & 0x10 != 0 # [☆] : 通行に影響しない
return true if flag & bit == 0 # [○] : 通行可
return false if flag & bit == bit # [×] : 通行不可
end
return false # 通行不可
end
#--------------------------------------------------------------------------
# ● 指定座標にあるタイル ID の取得
#--------------------------------------------------------------------------
def tile_id(x, y, z)
@map.data[x, y, z] || 0
end
#--------------------------------------------------------------------------
# ● 指定座標にある全レイヤーのタイル(上から順)を配列で取得
#--------------------------------------------------------------------------
def layered_tiles(x, y)
[2, 1, 0].collect {|z| tile_id(x, y, z) }
end
#--------------------------------------------------------------------------
# ● 指定座標にある全てのタイル(イベント含む)を配列で取得
#--------------------------------------------------------------------------
def all_tiles(x, y)
tile_events_xy(x, y).collect {|ev| ev.tile_id } + layered_tiles(x, y)
end
#--------------------------------------------------------------------------
# ● 指定座標にあるオートタイルの種類を取得
#--------------------------------------------------------------------------
def autotile_type(x, y, z)
tile_id(x, y, z) >= 2048 ? (tile_id(x, y, z) - 2048) / 48 : -1
end
#--------------------------------------------------------------------------
# ● 通常キャラの通行可能判定
# d : 方向2,4,6,8
# 指定された座標のタイルが指定方向に通行可能かを判定する。
#--------------------------------------------------------------------------
def passable?(x, y, d)
check_passage(x, y, (1 << (d / 2 - 1)) & 0x0f)
end
#--------------------------------------------------------------------------
# ● 小型船の通行可能判定
#--------------------------------------------------------------------------
def boat_passable?(x, y)
check_passage(x, y, 0x0200)
end
#--------------------------------------------------------------------------
# ● 大型船の通行可能判定
#--------------------------------------------------------------------------
def ship_passable?(x, y)
check_passage(x, y, 0x0400)
end
#--------------------------------------------------------------------------
# ● 飛行船の着陸可能判定
#--------------------------------------------------------------------------
def airship_land_ok?(x, y)
check_passage(x, y, 0x0800) && check_passage(x, y, 0x0f)
end
#--------------------------------------------------------------------------
# ● 指定座標の全レイヤーのフラグ判定
#--------------------------------------------------------------------------
def layered_tiles_flag?(x, y, bit)
layered_tiles(x, y).any? {|tile_id| tileset.flags[tile_id] & bit != 0 }
end
#--------------------------------------------------------------------------
# ● 梯子判定
#--------------------------------------------------------------------------
def ladder?(x, y)
valid?(x, y) && layered_tiles_flag?(x, y, 0x20)
end
#--------------------------------------------------------------------------
# ● 茂み判定
#--------------------------------------------------------------------------
def bush?(x, y)
valid?(x, y) && layered_tiles_flag?(x, y, 0x40)
end
#--------------------------------------------------------------------------
# ● カウンター判定
#--------------------------------------------------------------------------
def counter?(x, y)
valid?(x, y) && layered_tiles_flag?(x, y, 0x80)
end
#--------------------------------------------------------------------------
# ● ダメージ床判定
#--------------------------------------------------------------------------
def damage_floor?(x, y)
valid?(x, y) && layered_tiles_flag?(x, y, 0x100)
end
#--------------------------------------------------------------------------
# ● 地形タグの取得
#--------------------------------------------------------------------------
def terrain_tag(x, y)
return 0 unless valid?(x, y)
layered_tiles(x, y).each do |tile_id|
tag = tileset.flags[tile_id] >> 12
return tag if tag > 0
end
return 0
end
#--------------------------------------------------------------------------
# ● リージョン ID の取得
#--------------------------------------------------------------------------
def region_id(x, y)
valid?(x, y) ? @map.data[x, y, 3] >> 8 : 0
end
#--------------------------------------------------------------------------
# ● スクロールの開始
#--------------------------------------------------------------------------
def start_scroll(direction, distance, speed)
@scroll_direction = direction
@scroll_rest = distance
@scroll_speed = speed
end
#--------------------------------------------------------------------------
# ● スクロール中判定
#--------------------------------------------------------------------------
def scrolling?
@scroll_rest > 0
end
#--------------------------------------------------------------------------
# ● フレーム更新
# main : インタプリタ更新フラグ
#--------------------------------------------------------------------------
def update(main = false)
refresh if @need_refresh
update_interpreter if main
update_scroll
update_events
update_vehicles
update_parallax
@screen.update
end
#--------------------------------------------------------------------------
# ● スクロールの更新
#--------------------------------------------------------------------------
def update_scroll
return unless scrolling?
last_x = @display_x
last_y = @display_y
do_scroll(@scroll_direction, scroll_distance)
if @display_x == last_x && @display_y == last_y
@scroll_rest = 0
else
@scroll_rest -= scroll_distance
end
end
#--------------------------------------------------------------------------
# ● スクロール距離の計算
#--------------------------------------------------------------------------
def scroll_distance
2 ** @scroll_speed / 256.0
end
#--------------------------------------------------------------------------
# ● スクロールの実行
#--------------------------------------------------------------------------
def do_scroll(direction, distance)
case direction
when 2; scroll_down (distance)
when 4; scroll_left (distance)
when 6; scroll_right(distance)
when 8; scroll_up (distance)
end
end
#--------------------------------------------------------------------------
# ● イベントの更新
#--------------------------------------------------------------------------
def update_events
@events.each_value {|event| event.update }
@common_events.each {|event| event.update }
end
#--------------------------------------------------------------------------
# ● 乗り物の更新
#--------------------------------------------------------------------------
def update_vehicles
@vehicles.each {|vehicle| vehicle.update }
end
#--------------------------------------------------------------------------
# ● 遠景の更新
#--------------------------------------------------------------------------
def update_parallax
@parallax_x += @parallax_sx / 64.0 if @parallax_loop_x
@parallax_y += @parallax_sy / 64.0 if @parallax_loop_y
end
#--------------------------------------------------------------------------
# ● タイルセットの変更
#--------------------------------------------------------------------------
def change_tileset(tileset_id)
@tileset_id = tileset_id
refresh
end
#--------------------------------------------------------------------------
# ● 戦闘背景の変更
#--------------------------------------------------------------------------
def change_battleback(battleback1_name, battleback2_name)
@battleback1_name = battleback1_name
@battleback2_name = battleback2_name
end
#--------------------------------------------------------------------------
# ● 遠景の変更
#--------------------------------------------------------------------------
def change_parallax(name, loop_x, loop_y, sx, sy)
@parallax_name = name
@parallax_x = 0 if @parallax_loop_x && !loop_x
@parallax_y = 0 if @parallax_loop_y && !loop_y
@parallax_loop_x = loop_x
@parallax_loop_y = loop_y
@parallax_sx = sx
@parallax_sy = sy
end
#--------------------------------------------------------------------------
# ● インタプリタの更新
#--------------------------------------------------------------------------
def update_interpreter
loop do
@interpreter.update
return if @interpreter.running?
if @interpreter.event_id > 0
unlock_event(@interpreter.event_id)
@interpreter.clear
end
return unless setup_starting_event
end
end
#--------------------------------------------------------------------------
# ● イベントのロック解除
#--------------------------------------------------------------------------
def unlock_event(event_id)
@events[event_id].unlock if @events[event_id]
end
#--------------------------------------------------------------------------
# ● 起動中イベントのセットアップ
#--------------------------------------------------------------------------
def setup_starting_event
refresh if @need_refresh
return true if @interpreter.setup_reserved_common_event
return true if setup_starting_map_event
return true if setup_autorun_common_event
return false
end
#--------------------------------------------------------------------------
# ● 起動中マップイベントの存在判定
#--------------------------------------------------------------------------
def any_event_starting?
@events.values.any? {|event| event.starting }
end
#--------------------------------------------------------------------------
# ● 起動中のマップイベントを検出/セットアップ
#--------------------------------------------------------------------------
def setup_starting_map_event
event = @events.values.find {|event| event.starting }
event.clear_starting_flag if event
@interpreter.setup(event.list, event.id) if event
event
end
#--------------------------------------------------------------------------
# ● 自動実行のコモンイベントを検出/セットアップ
#--------------------------------------------------------------------------
def setup_autorun_common_event
event = $data_common_events.find do |event|
event && event.autorun? && $game_switches[event.switch_id]
end
@interpreter.setup(event.list) if event
event
end
end

101
Scripts/Game_Message.rb Normal file
View file

@ -0,0 +1,101 @@
#==============================================================================
# ■ Game_Message
#------------------------------------------------------------------------------
#  文章や選択肢などを表示するメッセージウィンドウの状態を扱うクラスです。この
# クラスのインスタンスは $game_message で参照されます。
#==============================================================================
class Game_Message
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :texts # 文章の配列(行単位)
attr_reader :choices # 選択肢の配列
attr_accessor :face_name # 顔グラフィック ファイル名
attr_accessor :face_index # 顔グラフィック インデックス
attr_accessor :background # 背景タイプ
attr_accessor :position # 表示位置
attr_accessor :choice_proc # 選択肢 コールバックProc
attr_accessor :choice_cancel_type # 選択肢 キャンセルの場合
attr_accessor :num_input_variable_id # 数値入力 変数 ID
attr_accessor :num_input_digits_max # 数値入力 桁数
attr_accessor :item_choice_variable_id # アイテム選択 変数 ID
attr_accessor :scroll_mode # スクロール文章フラグ
attr_accessor :scroll_speed # スクロール文章:速度
attr_accessor :scroll_no_fast # スクロール文章:早送り無効
attr_accessor :visible # メッセージ表示中
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
clear
@visible = false
end
#--------------------------------------------------------------------------
# ● クリア
#--------------------------------------------------------------------------
def clear
@texts = []
@choices = []
@face_name = ""
@face_index = 0
@background = 0
@position = 2
@choice_cancel_type = 0
@choice_proc = nil
@num_input_variable_id = 0
@num_input_digits_max = 0
@item_choice_variable_id = 0
@scroll_mode = false
@scroll_speed = 2
@scroll_no_fast = false
end
#--------------------------------------------------------------------------
# ● テキストの追加
#--------------------------------------------------------------------------
def add(text)
@texts.push(text)
end
#--------------------------------------------------------------------------
# ● テキストの存在判定
#--------------------------------------------------------------------------
def has_text?
@texts.size > 0
end
#--------------------------------------------------------------------------
# ● 選択肢モード判定
#--------------------------------------------------------------------------
def choice?
@choices.size > 0
end
#--------------------------------------------------------------------------
# ● 数値入力モード判定
#--------------------------------------------------------------------------
def num_input?
@num_input_variable_id > 0
end
#--------------------------------------------------------------------------
# ● アイテム選択モード判定
#--------------------------------------------------------------------------
def item_choice?
@item_choice_variable_id > 0
end
#--------------------------------------------------------------------------
# ● ビジー判定
#--------------------------------------------------------------------------
def busy?
has_text? || choice? || num_input? || item_choice?
end
#--------------------------------------------------------------------------
# ● 改ページ
#--------------------------------------------------------------------------
def new_page
@texts[-1] += "\f" if @texts.size > 0
end
#--------------------------------------------------------------------------
# ● 改行込みの全テキストを取得
#--------------------------------------------------------------------------
def all_text
@texts.inject("") {|r, text| r += text + "\n" }
end
end

416
Scripts/Game_Party.rb Normal file
View file

@ -0,0 +1,416 @@
#==============================================================================
# ■ Game_Party
#------------------------------------------------------------------------------
#  パーティを扱うクラスです。所持金やアイテムなどの情報が含まれます。このクラ
# スのインスタンスは $game_party で参照されます。
#==============================================================================
class Game_Party < Game_Unit
#--------------------------------------------------------------------------
# ● 定数
#--------------------------------------------------------------------------
ABILITY_ENCOUNTER_HALF = 0 # エンカウント半減
ABILITY_ENCOUNTER_NONE = 1 # エンカウント無効
ABILITY_CANCEL_SURPRISE = 2 # 不意打ち無効
ABILITY_RAISE_PREEMPTIVE = 3 # 先制攻撃率アップ
ABILITY_GOLD_DOUBLE = 4 # 獲得金額二倍
ABILITY_DROP_ITEM_DOUBLE = 5 # アイテム入手率二倍
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :gold # 所持金
attr_reader :steps # 歩数
attr_reader :last_item # カーソル記憶用 : アイテム
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super
@gold = 0
@steps = 0
@last_item = Game_BaseItem.new
@menu_actor_id = 0
@target_actor_id = 0
@actors = []
init_all_items
end
#--------------------------------------------------------------------------
# ● 全アイテムリストの初期化
#--------------------------------------------------------------------------
def init_all_items
@items = {}
@weapons = {}
@armors = {}
end
#--------------------------------------------------------------------------
# ● 存在判定
#--------------------------------------------------------------------------
def exists
!@actors.empty?
end
#--------------------------------------------------------------------------
# ● メンバーの取得
#--------------------------------------------------------------------------
def members
in_battle ? battle_members : all_members
end
#--------------------------------------------------------------------------
# ● 全メンバーの取得
#--------------------------------------------------------------------------
def all_members
@actors.collect {|id| $game_actors[id] }
end
#--------------------------------------------------------------------------
# ● バトルメンバーの取得
#--------------------------------------------------------------------------
def battle_members
all_members[0, max_battle_members].select {|actor| actor.exist? }
end
#--------------------------------------------------------------------------
# ● バトルメンバーの最大数を取得
#--------------------------------------------------------------------------
def max_battle_members
return 4
end
#--------------------------------------------------------------------------
# ● リーダーの取得
#--------------------------------------------------------------------------
def leader
battle_members[0]
end
#--------------------------------------------------------------------------
# ● アイテムオブジェクトの配列取得
#--------------------------------------------------------------------------
def items
@items.keys.sort.collect {|id| $data_items[id] }
end
#--------------------------------------------------------------------------
# ● 武器オブジェクトの配列取得
#--------------------------------------------------------------------------
def weapons
@weapons.keys.sort.collect {|id| $data_weapons[id] }
end
#--------------------------------------------------------------------------
# ● 防具オブジェクトの配列取得
#--------------------------------------------------------------------------
def armors
@armors.keys.sort.collect {|id| $data_armors[id] }
end
#--------------------------------------------------------------------------
# ● 全ての装備品オブジェクトの配列取得
#--------------------------------------------------------------------------
def equip_items
weapons + armors
end
#--------------------------------------------------------------------------
# ● 全てのアイテムオブジェクトの配列取得
#--------------------------------------------------------------------------
def all_items
items + equip_items
end
#--------------------------------------------------------------------------
# ● アイテムのクラスに対応するコンテナオブジェクトを取得
#--------------------------------------------------------------------------
def item_container(item_class)
return @items if item_class == RPG::Item
return @weapons if item_class == RPG::Weapon
return @armors if item_class == RPG::Armor
return nil
end
#--------------------------------------------------------------------------
# ● 初期パーティのセットアップ
#--------------------------------------------------------------------------
def setup_starting_members
@actors = $data_system.party_members.clone
end
#--------------------------------------------------------------------------
# ● パーティ名の取得
# 一人ならそのアクターの名前、複数なら "○○たち" を返す。
#--------------------------------------------------------------------------
def name
return "" if battle_members.size == 0
return leader.name if battle_members.size == 1
return sprintf(Vocab::PartyName, leader.name)
end
#--------------------------------------------------------------------------
# ● 戦闘テストのセットアップ
#--------------------------------------------------------------------------
def setup_battle_test
setup_battle_test_members
setup_battle_test_items
end
#--------------------------------------------------------------------------
# ● 戦闘テスト用パーティのセットアップ
#--------------------------------------------------------------------------
def setup_battle_test_members
$data_system.test_battlers.each do |battler|
actor = $game_actors[battler.actor_id]
actor.change_level(battler.level, false)
actor.init_equips(battler.equips)
actor.recover_all
add_actor(actor.id)
end
end
#--------------------------------------------------------------------------
# ● 戦闘テスト用アイテムのセットアップ
#--------------------------------------------------------------------------
def setup_battle_test_items
$data_items.each do |item|
gain_item(item, max_item_number(item)) if item && !item.name.empty?
end
end
#--------------------------------------------------------------------------
# ● パーティメンバーの最も高いレベルの取得
#--------------------------------------------------------------------------
def highest_level
lv = members.collect {|actor| actor.level }.max
end
#--------------------------------------------------------------------------
# ● アクターを加える
#--------------------------------------------------------------------------
def add_actor(actor_id)
@actors.push(actor_id) unless @actors.include?(actor_id)
$game_player.refresh
$game_map.need_refresh = true
end
#--------------------------------------------------------------------------
# ● アクターを外す
#--------------------------------------------------------------------------
def remove_actor(actor_id)
@actors.delete(actor_id)
$game_player.refresh
$game_map.need_refresh = true
end
#--------------------------------------------------------------------------
# ● 所持金の増加(減少)
#--------------------------------------------------------------------------
def gain_gold(amount)
@gold = [[@gold + amount, 0].max, max_gold].min
end
#--------------------------------------------------------------------------
# ● 所持金の減少
#--------------------------------------------------------------------------
def lose_gold(amount)
gain_gold(-amount)
end
#--------------------------------------------------------------------------
# ● 所持金の最大値を取得
#--------------------------------------------------------------------------
def max_gold
return 99999999
end
#--------------------------------------------------------------------------
# ● 歩数増加
#--------------------------------------------------------------------------
def increase_steps
@steps += 1
end
#--------------------------------------------------------------------------
# ● アイテムの所持数取得
#--------------------------------------------------------------------------
def item_number(item)
container = item_container(item.class)
container ? container[item.id] || 0 : 0
end
#--------------------------------------------------------------------------
# ● アイテムの最大所持数取得
#--------------------------------------------------------------------------
def max_item_number(item)
return 99
end
#--------------------------------------------------------------------------
# ● アイテムを最大まで所持しているか判定
#--------------------------------------------------------------------------
def item_max?(item)
item_number(item) >= max_item_number(item)
end
#--------------------------------------------------------------------------
# ● アイテムの所持判定
# include_equip : 装備品も含める
#--------------------------------------------------------------------------
def has_item?(item, include_equip = false)
return true if item_number(item) > 0
return include_equip ? members_equip_include?(item) : false
end
#--------------------------------------------------------------------------
# ● 指定アイテムがメンバーの装備品に含まれているかを判定
#--------------------------------------------------------------------------
def members_equip_include?(item)
members.any? {|actor| actor.equips.include?(item) }
end
#--------------------------------------------------------------------------
# ● アイテムの増加(減少)
# include_equip : 装備品も含める
#--------------------------------------------------------------------------
def gain_item(item, amount, include_equip = false)
container = item_container(item.class)
return unless container
last_number = item_number(item)
new_number = last_number + amount
container[item.id] = [[new_number, 0].max, max_item_number(item)].min
container.delete(item.id) if container[item.id] == 0
if include_equip && new_number < 0
discard_members_equip(item, -new_number)
end
$game_map.need_refresh = true
end
#--------------------------------------------------------------------------
# ● メンバーの装備品を破棄する
#--------------------------------------------------------------------------
def discard_members_equip(item, amount)
n = amount
members.each do |actor|
while n > 0 && actor.equips.include?(item)
actor.discard_equip(item)
n -= 1
end
end
end
#--------------------------------------------------------------------------
# ● アイテムの減少
# include_equip : 装備品も含める
#--------------------------------------------------------------------------
def lose_item(item, amount, include_equip = false)
gain_item(item, -amount, include_equip)
end
#--------------------------------------------------------------------------
# ● アイテムの消耗
# 指定されたオブジェクトが消耗アイテムであれば、所持数を 1 減らす。
#--------------------------------------------------------------------------
def consume_item(item)
lose_item(item, 1) if item.is_a?(RPG::Item) && item.consumable
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの使用可能判定
#--------------------------------------------------------------------------
def usable?(item)
members.any? {|actor| actor.usable?(item) }
end
#--------------------------------------------------------------------------
# ● 戦闘時コマンド入力可能判定
#--------------------------------------------------------------------------
def inputable?
members.any? {|actor| actor.inputable? }
end
#--------------------------------------------------------------------------
# ● 全滅判定
#--------------------------------------------------------------------------
def all_dead?
super && ($game_party.in_battle || members.size > 0)
end
#--------------------------------------------------------------------------
# ● プレイヤーが 1 歩動いたときの処理
#--------------------------------------------------------------------------
def on_player_walk
members.each {|actor| actor.on_player_walk }
end
#--------------------------------------------------------------------------
# ● メニュー画面で選択中のアクターを取得
#--------------------------------------------------------------------------
def menu_actor
$game_actors[@menu_actor_id] || members[0]
end
#--------------------------------------------------------------------------
# ● メニュー画面で選択中のアクターを設定
#--------------------------------------------------------------------------
def menu_actor=(actor)
@menu_actor_id = actor.id
end
#--------------------------------------------------------------------------
# ● メニュー画面で次のアクターを選択
#--------------------------------------------------------------------------
def menu_actor_next
index = members.index(menu_actor) || -1
index = (index + 1) % members.size
self.menu_actor = members[index]
end
#--------------------------------------------------------------------------
# ● メニュー画面で前のアクターを選択
#--------------------------------------------------------------------------
def menu_actor_prev
index = members.index(menu_actor) || 1
index = (index + members.size - 1) % members.size
self.menu_actor = members[index]
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの使用対象となったアクターを取得
#--------------------------------------------------------------------------
def target_actor
$game_actors[@target_actor_id] || members[0]
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの使用対象となったアクターを設定
#--------------------------------------------------------------------------
def target_actor=(actor)
@target_actor_id = actor.id
end
#--------------------------------------------------------------------------
# ● 順序入れ替え
#--------------------------------------------------------------------------
def swap_order(index1, index2)
@actors[index1], @actors[index2] = @actors[index2], @actors[index1]
$game_player.refresh
end
#--------------------------------------------------------------------------
# ● セーブファイル表示用のキャラクター画像情報
#--------------------------------------------------------------------------
def characters_for_savefile
battle_members.collect do |actor|
[actor.character_name, actor.character_index]
end
end
#--------------------------------------------------------------------------
# ● パーティ能力判定
#--------------------------------------------------------------------------
def party_ability(ability_id)
battle_members.any? {|actor| actor.party_ability(ability_id) }
end
#--------------------------------------------------------------------------
# ● エンカウント半減?
#--------------------------------------------------------------------------
def encounter_half?
party_ability(ABILITY_ENCOUNTER_HALF)
end
#--------------------------------------------------------------------------
# ● エンカウント無効?
#--------------------------------------------------------------------------
def encounter_none?
party_ability(ABILITY_ENCOUNTER_NONE)
end
#--------------------------------------------------------------------------
# ● 不意打ち無効?
#--------------------------------------------------------------------------
def cancel_surprise?
party_ability(ABILITY_CANCEL_SURPRISE)
end
#--------------------------------------------------------------------------
# ● 先制攻撃率アップ?
#--------------------------------------------------------------------------
def raise_preemptive?
party_ability(ABILITY_RAISE_PREEMPTIVE)
end
#--------------------------------------------------------------------------
# ● 獲得金額二倍?
#--------------------------------------------------------------------------
def gold_double?
party_ability(ABILITY_GOLD_DOUBLE)
end
#--------------------------------------------------------------------------
# ● アイテム入手率二倍?
#--------------------------------------------------------------------------
def drop_item_double?
party_ability(ABILITY_DROP_ITEM_DOUBLE)
end
#--------------------------------------------------------------------------
# ● 先制攻撃の確率計算
#--------------------------------------------------------------------------
def rate_preemptive(troop_agi)
(agi >= troop_agi ? 0.05 : 0.03) * (raise_preemptive? ? 4 : 1)
end
#--------------------------------------------------------------------------
# ● 不意打ちの確率計算
#--------------------------------------------------------------------------
def rate_surprise(troop_agi)
cancel_surprise? ? 0 : (agi >= troop_agi ? 0.03 : 0.05)
end
end

160
Scripts/Game_Picture.rb Normal file
View file

@ -0,0 +1,160 @@
#==============================================================================
# ■ Game_Picture
#------------------------------------------------------------------------------
#  ピクチャを扱うクラスです。このクラスは Game_Pictures クラスの内部で、特定
# の番号のピクチャが必要になったときだけ作成されます。
#==============================================================================
class Game_Picture
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :number # ピクチャ番号
attr_reader :name # ファイル名
attr_reader :origin # 原点
attr_reader :x # X 座標
attr_reader :y # Y 座標
attr_reader :zoom_x # X 方向拡大率
attr_reader :zoom_y # Y 方向拡大率
attr_reader :opacity # 不透明度
attr_reader :blend_type # ブレンド方法
attr_reader :tone # 色調
attr_reader :angle # 回転角度
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(number)
@number = number
init_basic
init_target
init_tone
init_rotate
end
#--------------------------------------------------------------------------
# ● 基本変数の初期化
#--------------------------------------------------------------------------
def init_basic
@name = ""
@origin = @x = @y = 0
@zoom_x = @zoom_y = 100.0
@opacity = 255.0
@blend_type = 1
end
#--------------------------------------------------------------------------
# ● 移動目標の初期化
#--------------------------------------------------------------------------
def init_target
@target_x = @x
@target_y = @y
@target_zoom_x = @zoom_x
@target_zoom_y = @zoom_y
@target_opacity = @opacity
@duration = 0
end
#--------------------------------------------------------------------------
# ● 色調の初期化
#--------------------------------------------------------------------------
def init_tone
@tone = Tone.new
@tone_target = Tone.new
@tone_duration = 0
end
#--------------------------------------------------------------------------
# ● 回転の初期化
#--------------------------------------------------------------------------
def init_rotate
@angle = 0
@rotate_speed = 0
end
#--------------------------------------------------------------------------
# ● ピクチャの表示
#--------------------------------------------------------------------------
def show(name, origin, x, y, zoom_x, zoom_y, opacity, blend_type)
@name = name
@origin = origin
@x = x.to_f
@y = y.to_f
@zoom_x = zoom_x.to_f
@zoom_y = zoom_y.to_f
@opacity = opacity.to_f
@blend_type = blend_type
init_target
init_tone
init_rotate
end
#--------------------------------------------------------------------------
# ● ピクチャの移動
#--------------------------------------------------------------------------
def move(origin, x, y, zoom_x, zoom_y, opacity, blend_type, duration)
@origin = origin
@target_x = x.to_f
@target_y = y.to_f
@target_zoom_x = zoom_x.to_f
@target_zoom_y = zoom_y.to_f
@target_opacity = opacity.to_f
@blend_type = blend_type
@duration = duration
end
#--------------------------------------------------------------------------
# ● 回転速度の変更
#--------------------------------------------------------------------------
def rotate(speed)
@rotate_speed = speed
end
#--------------------------------------------------------------------------
# ● 色調変更の開始
#--------------------------------------------------------------------------
def start_tone_change(tone, duration)
@tone_target = tone.clone
@tone_duration = duration
@tone = @tone_target.clone if @tone_duration == 0
end
#--------------------------------------------------------------------------
# ● ピクチャの消去
#--------------------------------------------------------------------------
def erase
@name = ""
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
update_move
update_tone_change
update_rotate
end
#--------------------------------------------------------------------------
# ● ピクチャ移動の更新
#--------------------------------------------------------------------------
def update_move
return if @duration == 0
d = @duration
@x = (@x * (d - 1) + @target_x) / d
@y = (@y * (d - 1) + @target_y) / d
@zoom_x = (@zoom_x * (d - 1) + @target_zoom_x) / d
@zoom_y = (@zoom_y * (d - 1) + @target_zoom_y) / d
@opacity = (@opacity * (d - 1) + @target_opacity) / d
@duration -= 1
end
#--------------------------------------------------------------------------
# ● 色調変更の更新
#--------------------------------------------------------------------------
def update_tone_change
return if @tone_duration == 0
d = @tone_duration
@tone.red = (@tone.red * (d - 1) + @tone_target.red) / d
@tone.green = (@tone.green * (d - 1) + @tone_target.green) / d
@tone.blue = (@tone.blue * (d - 1) + @tone_target.blue) / d
@tone.gray = (@tone.gray * (d - 1) + @tone_target.gray) / d
@tone_duration -= 1
end
#--------------------------------------------------------------------------
# ● 回転の更新
#--------------------------------------------------------------------------
def update_rotate
return if @rotate_speed == 0
@angle += @rotate_speed / 2.0
@angle += 360 while @angle < 0
@angle %= 360
end
end

27
Scripts/Game_Pictures.rb Normal file
View file

@ -0,0 +1,27 @@
#==============================================================================
# ■ Game_Pictures
#------------------------------------------------------------------------------
#  ピクチャの配列のラッパーです。このクラスは Game_Screen クラスの内部で使用
# されます。マップ画面のピクチャとバトル画面のピクチャは別々に扱われます。
#==============================================================================
class Game_Pictures
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
@data = []
end
#--------------------------------------------------------------------------
# ● ピクチャの取得
#--------------------------------------------------------------------------
def [](number)
@data[number] ||= Game_Picture.new(number)
end
#--------------------------------------------------------------------------
# ● イテレータ
#--------------------------------------------------------------------------
def each
@data.compact.each {|picture| yield picture } if block_given?
end
end

486
Scripts/Game_Player.rb Normal file
View file

@ -0,0 +1,486 @@
#==============================================================================
# ■ Game_Player
#------------------------------------------------------------------------------
#  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの
# 機能を持っています。このクラスのインスタンスは $game_player で参照されます。
#==============================================================================
class Game_Player < Game_Character
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :followers # フォロワー(隊列メンバー)
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super
@vehicle_type = :walk # 現在乗っている乗り物の種類
@vehicle_getting_on = false # 乗る動作の途中フラグ
@vehicle_getting_off = false # 降りる動作の途中フラグ
@followers = Game_Followers.new(self)
@transparent = $data_system.opt_transparent
clear_transfer_info
end
#--------------------------------------------------------------------------
# ● 場所移動情報のクリア
#--------------------------------------------------------------------------
def clear_transfer_info
@transferring = false # 場所移動フラグ
@new_map_id = 0 # 移動先 マップ ID
@new_x = 0 # 移動先 X 座標
@new_y = 0 # 移動先 Y 座標
@new_direction = 0 # 移動後の向き
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
@character_name = actor ? actor.character_name : ""
@character_index = actor ? actor.character_index : 0
@followers.refresh
end
#--------------------------------------------------------------------------
# ● 対応するアクターの取得
#--------------------------------------------------------------------------
def actor
$game_party.battle_members[0]
end
#--------------------------------------------------------------------------
# ● 停止中判定
#--------------------------------------------------------------------------
def stopping?
return false if @vehicle_getting_on || @vehicle_getting_off
return super
end
#--------------------------------------------------------------------------
# ● 場所移動の予約
# d : 移動後の向き2,4,6,8
#--------------------------------------------------------------------------
def reserve_transfer(map_id, x, y, d = 2)
@transferring = true
@new_map_id = map_id
@new_x = x
@new_y = y
@new_direction = d
end
#--------------------------------------------------------------------------
# ● 場所移動の予約中判定
#--------------------------------------------------------------------------
def transfer?
@transferring
end
#--------------------------------------------------------------------------
# ● 場所移動の実行
#--------------------------------------------------------------------------
def perform_transfer
if transfer?
set_direction(@new_direction)
if @new_map_id != $game_map.map_id
$game_map.setup(@new_map_id)
$game_map.autoplay
end
moveto(@new_x, @new_y)
clear_transfer_info
end
end
#--------------------------------------------------------------------------
# ● マップ通行可能判定
# d : 方向2,4,6,8
#--------------------------------------------------------------------------
def map_passable?(x, y, d)
case @vehicle_type
when :boat
$game_map.boat_passable?(x, y)
when :ship
$game_map.ship_passable?(x, y)
when :airship
true
else
super
end
end
#--------------------------------------------------------------------------
# ● 現在乗っている乗り物を取得
#--------------------------------------------------------------------------
def vehicle
$game_map.vehicle(@vehicle_type)
end
#--------------------------------------------------------------------------
# ● 小型船に乗っている状態判定
#--------------------------------------------------------------------------
def in_boat?
@vehicle_type == :boat
end
#--------------------------------------------------------------------------
# ● 大型船に乗っている状態判定
#--------------------------------------------------------------------------
def in_ship?
@vehicle_type == :ship
end
#--------------------------------------------------------------------------
# ● 飛行船に乗っている状態判定
#--------------------------------------------------------------------------
def in_airship?
@vehicle_type == :airship
end
#--------------------------------------------------------------------------
# ● 通常歩行状態判定
#--------------------------------------------------------------------------
def normal_walk?
@vehicle_type == :walk && !@move_route_forcing
end
#--------------------------------------------------------------------------
# ● ダッシュ状態判定
#--------------------------------------------------------------------------
def dash?
return false if @move_route_forcing
return false if $game_map.disable_dash?
return false if vehicle
return Input.press?(:A)
end
#--------------------------------------------------------------------------
# ● デバッグすり抜け状態判定
#--------------------------------------------------------------------------
def debug_through?
$TEST && Input.press?(:CTRL)
end
#--------------------------------------------------------------------------
# ● 衝突判定(フォロワーを含む)
#--------------------------------------------------------------------------
def collide?(x, y)
!@through && (pos?(x, y) || followers.collide?(x, y))
end
#--------------------------------------------------------------------------
# ● 画面中央の X 座標
#--------------------------------------------------------------------------
def center_x
(Graphics.width / 32 - 1) / 2.0
end
#--------------------------------------------------------------------------
# ● 画面中央の Y 座標
#--------------------------------------------------------------------------
def center_y
(Graphics.height / 32 - 1) / 2.0
end
#--------------------------------------------------------------------------
# ● 画面中央に来るようにマップの表示位置を設定
#--------------------------------------------------------------------------
def center(x, y)
$game_map.set_display_pos(x - center_x, y - center_y)
end
#--------------------------------------------------------------------------
# ● 指定位置に移動
#--------------------------------------------------------------------------
def moveto(x, y)
super
center(x, y)
make_encounter_count
vehicle.refresh if vehicle
@followers.synchronize(x, y, direction)
end
#--------------------------------------------------------------------------
# ● 歩数増加
#--------------------------------------------------------------------------
def increase_steps
super
$game_party.increase_steps if normal_walk?
end
#--------------------------------------------------------------------------
# ● エンカウント カウント作成
#--------------------------------------------------------------------------
def make_encounter_count
n = $game_map.encounter_step
@encounter_count = rand(n) + rand(n) + 1
end
#--------------------------------------------------------------------------
# ● エンカウントする敵グループの ID を作成
#--------------------------------------------------------------------------
def make_encounter_troop_id
encounter_list = []
weight_sum = 0
$game_map.encounter_list.each do |encounter|
next unless encounter_ok?(encounter)
encounter_list.push(encounter)
weight_sum += encounter.weight
end
if weight_sum > 0
value = rand(weight_sum)
encounter_list.each do |encounter|
value -= encounter.weight
return encounter.troop_id if value < 0
end
end
return 0
end
#--------------------------------------------------------------------------
# ● エンカウント項目の採用可能判定
#--------------------------------------------------------------------------
def encounter_ok?(encounter)
return true if encounter.region_set.empty?
return true if encounter.region_set.include?(region_id)
return false
end
#--------------------------------------------------------------------------
# ● エンカウント処理の実行
#--------------------------------------------------------------------------
def encounter
return false if $game_map.interpreter.running?
return false if $game_system.encounter_disabled
return false if @encounter_count > 0
make_encounter_count
troop_id = make_encounter_troop_id
return false unless $data_troops[troop_id]
BattleManager.setup(troop_id)
BattleManager.on_encounter
return true
end
#--------------------------------------------------------------------------
# ● マップイベントの起動
# triggers : トリガーの配列
# normal : プライオリティ[通常キャラと同じ]かそれ以外か
#--------------------------------------------------------------------------
def start_map_event(x, y, triggers, normal)
$game_map.events_xy(x, y).each do |event|
if event.trigger_in?(triggers) && event.normal_priority? == normal
event.start
end
end
end
#--------------------------------------------------------------------------
# ● 同位置のイベント起動判定
#--------------------------------------------------------------------------
def check_event_trigger_here(triggers)
start_map_event(@x, @y, triggers, false)
end
#--------------------------------------------------------------------------
# ● 正面のイベント起動判定
#--------------------------------------------------------------------------
def check_event_trigger_there(triggers)
x2 = $game_map.round_x_with_direction(@x, @direction)
y2 = $game_map.round_y_with_direction(@y, @direction)
start_map_event(x2, y2, triggers, true)
return if $game_map.any_event_starting?
return unless $game_map.counter?(x2, y2)
x3 = $game_map.round_x_with_direction(x2, @direction)
y3 = $game_map.round_y_with_direction(y2, @direction)
start_map_event(x3, y3, triggers, true)
end
#--------------------------------------------------------------------------
# ● 接触イベントの起動判定
#--------------------------------------------------------------------------
def check_event_trigger_touch(x, y)
start_map_event(x, y, [1,2], true)
end
#--------------------------------------------------------------------------
# ● 方向ボタン入力による移動処理
#--------------------------------------------------------------------------
def move_by_input
return if !movable? || $game_map.interpreter.running?
move_straight(Input.dir4) if Input.dir4 > 0
end
#--------------------------------------------------------------------------
# ● 移動可能判定
#--------------------------------------------------------------------------
def movable?
return false if moving?
return false if @move_route_forcing || @followers.gathering?
return false if @vehicle_getting_on || @vehicle_getting_off
return false if $game_message.busy? || $game_message.visible
return false if vehicle && !vehicle.movable?
return true
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
last_real_x = @real_x
last_real_y = @real_y
last_moving = moving?
move_by_input
super
update_scroll(last_real_x, last_real_y)
update_vehicle
update_nonmoving(last_moving) unless moving?
@followers.update
end
#--------------------------------------------------------------------------
# ● スクロール処理
#--------------------------------------------------------------------------
def update_scroll(last_real_x, last_real_y)
ax1 = $game_map.adjust_x(last_real_x)
ay1 = $game_map.adjust_y(last_real_y)
ax2 = $game_map.adjust_x(@real_x)
ay2 = $game_map.adjust_y(@real_y)
$game_map.scroll_down (ay2 - ay1) if ay2 > ay1 && ay2 > center_y
$game_map.scroll_left (ax1 - ax2) if ax2 < ax1 && ax2 < center_x
$game_map.scroll_right(ax2 - ax1) if ax2 > ax1 && ax2 > center_x
$game_map.scroll_up (ay1 - ay2) if ay2 < ay1 && ay2 < center_y
end
#--------------------------------------------------------------------------
# ● 乗り物の処理
#--------------------------------------------------------------------------
def update_vehicle
return if @followers.gathering?
return unless vehicle
if @vehicle_getting_on
update_vehicle_get_on
elsif @vehicle_getting_off
update_vehicle_get_off
else
vehicle.sync_with_player
end
end
#--------------------------------------------------------------------------
# ● 乗り物に乗る動作の更新
#--------------------------------------------------------------------------
def update_vehicle_get_on
if !@followers.gathering? && !moving?
@direction = vehicle.direction
@move_speed = vehicle.speed
@vehicle_getting_on = false
@transparent = true
@through = true if in_airship?
vehicle.get_on
end
end
#--------------------------------------------------------------------------
# ● 乗り物から降りる動作の更新
#--------------------------------------------------------------------------
def update_vehicle_get_off
if !@followers.gathering? && vehicle.altitude == 0
@vehicle_getting_off = false
@vehicle_type = :walk
@transparent = false
end
end
#--------------------------------------------------------------------------
# ● 移動中でない場合の処理
# last_moving : 直前に移動中だったか
#--------------------------------------------------------------------------
def update_nonmoving(last_moving)
return if $game_map.interpreter.running?
if last_moving
$game_party.on_player_walk
return if check_touch_event
end
if movable? && Input.trigger?(:C)
return if get_on_off_vehicle
return if check_action_event
end
update_encounter if last_moving
end
#--------------------------------------------------------------------------
# ● エンカウントの更新
#--------------------------------------------------------------------------
def update_encounter
return if $TEST && Input.press?(:CTRL)
return if $game_party.encounter_none?
return if in_airship?
return if @move_route_forcing
@encounter_count -= encounter_progress_value
end
#--------------------------------------------------------------------------
# ● エンカウント進行値の取得
#--------------------------------------------------------------------------
def encounter_progress_value
value = $game_map.bush?(@x, @y) ? 2 : 1
value *= 0.5 if $game_party.encounter_half?
value *= 0.5 if in_ship?
value
end
#--------------------------------------------------------------------------
# ● 接触(重なり)によるイベント起動判定
#--------------------------------------------------------------------------
def check_touch_event
return false if in_airship?
check_event_trigger_here([1,2])
$game_map.setup_starting_event
end
#--------------------------------------------------------------------------
# ● 決定ボタンによるイベント起動判定
#--------------------------------------------------------------------------
def check_action_event
return false if in_airship?
check_event_trigger_here([0])
return true if $game_map.setup_starting_event
check_event_trigger_there([0,1,2])
$game_map.setup_starting_event
end
#--------------------------------------------------------------------------
# ● 乗り物の乗降
#--------------------------------------------------------------------------
def get_on_off_vehicle
if vehicle
get_off_vehicle
else
get_on_vehicle
end
end
#--------------------------------------------------------------------------
# ● 乗り物に乗る
# 現在乗り物に乗っていないことが前提。
#--------------------------------------------------------------------------
def get_on_vehicle
front_x = $game_map.round_x_with_direction(@x, @direction)
front_y = $game_map.round_y_with_direction(@y, @direction)
@vehicle_type = :boat if $game_map.boat.pos?(front_x, front_y)
@vehicle_type = :ship if $game_map.ship.pos?(front_x, front_y)
@vehicle_type = :airship if $game_map.airship.pos?(@x, @y)
if vehicle
@vehicle_getting_on = true
force_move_forward unless in_airship?
@followers.gather
end
@vehicle_getting_on
end
#--------------------------------------------------------------------------
# ● 乗り物から降りる
# 現在乗り物に乗っていることが前提。
#--------------------------------------------------------------------------
def get_off_vehicle
if vehicle.land_ok?(@x, @y, @direction)
set_direction(2) if in_airship?
@followers.synchronize(@x, @y, @direction)
vehicle.get_off
unless in_airship?
force_move_forward
@transparent = false
end
@vehicle_getting_off = true
@move_speed = 4
@through = false
make_encounter_count
@followers.gather
end
@vehicle_getting_off
end
#--------------------------------------------------------------------------
# ● 強制的に一歩前進
#--------------------------------------------------------------------------
def force_move_forward
@through = true
move_forward
@through = false
end
#--------------------------------------------------------------------------
# ● ダメージ床判定
#--------------------------------------------------------------------------
def on_damage_floor?
$game_map.damage_floor?(@x, @y) && !in_airship?
end
#--------------------------------------------------------------------------
# ● まっすぐに移動
#--------------------------------------------------------------------------
def move_straight(d, turn_ok = true)
@followers.move if passable?(@x, @y, d)
super
end
#--------------------------------------------------------------------------
# ● 斜めに移動
#--------------------------------------------------------------------------
def move_diagonal(horz, vert)
@followers.move if diagonal_passable?(@x, @y, horz, vert)
super
end
end

233
Scripts/Game_Screen.rb Normal file
View file

@ -0,0 +1,233 @@
#==============================================================================
# ■ Game_Screen
#------------------------------------------------------------------------------
#  色調変更やフラッシュなど、画面全体に関係する処理のデータを保持するクラスで
# す。このクラスは Game_Map クラス、Game_Troop クラスの内部で使用されます。
#==============================================================================
class Game_Screen
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :brightness # 明るさ
attr_reader :tone # 色調
attr_reader :flash_color # フラッシュ色
attr_reader :pictures # ピクチャ
attr_reader :shake # シェイク位置
attr_reader :weather_type # 天候 タイプ
attr_reader :weather_power # 天候 強さ (Float)
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
@pictures = Game_Pictures.new
clear
end
#--------------------------------------------------------------------------
# ● クリア
#--------------------------------------------------------------------------
def clear
clear_fade
clear_tone
clear_flash
clear_shake
clear_weather
clear_pictures
end
#--------------------------------------------------------------------------
# ● フェードイン・アウトのクリア
#--------------------------------------------------------------------------
def clear_fade
@brightness = 255
@fadeout_duration = 0
@fadein_duration = 0
end
#--------------------------------------------------------------------------
# ● 色調のクリア
#--------------------------------------------------------------------------
def clear_tone
@tone = Tone.new
@tone_target = Tone.new
@tone_duration = 0
end
#--------------------------------------------------------------------------
# ● フラッシュのクリア
#--------------------------------------------------------------------------
def clear_flash
@flash_color = Color.new
@flash_duration = 0
end
#--------------------------------------------------------------------------
# ● シェイクのクリア
#--------------------------------------------------------------------------
def clear_shake
@shake_power = 0
@shake_speed = 0
@shake_duration = 0
@shake_direction = 1
@shake = 0
end
#--------------------------------------------------------------------------
# ● 天候のクリア
#--------------------------------------------------------------------------
def clear_weather
@weather_type = :none
@weather_power = 0
@weather_power_target = 0
@weather_duration = 0
end
#--------------------------------------------------------------------------
# ● ピクチャのクリア
#--------------------------------------------------------------------------
def clear_pictures
@pictures.each {|picture| picture.erase }
end
#--------------------------------------------------------------------------
# ● フェードアウトの開始
#--------------------------------------------------------------------------
def start_fadeout(duration)
@fadeout_duration = duration
@fadein_duration = 0
end
#--------------------------------------------------------------------------
# ● フェードインの開始
#--------------------------------------------------------------------------
def start_fadein(duration)
@fadein_duration = duration
@fadeout_duration = 0
end
#--------------------------------------------------------------------------
# ● 色調変更の開始
#--------------------------------------------------------------------------
def start_tone_change(tone, duration)
@tone_target = tone.clone
@tone_duration = duration
@tone = @tone_target.clone if @tone_duration == 0
end
#--------------------------------------------------------------------------
# ● フラッシュの開始
#--------------------------------------------------------------------------
def start_flash(color, duration)
@flash_color = color.clone
@flash_duration = duration
end
#--------------------------------------------------------------------------
# ● シェイクの開始
# power : 強さ
# speed : 速さ
#--------------------------------------------------------------------------
def start_shake(power, speed, duration)
@shake_power = power
@shake_speed = speed
@shake_duration = duration
end
#--------------------------------------------------------------------------
# ● 天候の変更
# type : タイプ (:none, :rain, :storm, :snow)
# power : 強さ
# 雨が段階的に止むような表現を行うため、天候タイプがなし (:none) の場合
# は例外的に @weather_power_target (強さの目標値) を 0 に設定する。
#--------------------------------------------------------------------------
def change_weather(type, power, duration)
@weather_type = type if type != :none || duration == 0
@weather_power_target = type == :none ? 0.0 : power.to_f
@weather_duration = duration
@weather_power = @weather_power_target if duration == 0
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
update_fadeout
update_fadein
update_tone
update_flash
update_shake
update_weather
update_pictures
end
#--------------------------------------------------------------------------
# ● フェードアウトの更新
#--------------------------------------------------------------------------
def update_fadeout
if @fadeout_duration > 0
d = @fadeout_duration
@brightness = (@brightness * (d - 1)) / d
@fadeout_duration -= 1
end
end
#--------------------------------------------------------------------------
# ● フェードインの更新
#--------------------------------------------------------------------------
def update_fadein
if @fadein_duration > 0
d = @fadein_duration
@brightness = (@brightness * (d - 1) + 255) / d
@fadein_duration -= 1
end
end
#--------------------------------------------------------------------------
# ● 色調の更新
#--------------------------------------------------------------------------
def update_tone
if @tone_duration > 0
d = @tone_duration
@tone.red = (@tone.red * (d - 1) + @tone_target.red) / d
@tone.green = (@tone.green * (d - 1) + @tone_target.green) / d
@tone.blue = (@tone.blue * (d - 1) + @tone_target.blue) / d
@tone.gray = (@tone.gray * (d - 1) + @tone_target.gray) / d
@tone_duration -= 1
end
end
#--------------------------------------------------------------------------
# ● フラッシュの更新
#--------------------------------------------------------------------------
def update_flash
if @flash_duration > 0
d = @flash_duration
@flash_color.alpha = @flash_color.alpha * (d - 1) / d
@flash_duration -= 1
end
end
#--------------------------------------------------------------------------
# ● シェイクの更新
#--------------------------------------------------------------------------
def update_shake
if @shake_duration > 0 || @shake != 0
delta = (@shake_power * @shake_speed * @shake_direction) / 10.0
if @shake_duration <= 1 && @shake * (@shake + delta) < 0
@shake = 0
else
@shake += delta
end
@shake_direction = -1 if @shake > @shake_power * 2
@shake_direction = 1 if @shake < - @shake_power * 2
@shake_duration -= 1
end
end
#--------------------------------------------------------------------------
# ● 天候の更新
#--------------------------------------------------------------------------
def update_weather
if @weather_duration > 0
d = @weather_duration
@weather_power = (@weather_power * (d - 1) + @weather_power_target) / d
@weather_duration -= 1
if @weather_duration == 0 && @weather_power_target == 0
@weather_type = :none
end
end
end
#--------------------------------------------------------------------------
# ● ピクチャの更新
#--------------------------------------------------------------------------
def update_pictures
@pictures.each {|picture| picture.update }
end
#--------------------------------------------------------------------------
# ● フラッシュの開始(毒・ダメージ床用)
#--------------------------------------------------------------------------
def start_flash_for_damage
start_flash(Color.new(255,0,0,128), 8)
end
end

View file

@ -0,0 +1,35 @@
#==============================================================================
# ■ Game_SelfSwitches
#------------------------------------------------------------------------------
#  セルフスイッチを扱うクラスです。組み込みクラス Hash のラッパーです。このク
# ラスのインスタンスは $game_self_switches で参照されます。
#==============================================================================
class Game_SelfSwitches
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
@data = {}
end
#--------------------------------------------------------------------------
# ● セルフスイッチの取得
#--------------------------------------------------------------------------
def [](key)
@data[key] == true
end
#--------------------------------------------------------------------------
# ● セルフスイッチの設定
# value : ON (true) / OFF (false)
#--------------------------------------------------------------------------
def []=(key, value)
@data[key] = value
on_change
end
#--------------------------------------------------------------------------
# ● セルフスイッチの設定時の処理
#--------------------------------------------------------------------------
def on_change
$game_map.need_refresh = true
end
end

35
Scripts/Game_Switches.rb Normal file
View file

@ -0,0 +1,35 @@
#==============================================================================
# ■ Game_Switches
#------------------------------------------------------------------------------
#  スイッチを扱うクラスです。組み込みクラス Array のラッパーです。このクラス
# のインスタンスは $game_switches で参照されます。
#==============================================================================
class Game_Switches
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
@data = []
end
#--------------------------------------------------------------------------
# ● スイッチの取得
#--------------------------------------------------------------------------
def [](switch_id)
@data[switch_id] || false
end
#--------------------------------------------------------------------------
# ● スイッチの設定
# value : ON (true) / OFF (false)
#--------------------------------------------------------------------------
def []=(switch_id, value)
@data[switch_id] = value
on_change
end
#--------------------------------------------------------------------------
# ● スイッチの設定時の処理
#--------------------------------------------------------------------------
def on_change
$game_map.need_refresh = true
end
end

122
Scripts/Game_System.rb Normal file
View file

@ -0,0 +1,122 @@
#==============================================================================
# ■ Game_System
#------------------------------------------------------------------------------
#  システム周りのデータを扱うクラスです。セーブやメニューの禁止状態などを保存
# します。このクラスのインスタンスは $game_system で参照されます。
#==============================================================================
class Game_System
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :save_disabled # セーブ禁止
attr_accessor :menu_disabled # メニュー禁止
attr_accessor :encounter_disabled # エンカウント禁止
attr_accessor :formation_disabled # 並び替え禁止
attr_accessor :battle_count # 戦闘回数
attr_reader :save_count # セーブ回数
attr_reader :version_id # ゲームのバージョン ID
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
@save_disabled = false
@menu_disabled = false
@encounter_disabled = false
@formation_disabled = false
@battle_count = 0
@save_count = 0
@version_id = 0
@window_tone = nil
@battle_bgm = nil
@battle_end_me = nil
@saved_bgm = nil
end
#--------------------------------------------------------------------------
# ● 日本語モード判定
#--------------------------------------------------------------------------
def japanese?
$data_system.japanese
end
#--------------------------------------------------------------------------
# ● ウィンドウカラーの取得
#--------------------------------------------------------------------------
def window_tone
@window_tone || $data_system.window_tone
end
#--------------------------------------------------------------------------
# ● ウィンドウカラーの設定
#--------------------------------------------------------------------------
def window_tone=(window_tone)
@window_tone = window_tone
end
#--------------------------------------------------------------------------
# ● 戦闘 BGM の取得
#--------------------------------------------------------------------------
def battle_bgm
@battle_bgm || $data_system.battle_bgm
end
#--------------------------------------------------------------------------
# ● 戦闘 BGM の設定
#--------------------------------------------------------------------------
def battle_bgm=(battle_bgm)
@battle_bgm = battle_bgm
end
#--------------------------------------------------------------------------
# ● 戦闘終了 ME の取得
#--------------------------------------------------------------------------
def battle_end_me
@battle_end_me || $data_system.battle_end_me
end
#--------------------------------------------------------------------------
# ● 戦闘終了 ME の設定
#--------------------------------------------------------------------------
def battle_end_me=(battle_end_me)
@battle_end_me = battle_end_me
end
#--------------------------------------------------------------------------
# ● セーブ前の処理
#--------------------------------------------------------------------------
def on_before_save
@save_count += 1
@version_id = $data_system.version_id
@frames_on_save = Graphics.frame_count
@bgm_on_save = RPG::BGM.last
@bgs_on_save = RPG::BGS.last
end
#--------------------------------------------------------------------------
# ● ロード後の処理
#--------------------------------------------------------------------------
def on_after_load
Graphics.frame_count = @frames_on_save
@bgm_on_save.play
@bgs_on_save.play
end
#--------------------------------------------------------------------------
# ● プレイ時間を秒数で取得
#--------------------------------------------------------------------------
def playtime
Graphics.frame_count / Graphics.frame_rate
end
#--------------------------------------------------------------------------
# ● プレイ時間を文字列で取得
#--------------------------------------------------------------------------
def playtime_s
hour = playtime / 60 / 60
min = playtime / 60 % 60
sec = playtime % 60
sprintf("%02d:%02d:%02d", hour, min, sec)
end
#--------------------------------------------------------------------------
# ● BGM の保存
#--------------------------------------------------------------------------
def save_bgm
@saved_bgm = RPG::BGM.last
end
#--------------------------------------------------------------------------
# ● BGM の再開
#--------------------------------------------------------------------------
def replay_bgm
@saved_bgm.replay if @saved_bgm
end
end

45
Scripts/Game_Temp.rb Normal file
View file

@ -0,0 +1,45 @@
#==============================================================================
# ■ Game_Temp
#------------------------------------------------------------------------------
#  セーブデータに含まれない、一時的なデータを扱うクラスです。このクラスのイン
# スタンスは $game_temp で参照されます。
#==============================================================================
class Game_Temp
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :common_event_id # コモンイベント ID
attr_accessor :fade_type # 場所移動時のフェードタイプ
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
@common_event_id = 0
@fade_type = 0
end
#--------------------------------------------------------------------------
# ● コモンイベントの呼び出しを予約
#--------------------------------------------------------------------------
def reserve_common_event(common_event_id)
@common_event_id = common_event_id
end
#--------------------------------------------------------------------------
# ● コモンイベントの呼び出し予約をクリア
#--------------------------------------------------------------------------
def clear_common_event
@common_event_id = 0
end
#--------------------------------------------------------------------------
# ● コモンイベント呼び出しの予約判定
#--------------------------------------------------------------------------
def common_event_reserved?
@common_event_id > 0
end
#--------------------------------------------------------------------------
# ● 予約されているコモンイベントを取得
#--------------------------------------------------------------------------
def reserved_common_event
$data_common_events[@common_event_id]
end
end

56
Scripts/Game_Timer.rb Normal file
View file

@ -0,0 +1,56 @@
#==============================================================================
# ■ Game_Timer
#------------------------------------------------------------------------------
#  タイマーを扱うクラスです。このクラスのインスタンスは $game_timer で参照さ
# れます。
#==============================================================================
class Game_Timer
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
@count = 0
@working = false
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
if @working && @count > 0
@count -= 1
on_expire if @count == 0
end
end
#--------------------------------------------------------------------------
# ● 始動
#--------------------------------------------------------------------------
def start(count)
@count = count
@working = true
end
#--------------------------------------------------------------------------
# ● 停止
#--------------------------------------------------------------------------
def stop
@working = false
end
#--------------------------------------------------------------------------
# ● 作動中判定
#--------------------------------------------------------------------------
def working?
@working
end
#--------------------------------------------------------------------------
# ● 秒の取得
#--------------------------------------------------------------------------
def sec
@count / Graphics.frame_rate
end
#--------------------------------------------------------------------------
# ● タイマーが 0 になったときの処理
#--------------------------------------------------------------------------
def on_expire
BattleManager.abort
end
end

205
Scripts/Game_Troop.rb Normal file
View file

@ -0,0 +1,205 @@
#==============================================================================
# ■ Game_Troop
#------------------------------------------------------------------------------
#  敵グループおよび戦闘に関するデータを扱うクラスです。バトルイベントの処理も
# 行います。このクラスのインスタンスは $game_troop で参照されます。
#==============================================================================
class Game_Troop < Game_Unit
#--------------------------------------------------------------------------
# ● 敵キャラ名の後ろにつける文字の表
#--------------------------------------------------------------------------
LETTER_TABLE_HALF = [' A',' B',' C',' D',' E',' F',' G',' H',' I',' J',
' K',' L',' M',' N',' O',' P',' Q',' R',' S',' T',
' U',' V',' W',' X',' Y',' Z']
LETTER_TABLE_FULL = ['','','','','','','','','','',
'','','','','','','','','','',
'','','','','','']
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :screen # バトル画面の状態
attr_reader :interpreter # バトルイベント用インタプリタ
attr_reader :event_flags # バトルイベント実行済みフラグ
attr_reader :turn_count # ターン数
attr_reader :name_counts # 敵キャラ名の出現数記録ハッシュ
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super
@screen = Game_Screen.new
@interpreter = Game_Interpreter.new
@event_flags = {}
clear
end
#--------------------------------------------------------------------------
# ● メンバーの取得
#--------------------------------------------------------------------------
def members
@enemies
end
#--------------------------------------------------------------------------
# ● クリア
#--------------------------------------------------------------------------
def clear
@screen.clear
@interpreter.clear
@event_flags.clear
@enemies = []
@turn_count = 0
@names_count = {}
end
#--------------------------------------------------------------------------
# ● 敵グループオブジェクト取得
#--------------------------------------------------------------------------
def troop
$data_troops[@troop_id]
end
#--------------------------------------------------------------------------
# ● セットアップ
#--------------------------------------------------------------------------
def setup(troop_id)
clear
@troop_id = troop_id
@enemies = []
troop.members.each do |member|
next unless $data_enemies[member.enemy_id]
enemy = Game_Enemy.new(@enemies.size, member.enemy_id)
enemy.hide if member.hidden
enemy.screen_x = member.x
enemy.screen_y = member.y
@enemies.push(enemy)
end
init_screen_tone
make_unique_names
end
#--------------------------------------------------------------------------
# ● 画面の色調を初期化
#--------------------------------------------------------------------------
def init_screen_tone
@screen.start_tone_change($game_map.screen.tone, 0) if $game_map
end
#--------------------------------------------------------------------------
# ● 同名の敵キャラに ABC などの文字を付加
#--------------------------------------------------------------------------
def make_unique_names
members.each do |enemy|
next unless enemy.alive?
next unless enemy.letter.empty?
n = @names_count[enemy.original_name] || 0
enemy.letter = letter_table[n % letter_table.size]
@names_count[enemy.original_name] = n + 1
end
members.each do |enemy|
n = @names_count[enemy.original_name] || 0
enemy.plural = true if n >= 2
end
end
#--------------------------------------------------------------------------
# ● 敵キャラ名の後ろにつける文字の表を取得
#--------------------------------------------------------------------------
def letter_table
$game_system.japanese? ? LETTER_TABLE_FULL : LETTER_TABLE_HALF
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
@screen.update
end
#--------------------------------------------------------------------------
# ● 敵キャラ名の配列取得
# 戦闘開始時の表示用。重複は除去する。
#--------------------------------------------------------------------------
def enemy_names
names = []
members.each do |enemy|
next unless enemy.alive?
next if names.include?(enemy.original_name)
names.push(enemy.original_name)
end
names
end
#--------------------------------------------------------------------------
# ● バトルイベント(ページ)の条件合致判定
#--------------------------------------------------------------------------
def conditions_met?(page)
c = page.condition
if !c.turn_ending && !c.turn_valid && !c.enemy_valid &&
!c.actor_valid && !c.switch_valid
return false # 条件未設定…実行しない
end
if @event_flags[page]
return false # 実行済み
end
if c.turn_ending # ターン終了時
return false unless BattleManager.turn_end?
end
if c.turn_valid # ターン数
n = @turn_count
a = c.turn_a
b = c.turn_b
return false if (b == 0 && n != a)
return false if (b > 0 && (n < 1 || n < a || n % b != a % b))
end
if c.enemy_valid # 敵キャラ
enemy = $game_troop.members[c.enemy_index]
return false if enemy == nil
return false if enemy.hp_rate * 100 > c.enemy_hp
end
if c.actor_valid # アクター
actor = $game_actors[c.actor_id]
return false if actor == nil
return false if actor.hp_rate * 100 > c.actor_hp
end
if c.switch_valid # スイッチ
return false if !$game_switches[c.switch_id]
end
return true # 条件合致
end
#--------------------------------------------------------------------------
# ● バトルイベントのセットアップ
#--------------------------------------------------------------------------
def setup_battle_event
return if @interpreter.running?
return if @interpreter.setup_reserved_common_event
troop.pages.each do |page|
next unless conditions_met?(page)
@interpreter.setup(page.list)
@event_flags[page] = true if page.span <= 1
return
end
end
#--------------------------------------------------------------------------
# ● ターンの増加
#--------------------------------------------------------------------------
def increase_turn
troop.pages.each {|page| @event_flags[page] = false if page.span == 1 }
@turn_count += 1
end
#--------------------------------------------------------------------------
# ● 経験値の合計計算
#--------------------------------------------------------------------------
def exp_total
dead_members.inject(0) {|r, enemy| r += enemy.exp }
end
#--------------------------------------------------------------------------
# ● お金の合計計算
#--------------------------------------------------------------------------
def gold_total
dead_members.inject(0) {|r, enemy| r += enemy.gold } * gold_rate
end
#--------------------------------------------------------------------------
# ● お金の倍率を取得
#--------------------------------------------------------------------------
def gold_rate
$game_party.gold_double? ? 2 : 1
end
#--------------------------------------------------------------------------
# ● ドロップアイテムの配列作成
#--------------------------------------------------------------------------
def make_drop_items
dead_members.inject([]) {|r, enemy| r += enemy.make_drop_items }
end
end

131
Scripts/Game_Unit.rb Normal file
View file

@ -0,0 +1,131 @@
#==============================================================================
# ■ Game_Unit
#------------------------------------------------------------------------------
#  ユニットを扱うクラスです。このクラスは Game_Party クラスと Game_Troop クラ
# スのスーパークラスとして使用されます。
#==============================================================================
class Game_Unit
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :in_battle # 戦闘中フラグ
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
@in_battle = false
end
#--------------------------------------------------------------------------
# ● メンバーの取得
#--------------------------------------------------------------------------
def members
return []
end
#--------------------------------------------------------------------------
# ● 生存しているメンバーの配列取得
#--------------------------------------------------------------------------
def alive_members
members.select {|member| member.alive? }
end
#--------------------------------------------------------------------------
# ● 戦闘不能のメンバーの配列取得
#--------------------------------------------------------------------------
def dead_members
members.select {|member| member.dead? }
end
#--------------------------------------------------------------------------
# ● 行動可能なメンバーの配列取得
#--------------------------------------------------------------------------
def movable_members
members.select {|member| member.movable? }
end
#--------------------------------------------------------------------------
# ● 全員の戦闘行動クリア
#--------------------------------------------------------------------------
def clear_actions
members.each {|member| member.clear_actions }
end
#--------------------------------------------------------------------------
# ● 敏捷性の平均値を計算
#--------------------------------------------------------------------------
def agi
return 1 if members.size == 0
members.inject(0) {|r, member| r += member.agi } / members.size
end
#--------------------------------------------------------------------------
# ● 狙われ率の合計を計算
#--------------------------------------------------------------------------
def tgr_sum
alive_members.inject(0) {|r, member| r + member.tgr }
end
#--------------------------------------------------------------------------
# ● ターゲットのランダムな決定
#--------------------------------------------------------------------------
def random_target
tgr_rand = rand * tgr_sum
alive_members.each do |member|
tgr_rand -= member.tgr
return member if tgr_rand < 0
end
alive_members[0]
end
#--------------------------------------------------------------------------
# ● ターゲットのランダムな決定(戦闘不能)
#--------------------------------------------------------------------------
def random_dead_target
dead_members.empty? ? nil : dead_members[rand(dead_members.size)]
end
#--------------------------------------------------------------------------
# ● ターゲットのスムーズな決定
#--------------------------------------------------------------------------
def smooth_target(index)
member = members[index]
(member && member.alive?) ? member : alive_members[0]
end
#--------------------------------------------------------------------------
# ● ターゲットのスムーズな決定(戦闘不能)
#--------------------------------------------------------------------------
def smooth_dead_target(index)
member = members[index]
(member && member.dead?) ? member : dead_members[0]
end
#--------------------------------------------------------------------------
# ● 行動結果のクリア
#--------------------------------------------------------------------------
def clear_results
members.select {|member| member.result.clear }
end
#--------------------------------------------------------------------------
# ● 戦闘開始処理
#--------------------------------------------------------------------------
def on_battle_start
members.each {|member| member.on_battle_start }
@in_battle = true
end
#--------------------------------------------------------------------------
# ● 戦闘終了処理
#--------------------------------------------------------------------------
def on_battle_end
@in_battle = false
members.each {|member| member.on_battle_end }
end
#--------------------------------------------------------------------------
# ● 戦闘行動の作成
#--------------------------------------------------------------------------
def make_actions
members.each {|member| member.make_actions }
end
#--------------------------------------------------------------------------
# ● 全滅判定
#--------------------------------------------------------------------------
def all_dead?
alive_members.empty?
end
#--------------------------------------------------------------------------
# ● 身代わりバトラーの取得
#--------------------------------------------------------------------------
def substitute_battler
members.find {|member| member.substitute? }
end
end

34
Scripts/Game_Variables.rb Normal file
View file

@ -0,0 +1,34 @@
#==============================================================================
# ■ Game_Variables
#------------------------------------------------------------------------------
#  変数を扱うクラスです。組み込みクラス Array のラッパーです。このクラスのイ
# ンスタンスは $game_variables で参照されます。
#==============================================================================
class Game_Variables
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
@data = []
end
#--------------------------------------------------------------------------
# ● 変数の取得
#--------------------------------------------------------------------------
def [](variable_id)
@data[variable_id] || 0
end
#--------------------------------------------------------------------------
# ● 変数の設定
#--------------------------------------------------------------------------
def []=(variable_id, value)
@data[variable_id] = value
on_change
end
#--------------------------------------------------------------------------
# ● 変数の設定時の処理
#--------------------------------------------------------------------------
def on_change
$game_map.need_refresh = true
end
end

193
Scripts/Game_Vehicle.rb Normal file
View file

@ -0,0 +1,193 @@
#==============================================================================
# ■ Game_Vehicle
#------------------------------------------------------------------------------
#  乗り物を扱うクラスです。このクラスは Game_Map クラスの内部で使用されます。
# 現在のマップに乗り物がないときは、マップ座標 (-1,-1) に設定されます。
#==============================================================================
class Game_Vehicle < Game_Character
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :altitude # 高度(飛行船用)
attr_reader :driving # 運転中フラグ
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# type : 乗り物タイプ(:boat, :ship, :airship
#--------------------------------------------------------------------------
def initialize(type)
super()
@type = type
@altitude = 0
@driving = false
@direction = 4
@walk_anime = false
@step_anime = false
@walking_bgm = nil
init_move_speed
load_system_settings
end
#--------------------------------------------------------------------------
# ● 移動速度の初期化
#--------------------------------------------------------------------------
def init_move_speed
@move_speed = 4 if @type == :boat
@move_speed = 5 if @type == :ship
@move_speed = 6 if @type == :airship
end
#--------------------------------------------------------------------------
# ● システム設定の取得
#--------------------------------------------------------------------------
def system_vehicle
return $data_system.boat if @type == :boat
return $data_system.ship if @type == :ship
return $data_system.airship if @type == :airship
return nil
end
#--------------------------------------------------------------------------
# ● システム設定のロード
#--------------------------------------------------------------------------
def load_system_settings
@map_id = system_vehicle.start_map_id
@x = system_vehicle.start_x
@y = system_vehicle.start_y
@character_name = system_vehicle.character_name
@character_index = system_vehicle.character_index
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
if @driving
@map_id = $game_map.map_id
sync_with_player
elsif @map_id == $game_map.map_id
moveto(@x, @y)
end
if @type == :airship
@priority_type = @driving ? 2 : 0
else
@priority_type = 1
end
@walk_anime = @step_anime = @driving
end
#--------------------------------------------------------------------------
# ● 位置の変更
#--------------------------------------------------------------------------
def set_location(map_id, x, y)
@map_id = map_id
@x = x
@y = y
refresh
end
#--------------------------------------------------------------------------
# ● 座標一致判定
#--------------------------------------------------------------------------
def pos?(x, y)
@map_id == $game_map.map_id && super(x, y)
end
#--------------------------------------------------------------------------
# ● 透明判定
#--------------------------------------------------------------------------
def transparent
@map_id != $game_map.map_id || super
end
#--------------------------------------------------------------------------
# ● 乗り物に乗る
#--------------------------------------------------------------------------
def get_on
@driving = true
@walk_anime = true
@step_anime = true
@walking_bgm = RPG::BGM.last
system_vehicle.bgm.play
end
#--------------------------------------------------------------------------
# ● 乗り物から降りる
#--------------------------------------------------------------------------
def get_off
@driving = false
@walk_anime = false
@step_anime = false
@direction = 4
@walking_bgm.play
end
#--------------------------------------------------------------------------
# ● プレイヤーとの同期
#--------------------------------------------------------------------------
def sync_with_player
@x = $game_player.x
@y = $game_player.y
@real_x = $game_player.real_x
@real_y = $game_player.real_y
@direction = $game_player.direction
update_bush_depth
end
#--------------------------------------------------------------------------
# ● 移動速度の取得
#--------------------------------------------------------------------------
def speed
@move_speed
end
#--------------------------------------------------------------------------
# ● 画面 Y 座標の取得
#--------------------------------------------------------------------------
def screen_y
super - altitude
end
#--------------------------------------------------------------------------
# ● 移動可能判定
#--------------------------------------------------------------------------
def movable?
!moving? && !(@type == :airship && @altitude < max_altitude)
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
super
update_airship_altitude if @type == :airship
end
#--------------------------------------------------------------------------
# ● 飛行船の高度を更新
#--------------------------------------------------------------------------
def update_airship_altitude
if @driving
@altitude += 1 if @altitude < max_altitude && takeoff_ok?
elsif @altitude > 0
@altitude -= 1
@priority_type = 0 if @altitude == 0
end
@step_anime = (@altitude == max_altitude)
@priority_type = 2 if @altitude > 0
end
#--------------------------------------------------------------------------
# ● 飛行船が飛ぶ高さを取得
#--------------------------------------------------------------------------
def max_altitude
return 32
end
#--------------------------------------------------------------------------
# ● 離陸可能判定
#--------------------------------------------------------------------------
def takeoff_ok?
$game_player.followers.gather?
end
#--------------------------------------------------------------------------
# ● 接岸/着陸可能判定
# d : 方向2,4,6,8
#--------------------------------------------------------------------------
def land_ok?(x, y, d)
if @type == :airship
return false unless $game_map.airship_land_ok?(x, y)
return false unless $game_map.events_xy(x, y).empty?
else
x2 = $game_map.round_x_with_direction(x, d)
y2 = $game_map.round_y_with_direction(y, d)
return false unless $game_map.valid?(x2, y2)
return false unless $game_map.passable?(x2, y2, reverse_dir(d))
return false if collide_with_characters?(x2, y2)
end
return true
end
end

7
Scripts/Main.rb Normal file
View file

@ -0,0 +1,7 @@
#==============================================================================
# ■ Main
#------------------------------------------------------------------------------
#  モジュールとクラスの定義が終わった後に実行される処理です。
#==============================================================================
rgss_main { SceneManager.run }

25
Scripts/Picture_Fix.rb Normal file
View file

@ -0,0 +1,25 @@
#==============================================================================
# Picture Bug Fix
#------------------------------------------------------------------------------
# Author : Raizen884
# Credits : JohnBolton, Gab!
# Community : www.centrorpgmaker.com
# This script corrects a bug in the default scripts in which pictures continued
# to be updated even after they were erased, which caused lag.
#------------------------------------------------------------------------------
# Place this script above all other scripts in the Materials section.
#==============================================================================
class Sprite_Picture < Sprite
def update
super
if @picture.name != ""
update_bitmap
update_origin
update_position
update_zoom
update_other
else
self.bitmap.dispose if self.bitmap != nil
end
end
end

93
Scripts/SceneManager.rb Normal file
View file

@ -0,0 +1,93 @@
#==============================================================================
# ■ SceneManager
#------------------------------------------------------------------------------
#  シーン遷移を管理するモジュールです。たとえばメインメニューからアイテム画面
# を呼び出し、また戻るというような階層構造を扱うことができます。
#==============================================================================
module SceneManager
#--------------------------------------------------------------------------
# ● モジュールのインスタンス変数
#--------------------------------------------------------------------------
@scene = nil # 現在のシーンオブジェクト
@stack = [] # 階層遷移用のスタック
@background_bitmap = nil # 背景用ビットマップ
#--------------------------------------------------------------------------
# ● 実行
#--------------------------------------------------------------------------
def self.run
DataManager.init
Audio.setup_midi if use_midi?
@scene = first_scene_class.new
@scene.main while @scene
end
#--------------------------------------------------------------------------
# ● 最初のシーンクラスを取得
#--------------------------------------------------------------------------
def self.first_scene_class
$BTEST ? Scene_Battle : Scene_Title
end
#--------------------------------------------------------------------------
# ● MIDI を使用するか
#--------------------------------------------------------------------------
def self.use_midi?
$data_system.opt_use_midi
end
#--------------------------------------------------------------------------
# ● 現在のシーンを取得
#--------------------------------------------------------------------------
def self.scene
@scene
end
#--------------------------------------------------------------------------
# ● 現在のシーンクラス判定
#--------------------------------------------------------------------------
def self.scene_is?(scene_class)
@scene.instance_of?(scene_class)
end
#--------------------------------------------------------------------------
# ● 直接遷移
#--------------------------------------------------------------------------
def self.goto(scene_class)
@scene = scene_class.new
end
#--------------------------------------------------------------------------
# ● 呼び出し
#--------------------------------------------------------------------------
def self.call(scene_class)
@stack.push(@scene)
@scene = scene_class.new
end
#--------------------------------------------------------------------------
# ● 呼び出し元へ戻る
#--------------------------------------------------------------------------
def self.return
@scene = @stack.pop
end
#--------------------------------------------------------------------------
# ● 呼び出しスタックのクリア
#--------------------------------------------------------------------------
def self.clear
@stack.clear
end
#--------------------------------------------------------------------------
# ● ゲーム終了
#--------------------------------------------------------------------------
def self.exit
@scene = nil
end
#--------------------------------------------------------------------------
# ● 背景として使うためのスナップショット作成
#--------------------------------------------------------------------------
def self.snapshot_for_background
@background_bitmap.dispose if @background_bitmap
@background_bitmap = Graphics.snap_to_bitmap
@background_bitmap.blur
end
#--------------------------------------------------------------------------
# ● 背景用ビットマップを取得
#--------------------------------------------------------------------------
def self.background_bitmap
@background_bitmap
end
end

132
Scripts/Scene_Base.rb Normal file
View file

@ -0,0 +1,132 @@
#==============================================================================
# ■ Scene_Base
#------------------------------------------------------------------------------
#  ゲーム中の全てのシーンのスーパークラスです。
#==============================================================================
class Scene_Base
#--------------------------------------------------------------------------
# ● メイン
#--------------------------------------------------------------------------
def main
start
post_start
update until scene_changing?
pre_terminate
terminate
end
#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
def start
create_main_viewport
end
#--------------------------------------------------------------------------
# ● 開始後処理
#--------------------------------------------------------------------------
def post_start
perform_transition
Input.update
end
#--------------------------------------------------------------------------
# ● シーン変更中判定
#--------------------------------------------------------------------------
def scene_changing?
SceneManager.scene != self
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
update_basic
end
#--------------------------------------------------------------------------
# ● フレーム更新(基本)
#--------------------------------------------------------------------------
def update_basic
Graphics.update
Input.update
update_all_windows
end
#--------------------------------------------------------------------------
# ● 終了前処理
#--------------------------------------------------------------------------
def pre_terminate
end
#--------------------------------------------------------------------------
# ● 終了処理
#--------------------------------------------------------------------------
def terminate
Graphics.freeze
dispose_all_windows
dispose_main_viewport
end
#--------------------------------------------------------------------------
# ● トランジション実行
#--------------------------------------------------------------------------
def perform_transition
Graphics.transition(transition_speed)
end
#--------------------------------------------------------------------------
# ● トランジション速度の取得
#--------------------------------------------------------------------------
def transition_speed
return 10
end
#--------------------------------------------------------------------------
# ● ビューポートの作成
#--------------------------------------------------------------------------
def create_main_viewport
@viewport = Viewport.new
@viewport.z = 200
end
#--------------------------------------------------------------------------
# ● ビューポートの解放
#--------------------------------------------------------------------------
def dispose_main_viewport
@viewport.dispose
end
#--------------------------------------------------------------------------
# ● 全ウィンドウの更新
#--------------------------------------------------------------------------
def update_all_windows
instance_variables.each do |varname|
ivar = instance_variable_get(varname)
ivar.update if ivar.is_a?(Window)
end
end
#--------------------------------------------------------------------------
# ● 全ウィンドウの解放
#--------------------------------------------------------------------------
def dispose_all_windows
instance_variables.each do |varname|
ivar = instance_variable_get(varname)
ivar.dispose if ivar.is_a?(Window)
end
end
#--------------------------------------------------------------------------
# ● 呼び出し元のシーンへ戻る
#--------------------------------------------------------------------------
def return_scene
SceneManager.return
end
#--------------------------------------------------------------------------
# ● 各種サウンドとグラフィックの一括フェードアウト
#--------------------------------------------------------------------------
def fadeout_all(time = 1000)
RPG::BGM.fade(time)
RPG::BGS.fade(time)
RPG::ME.fade(time)
Graphics.fadeout(time * Graphics.frame_rate / 1000)
RPG::BGM.stop
RPG::BGS.stop
RPG::ME.stop
end
#--------------------------------------------------------------------------
# ● ゲームオーバー判定
# パーティが全滅状態ならゲームオーバー画面へ遷移する。
#--------------------------------------------------------------------------
def check_gameover
SceneManager.goto(Scene_Gameover) if $game_party.all_dead?
end
end

691
Scripts/Scene_Battle.rb Normal file
View file

@ -0,0 +1,691 @@
#==============================================================================
# ■ Scene_Battle
#------------------------------------------------------------------------------
#  バトル画面の処理を行うクラスです。
#==============================================================================
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
def start
super
create_spriteset
create_all_windows
BattleManager.method_wait_for_message = method(:wait_for_message)
end
#--------------------------------------------------------------------------
# ● 開始後処理
#--------------------------------------------------------------------------
def post_start
super
battle_start
end
#--------------------------------------------------------------------------
# ● 終了前処理
#--------------------------------------------------------------------------
def pre_terminate
super
Graphics.fadeout(30) if SceneManager.scene_is?(Scene_Map)
Graphics.fadeout(60) if SceneManager.scene_is?(Scene_Title)
end
#--------------------------------------------------------------------------
# ● 終了処理
#--------------------------------------------------------------------------
def terminate
super
dispose_spriteset
@info_viewport.dispose
RPG::ME.stop
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
super
if BattleManager.in_turn?
process_event
process_action
end
BattleManager.judge_win_loss
end
#--------------------------------------------------------------------------
# ● フレーム更新(基本)
#--------------------------------------------------------------------------
def update_basic
super
$game_timer.update
$game_troop.update
@spriteset.update
update_info_viewport
update_message_open
end
#--------------------------------------------------------------------------
# ● フレーム更新(ウェイト用)
#--------------------------------------------------------------------------
def update_for_wait
update_basic
end
#--------------------------------------------------------------------------
# ● ウェイト
#--------------------------------------------------------------------------
def wait(duration)
duration.times {|i| update_for_wait if i < duration / 2 || !show_fast? }
end
#--------------------------------------------------------------------------
# ● 早送り判定
#--------------------------------------------------------------------------
def show_fast?
Input.press?(:A) || Input.press?(:C)
end
#--------------------------------------------------------------------------
# ● ウェイト(早送り無効)
#--------------------------------------------------------------------------
def abs_wait(duration)
duration.times {|i| update_for_wait }
end
#--------------------------------------------------------------------------
# ● 短時間ウェイト(早送り無効)
#--------------------------------------------------------------------------
def abs_wait_short
abs_wait(15)
end
#--------------------------------------------------------------------------
# ● メッセージ表示が終わるまでウェイト
#--------------------------------------------------------------------------
def wait_for_message
@message_window.update
update_for_wait while $game_message.visible
end
#--------------------------------------------------------------------------
# ● アニメーション表示が終わるまでウェイト
#--------------------------------------------------------------------------
def wait_for_animation
update_for_wait
update_for_wait while @spriteset.animation?
end
#--------------------------------------------------------------------------
# ● エフェクト実行が終わるまでウェイト
#--------------------------------------------------------------------------
def wait_for_effect
update_for_wait
update_for_wait while @spriteset.effect?
end
#--------------------------------------------------------------------------
# ● 情報表示ビューポートの更新
#--------------------------------------------------------------------------
def update_info_viewport
move_info_viewport(0) if @party_command_window.active
move_info_viewport(128) if @actor_command_window.active
move_info_viewport(64) if BattleManager.in_turn?
end
#--------------------------------------------------------------------------
# ● 情報表示ビューポートの移動
#--------------------------------------------------------------------------
def move_info_viewport(ox)
current_ox = @info_viewport.ox
@info_viewport.ox = [ox, current_ox + 16].min if current_ox < ox
@info_viewport.ox = [ox, current_ox - 16].max if current_ox > ox
end
#--------------------------------------------------------------------------
# ● メッセージウィンドウを開く処理の更新
# ステータスウィンドウなどが閉じ終わるまでオープン度を 0 にする。
#--------------------------------------------------------------------------
def update_message_open
if $game_message.busy? && !@status_window.close?
@message_window.openness = 0
@status_window.close
@party_command_window.close
@actor_command_window.close
end
end
#--------------------------------------------------------------------------
# ● スプライトセットの作成
#--------------------------------------------------------------------------
def create_spriteset
@spriteset = Spriteset_Battle.new
end
#--------------------------------------------------------------------------
# ● スプライトセットの解放
#--------------------------------------------------------------------------
def dispose_spriteset
@spriteset.dispose
end
#--------------------------------------------------------------------------
# ● 全ウィンドウの作成
#--------------------------------------------------------------------------
def create_all_windows
create_message_window
create_scroll_text_window
create_log_window
create_status_window
create_info_viewport
create_party_command_window
create_actor_command_window
create_help_window
create_skill_window
create_item_window
create_actor_window
create_enemy_window
end
#--------------------------------------------------------------------------
# ● メッセージウィンドウの作成
#--------------------------------------------------------------------------
def create_message_window
@message_window = Window_Message.new
end
#--------------------------------------------------------------------------
# ● スクロール文章ウィンドウの作成
#--------------------------------------------------------------------------
def create_scroll_text_window
@scroll_text_window = Window_ScrollText.new
end
#--------------------------------------------------------------------------
# ● ログウィンドウの作成
#--------------------------------------------------------------------------
def create_log_window
@log_window = Window_BattleLog.new
@log_window.method_wait = method(:wait)
@log_window.method_wait_for_effect = method(:wait_for_effect)
end
#--------------------------------------------------------------------------
# ● ステータスウィンドウの作成
#--------------------------------------------------------------------------
def create_status_window
@status_window = Window_BattleStatus.new
@status_window.x = 128
end
#--------------------------------------------------------------------------
# ● 情報表示ビューポートの作成
#--------------------------------------------------------------------------
def create_info_viewport
@info_viewport = Viewport.new
@info_viewport.rect.y = Graphics.height - @status_window.height
@info_viewport.rect.height = @status_window.height
@info_viewport.z = 100
@info_viewport.ox = 64
@status_window.viewport = @info_viewport
end
#--------------------------------------------------------------------------
# ● パーティコマンドウィンドウの作成
#--------------------------------------------------------------------------
def create_party_command_window
@party_command_window = Window_PartyCommand.new
@party_command_window.viewport = @info_viewport
@party_command_window.set_handler(:fight, method(:command_fight))
@party_command_window.set_handler(:escape, method(:command_escape))
@party_command_window.unselect
end
#--------------------------------------------------------------------------
# ● アクターコマンドウィンドウの作成
#--------------------------------------------------------------------------
def create_actor_command_window
@actor_command_window = Window_ActorCommand.new
@actor_command_window.viewport = @info_viewport
@actor_command_window.set_handler(:attack, method(:command_attack))
@actor_command_window.set_handler(:skill, method(:command_skill))
@actor_command_window.set_handler(:guard, method(:command_guard))
@actor_command_window.set_handler(:item, method(:command_item))
@actor_command_window.set_handler(:cancel, method(:prior_command))
@actor_command_window.x = Graphics.width
end
#--------------------------------------------------------------------------
# ● ヘルプウィンドウの作成
#--------------------------------------------------------------------------
def create_help_window
@help_window = Window_Help.new
@help_window.visible = false
end
#--------------------------------------------------------------------------
# ● スキルウィンドウの作成
#--------------------------------------------------------------------------
def create_skill_window
@skill_window = Window_BattleSkill.new(@help_window, @info_viewport)
@skill_window.set_handler(:ok, method(:on_skill_ok))
@skill_window.set_handler(:cancel, method(:on_skill_cancel))
end
#--------------------------------------------------------------------------
# ● アイテムウィンドウの作成
#--------------------------------------------------------------------------
def create_item_window
@item_window = Window_BattleItem.new(@help_window, @info_viewport)
@item_window.set_handler(:ok, method(:on_item_ok))
@item_window.set_handler(:cancel, method(:on_item_cancel))
end
#--------------------------------------------------------------------------
# ● アクターウィンドウの作成
#--------------------------------------------------------------------------
def create_actor_window
@actor_window = Window_BattleActor.new(@info_viewport)
@actor_window.set_handler(:ok, method(:on_actor_ok))
@actor_window.set_handler(:cancel, method(:on_actor_cancel))
end
#--------------------------------------------------------------------------
# ● 敵キャラウィンドウの作成
#--------------------------------------------------------------------------
def create_enemy_window
@enemy_window = Window_BattleEnemy.new(@info_viewport)
@enemy_window.set_handler(:ok, method(:on_enemy_ok))
@enemy_window.set_handler(:cancel, method(:on_enemy_cancel))
end
#--------------------------------------------------------------------------
# ● ステータスウィンドウの情報を更新
#--------------------------------------------------------------------------
def refresh_status
@status_window.refresh
end
#--------------------------------------------------------------------------
# ● 次のコマンド入力へ
#--------------------------------------------------------------------------
def next_command
if BattleManager.next_command
start_actor_command_selection
else
turn_start
end
end
#--------------------------------------------------------------------------
# ● 前のコマンド入力へ
#--------------------------------------------------------------------------
def prior_command
if BattleManager.prior_command
start_actor_command_selection
else
start_party_command_selection
end
end
#--------------------------------------------------------------------------
# ● パーティコマンド選択の開始
#--------------------------------------------------------------------------
def start_party_command_selection
unless scene_changing?
refresh_status
@status_window.unselect
@status_window.open
if BattleManager.input_start
@actor_command_window.close
@party_command_window.setup
else
@party_command_window.deactivate
turn_start
end
end
end
#--------------------------------------------------------------------------
# ● コマンド[戦う]
#--------------------------------------------------------------------------
def command_fight
next_command
end
#--------------------------------------------------------------------------
# ● コマンド[逃げる]
#--------------------------------------------------------------------------
def command_escape
turn_start unless BattleManager.process_escape
end
#--------------------------------------------------------------------------
# ● アクターコマンド選択の開始
#--------------------------------------------------------------------------
def start_actor_command_selection
@status_window.select(BattleManager.actor.index)
@party_command_window.close
@actor_command_window.setup(BattleManager.actor)
end
#--------------------------------------------------------------------------
# ● コマンド[攻撃]
#--------------------------------------------------------------------------
def command_attack
BattleManager.actor.input.set_attack
select_enemy_selection
end
#--------------------------------------------------------------------------
# ● コマンド[スキル]
#--------------------------------------------------------------------------
def command_skill
@skill_window.actor = BattleManager.actor
@skill_window.stype_id = @actor_command_window.current_ext
@skill_window.refresh
@skill_window.show.activate
end
#--------------------------------------------------------------------------
# ● コマンド[防御]
#--------------------------------------------------------------------------
def command_guard
BattleManager.actor.input.set_guard
next_command
end
#--------------------------------------------------------------------------
# ● コマンド[アイテム]
#--------------------------------------------------------------------------
def command_item
@item_window.refresh
@item_window.show.activate
end
#--------------------------------------------------------------------------
# ● アクター選択の開始
#--------------------------------------------------------------------------
def select_actor_selection
@actor_window.refresh
@actor_window.show.activate
end
#--------------------------------------------------------------------------
# ● アクター[決定]
#--------------------------------------------------------------------------
def on_actor_ok
BattleManager.actor.input.target_index = @actor_window.index
@actor_window.hide
@skill_window.hide
@item_window.hide
next_command
end
#--------------------------------------------------------------------------
# ● アクター[キャンセル]
#--------------------------------------------------------------------------
def on_actor_cancel
@actor_window.hide
case @actor_command_window.current_symbol
when :skill
@skill_window.activate
when :item
@item_window.activate
end
end
#--------------------------------------------------------------------------
# ● 敵キャラ選択の開始
#--------------------------------------------------------------------------
def select_enemy_selection
@enemy_window.refresh
@enemy_window.show.activate
end
#--------------------------------------------------------------------------
# ● 敵キャラ[決定]
#--------------------------------------------------------------------------
def on_enemy_ok
BattleManager.actor.input.target_index = @enemy_window.enemy.index
@enemy_window.hide
@skill_window.hide
@item_window.hide
next_command
end
#--------------------------------------------------------------------------
# ● 敵キャラ[キャンセル]
#--------------------------------------------------------------------------
def on_enemy_cancel
@enemy_window.hide
case @actor_command_window.current_symbol
when :attack
@actor_command_window.activate
when :skill
@skill_window.activate
when :item
@item_window.activate
end
end
#--------------------------------------------------------------------------
# ● スキル[決定]
#--------------------------------------------------------------------------
def on_skill_ok
@skill = @skill_window.item
BattleManager.actor.input.set_skill(@skill.id)
BattleManager.actor.last_skill.object = @skill
if !@skill.need_selection?
@skill_window.hide
next_command
elsif @skill.for_opponent?
select_enemy_selection
else
select_actor_selection
end
end
#--------------------------------------------------------------------------
# ● スキル[キャンセル]
#--------------------------------------------------------------------------
def on_skill_cancel
@skill_window.hide
@actor_command_window.activate
end
#--------------------------------------------------------------------------
# ● アイテム[決定]
#--------------------------------------------------------------------------
def on_item_ok
@item = @item_window.item
BattleManager.actor.input.set_item(@item.id)
if !@item.need_selection?
@item_window.hide
next_command
elsif @item.for_opponent?
select_enemy_selection
else
select_actor_selection
end
$game_party.last_item.object = @item
end
#--------------------------------------------------------------------------
# ● アイテム[キャンセル]
#--------------------------------------------------------------------------
def on_item_cancel
@item_window.hide
@actor_command_window.activate
end
#--------------------------------------------------------------------------
# ● 戦闘開始
#--------------------------------------------------------------------------
def battle_start
BattleManager.battle_start
process_event
start_party_command_selection
end
#--------------------------------------------------------------------------
# ● ターン開始
#--------------------------------------------------------------------------
def turn_start
@party_command_window.close
@actor_command_window.close
@status_window.unselect
@subject = nil
BattleManager.turn_start
@log_window.wait
@log_window.clear
end
#--------------------------------------------------------------------------
# ● ターン終了
#--------------------------------------------------------------------------
def turn_end
all_battle_members.each do |battler|
battler.on_turn_end
refresh_status
@log_window.display_auto_affected_status(battler)
@log_window.wait_and_clear
end
BattleManager.turn_end
process_event
start_party_command_selection
end
#--------------------------------------------------------------------------
# ● 敵味方合わせた全バトルメンバーの取得
#--------------------------------------------------------------------------
def all_battle_members
$game_party.members + $game_troop.members
end
#--------------------------------------------------------------------------
# ● イベントの処理
#--------------------------------------------------------------------------
def process_event
while !scene_changing?
$game_troop.interpreter.update
$game_troop.setup_battle_event
wait_for_message
wait_for_effect if $game_troop.all_dead?
process_forced_action
BattleManager.judge_win_loss
break unless $game_troop.interpreter.running?
update_for_wait
end
end
#--------------------------------------------------------------------------
# ● 強制された戦闘行動の処理
#--------------------------------------------------------------------------
def process_forced_action
if BattleManager.action_forced?
last_subject = @subject
@subject = BattleManager.action_forced_battler
BattleManager.clear_action_force
process_action
@subject = last_subject
end
end
#--------------------------------------------------------------------------
# ● 戦闘行動の処理
#--------------------------------------------------------------------------
def process_action
return if scene_changing?
if !@subject || !@subject.current_action
@subject = BattleManager.next_subject
end
return turn_end unless @subject
if @subject.current_action
@subject.current_action.prepare
if @subject.current_action.valid?
@status_window.open
execute_action
end
@subject.remove_current_action
end
process_action_end unless @subject.current_action
end
#--------------------------------------------------------------------------
# ● 戦闘行動終了時の処理
#--------------------------------------------------------------------------
def process_action_end
@subject.on_action_end
refresh_status
@log_window.display_auto_affected_status(@subject)
@log_window.wait_and_clear
@log_window.display_current_state(@subject)
@log_window.wait_and_clear
BattleManager.judge_win_loss
end
#--------------------------------------------------------------------------
# ● 戦闘行動の実行
#--------------------------------------------------------------------------
def execute_action
@subject.sprite_effect_type = :whiten
use_item
@log_window.wait_and_clear
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの使用
#--------------------------------------------------------------------------
def use_item
item = @subject.current_action.item
@log_window.display_use_item(@subject, item)
@subject.use_item(item)
refresh_status
targets = @subject.current_action.make_targets.compact
show_animation(targets, item.animation_id)
targets.each {|target| item.repeats.times { invoke_item(target, item) } }
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの発動
#--------------------------------------------------------------------------
def invoke_item(target, item)
if rand < target.item_cnt(@subject, item)
invoke_counter_attack(target, item)
elsif rand < target.item_mrf(@subject, item)
invoke_magic_reflection(target, item)
else
apply_item_effects(apply_substitute(target, item), item)
end
@subject.last_target_index = target.index
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの効果を適用
#--------------------------------------------------------------------------
def apply_item_effects(target, item)
target.item_apply(@subject, item)
refresh_status
@log_window.display_action_results(target, item)
end
#--------------------------------------------------------------------------
# ● 反撃の発動
#--------------------------------------------------------------------------
def invoke_counter_attack(target, item)
@log_window.display_counter(target, item)
attack_skill = $data_skills[target.attack_skill_id]
@subject.item_apply(target, attack_skill)
refresh_status
@log_window.display_action_results(@subject, attack_skill)
end
#--------------------------------------------------------------------------
# ● 魔法反射の発動
#--------------------------------------------------------------------------
def invoke_magic_reflection(target, item)
@log_window.display_reflection(target, item)
apply_item_effects(@subject, item)
end
#--------------------------------------------------------------------------
# ● 身代わりの適用
#--------------------------------------------------------------------------
def apply_substitute(target, item)
if check_substitute(target, item)
substitute = target.friends_unit.substitute_battler
if substitute && target != substitute
@log_window.display_substitute(substitute, target)
return substitute
end
end
target
end
#--------------------------------------------------------------------------
# ● 身代わり条件チェック
#--------------------------------------------------------------------------
def check_substitute(target, item)
target.hp < target.mhp / 4 && (!item || !item.certain?)
end
#--------------------------------------------------------------------------
# ● アニメーションの表示
# targets : 対象者の配列
# animation_id : アニメーション ID-1: 通常攻撃と同じ)
#--------------------------------------------------------------------------
def show_animation(targets, animation_id)
if animation_id < 0
show_attack_animation(targets)
else
show_normal_animation(targets, animation_id)
end
@log_window.wait
wait_for_animation
end
#--------------------------------------------------------------------------
# ● 攻撃アニメーションの表示
# targets : 対象者の配列
# アクターの場合は二刀流を考慮(左手武器は反転して表示)。
# 敵キャラの場合は [敵の通常攻撃] 効果音を演奏して一瞬待つ。
#--------------------------------------------------------------------------
def show_attack_animation(targets)
if @subject.actor?
show_normal_animation(targets, @subject.atk_animation_id1, false)
show_normal_animation(targets, @subject.atk_animation_id2, true)
else
Sound.play_enemy_attack
abs_wait_short
end
end
#--------------------------------------------------------------------------
# ● 通常アニメーションの表示
# targets : 対象者の配列
# animation_id : アニメーション ID
# mirror : 左右反転
#--------------------------------------------------------------------------
def show_normal_animation(targets, animation_id, mirror = false)
animation = $data_animations[animation_id]
if animation
targets.each do |target|
target.animation_id = animation_id
target.animation_mirror = mirror
abs_wait_short unless animation.to_screen?
end
abs_wait_short if animation.to_screen?
end
end
end

87
Scripts/Scene_Debug.rb Normal file
View file

@ -0,0 +1,87 @@
#==============================================================================
# ■ Scene_Debug
#------------------------------------------------------------------------------
#  デバッグ画面の処理を行うクラスです。
#==============================================================================
class Scene_Debug < Scene_MenuBase
#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
def start
super
create_left_window
create_right_window
create_debug_help_window
end
#--------------------------------------------------------------------------
# ● 終了処理
#--------------------------------------------------------------------------
def terminate
super
#$game_map.refresh
end
#--------------------------------------------------------------------------
# ● 左ウィンドウの作成
#--------------------------------------------------------------------------
def create_left_window
@left_window = Window_DebugLeft.new(0, 0)
@left_window.set_handler(:ok, method(:on_left_ok))
@left_window.set_handler(:cancel, method(:return_scene))
end
#--------------------------------------------------------------------------
# ● 右ウィンドウの作成
#--------------------------------------------------------------------------
def create_right_window
wx = @left_window.width
ww = Graphics.width - wx
@right_window = Window_DebugRight.new(wx, 0, ww)
@right_window.set_handler(:cancel, method(:on_right_cancel))
@left_window.right_window = @right_window
end
#--------------------------------------------------------------------------
# ● ヘルプウィンドウの作成
#--------------------------------------------------------------------------
def create_debug_help_window
wx = @right_window.x
wy = @right_window.height
ww = @right_window.width
wh = Graphics.height - wy
@debug_help_window = Window_Base.new(wx, wy, ww, wh)
end
#--------------------------------------------------------------------------
# ● 左[決定]
#--------------------------------------------------------------------------
def on_left_ok
refresh_help_window
@right_window.activate
@right_window.select(0)
end
#--------------------------------------------------------------------------
# ● 右[キャンセル]
#--------------------------------------------------------------------------
def on_right_cancel
@left_window.activate
@right_window.unselect
@debug_help_window.contents.clear
end
#--------------------------------------------------------------------------
# ● ヘルプウィンドウのリフレッシュ
#--------------------------------------------------------------------------
def refresh_help_window
@debug_help_window.draw_text_ex(4, 0, help_text)
end
#--------------------------------------------------------------------------
# ● ヘルプ文字列の取得
#--------------------------------------------------------------------------
def help_text
if @left_window.mode == :switch
"C (Enter) : ON / OFF"
else
"← (Left) : -1\n" +
"→ (Right) : +1\n" +
"L (Pageup) : -10\n" +
"R (Pagedown) : +10"
end
end
end

61
Scripts/Scene_End.rb Normal file
View file

@ -0,0 +1,61 @@
#==============================================================================
# ■ Scene_End
#------------------------------------------------------------------------------
#  ゲーム終了画面の処理を行うクラスです。
#==============================================================================
class Scene_End < Scene_MenuBase
#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
def start
super
create_command_window
end
#--------------------------------------------------------------------------
# ● 終了前処理
#--------------------------------------------------------------------------
def pre_terminate
super
close_command_window
end
#--------------------------------------------------------------------------
# ● 背景の作成
#--------------------------------------------------------------------------
def create_background
super
@background_sprite.tone.set(0, 0, 0, 128)
end
#--------------------------------------------------------------------------
# ● コマンドウィンドウの作成
#--------------------------------------------------------------------------
def create_command_window
@command_window = Window_GameEnd.new
@command_window.set_handler(:to_title, method(:command_to_title))
@command_window.set_handler(:shutdown, method(:command_shutdown))
@command_window.set_handler(:cancel, method(:return_scene))
end
#--------------------------------------------------------------------------
# ● コマンドウィンドウを閉じる
#--------------------------------------------------------------------------
def close_command_window
@command_window.close
update until @command_window.close?
end
#--------------------------------------------------------------------------
# ● コマンド[タイトルへ]
#--------------------------------------------------------------------------
def command_to_title
close_command_window
fadeout_all
SceneManager.goto(Scene_Title)
end
#--------------------------------------------------------------------------
# ● コマンド[シャットダウン]
#--------------------------------------------------------------------------
def command_shutdown
close_command_window
fadeout_all
SceneManager.exit
end
end

144
Scripts/Scene_Equip.rb Normal file
View file

@ -0,0 +1,144 @@
#==============================================================================
# ■ Scene_Equip
#------------------------------------------------------------------------------
#  装備画面の処理を行うクラスです。
#==============================================================================
class Scene_Equip < Scene_MenuBase
#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
def start
super
create_help_window
create_status_window
create_command_window
create_slot_window
create_item_window
end
#--------------------------------------------------------------------------
# ● ステータスウィンドウの作成
#--------------------------------------------------------------------------
def create_status_window
@status_window = Window_EquipStatus.new(0, @help_window.height)
@status_window.viewport = @viewport
@status_window.actor = @actor
end
#--------------------------------------------------------------------------
# ● コマンドウィンドウの作成
#--------------------------------------------------------------------------
def create_command_window
wx = @status_window.width
wy = @help_window.height
ww = Graphics.width - @status_window.width
@command_window = Window_EquipCommand.new(wx, wy, ww)
@command_window.viewport = @viewport
@command_window.help_window = @help_window
@command_window.set_handler(:equip, method(:command_equip))
@command_window.set_handler(:optimize, method(:command_optimize))
@command_window.set_handler(:clear, method(:command_clear))
@command_window.set_handler(:cancel, method(:return_scene))
@command_window.set_handler(:pagedown, method(:next_actor))
@command_window.set_handler(:pageup, method(:prev_actor))
end
#--------------------------------------------------------------------------
# ● スロットウィンドウの作成
#--------------------------------------------------------------------------
def create_slot_window
wx = @status_window.width
wy = @command_window.y + @command_window.height
ww = Graphics.width - @status_window.width
@slot_window = Window_EquipSlot.new(wx, wy, ww)
@slot_window.viewport = @viewport
@slot_window.help_window = @help_window
@slot_window.status_window = @status_window
@slot_window.actor = @actor
@slot_window.set_handler(:ok, method(:on_slot_ok))
@slot_window.set_handler(:cancel, method(:on_slot_cancel))
end
#--------------------------------------------------------------------------
# ● アイテムウィンドウの作成
#--------------------------------------------------------------------------
def create_item_window
wx = 0
wy = @slot_window.y + @slot_window.height
ww = Graphics.width
wh = Graphics.height - wy
@item_window = Window_EquipItem.new(wx, wy, ww, wh)
@item_window.viewport = @viewport
@item_window.help_window = @help_window
@item_window.status_window = @status_window
@item_window.actor = @actor
@item_window.set_handler(:ok, method(:on_item_ok))
@item_window.set_handler(:cancel, method(:on_item_cancel))
@slot_window.item_window = @item_window
end
#--------------------------------------------------------------------------
# ● コマンド[装備変更]
#--------------------------------------------------------------------------
def command_equip
@slot_window.activate
@slot_window.select(0)
end
#--------------------------------------------------------------------------
# ● コマンド[最強装備]
#--------------------------------------------------------------------------
def command_optimize
Sound.play_equip
@actor.optimize_equipments
@status_window.refresh
@slot_window.refresh
@command_window.activate
end
#--------------------------------------------------------------------------
# ● コマンド[全て外す]
#--------------------------------------------------------------------------
def command_clear
Sound.play_equip
@actor.clear_equipments
@status_window.refresh
@slot_window.refresh
@command_window.activate
end
#--------------------------------------------------------------------------
# ● スロット[決定]
#--------------------------------------------------------------------------
def on_slot_ok
@item_window.activate
@item_window.select(0)
end
#--------------------------------------------------------------------------
# ● スロット[キャンセル]
#--------------------------------------------------------------------------
def on_slot_cancel
@slot_window.unselect
@command_window.activate
end
#--------------------------------------------------------------------------
# ● アイテム[決定]
#--------------------------------------------------------------------------
def on_item_ok
Sound.play_equip
@actor.change_equip(@slot_window.index, @item_window.item)
@slot_window.activate
@slot_window.refresh
@item_window.unselect
@item_window.refresh
end
#--------------------------------------------------------------------------
# ● アイテム[キャンセル]
#--------------------------------------------------------------------------
def on_item_cancel
@slot_window.activate
@item_window.unselect
end
#--------------------------------------------------------------------------
# ● アクターの切り替え
#--------------------------------------------------------------------------
def on_actor_change
@status_window.actor = @actor
@slot_window.actor = @actor
@item_window.actor = @actor
@command_window.activate
end
end

203
Scripts/Scene_File.rb Normal file
View file

@ -0,0 +1,203 @@
#==============================================================================
# ■ Scene_File
#------------------------------------------------------------------------------
#  セーブ画面とロード画面の共通処理を行うクラスです。
#==============================================================================
class Scene_File < Scene_MenuBase
#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
def start
super
create_help_window
create_savefile_viewport
create_savefile_windows
init_selection
end
#--------------------------------------------------------------------------
# ● 終了処理
#--------------------------------------------------------------------------
def terminate
super
@savefile_viewport.dispose
@savefile_windows.each {|window| window.dispose }
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
super
@savefile_windows.each {|window| window.update }
update_savefile_selection
end
#--------------------------------------------------------------------------
# ● ヘルプウィンドウの作成
#--------------------------------------------------------------------------
def create_help_window
@help_window = Window_Help.new(1)
@help_window.set_text(help_window_text)
end
#--------------------------------------------------------------------------
# ● ヘルプウィンドウのテキストを取得
#--------------------------------------------------------------------------
def help_window_text
return ""
end
#--------------------------------------------------------------------------
# ● セーブファイルビューポートの作成
#--------------------------------------------------------------------------
def create_savefile_viewport
@savefile_viewport = Viewport.new
@savefile_viewport.rect.y = @help_window.height
@savefile_viewport.rect.height -= @help_window.height
end
#--------------------------------------------------------------------------
# ● セーブファイルウィンドウの作成
#--------------------------------------------------------------------------
def create_savefile_windows
@savefile_windows = Array.new(item_max) do |i|
Window_SaveFile.new(savefile_height, i)
end
@savefile_windows.each {|window| window.viewport = @savefile_viewport }
end
#--------------------------------------------------------------------------
# ● 選択状態の初期化
#--------------------------------------------------------------------------
def init_selection
@index = first_savefile_index
@savefile_windows[@index].selected = true
self.top_index = @index - visible_max / 2
ensure_cursor_visible
end
#--------------------------------------------------------------------------
# ● 項目数の取得
#--------------------------------------------------------------------------
def item_max
DataManager.savefile_max
end
#--------------------------------------------------------------------------
# ● 画面内に表示するセーブファイル数を取得
#--------------------------------------------------------------------------
def visible_max
return 4
end
#--------------------------------------------------------------------------
# ● セーブファイルウィンドウの高さを取得
#--------------------------------------------------------------------------
def savefile_height
@savefile_viewport.rect.height / visible_max
end
#--------------------------------------------------------------------------
# ● 最初に選択状態にするファイルインデックスを取得
#--------------------------------------------------------------------------
def first_savefile_index
return 0
end
#--------------------------------------------------------------------------
# ● 現在のインデックスの取得
#--------------------------------------------------------------------------
def index
@index
end
#--------------------------------------------------------------------------
# ● 先頭のインデックスの取得
#--------------------------------------------------------------------------
def top_index
@savefile_viewport.oy / savefile_height
end
#--------------------------------------------------------------------------
# ● 先頭のインデックスの設定
#--------------------------------------------------------------------------
def top_index=(index)
index = 0 if index < 0
index = item_max - visible_max if index > item_max - visible_max
@savefile_viewport.oy = index * savefile_height
end
#--------------------------------------------------------------------------
# ● 末尾のインデックスの取得
#--------------------------------------------------------------------------
def bottom_index
top_index + visible_max - 1
end
#--------------------------------------------------------------------------
# ● 末尾のインデックスの設定
#--------------------------------------------------------------------------
def bottom_index=(index)
self.top_index = index - (visible_max - 1)
end
#--------------------------------------------------------------------------
# ● セーブファイル選択の更新
#--------------------------------------------------------------------------
def update_savefile_selection
return on_savefile_ok if Input.trigger?(:C)
return on_savefile_cancel if Input.trigger?(:B)
update_cursor
end
#--------------------------------------------------------------------------
# ● セーブファイル[決定]
#--------------------------------------------------------------------------
def on_savefile_ok
end
#--------------------------------------------------------------------------
# ● セーブファイル[キャンセル]
#--------------------------------------------------------------------------
def on_savefile_cancel
Sound.play_cancel
return_scene
end
#--------------------------------------------------------------------------
# ● カーソルの更新
#--------------------------------------------------------------------------
def update_cursor
last_index = @index
cursor_down (Input.trigger?(:DOWN)) if Input.repeat?(:DOWN)
cursor_up (Input.trigger?(:UP)) if Input.repeat?(:UP)
cursor_pagedown if Input.trigger?(:R)
cursor_pageup if Input.trigger?(:L)
if @index != last_index
Sound.play_cursor
@savefile_windows[last_index].selected = false
@savefile_windows[@index].selected = true
end
end
#--------------------------------------------------------------------------
# ● カーソルを下に移動
#--------------------------------------------------------------------------
def cursor_down(wrap)
@index = (@index + 1) % item_max if @index < item_max - 1 || wrap
ensure_cursor_visible
end
#--------------------------------------------------------------------------
# ● カーソルを上に移動
#--------------------------------------------------------------------------
def cursor_up(wrap)
@index = (@index - 1 + item_max) % item_max if @index > 0 || wrap
ensure_cursor_visible
end
#--------------------------------------------------------------------------
# ● カーソルを 1 ページ後ろに移動
#--------------------------------------------------------------------------
def cursor_pagedown
if top_index + visible_max < item_max
self.top_index += visible_max
@index = [@index + visible_max, item_max - 1].min
end
end
#--------------------------------------------------------------------------
# ● カーソルを 1 ページ前に移動
#--------------------------------------------------------------------------
def cursor_pageup
if top_index > 0
self.top_index -= visible_max
@index = [@index - visible_max, 0].max
end
end
#--------------------------------------------------------------------------
# ● カーソル位置が画面内になるようにスクロール
#--------------------------------------------------------------------------
def ensure_cursor_visible
self.top_index = index if index < top_index
self.bottom_index = index if index > bottom_index
end
end

85
Scripts/Scene_Gameover.rb Normal file
View file

@ -0,0 +1,85 @@
#==============================================================================
# ■ Scene_Gameover
#------------------------------------------------------------------------------
#  ゲームオーバー画面の処理を行うクラスです。
#==============================================================================
class Scene_Gameover < Scene_Base
#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
def start
super
play_gameover_music
fadeout_frozen_graphics
create_background
end
#--------------------------------------------------------------------------
# ● 終了処理
#--------------------------------------------------------------------------
def terminate
super
dispose_background
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
super
goto_title if Input.trigger?(:C)
end
#--------------------------------------------------------------------------
# ● トランジション実行
#--------------------------------------------------------------------------
def perform_transition
Graphics.transition(fadein_speed)
end
#--------------------------------------------------------------------------
# ● ゲームオーバー画面の音楽演奏
#--------------------------------------------------------------------------
def play_gameover_music
RPG::BGM.stop
RPG::BGS.stop
$data_system.gameover_me.play
end
#--------------------------------------------------------------------------
# ● 固定済みグラフィックのフェードアウト
#--------------------------------------------------------------------------
def fadeout_frozen_graphics
Graphics.transition(fadeout_speed)
Graphics.freeze
end
#--------------------------------------------------------------------------
# ● 背景の作成
#--------------------------------------------------------------------------
def create_background
@sprite = Sprite.new
@sprite.bitmap = Cache.system("GameOver")
end
#--------------------------------------------------------------------------
# ● 背景の解放
#--------------------------------------------------------------------------
def dispose_background
@sprite.bitmap.dispose
@sprite.dispose
end
#--------------------------------------------------------------------------
# ● フェードアウト速度の取得
#--------------------------------------------------------------------------
def fadeout_speed
return 60
end
#--------------------------------------------------------------------------
# ● フェードイン速度の取得
#--------------------------------------------------------------------------
def fadein_speed
return 120
end
#--------------------------------------------------------------------------
# ● タイトル画面へ遷移
#--------------------------------------------------------------------------
def goto_title
fadeout_all
SceneManager.goto(Scene_Title)
end
end

75
Scripts/Scene_Item.rb Normal file
View file

@ -0,0 +1,75 @@
#==============================================================================
# ■ Scene_Item
#------------------------------------------------------------------------------
#  アイテム画面の処理を行うクラスです。
#==============================================================================
class Scene_Item < Scene_ItemBase
#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
def start
super
create_help_window
create_category_window
create_item_window
end
#--------------------------------------------------------------------------
# ● カテゴリウィンドウの作成
#--------------------------------------------------------------------------
def create_category_window
@category_window = Window_ItemCategory.new
@category_window.viewport = @viewport
@category_window.help_window = @help_window
@category_window.y = @help_window.height
@category_window.set_handler(:ok, method(:on_category_ok))
@category_window.set_handler(:cancel, method(:return_scene))
end
#--------------------------------------------------------------------------
# ● アイテムウィンドウの作成
#--------------------------------------------------------------------------
def create_item_window
wy = @category_window.y + @category_window.height
wh = Graphics.height - wy
@item_window = Window_ItemList.new(0, wy, Graphics.width, wh)
@item_window.viewport = @viewport
@item_window.help_window = @help_window
@item_window.set_handler(:ok, method(:on_item_ok))
@item_window.set_handler(:cancel, method(:on_item_cancel))
@category_window.item_window = @item_window
end
#--------------------------------------------------------------------------
# ● カテゴリ[決定]
#--------------------------------------------------------------------------
def on_category_ok
@item_window.activate
@item_window.select_last
end
#--------------------------------------------------------------------------
# ● アイテム[決定]
#--------------------------------------------------------------------------
def on_item_ok
$game_party.last_item.object = item
determine_item
end
#--------------------------------------------------------------------------
# ● アイテム[キャンセル]
#--------------------------------------------------------------------------
def on_item_cancel
@item_window.unselect
@category_window.activate
end
#--------------------------------------------------------------------------
# ● アイテム使用時の SE 演奏
#--------------------------------------------------------------------------
def play_se_for_item
Sound.play_use_item
end
#--------------------------------------------------------------------------
# ● アイテムの使用
#--------------------------------------------------------------------------
def use_item
super
@item_window.redraw_current_item
end
end

147
Scripts/Scene_ItemBase.rb Normal file
View file

@ -0,0 +1,147 @@
#==============================================================================
# ■ Scene_ItemBase
#------------------------------------------------------------------------------
#  アイテム画面とスキル画面の共通処理を行うクラスです。
#==============================================================================
class Scene_ItemBase < Scene_MenuBase
#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
def start
super
create_actor_window
end
#--------------------------------------------------------------------------
# ● アクターウィンドウの作成
#--------------------------------------------------------------------------
def create_actor_window
@actor_window = Window_MenuActor.new
@actor_window.set_handler(:ok, method(:on_actor_ok))
@actor_window.set_handler(:cancel, method(:on_actor_cancel))
end
#--------------------------------------------------------------------------
# ● 現在選択されているアイテムの取得
#--------------------------------------------------------------------------
def item
@item_window.item
end
#--------------------------------------------------------------------------
# ● アイテムの使用者を取得
#--------------------------------------------------------------------------
def user
$game_party.movable_members.max_by {|member| member.pha }
end
#--------------------------------------------------------------------------
# ● カーソルが左列にあるかの判定
#--------------------------------------------------------------------------
def cursor_left?
@item_window.index % 2 == 0
end
#--------------------------------------------------------------------------
# ● サブウィンドウの表示
#--------------------------------------------------------------------------
def show_sub_window(window)
width_remain = Graphics.width - window.width
window.x = cursor_left? ? width_remain : 0
@viewport.rect.x = @viewport.ox = cursor_left? ? 0 : window.width
@viewport.rect.width = width_remain
window.show.activate
end
#--------------------------------------------------------------------------
# ● サブウィンドウの非表示
#--------------------------------------------------------------------------
def hide_sub_window(window)
@viewport.rect.x = @viewport.ox = 0
@viewport.rect.width = Graphics.width
window.hide.deactivate
activate_item_window
end
#--------------------------------------------------------------------------
# ● アクター[決定]
#--------------------------------------------------------------------------
def on_actor_ok
if item_usable?
use_item
else
Sound.play_buzzer
end
end
#--------------------------------------------------------------------------
# ● アクター[キャンセル]
#--------------------------------------------------------------------------
def on_actor_cancel
hide_sub_window(@actor_window)
end
#--------------------------------------------------------------------------
# ● アイテムの決定
#--------------------------------------------------------------------------
def determine_item
if item.for_friend?
show_sub_window(@actor_window)
@actor_window.select_for_item(item)
else
use_item
activate_item_window
end
end
#--------------------------------------------------------------------------
# ● アイテムウィンドウのアクティブ化
#--------------------------------------------------------------------------
def activate_item_window
@item_window.refresh
@item_window.activate
end
#--------------------------------------------------------------------------
# ● アイテムの使用対象となるアクターを配列で取得
#--------------------------------------------------------------------------
def item_target_actors
if !item.for_friend?
[]
elsif item.for_all?
$game_party.members
else
[$game_party.members[@actor_window.index]]
end
end
#--------------------------------------------------------------------------
# ● アイテムの使用可能判定
#--------------------------------------------------------------------------
def item_usable?
user.usable?(item) && item_effects_valid?
end
#--------------------------------------------------------------------------
# ● アイテムの効果が有効かを判定
#--------------------------------------------------------------------------
def item_effects_valid?
item_target_actors.any? do |target|
target.item_test(user, item)
end
end
#--------------------------------------------------------------------------
# ● アイテムをアクターに対して使用
#--------------------------------------------------------------------------
def use_item_to_actors
item_target_actors.each do |target|
item.repeats.times { target.item_apply(user, item) }
end
end
#--------------------------------------------------------------------------
# ● アイテムの使用
#--------------------------------------------------------------------------
def use_item
play_se_for_item
user.use_item(item)
use_item_to_actors
check_common_event
check_gameover
@actor_window.refresh
end
#--------------------------------------------------------------------------
# ● コモンイベント予約判定
# イベントの呼び出しが予約されているならマップ画面へ遷移する。
#--------------------------------------------------------------------------
def check_common_event
SceneManager.goto(Scene_Map) if $game_temp.common_event_reserved?
end
end

40
Scripts/Scene_Load.rb Normal file
View file

@ -0,0 +1,40 @@
#==============================================================================
# ■ Scene_Load
#------------------------------------------------------------------------------
#  ロード画面の処理を行うクラスです。
#==============================================================================
class Scene_Load < Scene_File
#--------------------------------------------------------------------------
# ● ヘルプウィンドウのテキストを取得
#--------------------------------------------------------------------------
def help_window_text
Vocab::LoadMessage
end
#--------------------------------------------------------------------------
# ● 最初に選択状態にするファイルインデックスを取得
#--------------------------------------------------------------------------
def first_savefile_index
DataManager.latest_savefile_index
end
#--------------------------------------------------------------------------
# ● セーブファイルの決定
#--------------------------------------------------------------------------
def on_savefile_ok
super
if DataManager.load_game(@index)
on_load_success
else
Sound.play_buzzer
end
end
#--------------------------------------------------------------------------
# ● ロード成功時の処理
#--------------------------------------------------------------------------
def on_load_success
Sound.play_load
fadeout_all
$game_system.on_after_load
SceneManager.goto(Scene_Map)
end
end

275
Scripts/Scene_Map.rb Normal file
View file

@ -0,0 +1,275 @@
#==============================================================================
# ■ Scene_Map
#------------------------------------------------------------------------------
#  マップ画面の処理を行うクラスです。
#==============================================================================
class Scene_Map < Scene_Base
#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
def start
super
SceneManager.clear
$game_player.straighten
$game_map.refresh
$game_message.visible = false
create_spriteset
create_all_windows
@menu_calling = false
end
#--------------------------------------------------------------------------
# ● トランジション実行
# 戦闘後やロード直後など、画面が暗転しているときはフェードインを行う。
#--------------------------------------------------------------------------
def perform_transition
if Graphics.brightness == 0
Graphics.transition(0)
fadein(fadein_speed)
else
super
end
end
#--------------------------------------------------------------------------
# ● トランジション速度の取得
#--------------------------------------------------------------------------
def transition_speed
return 15
end
#--------------------------------------------------------------------------
# ● 終了前処理
#--------------------------------------------------------------------------
def pre_terminate
super
pre_battle_scene if SceneManager.scene_is?(Scene_Battle)
pre_title_scene if SceneManager.scene_is?(Scene_Title)
end
#--------------------------------------------------------------------------
# ● 終了処理
#--------------------------------------------------------------------------
def terminate
super
SceneManager.snapshot_for_background
dispose_spriteset
perform_battle_transition if SceneManager.scene_is?(Scene_Battle)
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
super
$game_map.update(true)
$game_player.update
$game_timer.update
@spriteset.update
update_scene if scene_change_ok?
end
#--------------------------------------------------------------------------
# ● シーン遷移の可能判定
#--------------------------------------------------------------------------
def scene_change_ok?
!$game_message.busy? && !$game_message.visible
end
#--------------------------------------------------------------------------
# ● シーン遷移に関連する更新
#--------------------------------------------------------------------------
def update_scene
check_gameover
update_transfer_player unless scene_changing?
update_encounter unless scene_changing?
update_call_menu unless scene_changing?
update_call_debug unless scene_changing?
end
#--------------------------------------------------------------------------
# ● フレーム更新(フェード用)
#--------------------------------------------------------------------------
def update_for_fade
update_basic
$game_map.update(false)
@spriteset.update
end
#--------------------------------------------------------------------------
# ● 汎用フェード処理
#--------------------------------------------------------------------------
def fade_loop(duration)
duration.times do |i|
yield 255 * (i + 1) / duration
update_for_fade
end
end
#--------------------------------------------------------------------------
# ● 画面のフェードイン
#--------------------------------------------------------------------------
def fadein(duration)
fade_loop(duration) {|v| Graphics.brightness = v }
end
#--------------------------------------------------------------------------
# ● 画面のフェードアウト
#--------------------------------------------------------------------------
def fadeout(duration)
fade_loop(duration) {|v| Graphics.brightness = 255 - v }
end
#--------------------------------------------------------------------------
# ● 画面のフェードイン(白)
#--------------------------------------------------------------------------
def white_fadein(duration)
fade_loop(duration) {|v| @viewport.color.set(255, 255, 255, 255 - v) }
end
#--------------------------------------------------------------------------
# ● 画面のフェードアウト(白)
#--------------------------------------------------------------------------
def white_fadeout(duration)
fade_loop(duration) {|v| @viewport.color.set(255, 255, 255, v) }
end
#--------------------------------------------------------------------------
# ● スプライトセットの作成
#--------------------------------------------------------------------------
def create_spriteset
@spriteset = Spriteset_Map.new
end
#--------------------------------------------------------------------------
# ● スプライトセットの解放
#--------------------------------------------------------------------------
def dispose_spriteset
@spriteset.dispose
end
#--------------------------------------------------------------------------
# ● 全ウィンドウの作成
#--------------------------------------------------------------------------
def create_all_windows
create_message_window
create_scroll_text_window
create_location_window
end
#--------------------------------------------------------------------------
# ● メッセージウィンドウの作成
#--------------------------------------------------------------------------
def create_message_window
@message_window = Window_Message.new
end
#--------------------------------------------------------------------------
# ● スクロール文章ウィンドウの作成
#--------------------------------------------------------------------------
def create_scroll_text_window
@scroll_text_window = Window_ScrollText.new
end
#--------------------------------------------------------------------------
# ● マップ名ウィンドウの作成
#--------------------------------------------------------------------------
def create_location_window
@map_name_window = Window_MapName.new
end
#--------------------------------------------------------------------------
# ● 場所移動の更新
#--------------------------------------------------------------------------
def update_transfer_player
perform_transfer if $game_player.transfer?
end
#--------------------------------------------------------------------------
# ● エンカウントの更新
#--------------------------------------------------------------------------
def update_encounter
SceneManager.call(Scene_Battle) if $game_player.encounter
end
#--------------------------------------------------------------------------
# ● キャンセルボタンによるメニュー呼び出し判定
#--------------------------------------------------------------------------
def update_call_menu
if $game_system.menu_disabled || $game_map.interpreter.running?
@menu_calling = false
else
@menu_calling ||= Input.trigger?(:B)
call_menu if @menu_calling && !$game_player.moving?
end
end
#--------------------------------------------------------------------------
# ● メニュー画面の呼び出し
#--------------------------------------------------------------------------
def call_menu
Sound.play_ok
SceneManager.call(Scene_Menu)
Window_MenuCommand::init_command_position
end
#--------------------------------------------------------------------------
# ● F9 キーによるデバッグ呼び出し判定
#--------------------------------------------------------------------------
def update_call_debug
SceneManager.call(Scene_Debug) if $TEST && Input.press?(:F9)
end
#--------------------------------------------------------------------------
# ● 場所移動の処理
#--------------------------------------------------------------------------
def perform_transfer
pre_transfer
$game_player.perform_transfer
post_transfer
end
#--------------------------------------------------------------------------
# ● 場所移動前の処理
#--------------------------------------------------------------------------
def pre_transfer
@map_name_window.close
case $game_temp.fade_type
when 0
fadeout(fadeout_speed)
when 1
white_fadeout(fadeout_speed)
end
end
#--------------------------------------------------------------------------
# ● 場所移動後の処理
#--------------------------------------------------------------------------
def post_transfer
case $game_temp.fade_type
when 0
Graphics.wait(fadein_speed / 2)
fadein(fadein_speed)
when 1
Graphics.wait(fadein_speed / 2)
white_fadein(fadein_speed)
end
@map_name_window.open
end
#--------------------------------------------------------------------------
# ● バトル画面遷移の前処理
#--------------------------------------------------------------------------
def pre_battle_scene
Graphics.update
Graphics.freeze
@spriteset.dispose_characters
BattleManager.save_bgm_and_bgs
BattleManager.play_battle_bgm
Sound.play_battle_start
end
#--------------------------------------------------------------------------
# ● タイトル画面遷移の前処理
#--------------------------------------------------------------------------
def pre_title_scene
fadeout(fadeout_speed_to_title)
end
#--------------------------------------------------------------------------
# ● 戦闘前トランジション実行
#--------------------------------------------------------------------------
def perform_battle_transition
Graphics.transition(60, "Graphics/System/BattleStart", 100)
Graphics.freeze
end
#--------------------------------------------------------------------------
# ● フェードアウト速度の取得
#--------------------------------------------------------------------------
def fadeout_speed
return 30
end
#--------------------------------------------------------------------------
# ● フェードイン速度の取得
#--------------------------------------------------------------------------
def fadein_speed
return 30
end
#--------------------------------------------------------------------------
# ● タイトル画面遷移用フェードアウト速度の取得
#--------------------------------------------------------------------------
def fadeout_speed_to_title
return 60
end
end

127
Scripts/Scene_Menu.rb Normal file
View file

@ -0,0 +1,127 @@
#==============================================================================
# ■ Scene_Menu
#------------------------------------------------------------------------------
#  メニュー画面の処理を行うクラスです。
#==============================================================================
class Scene_Menu < Scene_MenuBase
#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
def start
super
create_command_window
create_gold_window
create_status_window
end
#--------------------------------------------------------------------------
# ● コマンドウィンドウの作成
#--------------------------------------------------------------------------
def create_command_window
@command_window = Window_MenuCommand.new
@command_window.set_handler(:item, method(:command_item))
@command_window.set_handler(:skill, method(:command_personal))
@command_window.set_handler(:equip, method(:command_personal))
@command_window.set_handler(:status, method(:command_personal))
@command_window.set_handler(:formation, method(:command_formation))
@command_window.set_handler(:save, method(:command_save))
@command_window.set_handler(:game_end, method(:command_game_end))
@command_window.set_handler(:cancel, method(:return_scene))
end
#--------------------------------------------------------------------------
# ● ゴールドウィンドウの作成
#--------------------------------------------------------------------------
def create_gold_window
@gold_window = Window_Gold.new
@gold_window.x = 0
@gold_window.y = Graphics.height - @gold_window.height
end
#--------------------------------------------------------------------------
# ● ステータスウィンドウの作成
#--------------------------------------------------------------------------
def create_status_window
@status_window = Window_MenuStatus.new(@command_window.width, 0)
end
#--------------------------------------------------------------------------
# ● コマンド[アイテム]
#--------------------------------------------------------------------------
def command_item
SceneManager.call(Scene_Item)
end
#--------------------------------------------------------------------------
# ● コマンド[スキル][装備][ステータス]
#--------------------------------------------------------------------------
def command_personal
@status_window.select_last
@status_window.activate
@status_window.set_handler(:ok, method(:on_personal_ok))
@status_window.set_handler(:cancel, method(:on_personal_cancel))
end
#--------------------------------------------------------------------------
# ● コマンド[並び替え]
#--------------------------------------------------------------------------
def command_formation
@status_window.select_last
@status_window.activate
@status_window.set_handler(:ok, method(:on_formation_ok))
@status_window.set_handler(:cancel, method(:on_formation_cancel))
end
#--------------------------------------------------------------------------
# ● コマンド[セーブ]
#--------------------------------------------------------------------------
def command_save
SceneManager.call(Scene_Save)
end
#--------------------------------------------------------------------------
# ● コマンド[ゲーム終了]
#--------------------------------------------------------------------------
def command_game_end
SceneManager.call(Scene_End)
end
#--------------------------------------------------------------------------
# ● 個人コマンド[決定]
#--------------------------------------------------------------------------
def on_personal_ok
case @command_window.current_symbol
when :skill
SceneManager.call(Scene_Skill)
when :equip
SceneManager.call(Scene_Equip)
when :status
SceneManager.call(Scene_Status)
end
end
#--------------------------------------------------------------------------
# ● 個人コマンド[終了]
#--------------------------------------------------------------------------
def on_personal_cancel
@status_window.unselect
@command_window.activate
end
#--------------------------------------------------------------------------
# ● 並び替え[決定]
#--------------------------------------------------------------------------
def on_formation_ok
if @status_window.pending_index >= 0
$game_party.swap_order(@status_window.index,
@status_window.pending_index)
@status_window.pending_index = -1
@status_window.redraw_item(@status_window.index)
else
@status_window.pending_index = @status_window.index
end
@status_window.activate
end
#--------------------------------------------------------------------------
# ● 並び替え[キャンセル]
#--------------------------------------------------------------------------
def on_formation_cancel
if @status_window.pending_index >= 0
@status_window.pending_index = -1
@status_window.activate
else
@status_window.unselect
@command_window.activate
end
end
end

63
Scripts/Scene_MenuBase.rb Normal file
View file

@ -0,0 +1,63 @@
#==============================================================================
# ■ Scene_MenuBase
#------------------------------------------------------------------------------
#  メニュー画面系の基本処理を行うクラスです。
#==============================================================================
class Scene_MenuBase < Scene_Base
#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
def start
super
create_background
@actor = $game_party.menu_actor
end
#--------------------------------------------------------------------------
# ● 終了処理
#--------------------------------------------------------------------------
def terminate
super
dispose_background
end
#--------------------------------------------------------------------------
# ● 背景の作成
#--------------------------------------------------------------------------
def create_background
@background_sprite = Sprite.new
@background_sprite.bitmap = SceneManager.background_bitmap
@background_sprite.color.set(16, 16, 16, 128)
end
#--------------------------------------------------------------------------
# ● 背景の解放
#--------------------------------------------------------------------------
def dispose_background
@background_sprite.dispose
end
#--------------------------------------------------------------------------
# ● ヘルプウィンドウの作成
#--------------------------------------------------------------------------
def create_help_window
@help_window = Window_Help.new
@help_window.viewport = @viewport
end
#--------------------------------------------------------------------------
# ● 次のアクターに切り替え
#--------------------------------------------------------------------------
def next_actor
@actor = $game_party.menu_actor_next
on_actor_change
end
#--------------------------------------------------------------------------
# ● 前のアクターに切り替え
#--------------------------------------------------------------------------
def prev_actor
@actor = $game_party.menu_actor_prev
on_actor_change
end
#--------------------------------------------------------------------------
# ● アクターの切り替え
#--------------------------------------------------------------------------
def on_actor_change
end
end

32
Scripts/Scene_Name.rb Normal file
View file

@ -0,0 +1,32 @@
#==============================================================================
# ■ Scene_Name
#------------------------------------------------------------------------------
#  名前入力画面の処理を行うクラスです。
#==============================================================================
class Scene_Name < Scene_MenuBase
#--------------------------------------------------------------------------
# ● 準備
#--------------------------------------------------------------------------
def prepare(actor_id, max_char)
@actor_id = actor_id
@max_char = max_char
end
#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
def start
super
@actor = $game_actors[@actor_id]
@edit_window = Window_NameEdit.new(@actor, @max_char)
@input_window = Window_NameInput.new(@edit_window)
@input_window.set_handler(:ok, method(:on_input_ok))
end
#--------------------------------------------------------------------------
# ● 入力[決定]
#--------------------------------------------------------------------------
def on_input_ok
@actor.name = @edit_window.name
return_scene
end
end

38
Scripts/Scene_Save.rb Normal file
View file

@ -0,0 +1,38 @@
#==============================================================================
# ■ Scene_Save
#------------------------------------------------------------------------------
#  セーブ画面の処理を行うクラスです。
#==============================================================================
class Scene_Save < Scene_File
#--------------------------------------------------------------------------
# ● ヘルプウィンドウのテキストを取得
#--------------------------------------------------------------------------
def help_window_text
Vocab::SaveMessage
end
#--------------------------------------------------------------------------
# ● 最初に選択状態にするファイルインデックスを取得
#--------------------------------------------------------------------------
def first_savefile_index
DataManager.last_savefile_index
end
#--------------------------------------------------------------------------
# ● セーブファイルの決定
#--------------------------------------------------------------------------
def on_savefile_ok
super
if DataManager.save_game(@index)
on_save_success
else
Sound.play_buzzer
end
end
#--------------------------------------------------------------------------
# ● セーブ成功時の処理
#--------------------------------------------------------------------------
def on_save_success
Sound.play_save
return_scene
end
end

299
Scripts/Scene_Shop.rb Normal file
View file

@ -0,0 +1,299 @@
#==============================================================================
# ■ Scene_Shop
#------------------------------------------------------------------------------
#  ショップ画面の処理を行うクラスです。
#==============================================================================
class Scene_Shop < Scene_MenuBase
#--------------------------------------------------------------------------
# ● 準備
#--------------------------------------------------------------------------
def prepare(goods, purchase_only)
@goods = goods
@purchase_only = purchase_only
end
#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
def start
super
create_help_window
create_gold_window
create_command_window
create_dummy_window
create_number_window
create_status_window
create_buy_window
create_category_window
create_sell_window
end
#--------------------------------------------------------------------------
# ● ゴールドウィンドウの作成
#--------------------------------------------------------------------------
def create_gold_window
@gold_window = Window_Gold.new
@gold_window.viewport = @viewport
@gold_window.x = Graphics.width - @gold_window.width
@gold_window.y = @help_window.height
end
#--------------------------------------------------------------------------
# ● コマンドウィンドウの作成
#--------------------------------------------------------------------------
def create_command_window
@command_window = Window_ShopCommand.new(@gold_window.x, @purchase_only)
@command_window.viewport = @viewport
@command_window.y = @help_window.height
@command_window.set_handler(:buy, method(:command_buy))
@command_window.set_handler(:sell, method(:command_sell))
@command_window.set_handler(:cancel, method(:return_scene))
end
#--------------------------------------------------------------------------
# ● ダミーウィンドウの作成
#--------------------------------------------------------------------------
def create_dummy_window
wy = @command_window.y + @command_window.height
wh = Graphics.height - wy
@dummy_window = Window_Base.new(0, wy, Graphics.width, wh)
@dummy_window.viewport = @viewport
end
#--------------------------------------------------------------------------
# ● 個数入力ウィンドウの作成
#--------------------------------------------------------------------------
def create_number_window
wy = @dummy_window.y
wh = @dummy_window.height
@number_window = Window_ShopNumber.new(0, wy, wh)
@number_window.viewport = @viewport
@number_window.hide
@number_window.set_handler(:ok, method(:on_number_ok))
@number_window.set_handler(:cancel, method(:on_number_cancel))
end
#--------------------------------------------------------------------------
# ● ステータスウィンドウの作成
#--------------------------------------------------------------------------
def create_status_window
wx = @number_window.width
wy = @dummy_window.y
ww = Graphics.width - wx
wh = @dummy_window.height
@status_window = Window_ShopStatus.new(wx, wy, ww, wh)
@status_window.viewport = @viewport
@status_window.hide
end
#--------------------------------------------------------------------------
# ● 購入ウィンドウの作成
#--------------------------------------------------------------------------
def create_buy_window
wy = @dummy_window.y
wh = @dummy_window.height
@buy_window = Window_ShopBuy.new(0, wy, wh, @goods)
@buy_window.viewport = @viewport
@buy_window.help_window = @help_window
@buy_window.status_window = @status_window
@buy_window.hide
@buy_window.set_handler(:ok, method(:on_buy_ok))
@buy_window.set_handler(:cancel, method(:on_buy_cancel))
end
#--------------------------------------------------------------------------
# ● カテゴリウィンドウの作成
#--------------------------------------------------------------------------
def create_category_window
@category_window = Window_ItemCategory.new
@category_window.viewport = @viewport
@category_window.help_window = @help_window
@category_window.y = @dummy_window.y
@category_window.hide.deactivate
@category_window.set_handler(:ok, method(:on_category_ok))
@category_window.set_handler(:cancel, method(:on_category_cancel))
end
#--------------------------------------------------------------------------
# ● 売却ウィンドウの作成
#--------------------------------------------------------------------------
def create_sell_window
wy = @category_window.y + @category_window.height
wh = Graphics.height - wy
@sell_window = Window_ShopSell.new(0, wy, Graphics.width, wh)
@sell_window.viewport = @viewport
@sell_window.help_window = @help_window
@sell_window.hide
@sell_window.set_handler(:ok, method(:on_sell_ok))
@sell_window.set_handler(:cancel, method(:on_sell_cancel))
@category_window.item_window = @sell_window
end
#--------------------------------------------------------------------------
# ● 購入ウィンドウのアクティブ化
#--------------------------------------------------------------------------
def activate_buy_window
@buy_window.money = money
@buy_window.show.activate
@status_window.show
end
#--------------------------------------------------------------------------
# ● 売却ウィンドウのアクティブ化
#--------------------------------------------------------------------------
def activate_sell_window
@category_window.show
@sell_window.refresh
@sell_window.show.activate
@status_window.hide
end
#--------------------------------------------------------------------------
# ● コマンド[購入する]
#--------------------------------------------------------------------------
def command_buy
@dummy_window.hide
activate_buy_window
end
#--------------------------------------------------------------------------
# ● コマンド[売却する]
#--------------------------------------------------------------------------
def command_sell
@dummy_window.hide
@category_window.show.activate
@sell_window.show
@sell_window.unselect
@sell_window.refresh
end
#--------------------------------------------------------------------------
# ● 購入[決定]
#--------------------------------------------------------------------------
def on_buy_ok
@item = @buy_window.item
@buy_window.hide
@number_window.set(@item, max_buy, buying_price, currency_unit)
@number_window.show.activate
end
#--------------------------------------------------------------------------
# ● 購入[キャンセル]
#--------------------------------------------------------------------------
def on_buy_cancel
@command_window.activate
@dummy_window.show
@buy_window.hide
@status_window.hide
@status_window.item = nil
@help_window.clear
end
#--------------------------------------------------------------------------
# ● カテゴリ[決定]
#--------------------------------------------------------------------------
def on_category_ok
activate_sell_window
@sell_window.select(0)
end
#--------------------------------------------------------------------------
# ● カテゴリ[キャンセル]
#--------------------------------------------------------------------------
def on_category_cancel
@command_window.activate
@dummy_window.show
@category_window.hide
@sell_window.hide
end
#--------------------------------------------------------------------------
# ● 売却[決定]
#--------------------------------------------------------------------------
def on_sell_ok
@item = @sell_window.item
@status_window.item = @item
@category_window.hide
@sell_window.hide
@number_window.set(@item, max_sell, selling_price, currency_unit)
@number_window.show.activate
@status_window.show
end
#--------------------------------------------------------------------------
# ● 売却[キャンセル]
#--------------------------------------------------------------------------
def on_sell_cancel
@sell_window.unselect
@category_window.activate
@status_window.item = nil
@help_window.clear
end
#--------------------------------------------------------------------------
# ● 個数入力[決定]
#--------------------------------------------------------------------------
def on_number_ok
Sound.play_shop
case @command_window.current_symbol
when :buy
do_buy(@number_window.number)
when :sell
do_sell(@number_window.number)
end
end_number_input
@gold_window.refresh
@status_window.refresh
end
#--------------------------------------------------------------------------
# ● 個数入力[キャンセル]
#--------------------------------------------------------------------------
def on_number_cancel
Sound.play_cancel
end_number_input
end
#--------------------------------------------------------------------------
# ● 購入の実行
#--------------------------------------------------------------------------
def do_buy(number)
$game_party.lose_gold(number * buying_price)
$game_party.gain_item(@item, number)
end
#--------------------------------------------------------------------------
# ● 売却の実行
#--------------------------------------------------------------------------
def do_sell(number)
$game_party.gain_gold(number * selling_price)
$game_party.lose_item(@item, number)
end
#--------------------------------------------------------------------------
# ● 個数入力の終了
#--------------------------------------------------------------------------
def end_number_input
@number_window.hide
case @command_window.current_symbol
when :buy
activate_buy_window
when :sell
activate_sell_window
end
end
#--------------------------------------------------------------------------
# ● 最大購入可能個数の取得
#--------------------------------------------------------------------------
def max_buy
max = $game_party.max_item_number(@item) - $game_party.item_number(@item)
buying_price == 0 ? max : [max, money / buying_price].min
end
#--------------------------------------------------------------------------
# ● 最大売却可能個数の取得
#--------------------------------------------------------------------------
def max_sell
$game_party.item_number(@item)
end
#--------------------------------------------------------------------------
# ● 所持金の取得
#--------------------------------------------------------------------------
def money
@gold_window.value
end
#--------------------------------------------------------------------------
# ● 通貨単位の取得
#--------------------------------------------------------------------------
def currency_unit
@gold_window.currency_unit
end
#--------------------------------------------------------------------------
# ● 買値の取得
#--------------------------------------------------------------------------
def buying_price
@buy_window.price(@item)
end
#--------------------------------------------------------------------------
# ● 売値の取得
#--------------------------------------------------------------------------
def selling_price
@item.price / 2
end
end

108
Scripts/Scene_Skill.rb Normal file
View file

@ -0,0 +1,108 @@
#==============================================================================
# ■ Scene_Skill
#------------------------------------------------------------------------------
#  スキル画面の処理を行うクラスです。処理共通化の便宜上、スキルも「アイテム」
# として扱っています。
#==============================================================================
class Scene_Skill < Scene_ItemBase
#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
def start
super
create_help_window
create_command_window
create_status_window
create_item_window
end
#--------------------------------------------------------------------------
# ● コマンドウィンドウの作成
#--------------------------------------------------------------------------
def create_command_window
wy = @help_window.height
@command_window = Window_SkillCommand.new(0, wy)
@command_window.viewport = @viewport
@command_window.help_window = @help_window
@command_window.actor = @actor
@command_window.set_handler(:skill, method(:command_skill))
@command_window.set_handler(:cancel, method(:return_scene))
@command_window.set_handler(:pagedown, method(:next_actor))
@command_window.set_handler(:pageup, method(:prev_actor))
end
#--------------------------------------------------------------------------
# ● ステータスウィンドウの作成
#--------------------------------------------------------------------------
def create_status_window
y = @help_window.height
@status_window = Window_SkillStatus.new(@command_window.width, y)
@status_window.viewport = @viewport
@status_window.actor = @actor
end
#--------------------------------------------------------------------------
# ● アイテムウィンドウの作成
#--------------------------------------------------------------------------
def create_item_window
wx = 0
wy = @status_window.y + @status_window.height
ww = Graphics.width
wh = Graphics.height - wy
@item_window = Window_SkillList.new(wx, wy, ww, wh)
@item_window.actor = @actor
@item_window.viewport = @viewport
@item_window.help_window = @help_window
@item_window.set_handler(:ok, method(:on_item_ok))
@item_window.set_handler(:cancel, method(:on_item_cancel))
@command_window.skill_window = @item_window
end
#--------------------------------------------------------------------------
# ● スキルの使用者を取得
#--------------------------------------------------------------------------
def user
@actor
end
#--------------------------------------------------------------------------
# ● コマンド[スキル]
#--------------------------------------------------------------------------
def command_skill
@item_window.activate
@item_window.select_last
end
#--------------------------------------------------------------------------
# ● アイテム[決定]
#--------------------------------------------------------------------------
def on_item_ok
@actor.last_skill.object = item
determine_item
end
#--------------------------------------------------------------------------
# ● アイテム[キャンセル]
#--------------------------------------------------------------------------
def on_item_cancel
@item_window.unselect
@command_window.activate
end
#--------------------------------------------------------------------------
# ● アイテム使用時の SE 演奏
#--------------------------------------------------------------------------
def play_se_for_item
Sound.play_use_skill
end
#--------------------------------------------------------------------------
# ● アイテムの使用
#--------------------------------------------------------------------------
def use_item
super
@status_window.refresh
@item_window.refresh
end
#--------------------------------------------------------------------------
# ● アクターの切り替え
#--------------------------------------------------------------------------
def on_actor_change
@command_window.actor = @actor
@status_window.actor = @actor
@item_window.actor = @actor
@command_window.activate
end
end

25
Scripts/Scene_Status.rb Normal file
View file

@ -0,0 +1,25 @@
#==============================================================================
# ■ Scene_Status
#------------------------------------------------------------------------------
#  ステータス画面の処理を行うクラスです。
#==============================================================================
class Scene_Status < Scene_MenuBase
#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
def start
super
@status_window = Window_Status.new(@actor)
@status_window.set_handler(:cancel, method(:return_scene))
@status_window.set_handler(:pagedown, method(:next_actor))
@status_window.set_handler(:pageup, method(:prev_actor))
end
#--------------------------------------------------------------------------
# ● アクターの切り替え
#--------------------------------------------------------------------------
def on_actor_change
@status_window.actor = @actor
@status_window.activate
end
end

137
Scripts/Scene_Title.rb Normal file
View file

@ -0,0 +1,137 @@
#==============================================================================
# ■ Scene_Title
#------------------------------------------------------------------------------
#  タイトル画面の処理を行うクラスです。
#==============================================================================
class Scene_Title < Scene_Base
#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
def start
super
SceneManager.clear
Graphics.freeze
create_background
create_foreground
create_command_window
play_title_music
end
#--------------------------------------------------------------------------
# ● トランジション速度の取得
#--------------------------------------------------------------------------
def transition_speed
return 20
end
#--------------------------------------------------------------------------
# ● 終了処理
#--------------------------------------------------------------------------
def terminate
super
SceneManager.snapshot_for_background
dispose_background
dispose_foreground
end
#--------------------------------------------------------------------------
# ● 背景の作成
#--------------------------------------------------------------------------
def create_background
@sprite1 = Sprite.new
@sprite1.bitmap = Cache.title1($data_system.title1_name)
@sprite2 = Sprite.new
@sprite2.bitmap = Cache.title2($data_system.title2_name)
center_sprite(@sprite1)
center_sprite(@sprite2)
end
#--------------------------------------------------------------------------
# ● 前景の作成
#--------------------------------------------------------------------------
def create_foreground
@foreground_sprite = Sprite.new
@foreground_sprite.bitmap = Bitmap.new(Graphics.width, Graphics.height)
@foreground_sprite.z = 100
draw_game_title if $data_system.opt_draw_title
end
#--------------------------------------------------------------------------
# ● ゲームタイトルの描画
#--------------------------------------------------------------------------
def draw_game_title
@foreground_sprite.bitmap.font.size = 48
rect = Rect.new(0, 0, Graphics.width, Graphics.height / 2)
@foreground_sprite.bitmap.draw_text(rect, $data_system.game_title, 1)
end
#--------------------------------------------------------------------------
# ● 背景の解放
#--------------------------------------------------------------------------
def dispose_background
@sprite1.bitmap.dispose
@sprite1.dispose
@sprite2.bitmap.dispose
@sprite2.dispose
end
#--------------------------------------------------------------------------
# ● 前景の解放
#--------------------------------------------------------------------------
def dispose_foreground
@foreground_sprite.bitmap.dispose
@foreground_sprite.dispose
end
#--------------------------------------------------------------------------
# ● スプライトを画面中央に移動
#--------------------------------------------------------------------------
def center_sprite(sprite)
sprite.ox = sprite.bitmap.width / 2
sprite.oy = sprite.bitmap.height / 2
sprite.x = Graphics.width / 2
sprite.y = Graphics.height / 2
end
#--------------------------------------------------------------------------
# ● コマンドウィンドウの作成
#--------------------------------------------------------------------------
def create_command_window
@command_window = Window_TitleCommand.new
@command_window.set_handler(:new_game, method(:command_new_game))
@command_window.set_handler(:continue, method(:command_continue))
@command_window.set_handler(:shutdown, method(:command_shutdown))
end
#--------------------------------------------------------------------------
# ● コマンドウィンドウを閉じる
#--------------------------------------------------------------------------
def close_command_window
@command_window.close
update until @command_window.close?
end
#--------------------------------------------------------------------------
# ● コマンド[ニューゲーム]
#--------------------------------------------------------------------------
def command_new_game
DataManager.setup_new_game
close_command_window
fadeout_all
$game_map.autoplay
SceneManager.goto(Scene_Map)
end
#--------------------------------------------------------------------------
# ● コマンド[コンティニュー]
#--------------------------------------------------------------------------
def command_continue
close_command_window
SceneManager.call(Scene_Load)
end
#--------------------------------------------------------------------------
# ● コマンド[シャットダウン]
#--------------------------------------------------------------------------
def command_shutdown
close_command_window
fadeout_all
SceneManager.exit
end
#--------------------------------------------------------------------------
# ● タイトル画面の音楽演奏
#--------------------------------------------------------------------------
def play_title_music
$data_system.title_bgm.play
RPG::BGS.stop
RPG::ME.stop
end
end

135
Scripts/Sound.rb Normal file
View file

@ -0,0 +1,135 @@
#==============================================================================
# ■ Sound
#------------------------------------------------------------------------------
#  効果音を演奏するモジュールです。グローバル変数 $data_system からデータベー
# スで設定された SE の内容を取得し、演奏します。
#==============================================================================
module Sound
# システム効果音
def self.play_system_sound(n)
$data_system.sounds[n].play
end
# カーソル移動
def self.play_cursor
play_system_sound(0)
end
# 決定
def self.play_ok
play_system_sound(1)
end
# キャンセル
def self.play_cancel
play_system_sound(2)
end
# ブザー
def self.play_buzzer
play_system_sound(3)
end
# 装備
def self.play_equip
play_system_sound(4)
end
# セーブ
def self.play_save
play_system_sound(5)
end
# ロード
def self.play_load
play_system_sound(6)
end
# 戦闘開始
def self.play_battle_start
play_system_sound(7)
end
# 逃走
def self.play_escape
play_system_sound(8)
end
# 敵の通常攻撃
def self.play_enemy_attack
play_system_sound(9)
end
# 敵ダメージ
def self.play_enemy_damage
play_system_sound(10)
end
# 敵消滅
def self.play_enemy_collapse
play_system_sound(11)
end
# ボス消滅 1
def self.play_boss_collapse1
play_system_sound(12)
end
# ボス消滅 2
def self.play_boss_collapse2
play_system_sound(13)
end
# 味方ダメージ
def self.play_actor_damage
play_system_sound(14)
end
# 味方戦闘不能
def self.play_actor_collapse
play_system_sound(15)
end
# 回復
def self.play_recovery
play_system_sound(16)
end
# ミス
def self.play_miss
play_system_sound(17)
end
# 攻撃回避
def self.play_evasion
play_system_sound(18)
end
# 魔法回避
def self.play_magic_evasion
play_system_sound(19)
end
# 魔法反射
def self.play_reflection
play_system_sound(20)
end
# ショップ
def self.play_shop
play_system_sound(21)
end
# アイテム使用
def self.play_use_item
play_system_sound(22)
end
# スキル使用
def self.play_use_skill
play_system_sound(0)
end
end

232
Scripts/Sprite_Base.rb Normal file
View file

@ -0,0 +1,232 @@
#==============================================================================
# ■ Sprite_Base
#------------------------------------------------------------------------------
#  アニメーションの表示処理を追加したスプライトのクラスです。
#==============================================================================
class Sprite_Base < Sprite
#--------------------------------------------------------------------------
# ● クラス変数
#--------------------------------------------------------------------------
@@ani_checker = []
@@ani_spr_checker = []
@@_reference_count = {}
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(viewport = nil)
super(viewport)
@use_sprite = true # スプライト使用フラグ
@ani_duration = 0 # アニメーションの残り時間
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
super
dispose_animation
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
super
update_animation
@@ani_checker.clear
@@ani_spr_checker.clear
end
#--------------------------------------------------------------------------
# ● アニメーション表示中判定
#--------------------------------------------------------------------------
def animation?
@animation != nil
end
#--------------------------------------------------------------------------
# ● アニメーションの開始
#--------------------------------------------------------------------------
def start_animation(animation, mirror = false)
dispose_animation
@animation = animation
if @animation
@ani_mirror = mirror
set_animation_rate
@ani_duration = @animation.frame_max * @ani_rate + 1
load_animation_bitmap
make_animation_sprites
set_animation_origin
end
end
#--------------------------------------------------------------------------
# ● アニメーションの速度を設定
#--------------------------------------------------------------------------
def set_animation_rate
@ani_rate = 4 # デフォルトでは固定値
end
#--------------------------------------------------------------------------
# ● アニメーション グラフィックの読み込み
#--------------------------------------------------------------------------
def load_animation_bitmap
animation1_name = @animation.animation1_name
animation1_hue = @animation.animation1_hue
animation2_name = @animation.animation2_name
animation2_hue = @animation.animation2_hue
@ani_bitmap1 = Cache.animation(animation1_name, animation1_hue)
@ani_bitmap2 = Cache.animation(animation2_name, animation2_hue)
if @@_reference_count.include?(@ani_bitmap1)
@@_reference_count[@ani_bitmap1] += 1
else
@@_reference_count[@ani_bitmap1] = 1
end
if @@_reference_count.include?(@ani_bitmap2)
@@_reference_count[@ani_bitmap2] += 1
else
@@_reference_count[@ani_bitmap2] = 1
end
Graphics.frame_reset
end
#--------------------------------------------------------------------------
# ● アニメーションスプライトの作成
#--------------------------------------------------------------------------
def make_animation_sprites
@ani_sprites = []
if @use_sprite && !@@ani_spr_checker.include?(@animation)
16.times do
sprite = ::Sprite.new(viewport)
sprite.visible = false
@ani_sprites.push(sprite)
end
if @animation.position == 3
@@ani_spr_checker.push(@animation)
end
end
@ani_duplicated = @@ani_checker.include?(@animation)
if !@ani_duplicated && @animation.position == 3
@@ani_checker.push(@animation)
end
end
#--------------------------------------------------------------------------
# ● アニメーションの原点設定
#--------------------------------------------------------------------------
def set_animation_origin
if @animation.position == 3
if viewport == nil
@ani_ox = Graphics.width / 2
@ani_oy = Graphics.height / 2
else
@ani_ox = viewport.rect.width / 2
@ani_oy = viewport.rect.height / 2
end
else
@ani_ox = x - ox + width / 2
@ani_oy = y - oy + height / 2
if @animation.position == 0
@ani_oy -= height / 2
elsif @animation.position == 2
@ani_oy += height / 2
end
end
end
#--------------------------------------------------------------------------
# ● アニメーションの解放
#--------------------------------------------------------------------------
def dispose_animation
if @ani_bitmap1
@@_reference_count[@ani_bitmap1] -= 1
if @@_reference_count[@ani_bitmap1] == 0
@ani_bitmap1.dispose
end
end
if @ani_bitmap2
@@_reference_count[@ani_bitmap2] -= 1
if @@_reference_count[@ani_bitmap2] == 0
@ani_bitmap2.dispose
end
end
if @ani_sprites
@ani_sprites.each {|sprite| sprite.dispose }
@ani_sprites = nil
@animation = nil
end
@ani_bitmap1 = nil
@ani_bitmap2 = nil
end
#--------------------------------------------------------------------------
# ● アニメーションの更新
#--------------------------------------------------------------------------
def update_animation
return unless animation?
@ani_duration -= 1
if @ani_duration % @ani_rate == 0
if @ani_duration > 0
frame_index = @animation.frame_max
frame_index -= (@ani_duration + @ani_rate - 1) / @ani_rate
animation_set_sprites(@animation.frames[frame_index])
@animation.timings.each do |timing|
animation_process_timing(timing) if timing.frame == frame_index
end
else
end_animation
end
end
end
#--------------------------------------------------------------------------
# ● アニメーションの終了
#--------------------------------------------------------------------------
def end_animation
dispose_animation
end
#--------------------------------------------------------------------------
# ● アニメーションスプライトの設定
# frame : フレームデータRPG::Animation::Frame
#--------------------------------------------------------------------------
def animation_set_sprites(frame)
cell_data = frame.cell_data
@ani_sprites.each_with_index do |sprite, i|
next unless sprite
pattern = cell_data[i, 0]
if !pattern || pattern < 0
sprite.visible = false
next
end
sprite.bitmap = pattern < 100 ? @ani_bitmap1 : @ani_bitmap2
sprite.visible = true
sprite.src_rect.set(pattern % 5 * 192,
pattern % 100 / 5 * 192, 192, 192)
if @ani_mirror
sprite.x = @ani_ox - cell_data[i, 1]
sprite.y = @ani_oy + cell_data[i, 2]
sprite.angle = (360 - cell_data[i, 4])
sprite.mirror = (cell_data[i, 5] == 0)
else
sprite.x = @ani_ox + cell_data[i, 1]
sprite.y = @ani_oy + cell_data[i, 2]
sprite.angle = cell_data[i, 4]
sprite.mirror = (cell_data[i, 5] == 1)
end
sprite.z = self.z + 300 + i
sprite.ox = 96
sprite.oy = 96
sprite.zoom_x = cell_data[i, 3] / 100.0
sprite.zoom_y = cell_data[i, 3] / 100.0
sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
sprite.blend_type = cell_data[i, 7]
end
end
#--------------------------------------------------------------------------
# ● SE とフラッシュのタイミング処理
# timing : タイミングデータRPG::Animation::Timing
#--------------------------------------------------------------------------
def animation_process_timing(timing)
timing.se.play unless @ani_duplicated
case timing.flash_scope
when 1
self.flash(timing.flash_color, timing.flash_duration * @ani_rate)
when 2
if viewport && !@ani_duplicated
viewport.flash(timing.flash_color, timing.flash_duration * @ani_rate)
end
when 3
self.flash(nil, timing.flash_duration * @ani_rate)
end
end
end

231
Scripts/Sprite_Battler.rb Normal file
View file

@ -0,0 +1,231 @@
#==============================================================================
# ■ Sprite_Battler
#------------------------------------------------------------------------------
#  バトラー表示用のスプライトです。Game_Battler クラスのインスタンスを監視し、
# スプライトの状態を自動的に変化させます。
#==============================================================================
class Sprite_Battler < Sprite_Base
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :battler
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(viewport, battler = nil)
super(viewport)
@battler = battler
@battler_visible = false
@effect_type = nil
@effect_duration = 0
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
bitmap.dispose if bitmap
super
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
super
if @battler
@use_sprite = @battler.use_sprite?
if @use_sprite
update_bitmap
update_origin
update_position
end
setup_new_effect
setup_new_animation
update_effect
else
self.bitmap = nil
@effect_type = nil
end
end
#--------------------------------------------------------------------------
# ● 転送元ビットマップの更新
#--------------------------------------------------------------------------
def update_bitmap
new_bitmap = Cache.battler(@battler.battler_name, @battler.battler_hue)
if bitmap != new_bitmap
self.bitmap = new_bitmap
init_visibility
end
end
#--------------------------------------------------------------------------
# ● 可視状態の初期化
#--------------------------------------------------------------------------
def init_visibility
@battler_visible = @battler.alive?
self.opacity = 0 unless @battler_visible
end
#--------------------------------------------------------------------------
# ● 原点の更新
#--------------------------------------------------------------------------
def update_origin
if bitmap
self.ox = bitmap.width / 2
self.oy = bitmap.height
end
end
#--------------------------------------------------------------------------
# ● 位置の更新
#--------------------------------------------------------------------------
def update_position
self.x = @battler.screen_x
self.y = @battler.screen_y
self.z = @battler.screen_z
end
#--------------------------------------------------------------------------
# ● 新しいエフェクトの設定
#--------------------------------------------------------------------------
def setup_new_effect
if !@battler_visible && @battler.alive?
start_effect(:appear)
elsif @battler_visible && @battler.hidden?
start_effect(:disappear)
end
if @battler_visible && @battler.sprite_effect_type
start_effect(@battler.sprite_effect_type)
@battler.sprite_effect_type = nil
end
end
#--------------------------------------------------------------------------
# ● エフェクトの開始
#--------------------------------------------------------------------------
def start_effect(effect_type)
@effect_type = effect_type
case @effect_type
when :appear
@effect_duration = 16
@battler_visible = true
when :disappear
@effect_duration = 32
@battler_visible = false
when :whiten
@effect_duration = 16
@battler_visible = true
when :blink
@effect_duration = 20
@battler_visible = true
when :collapse
@effect_duration = 48
@battler_visible = false
when :boss_collapse
@effect_duration = bitmap.height
@battler_visible = false
when :instant_collapse
@effect_duration = 16
@battler_visible = false
end
revert_to_normal
end
#--------------------------------------------------------------------------
# ● 通常の設定に戻す
#--------------------------------------------------------------------------
def revert_to_normal
self.blend_type = 0
self.color.set(0, 0, 0, 0)
self.opacity = 255
self.ox = bitmap.width / 2 if bitmap
self.src_rect.y = 0
end
#--------------------------------------------------------------------------
# ● 新しいアニメーションの設定
#--------------------------------------------------------------------------
def setup_new_animation
if @battler.animation_id > 0
animation = $data_animations[@battler.animation_id]
mirror = @battler.animation_mirror
start_animation(animation, mirror)
@battler.animation_id = 0
end
end
#--------------------------------------------------------------------------
# ● エフェクト実行中判定
#--------------------------------------------------------------------------
def effect?
@effect_type != nil
end
#--------------------------------------------------------------------------
# ● エフェクトの更新
#--------------------------------------------------------------------------
def update_effect
if @effect_duration > 0
@effect_duration -= 1
case @effect_type
when :whiten
update_whiten
when :blink
update_blink
when :appear
update_appear
when :disappear
update_disappear
when :collapse
update_collapse
when :boss_collapse
update_boss_collapse
when :instant_collapse
update_instant_collapse
end
@effect_type = nil if @effect_duration == 0
end
end
#--------------------------------------------------------------------------
# ● 白フラッシュエフェクトの更新
#--------------------------------------------------------------------------
def update_whiten
self.color.set(255, 255, 255, 0)
self.color.alpha = 128 - (16 - @effect_duration) * 10
end
#--------------------------------------------------------------------------
# ● 点滅エフェクトの更新
#--------------------------------------------------------------------------
def update_blink
self.opacity = (@effect_duration % 10 < 5) ? 255 : 0
end
#--------------------------------------------------------------------------
# ● 出現エフェクトの更新
#--------------------------------------------------------------------------
def update_appear
self.opacity = (16 - @effect_duration) * 16
end
#--------------------------------------------------------------------------
# ● 消滅エフェクトの更新
#--------------------------------------------------------------------------
def update_disappear
self.opacity = 256 - (32 - @effect_duration) * 10
end
#--------------------------------------------------------------------------
# ● 崩壊エフェクトの更新
#--------------------------------------------------------------------------
def update_collapse
self.blend_type = 1
self.color.set(255, 128, 128, 128)
self.opacity = 256 - (48 - @effect_duration) * 6
end
#--------------------------------------------------------------------------
# ● ボス崩壊エフェクトの更新
#--------------------------------------------------------------------------
def update_boss_collapse
alpha = @effect_duration * 120 / bitmap.height
self.ox = bitmap.width / 2 + @effect_duration % 2 * 4 - 2
self.blend_type = 1
self.color.set(255, 255, 255, 255 - alpha)
self.opacity = alpha
self.src_rect.y -= 1
Sound.play_boss_collapse2 if @effect_duration % 20 == 19
end
#--------------------------------------------------------------------------
# ● 瞬間崩壊エフェクトの更新
#--------------------------------------------------------------------------
def update_instant_collapse
self.opacity = 0
end
end

212
Scripts/Sprite_Character.rb Normal file
View file

@ -0,0 +1,212 @@
#==============================================================================
# ■ Sprite_Character
#------------------------------------------------------------------------------
#  キャラクター表示用のスプライトです。Game_Character クラスのインスタンスを
# 監視し、スプライトの状態を自動的に変化させます。
#==============================================================================
class Sprite_Character < Sprite_Base
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :character
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# character : Game_Character
#--------------------------------------------------------------------------
def initialize(viewport, character = nil)
super(viewport)
@character = character
@balloon_duration = 0
update
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
end_animation
end_balloon
super
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
super
update_bitmap
update_src_rect
update_position
update_other
update_balloon
setup_new_effect
end
#--------------------------------------------------------------------------
# ● 指定されたタイルが含まれるタイルセット画像の取得
#--------------------------------------------------------------------------
def tileset_bitmap(tile_id)
Cache.tileset($game_map.tileset.tileset_names[5 + tile_id / 256])
end
#--------------------------------------------------------------------------
# ● 転送元ビットマップの更新
#--------------------------------------------------------------------------
def update_bitmap
if graphic_changed?
@tile_id = @character.tile_id
@character_name = @character.character_name
@character_index = @character.character_index
if @tile_id > 0
set_tile_bitmap
else
set_character_bitmap
end
end
end
#--------------------------------------------------------------------------
# ● グラフィックの変更判定
#--------------------------------------------------------------------------
def graphic_changed?
@tile_id != @character.tile_id ||
@character_name != @character.character_name ||
@character_index != @character.character_index
end
#--------------------------------------------------------------------------
# ● タイルのビットマップを設定
#--------------------------------------------------------------------------
def set_tile_bitmap
sx = (@tile_id / 128 % 2 * 8 + @tile_id % 8) * 32;
sy = @tile_id % 256 / 8 % 16 * 32;
self.bitmap = tileset_bitmap(@tile_id)
self.src_rect.set(sx, sy, 32, 32)
self.ox = 16
self.oy = 32
end
#--------------------------------------------------------------------------
# ● キャラクターのビットマップを設定
#--------------------------------------------------------------------------
def set_character_bitmap
self.bitmap = Cache.character(@character_name)
sign = @character_name[/^[\!\$]./]
if sign && sign.include?('$')
@cw = bitmap.width / 3
@ch = bitmap.height / 4
else
@cw = bitmap.width / 12
@ch = bitmap.height / 8
end
self.ox = @cw / 2
self.oy = @ch
end
#--------------------------------------------------------------------------
# ● 転送元矩形の更新
#--------------------------------------------------------------------------
def update_src_rect
if @tile_id == 0
index = @character.character_index
pattern = @character.pattern < 3 ? @character.pattern : 1
sx = (index % 4 * 3 + pattern) * @cw
sy = (index / 4 * 4 + (@character.direction - 2) / 2) * @ch
self.src_rect.set(sx, sy, @cw, @ch)
end
end
#--------------------------------------------------------------------------
# ● 位置の更新
#--------------------------------------------------------------------------
def update_position
self.x = @character.screen_x
self.y = @character.screen_y
self.z = @character.screen_z
end
#--------------------------------------------------------------------------
# ● その他の更新
#--------------------------------------------------------------------------
def update_other
self.opacity = @character.opacity
self.blend_type = @character.blend_type
self.bush_depth = @character.bush_depth
self.visible = !@character.transparent
end
#--------------------------------------------------------------------------
# ● 新しいエフェクトの設定
#--------------------------------------------------------------------------
def setup_new_effect
if !animation? && @character.animation_id > 0
animation = $data_animations[@character.animation_id]
start_animation(animation)
end
if !@balloon_sprite && @character.balloon_id > 0
@balloon_id = @character.balloon_id
start_balloon
end
end
#--------------------------------------------------------------------------
# ● アニメーションの終了
#--------------------------------------------------------------------------
def end_animation
super
@character.animation_id = 0
end
#--------------------------------------------------------------------------
# ● フキダシアイコン表示の開始
#--------------------------------------------------------------------------
def start_balloon
dispose_balloon
@balloon_duration = 8 * balloon_speed + balloon_wait
@balloon_sprite = ::Sprite.new(viewport)
@balloon_sprite.bitmap = Cache.system("Balloon")
@balloon_sprite.ox = 16
@balloon_sprite.oy = 32
update_balloon
end
#--------------------------------------------------------------------------
# ● フキダシアイコンの解放
#--------------------------------------------------------------------------
def dispose_balloon
if @balloon_sprite
@balloon_sprite.dispose
@balloon_sprite = nil
end
end
#--------------------------------------------------------------------------
# ● フキダシアイコンの更新
#--------------------------------------------------------------------------
def update_balloon
if @balloon_duration > 0
@balloon_duration -= 1
if @balloon_duration > 0
@balloon_sprite.x = x
@balloon_sprite.y = y - height
@balloon_sprite.z = z + 200
sx = balloon_frame_index * 32
sy = (@balloon_id - 1) * 32
@balloon_sprite.src_rect.set(sx, sy, 32, 32)
else
end_balloon
end
end
end
#--------------------------------------------------------------------------
# ● フキダシアイコンの終了
#--------------------------------------------------------------------------
def end_balloon
dispose_balloon
@character.balloon_id = 0
end
#--------------------------------------------------------------------------
# ● フキダシアイコンの表示速度
#--------------------------------------------------------------------------
def balloon_speed
return 8
end
#--------------------------------------------------------------------------
# ● フキダシ最終フレームのウェイト時間
#--------------------------------------------------------------------------
def balloon_wait
return 12
end
#--------------------------------------------------------------------------
# ● フキダシアイコンのフレーム番号
#--------------------------------------------------------------------------
def balloon_frame_index
return 7 - [(@balloon_duration - balloon_wait) / balloon_speed, 0].max
end
end

78
Scripts/Sprite_Picture.rb Normal file
View file

@ -0,0 +1,78 @@
#==============================================================================
# ■ Sprite_Picture
#------------------------------------------------------------------------------
#  ピクチャ表示用のスプライトです。Game_Picture クラスのインスタンスを監視し、
# スプライトの状態を自動的に変化させます。
#==============================================================================
class Sprite_Picture < Sprite
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# picture : Game_Picture
#--------------------------------------------------------------------------
def initialize(viewport, picture)
super(viewport)
@picture = picture
update
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
bitmap.dispose if bitmap
super
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
super
update_bitmap
update_origin
update_position
update_zoom
update_other
end
#--------------------------------------------------------------------------
# ● 転送元ビットマップの更新
#--------------------------------------------------------------------------
def update_bitmap
self.bitmap = Cache.picture(@picture.name)
end
#--------------------------------------------------------------------------
# ● 原点の更新
#--------------------------------------------------------------------------
def update_origin
if @picture.origin == 0
self.ox = 0
self.oy = 0
else
self.ox = bitmap.width / 2
self.oy = bitmap.height / 2
end
end
#--------------------------------------------------------------------------
# ● 位置の更新
#--------------------------------------------------------------------------
def update_position
self.x = @picture.x
self.y = @picture.y
self.z = @picture.number
end
#--------------------------------------------------------------------------
# ● 拡大率の更新
#--------------------------------------------------------------------------
def update_zoom
self.zoom_x = @picture.zoom_x / 100.0
self.zoom_y = @picture.zoom_y / 100.0
end
#--------------------------------------------------------------------------
# ● その他の更新
#--------------------------------------------------------------------------
def update_other
self.opacity = @picture.opacity
self.blend_type = @picture.blend_type
self.angle = @picture.angle
self.tone.set(@picture.tone)
end
end

77
Scripts/Sprite_Timer.rb Normal file
View file

@ -0,0 +1,77 @@
#==============================================================================
# ■ Sprite_Timer
#------------------------------------------------------------------------------
#  タイマー表示用のスプライトです。$game_timer を監視し、スプライトの状態を
# 自動的に変化させます。
#==============================================================================
class Sprite_Timer < Sprite
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(viewport)
super(viewport)
create_bitmap
update
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
self.bitmap.dispose
super
end
#--------------------------------------------------------------------------
# ● ビットマップの作成
#--------------------------------------------------------------------------
def create_bitmap
self.bitmap = Bitmap.new(96, 48)
self.bitmap.font.size = 32
self.bitmap.font.color.set(255, 255, 255)
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
super
update_bitmap
update_position
update_visibility
end
#--------------------------------------------------------------------------
# ● 転送元ビットマップの更新
#--------------------------------------------------------------------------
def update_bitmap
if $game_timer.sec != @total_sec
@total_sec = $game_timer.sec
redraw
end
end
#--------------------------------------------------------------------------
# ● 再描画
#--------------------------------------------------------------------------
def redraw
self.bitmap.clear
self.bitmap.draw_text(self.bitmap.rect, timer_text, 1)
end
#--------------------------------------------------------------------------
# ● 描画用テキストの作成
#--------------------------------------------------------------------------
def timer_text
sprintf("%02d:%02d", @total_sec / 60, @total_sec % 60)
end
#--------------------------------------------------------------------------
# ● 位置の更新
#--------------------------------------------------------------------------
def update_position
self.x = Graphics.width - self.bitmap.width
self.y = 0
self.z = 200
end
#--------------------------------------------------------------------------
# ● 可視状態の更新
#--------------------------------------------------------------------------
def update_visibility
self.visible = $game_timer.working?
end
end

388
Scripts/Spriteset_Battle.rb Normal file
View file

@ -0,0 +1,388 @@
#==============================================================================
# ■ Spriteset_Battle
#------------------------------------------------------------------------------
#  バトル画面のスプライトをまとめたクラスです。このクラスは Scene_Battle クラ
# スの内部で使用されます。
#==============================================================================
class Spriteset_Battle
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
create_viewports
create_battleback1
create_battleback2
create_enemies
create_actors
create_pictures
create_timer
update
end
#--------------------------------------------------------------------------
# ● ビューポートの作成
#--------------------------------------------------------------------------
def create_viewports
@viewport1 = Viewport.new
@viewport2 = Viewport.new
@viewport3 = Viewport.new
@viewport2.z = 50
@viewport3.z = 100
end
#--------------------------------------------------------------------------
# ● 戦闘背景(床)スプライトの作成
#--------------------------------------------------------------------------
def create_battleback1
@back1_sprite = Sprite.new(@viewport1)
@back1_sprite.bitmap = battleback1_bitmap
@back1_sprite.z = 0
center_sprite(@back1_sprite)
end
#--------------------------------------------------------------------------
# ● 戦闘背景(壁)スプライトの作成
#--------------------------------------------------------------------------
def create_battleback2
@back2_sprite = Sprite.new(@viewport1)
@back2_sprite.bitmap = battleback2_bitmap
@back2_sprite.z = 1
center_sprite(@back2_sprite)
end
#--------------------------------------------------------------------------
# ● 戦闘背景(床)ビットマップの取得
#--------------------------------------------------------------------------
def battleback1_bitmap
if battleback1_name
Cache.battleback1(battleback1_name)
else
create_blurry_background_bitmap
end
end
#--------------------------------------------------------------------------
# ● 戦闘背景(壁)ビットマップの取得
#--------------------------------------------------------------------------
def battleback2_bitmap
if battleback2_name
Cache.battleback2(battleback2_name)
else
Bitmap.new(1, 1)
end
end
#--------------------------------------------------------------------------
# ● マップ画面を加工した戦闘背景用ビットマップの作成
#--------------------------------------------------------------------------
def create_blurry_background_bitmap
source = SceneManager.background_bitmap
bitmap = Bitmap.new(640, 480)
bitmap.stretch_blt(bitmap.rect, source, source.rect)
bitmap.radial_blur(120, 16)
bitmap
end
#--------------------------------------------------------------------------
# ● 戦闘背景(床)ファイル名の取得
#--------------------------------------------------------------------------
def battleback1_name
if $BTEST
$data_system.battleback1_name
elsif $game_map.battleback1_name
$game_map.battleback1_name
elsif $game_map.overworld?
overworld_battleback1_name
end
end
#--------------------------------------------------------------------------
# ● 戦闘背景(壁)ファイル名の取得
#--------------------------------------------------------------------------
def battleback2_name
if $BTEST
$data_system.battleback2_name
elsif $game_map.battleback2_name
$game_map.battleback2_name
elsif $game_map.overworld?
overworld_battleback2_name
end
end
#--------------------------------------------------------------------------
# ● フィールド 戦闘背景(床)ファイル名の取得
#--------------------------------------------------------------------------
def overworld_battleback1_name
$game_player.vehicle ? ship_battleback1_name : normal_battleback1_name
end
#--------------------------------------------------------------------------
# ● フィールド 戦闘背景(壁)ファイル名の取得
#--------------------------------------------------------------------------
def overworld_battleback2_name
$game_player.vehicle ? ship_battleback2_name : normal_battleback2_name
end
#--------------------------------------------------------------------------
# ● 通常時 戦闘背景(床)ファイル名の取得
#--------------------------------------------------------------------------
def normal_battleback1_name
terrain_battleback1_name(autotile_type(1)) ||
terrain_battleback1_name(autotile_type(0)) ||
default_battleback1_name
end
#--------------------------------------------------------------------------
# ● 通常時 戦闘背景(壁)ファイル名の取得
#--------------------------------------------------------------------------
def normal_battleback2_name
terrain_battleback2_name(autotile_type(1)) ||
terrain_battleback2_name(autotile_type(0)) ||
default_battleback2_name
end
#--------------------------------------------------------------------------
# ● 地形に対応する戦闘背景(床)ファイル名の取得
#--------------------------------------------------------------------------
def terrain_battleback1_name(type)
case type
when 24,25 # 荒れ地
"Wasteland"
when 26,27 # 土肌
"DirtField"
when 32,33 # 砂漠
"Desert"
when 34 # 岩地
"Lava1"
when 35 # 岩地(溶岩)
"Lava2"
when 40,41 # 雪原
"Snowfield"
when 42 # 雲
"Clouds"
when 4,5 # 毒の沼
"PoisonSwamp"
end
end
#--------------------------------------------------------------------------
# ● 地形に対応する戦闘背景(壁)ファイル名の取得
#--------------------------------------------------------------------------
def terrain_battleback2_name(type)
case type
when 20,21 # 森
"Forest1"
when 22,30,38 # 低い山
"Cliff"
when 24,25,26,27 # 荒れ地、土肌
"Wasteland"
when 32,33 # 砂漠
"Desert"
when 34,35 # 岩地
"Lava"
when 40,41 # 雪原
"Snowfield"
when 42 # 雲
"Clouds"
when 4,5 # 毒の沼
"PoisonSwamp"
end
end
#--------------------------------------------------------------------------
# ● デフォルト 戦闘背景(床)ファイル名の取得
#--------------------------------------------------------------------------
def default_battleback1_name
"Grassland"
end
#--------------------------------------------------------------------------
# ● デフォルト 戦闘背景(壁)ファイル名の取得
#--------------------------------------------------------------------------
def default_battleback2_name
"Grassland"
end
#--------------------------------------------------------------------------
# ● 乗船時 戦闘背景(床)ファイル名の取得
#--------------------------------------------------------------------------
def ship_battleback1_name
"Ship"
end
#--------------------------------------------------------------------------
# ● 乗船時 戦闘背景(壁)ファイル名の取得
#--------------------------------------------------------------------------
def ship_battleback2_name
"Ship"
end
#--------------------------------------------------------------------------
# ● プレイヤーの足元にあるオートタイルの種類を取得
#--------------------------------------------------------------------------
def autotile_type(z)
$game_map.autotile_type($game_player.x, $game_player.y, z)
end
#--------------------------------------------------------------------------
# ● スプライトを画面中央に移動
#--------------------------------------------------------------------------
def center_sprite(sprite)
sprite.ox = sprite.bitmap.width / 2
sprite.oy = sprite.bitmap.height / 2
sprite.x = Graphics.width / 2
sprite.y = Graphics.height / 2
end
#--------------------------------------------------------------------------
# ● 敵キャラスプライトの作成
#--------------------------------------------------------------------------
def create_enemies
@enemy_sprites = $game_troop.members.reverse.collect do |enemy|
Sprite_Battler.new(@viewport1, enemy)
end
end
#--------------------------------------------------------------------------
# ● アクタースプライトの作成
# デフォルトではアクター側の画像は表示しないが、便宜上、敵と味方を同じ
# ように扱うためにダミーのスプライトを作成する。
#--------------------------------------------------------------------------
def create_actors
@actor_sprites = Array.new(4) { Sprite_Battler.new(@viewport1) }
end
#--------------------------------------------------------------------------
# ● ピクチャスプライトの作成
# 初期状態では空の配列だけ作っておき、必要になった時点で追加する。
#--------------------------------------------------------------------------
def create_pictures
@picture_sprites = []
end
#--------------------------------------------------------------------------
# ● タイマースプライトの作成
#--------------------------------------------------------------------------
def create_timer
@timer_sprite = Sprite_Timer.new(@viewport2)
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
dispose_battleback1
dispose_battleback2
dispose_enemies
dispose_actors
dispose_pictures
dispose_timer
dispose_viewports
end
#--------------------------------------------------------------------------
# ● 戦闘背景(床)スプライトの解放
#--------------------------------------------------------------------------
def dispose_battleback1
@back1_sprite.bitmap.dispose
@back1_sprite.dispose
end
#--------------------------------------------------------------------------
# ● 戦闘背景(壁)スプライトの解放
#--------------------------------------------------------------------------
def dispose_battleback2
@back2_sprite.bitmap.dispose
@back2_sprite.dispose
end
#--------------------------------------------------------------------------
# ● 敵キャラスプライトの解放
#--------------------------------------------------------------------------
def dispose_enemies
@enemy_sprites.each {|sprite| sprite.dispose }
end
#--------------------------------------------------------------------------
# ● アクタースプライトの解放
#--------------------------------------------------------------------------
def dispose_actors
@actor_sprites.each {|sprite| sprite.dispose }
end
#--------------------------------------------------------------------------
# ● ピクチャスプライトの解放
#--------------------------------------------------------------------------
def dispose_pictures
@picture_sprites.compact.each {|sprite| sprite.dispose }
end
#--------------------------------------------------------------------------
# ● タイマースプライトの解放
#--------------------------------------------------------------------------
def dispose_timer
@timer_sprite.dispose
end
#--------------------------------------------------------------------------
# ● ビューポートの解放
#--------------------------------------------------------------------------
def dispose_viewports
@viewport1.dispose
@viewport2.dispose
@viewport3.dispose
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
update_battleback1
update_battleback2
update_enemies
update_actors
update_pictures
update_timer
update_viewports
end
#--------------------------------------------------------------------------
# ● 戦闘背景(床)スプライトの更新
#--------------------------------------------------------------------------
def update_battleback1
@back1_sprite.update
end
#--------------------------------------------------------------------------
# ● 戦闘背景(壁)スプライトの更新
#--------------------------------------------------------------------------
def update_battleback2
@back2_sprite.update
end
#--------------------------------------------------------------------------
# ● 敵キャラスプライトの更新
#--------------------------------------------------------------------------
def update_enemies
@enemy_sprites.each {|sprite| sprite.update }
end
#--------------------------------------------------------------------------
# ● アクタースプライトの更新
#--------------------------------------------------------------------------
def update_actors
@actor_sprites.each_with_index do |sprite, i|
sprite.battler = $game_party.members[i]
sprite.update
end
end
#--------------------------------------------------------------------------
# ● ピクチャスプライトの更新
#--------------------------------------------------------------------------
def update_pictures
$game_troop.screen.pictures.each do |pic|
@picture_sprites[pic.number] ||= Sprite_Picture.new(@viewport2, pic)
@picture_sprites[pic.number].update
end
end
#--------------------------------------------------------------------------
# ● タイマースプライトの更新
#--------------------------------------------------------------------------
def update_timer
@timer_sprite.update
end
#--------------------------------------------------------------------------
# ● ビューポートの更新
#--------------------------------------------------------------------------
def update_viewports
@viewport1.tone.set($game_troop.screen.tone)
@viewport1.ox = $game_troop.screen.shake
@viewport2.color.set($game_troop.screen.flash_color)
@viewport3.color.set(0, 0, 0, 255 - $game_troop.screen.brightness)
@viewport1.update
@viewport2.update
@viewport3.update
end
#--------------------------------------------------------------------------
# ● 敵キャラとアクターのスプライトを取得
#--------------------------------------------------------------------------
def battler_sprites
@enemy_sprites + @actor_sprites
end
#--------------------------------------------------------------------------
# ● アニメーション表示中判定
#--------------------------------------------------------------------------
def animation?
battler_sprites.any? {|sprite| sprite.animation? }
end
#--------------------------------------------------------------------------
# ● エフェクト実行中判定
#--------------------------------------------------------------------------
def effect?
battler_sprites.any? {|sprite| sprite.effect? }
end
end

273
Scripts/Spriteset_Map.rb Normal file
View file

@ -0,0 +1,273 @@
#==============================================================================
# ■ Spriteset_Map
#------------------------------------------------------------------------------
#  マップ画面のスプライトやタイルマップなどをまとめたクラスです。このクラスは
# Scene_Map クラスの内部で使用されます。
#==============================================================================
class Spriteset_Map
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
create_viewports
create_tilemap
create_parallax
create_characters
create_shadow
create_weather
create_pictures
create_timer
update
end
#--------------------------------------------------------------------------
# ● ビューポートの作成
#--------------------------------------------------------------------------
def create_viewports
@viewport1 = Viewport.new
@viewport2 = Viewport.new
@viewport3 = Viewport.new
@viewport2.z = 50
@viewport3.z = 100
end
#--------------------------------------------------------------------------
# ● タイルマップの作成
#--------------------------------------------------------------------------
def create_tilemap
@tilemap = Tilemap.new(@viewport1)
@tilemap.map_data = $game_map.data
load_tileset
end
#--------------------------------------------------------------------------
# ● タイルセットのロード
#--------------------------------------------------------------------------
def load_tileset
@tileset = $game_map.tileset
@tileset.tileset_names.each_with_index do |name, i|
@tilemap.bitmaps[i] = Cache.tileset(name)
end
@tilemap.flags = @tileset.flags
end
#--------------------------------------------------------------------------
# ● 遠景の作成
#--------------------------------------------------------------------------
def create_parallax
@parallax = Plane.new(@viewport1)
@parallax.z = -100
end
#--------------------------------------------------------------------------
# ● キャラクタースプライトの作成
#--------------------------------------------------------------------------
def create_characters
@character_sprites = []
$game_map.events.values.each do |event|
@character_sprites.push(Sprite_Character.new(@viewport1, event))
end
$game_map.vehicles.each do |vehicle|
@character_sprites.push(Sprite_Character.new(@viewport1, vehicle))
end
$game_player.followers.reverse_each do |follower|
@character_sprites.push(Sprite_Character.new(@viewport1, follower))
end
@character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
@map_id = $game_map.map_id
end
#--------------------------------------------------------------------------
# ● 飛行船の影スプライトの作成
#--------------------------------------------------------------------------
def create_shadow
@shadow_sprite = Sprite.new(@viewport1)
@shadow_sprite.bitmap = Cache.system("Shadow")
@shadow_sprite.ox = @shadow_sprite.bitmap.width / 2
@shadow_sprite.oy = @shadow_sprite.bitmap.height
@shadow_sprite.z = 180
end
#--------------------------------------------------------------------------
# ● 天候の作成
#--------------------------------------------------------------------------
def create_weather
@weather = Spriteset_Weather.new(@viewport2)
end
#--------------------------------------------------------------------------
# ● ピクチャスプライトの作成
#--------------------------------------------------------------------------
def create_pictures
@picture_sprites = []
end
#--------------------------------------------------------------------------
# ● タイマースプライトの作成
#--------------------------------------------------------------------------
def create_timer
@timer_sprite = Sprite_Timer.new(@viewport2)
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
dispose_tilemap
dispose_parallax
dispose_characters
dispose_shadow
dispose_weather
dispose_pictures
dispose_timer
dispose_viewports
end
#--------------------------------------------------------------------------
# ● タイルマップの解放
#--------------------------------------------------------------------------
def dispose_tilemap
@tilemap.dispose
end
#--------------------------------------------------------------------------
# ● 遠景の解放
#--------------------------------------------------------------------------
def dispose_parallax
@parallax.bitmap.dispose if @parallax.bitmap
@parallax.dispose
end
#--------------------------------------------------------------------------
# ● キャラクタースプライトの解放
#--------------------------------------------------------------------------
def dispose_characters
@character_sprites.each {|sprite| sprite.dispose }
end
#--------------------------------------------------------------------------
# ● 飛行船の影スプライトの解放
#--------------------------------------------------------------------------
def dispose_shadow
@shadow_sprite.dispose
end
#--------------------------------------------------------------------------
# ● 天候の解放
#--------------------------------------------------------------------------
def dispose_weather
@weather.dispose
end
#--------------------------------------------------------------------------
# ● ピクチャスプライトの解放
#--------------------------------------------------------------------------
def dispose_pictures
@picture_sprites.compact.each {|sprite| sprite.dispose }
end
#--------------------------------------------------------------------------
# ● タイマースプライトの解放
#--------------------------------------------------------------------------
def dispose_timer
@timer_sprite.dispose
end
#--------------------------------------------------------------------------
# ● ビューポートの解放
#--------------------------------------------------------------------------
def dispose_viewports
@viewport1.dispose
@viewport2.dispose
@viewport3.dispose
end
#--------------------------------------------------------------------------
# ● キャラクターのリフレッシュ
#--------------------------------------------------------------------------
def refresh_characters
dispose_characters
create_characters
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
update_tileset
update_tilemap
update_parallax
update_characters
update_shadow
update_weather
update_pictures
update_timer
update_viewports
end
#--------------------------------------------------------------------------
# ● タイルセットの更新
#--------------------------------------------------------------------------
def update_tileset
if @tileset != $game_map.tileset
load_tileset
refresh_characters
end
end
#--------------------------------------------------------------------------
# ● タイルマップの更新
#--------------------------------------------------------------------------
def update_tilemap
@tilemap.map_data = $game_map.data
@tilemap.ox = $game_map.display_x * 32
@tilemap.oy = $game_map.display_y * 32
@tilemap.update
end
#--------------------------------------------------------------------------
# ● 遠景の更新
#--------------------------------------------------------------------------
def update_parallax
if @parallax_name != $game_map.parallax_name
@parallax_name = $game_map.parallax_name
@parallax.bitmap.dispose if @parallax.bitmap
@parallax.bitmap = Cache.parallax(@parallax_name)
Graphics.frame_reset
end
@parallax.ox = $game_map.parallax_ox(@parallax.bitmap)
@parallax.oy = $game_map.parallax_oy(@parallax.bitmap)
end
#--------------------------------------------------------------------------
# ● キャラクタースプライトの更新
#--------------------------------------------------------------------------
def update_characters
refresh_characters if @map_id != $game_map.map_id
@character_sprites.each {|sprite| sprite.update }
end
#--------------------------------------------------------------------------
# ● 飛行船の影スプライトの更新
#--------------------------------------------------------------------------
def update_shadow
airship = $game_map.airship
@shadow_sprite.x = airship.screen_x
@shadow_sprite.y = airship.screen_y + airship.altitude
@shadow_sprite.opacity = airship.altitude * 8
@shadow_sprite.update
end
#--------------------------------------------------------------------------
# ● 天候の更新
#--------------------------------------------------------------------------
def update_weather
@weather.type = $game_map.screen.weather_type
@weather.power = $game_map.screen.weather_power
@weather.ox = $game_map.display_x * 32
@weather.oy = $game_map.display_y * 32
@weather.update
end
#--------------------------------------------------------------------------
# ● ピクチャスプライトの更新
#--------------------------------------------------------------------------
def update_pictures
$game_map.screen.pictures.each do |pic|
@picture_sprites[pic.number] ||= Sprite_Picture.new(@viewport2, pic)
@picture_sprites[pic.number].update
end
end
#--------------------------------------------------------------------------
# ● タイマースプライトの更新
#--------------------------------------------------------------------------
def update_timer
@timer_sprite.update
end
#--------------------------------------------------------------------------
# ● ビューポートの更新
#--------------------------------------------------------------------------
def update_viewports
@viewport1.tone.set($game_map.screen.tone)
@viewport1.ox = $game_map.screen.shake
@viewport2.color.set($game_map.screen.flash_color)
@viewport3.color.set(0, 0, 0, 255 - $game_map.screen.brightness)
@viewport1.update
@viewport2.update
@viewport3.update
end
end

View file

@ -0,0 +1,184 @@
#==============================================================================
# ■ Spriteset_Weather
#------------------------------------------------------------------------------
#  天候エフェクト(雨、嵐、雪)のクラスです。このクラスは Spriteset_Map クラ
# スの内部で使用されます。
#==============================================================================
class Spriteset_Weather
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :type # 天候タイプ
attr_accessor :ox # 原点 X 座標
attr_accessor :oy # 原点 Y 座標
attr_reader :power # 強さ
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(viewport = nil)
@viewport = viewport
init_members
create_rain_bitmap
create_storm_bitmap
create_snow_bitmap
end
#--------------------------------------------------------------------------
# ● メンバ変数の初期化
#--------------------------------------------------------------------------
def init_members
@type = :none
@ox = 0
@oy = 0
@power = 0
@sprites = []
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
@sprites.each {|sprite| sprite.dispose }
@rain_bitmap.dispose
@storm_bitmap.dispose
@snow_bitmap.dispose
end
#--------------------------------------------------------------------------
# ● 粒子の色 1
#--------------------------------------------------------------------------
def particle_color1
Color.new(255, 255, 255, 192)
end
#--------------------------------------------------------------------------
# ● 粒子の色 2
#--------------------------------------------------------------------------
def particle_color2
Color.new(255, 255, 255, 96)
end
#--------------------------------------------------------------------------
# ● 天候[雨]のビットマップを作成
#--------------------------------------------------------------------------
def create_rain_bitmap
@rain_bitmap = Bitmap.new(7, 42)
7.times {|i| @rain_bitmap.fill_rect(6-i, i*6, 1, 6, particle_color1) }
end
#--------------------------------------------------------------------------
# ● 天候[嵐]のビットマップを作成
#--------------------------------------------------------------------------
def create_storm_bitmap
@storm_bitmap = Bitmap.new(34, 64)
32.times do |i|
@storm_bitmap.fill_rect(33-i, i*2, 1, 2, particle_color2)
@storm_bitmap.fill_rect(32-i, i*2, 1, 2, particle_color1)
@storm_bitmap.fill_rect(31-i, i*2, 1, 2, particle_color2)
end
end
#--------------------------------------------------------------------------
# ● 天候[雪]のビットマップを作成
#--------------------------------------------------------------------------
def create_snow_bitmap
@snow_bitmap = Bitmap.new(6, 6)
@snow_bitmap.fill_rect(0, 1, 6, 4, particle_color2)
@snow_bitmap.fill_rect(1, 0, 4, 6, particle_color2)
@snow_bitmap.fill_rect(1, 2, 4, 2, particle_color1)
@snow_bitmap.fill_rect(2, 1, 2, 4, particle_color1)
end
#--------------------------------------------------------------------------
# ● 天候の強さを設定
#--------------------------------------------------------------------------
def power=(power)
@power = power
(sprite_max - @sprites.size).times { add_sprite }
(@sprites.size - sprite_max).times { remove_sprite }
end
#--------------------------------------------------------------------------
# ● スプライトの最大数を取得
#--------------------------------------------------------------------------
def sprite_max
(@power * 10).to_i
end
#--------------------------------------------------------------------------
# ● スプライトの追加
#--------------------------------------------------------------------------
def add_sprite
sprite = Sprite.new(@viewport)
sprite.opacity = 0
@sprites.push(sprite)
end
#--------------------------------------------------------------------------
# ● スプライトの削除
#--------------------------------------------------------------------------
def remove_sprite
sprite = @sprites.pop
sprite.dispose if sprite
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
update_screen
@sprites.each {|sprite| update_sprite(sprite) }
end
#--------------------------------------------------------------------------
# ● 画面の更新
#--------------------------------------------------------------------------
def update_screen
@viewport.tone.set(-dimness, -dimness, -dimness)
end
#--------------------------------------------------------------------------
# ● 暗さの取得
#--------------------------------------------------------------------------
def dimness
(@power * 6).to_i
end
#--------------------------------------------------------------------------
# ● スプライトの更新
#--------------------------------------------------------------------------
def update_sprite(sprite)
sprite.ox = @ox
sprite.oy = @oy
case @type
when :rain
update_sprite_rain(sprite)
when :storm
update_sprite_storm(sprite)
when :snow
update_sprite_snow(sprite)
end
create_new_particle(sprite) if sprite.opacity < 64
end
#--------------------------------------------------------------------------
# ● スプライトの更新[雨]
#--------------------------------------------------------------------------
def update_sprite_rain(sprite)
sprite.bitmap = @rain_bitmap
sprite.x -= 1
sprite.y += 6
sprite.opacity -= 12
end
#--------------------------------------------------------------------------
# ● スプライトの更新[嵐]
#--------------------------------------------------------------------------
def update_sprite_storm(sprite)
sprite.bitmap = @storm_bitmap
sprite.x -= 3
sprite.y += 6
sprite.opacity -= 12
end
#--------------------------------------------------------------------------
# ● スプライトの更新[雪]
#--------------------------------------------------------------------------
def update_sprite_snow(sprite)
sprite.bitmap = @snow_bitmap
sprite.x -= 1
sprite.y += 3
sprite.opacity -= 12
end
#--------------------------------------------------------------------------
# ● 新しい粒子の作成
#--------------------------------------------------------------------------
def create_new_particle(sprite)
sprite.x = rand(Graphics.width + 100) - 100 + @ox
sprite.y = rand(Graphics.height + 200) - 200 + @oy
sprite.opacity = 160 + rand(96)
end
end

145
Scripts/Vocab.rb Normal file
View file

@ -0,0 +1,145 @@
#==============================================================================
# ■ Vocab
#------------------------------------------------------------------------------
#  用語とメッセージを定義するモジュールです。定数でメッセージなどを直接定義す
# るほか、グローバル変数 $data_system から用語データを取得します。
#==============================================================================
module Vocab
# ショップ画面
ShopBuy = "購入する"
ShopSell = "売却する"
ShopCancel = "やめる"
Possession = "持っている数"
# ステータス画面
ExpTotal = "現在の経験値"
ExpNext = "次の%sまで"
# セーブ/ロード画面
SaveMessage = "どのファイルにセーブしますか?"
LoadMessage = "どのファイルをロードしますか?"
File = "ファイル"
# 複数メンバーの場合の表示
PartyName = "%sたち"
# 戦闘基本メッセージ
Emerge = "%sが出現"
Preemptive = "%sは先手を取った"
Surprise = "%sは不意をつかれた"
EscapeStart = "%sは逃げ出した"
EscapeFailure = "しかし逃げることはできなかった!"
# 戦闘終了メッセージ
Victory = "%sの勝利"
Defeat = "%sは戦いに敗れた。"
ObtainExp = "%s の経験値を獲得!"
ObtainGold = "お金を %s\\G 手に入れた!"
ObtainItem = "%sを手に入れた"
LevelUp = "%sは%s %s に上がった!"
ObtainSkill = "%sを覚えた"
# アイテム使用
UseItem = "%sは%sを使った"
# クリティカルヒット
CriticalToEnemy = "会心の一撃!!"
CriticalToActor = "クリティカルヒット!!"
# アクター対象の行動結果
ActorDamage = "%sは %s の快感を受けた!"
ActorRecovery = "%sの%sが %s 回復した!"
ActorGain = "%sの%sが %s 増えた!"
ActorLoss = "%sの%sが %s 減った!"
ActorDrain = "%sは%sを %s 奪われた!"
ActorNoDamage = "%sには反応がない"
ActorNoHit = "ミス! %sはダメージを受けていない"
# 敵キャラ対象の行動結果
EnemyDamage = "%sに %s のダメージを与えた!"
EnemyRecovery = "%sの%sが %s 回復した!"
EnemyGain = "%sの%sが %s 上がった!"
EnemyLoss = "%sの%sが %s 減った!"
EnemyDrain = "%sの%sを %s 奪った!"
EnemyNoDamage = "%sは不思議そうにしてる"
EnemyNoHit = "ミス! %sにダメージを与えられない"
# 回避/反射
Evasion = "%sは攻撃をかわした"
MagicEvasion = "%sは魔法を打ち消した"
MagicReflection = "%sは魔法を跳ね返した"
CounterAttack = "%sの反撃"
Substitute = "%sが%sをかばった"
# 能力強化/弱体
BuffAdd = "%sの%sが上がった"
DebuffAdd = "%sの%sが下がった"
BuffRemove = "%sの%sが元に戻った"
# スキル、アイテムの効果がなかった
ActionFailure = "%sには効かなかった"
# エラーメッセージ
PlayerPosError = "プレイヤーの初期位置が設定されていません。"
EventOverflow = "コモンイベントの呼び出しが上限を超えました。"
# 基本ステータス
def self.basic(basic_id)
$data_system.terms.basic[basic_id]
end
# 能力値
def self.param(param_id)
$data_system.terms.params[param_id]
end
# 装備タイプ
def self.etype(etype_id)
$data_system.terms.etypes[etype_id]
end
# コマンド
def self.command(command_id)
$data_system.terms.commands[command_id]
end
# 通貨単位
def self.currency_unit
$data_system.currency_unit
end
#--------------------------------------------------------------------------
def self.level; basic(0); end # レベル
def self.level_a; basic(1); end # レベル (短)
def self.hp; basic(2); end # HP
def self.hp_a; basic(3); end # HP (短)
def self.mp; basic(4); end # MP
def self.mp_a; basic(5); end # MP (短)
def self.tp; basic(6); end # TP
def self.tp_a; basic(7); end # TP (短)
def self.fight; command(0); end # 戦う
def self.escape; command(1); end # 逃げる
def self.attack; command(2); end # 攻撃
def self.guard; command(3); end # 防御
def self.item; command(4); end # アイテム
def self.skill; command(5); end # スキル
def self.equip; command(6); end # 装備
def self.status; command(7); end # ステータス
def self.formation; command(8); end # 並び替え
def self.save; command(9); end # セーブ
def self.game_end; command(10); end # ゲーム終了
def self.weapon; command(12); end # 武器
def self.armor; command(13); end # 防具
def self.key_item; command(14); end # 大事なもの
def self.equip2; command(15); end # 装備変更
def self.optimize; command(16); end # 最強装備
def self.clear; command(17); end # 全て外す
def self.new_game; command(18); end # ニューゲーム
def self.continue; command(19); end # コンティニュー
def self.shutdown; command(20); end # シャットダウン
def self.to_title; command(21); end # タイトルへ
def self.cancel; command(22); end # やめる
#--------------------------------------------------------------------------
end

10
Scripts/Window_.rb Normal file
View file

@ -0,0 +1,10 @@
class Window_Message < Window_Base
alias vis_update update
def update
vis_update
if $game_message.visible
self.visible = !Input.press?(:Y)
@back_sprite.visible = self.visible if @background == 1
end
end
end

View file

@ -0,0 +1,77 @@
#==============================================================================
# ■ Window_ActorCommand
#------------------------------------------------------------------------------
#  バトル画面で、アクターの行動を選択するウィンドウです。
#==============================================================================
class Window_ActorCommand < Window_Command
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super(0, 0)
self.openness = 0
deactivate
@actor = nil
end
#--------------------------------------------------------------------------
# ● ウィンドウ幅の取得
#--------------------------------------------------------------------------
def window_width
return 128
end
#--------------------------------------------------------------------------
# ● 表示行数の取得
#--------------------------------------------------------------------------
def visible_line_number
return 4
end
#--------------------------------------------------------------------------
# ● コマンドリストの作成
#--------------------------------------------------------------------------
def make_command_list
return unless @actor
add_skill_commands
add_guard_command
add_item_command
end
#--------------------------------------------------------------------------
# ● 攻撃コマンドをリストに追加
#--------------------------------------------------------------------------
def add_attack_command
add_command(Vocab::attack, :attack, @actor.attack_usable?)
end
#--------------------------------------------------------------------------
# ● スキルコマンドをリストに追加
#--------------------------------------------------------------------------
def add_skill_commands
@actor.added_skill_types.sort.each do |stype_id|
name = $data_system.skill_types[stype_id]
add_command(name, :skill, true, stype_id)
end
end
#--------------------------------------------------------------------------
# ● 防御コマンドをリストに追加
#--------------------------------------------------------------------------
def add_guard_command
add_command(Vocab::guard, :guard, @actor.guard_usable?)
end
#--------------------------------------------------------------------------
# ● アイテムコマンドをリストに追加
#--------------------------------------------------------------------------
def add_item_command
add_command(Vocab::item, :item)
end
#--------------------------------------------------------------------------
# ● セットアップ
#--------------------------------------------------------------------------
def setup(actor)
@actor = actor
clear_command_list
make_command_list
refresh
select(0)
activate
open
end
end

569
Scripts/Window_Base.rb Normal file
View file

@ -0,0 +1,569 @@
#==============================================================================
# ■ Window_Base
#------------------------------------------------------------------------------
#  ゲーム中の全てのウィンドウのスーパークラスです。
#==============================================================================
class Window_Base < Window
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(x, y, width, height)
super
self.windowskin = Cache.system("Window")
update_padding
update_tone
create_contents
@opening = @closing = false
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
contents.dispose unless disposed?
super
end
#--------------------------------------------------------------------------
# ● 行の高さを取得
#--------------------------------------------------------------------------
def line_height
return 24
end
#--------------------------------------------------------------------------
# ● 標準パディングサイズの取得
#--------------------------------------------------------------------------
def standard_padding
return 12
end
#--------------------------------------------------------------------------
# ● パディングの更新
#--------------------------------------------------------------------------
def update_padding
self.padding = standard_padding
end
#--------------------------------------------------------------------------
# ● ウィンドウ内容の幅を計算
#--------------------------------------------------------------------------
def contents_width
width - standard_padding * 2
end
#--------------------------------------------------------------------------
# ● ウィンドウ内容の高さを計算
#--------------------------------------------------------------------------
def contents_height
height - standard_padding * 2
end
#--------------------------------------------------------------------------
# ● 指定行数に適合するウィンドウの高さを計算
#--------------------------------------------------------------------------
def fitting_height(line_number)
line_number * line_height + standard_padding * 2
end
#--------------------------------------------------------------------------
# ● 色調の更新
#--------------------------------------------------------------------------
def update_tone
self.tone.set($game_system.window_tone)
end
#--------------------------------------------------------------------------
# ● ウィンドウ内容の作成
#--------------------------------------------------------------------------
def create_contents
contents.dispose
if contents_width > 0 && contents_height > 0
self.contents = Bitmap.new(contents_width, contents_height)
else
self.contents = Bitmap.new(1, 1)
end
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
super
update_tone
update_open if @opening
update_close if @closing
end
#--------------------------------------------------------------------------
# ● 開く処理の更新
#--------------------------------------------------------------------------
def update_open
self.openness += 48
@opening = false if open?
end
#--------------------------------------------------------------------------
# ● 閉じる処理の更新
#--------------------------------------------------------------------------
def update_close
self.openness -= 48
@closing = false if close?
end
#--------------------------------------------------------------------------
# ● ウィンドウを開く
#--------------------------------------------------------------------------
def open
@opening = true unless open?
@closing = false
self
end
#--------------------------------------------------------------------------
# ● ウィンドウを閉じる
#--------------------------------------------------------------------------
def close
@closing = true unless close?
@opening = false
self
end
#--------------------------------------------------------------------------
# ● ウィンドウの表示
#--------------------------------------------------------------------------
def show
self.visible = true
self
end
#--------------------------------------------------------------------------
# ● ウィンドウの非表示
#--------------------------------------------------------------------------
def hide
self.visible = false
self
end
#--------------------------------------------------------------------------
# ● ウィンドウのアクティブ化
#--------------------------------------------------------------------------
def activate
self.active = true
self
end
#--------------------------------------------------------------------------
# ● ウィンドウの非アクティブ化
#--------------------------------------------------------------------------
def deactivate
self.active = false
self
end
#--------------------------------------------------------------------------
# ● 文字色取得
# n : 文字色番号0..31
#--------------------------------------------------------------------------
def text_color(n)
windowskin.get_pixel(64 + (n % 8) * 8, 96 + (n / 8) * 8)
end
#--------------------------------------------------------------------------
# ● 各種文字色の取得
#--------------------------------------------------------------------------
def normal_color; text_color(0); end; # 通常
def system_color; text_color(16); end; # システム
def crisis_color; text_color(17); end; # ピンチ
def knockout_color; text_color(18); end; # 戦闘不能
def gauge_back_color; text_color(19); end; # ゲージ背景
def hp_gauge_color1; text_color(20); end; # HP ゲージ 1
def hp_gauge_color2; text_color(21); end; # HP ゲージ 2
def mp_gauge_color1; text_color(22); end; # MP ゲージ 1
def mp_gauge_color2; text_color(23); end; # MP ゲージ 2
def mp_cost_color; text_color(23); end; # 消費 TP
def power_up_color; text_color(24); end; # 装備 パワーアップ
def power_down_color; text_color(25); end; # 装備 パワーダウン
def tp_gauge_color1; text_color(28); end; # TP ゲージ 1
def tp_gauge_color2; text_color(29); end; # TP ゲージ 2
def tp_cost_color; text_color(29); end; # 消費 TP
#--------------------------------------------------------------------------
# ● 保留項目の背景色を取得
#--------------------------------------------------------------------------
def pending_color
windowskin.get_pixel(80, 80)
end
#--------------------------------------------------------------------------
# ● 半透明描画用のアルファ値を取得
#--------------------------------------------------------------------------
def translucent_alpha
return 160
end
#--------------------------------------------------------------------------
# ● テキスト描画色の変更
# enabled : 有効フラグ。false のとき半透明で描画
#--------------------------------------------------------------------------
def change_color(color, enabled = true)
contents.font.color.set(color)
contents.font.color.alpha = translucent_alpha unless enabled
end
#--------------------------------------------------------------------------
# ● テキストの描画
# args : Bitmap#draw_text と同じ
#--------------------------------------------------------------------------
def draw_text(*args)
contents.draw_text(*args)
end
#--------------------------------------------------------------------------
# ● テキストサイズの取得
#--------------------------------------------------------------------------
def text_size(str)
contents.text_size(str)
end
#--------------------------------------------------------------------------
# ● 制御文字つきテキストの描画
#--------------------------------------------------------------------------
def draw_text_ex(x, y, text)
reset_font_settings
text = convert_escape_characters(text)
pos = {:x => x, :y => y, :new_x => x, :height => calc_line_height(text)}
process_character(text.slice!(0, 1), text, pos) until text.empty?
end
#--------------------------------------------------------------------------
# ● フォント設定のリセット
#--------------------------------------------------------------------------
def reset_font_settings
change_color(normal_color)
contents.font.size = 20
contents.font.bold = false
contents.font.italic = false
end
#--------------------------------------------------------------------------
# ● 制御文字の事前変換
# 実際の描画を始める前に、原則として文字列に変わるものだけを置き換える。
# 文字「\」はエスケープ文字(\eに変換。
#--------------------------------------------------------------------------
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 }
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
#--------------------------------------------------------------------------
# ● 文字の処理
# c : 文字
# text : 描画処理中の文字列バッファ(必要なら破壊的に変更)
# pos : 描画位置 {:x, :y, :new_x, :height}
#--------------------------------------------------------------------------
def process_character(c, text, pos)
case c
when "\n" # 改行
process_new_line(text, pos)
when "\f" # 改ページ
process_new_page(text, pos)
when "\e" # 制御文字
process_escape_character(obtain_escape_code(text), text, pos)
else # 普通の文字
process_normal_character(c, pos)
end
end
#--------------------------------------------------------------------------
# ● 通常文字の処理
#--------------------------------------------------------------------------
def process_normal_character(c, pos)
text_width = text_size(c).width
draw_text(pos[:x], pos[:y], text_width * 2, pos[:height], c)
pos[:x] += text_width
end
#--------------------------------------------------------------------------
# ● 改行文字の処理
#--------------------------------------------------------------------------
def process_new_line(text, pos)
pos[:x] = pos[:new_x]
pos[:y] += pos[:height]
pos[:height] = calc_line_height(text)
end
#--------------------------------------------------------------------------
# ● 改ページ文字の処理
#--------------------------------------------------------------------------
def process_new_page(text, pos)
end
#--------------------------------------------------------------------------
# ● 制御文字の本体を破壊的に取得
#--------------------------------------------------------------------------
def obtain_escape_code(text)
text.slice!(/^[\$\.\|\^!><\{\}\\]|^[A-Z]+/i)
end
#--------------------------------------------------------------------------
# ● 制御文字の引数を破壊的に取得
#--------------------------------------------------------------------------
def obtain_escape_param(text)
text.slice!(/^\[\d+\]/)[/\d+/].to_i rescue 0
end
#--------------------------------------------------------------------------
# ● 制御文字の処理
# code : 制御文字の本体部分(「\C[1]」なら「C」
#--------------------------------------------------------------------------
def process_escape_character(code, text, pos)
case code.upcase
when 'C'
change_color(text_color(obtain_escape_param(text)))
when 'I'
process_draw_icon(obtain_escape_param(text), pos)
when '{'
make_font_bigger
when '}'
make_font_smaller
end
end
#--------------------------------------------------------------------------
# ● 制御文字によるアイコン描画の処理
#--------------------------------------------------------------------------
def process_draw_icon(icon_index, pos)
draw_icon(icon_index, pos[:x], pos[:y])
pos[:x] += 24
end
#--------------------------------------------------------------------------
# ● フォントを大きくする
#--------------------------------------------------------------------------
def make_font_bigger
contents.font.size += 8 if contents.font.size <= 64
end
#--------------------------------------------------------------------------
# ● フォントを小さくする
#--------------------------------------------------------------------------
def make_font_smaller
contents.font.size -= 8 if contents.font.size >= 16
end
#--------------------------------------------------------------------------
# ● 行の高さを計算
# restore_font_size : 計算後にフォントサイズを元に戻す
#--------------------------------------------------------------------------
def calc_line_height(text, restore_font_size = true)
result = [line_height, contents.font.size].max
last_font_size = contents.font.size
text.slice(/^.*$/).scan(/\e[\{\}]/).each do |esc|
make_font_bigger if esc == "\e{"
make_font_smaller if esc == "\e}"
result = [result, contents.font.size].max
end
contents.font.size = last_font_size if restore_font_size
result
end
#--------------------------------------------------------------------------
# ● ゲージの描画
# rate : 割合1.0 で満タン)
# color1 : グラデーション 左端
# color2 : グラデーション 右端
#--------------------------------------------------------------------------
def draw_gauge(x, y, width, rate, color1, color2)
fill_w = (width * rate).to_i
gauge_y = y + line_height - 8
contents.fill_rect(x, gauge_y, width, 6, gauge_back_color)
contents.gradient_fill_rect(x, gauge_y, fill_w, 6, color1, color2)
end
#--------------------------------------------------------------------------
# ● アイコンの描画
# enabled : 有効フラグ。false のとき半透明で描画
#--------------------------------------------------------------------------
def draw_icon(icon_index, x, y, enabled = true)
bitmap = Cache.system("Iconset")
rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
contents.blt(x, y, bitmap, rect, enabled ? 255 : translucent_alpha)
end
#--------------------------------------------------------------------------
# ● 顔グラフィックの描画
# enabled : 有効フラグ。false のとき半透明で描画
#--------------------------------------------------------------------------
def draw_face(face_name, face_index, x, y, enabled = true)
bitmap = Cache.face(face_name)
rect = Rect.new(face_index % 4 * 96, face_index / 4 * 96, 96, 96)
contents.blt(x, y, bitmap, rect, enabled ? 255 : translucent_alpha)
bitmap.dispose
end
#--------------------------------------------------------------------------
# ● 歩行グラフィックの描画
#--------------------------------------------------------------------------
def draw_character(character_name, character_index, x, y)
return unless character_name
bitmap = Cache.character(character_name)
sign = character_name[/^[\!\$]./]
if sign && sign.include?('$')
cw = bitmap.width / 3
ch = bitmap.height / 4
else
cw = bitmap.width / 12
ch = bitmap.height / 8
end
n = character_index
src_rect = Rect.new((n%4*3+1)*cw, (n/4*4)*ch, cw, ch)
contents.blt(x - cw / 2, y - ch, bitmap, src_rect)
end
#--------------------------------------------------------------------------
# ● HP の文字色を取得
#--------------------------------------------------------------------------
def hp_color(actor)
return knockout_color if actor.hp == 0
return crisis_color if actor.hp < actor.mhp / 4
return normal_color
end
#--------------------------------------------------------------------------
# ● MP の文字色を取得
#--------------------------------------------------------------------------
def mp_color(actor)
return crisis_color if actor.mp < actor.mmp / 4
return normal_color
end
#--------------------------------------------------------------------------
# ● TP の文字色を取得
#--------------------------------------------------------------------------
def tp_color(actor)
return normal_color
end
#--------------------------------------------------------------------------
# ● アクターの歩行グラフィック描画
#--------------------------------------------------------------------------
def draw_actor_graphic(actor, x, y)
draw_character(actor.character_name, actor.character_index, x, y)
end
#--------------------------------------------------------------------------
# ● アクターの顔グラフィック描画
#--------------------------------------------------------------------------
def draw_actor_face(actor, x, y, enabled = true)
draw_face(actor.face_name, actor.face_index, x, y, enabled)
end
#--------------------------------------------------------------------------
# ● 名前の描画
#--------------------------------------------------------------------------
def draw_actor_name(actor, x, y, width = 112)
change_color(hp_color(actor))
draw_text(x, y, width, line_height, actor.name)
end
#--------------------------------------------------------------------------
# ● 職業の描画
#--------------------------------------------------------------------------
def draw_actor_class(actor, x, y, width = 112)
change_color(normal_color)
draw_text(x, y, width, line_height, actor.class.name)
end
#--------------------------------------------------------------------------
# ● 二つ名の描画
#--------------------------------------------------------------------------
def draw_actor_nickname(actor, x, y, width = 180)
change_color(normal_color)
draw_text(x, y, width, line_height, actor.nickname)
end
#--------------------------------------------------------------------------
# ● レベルの描画
#--------------------------------------------------------------------------
def draw_actor_level(actor, x, y)
change_color(system_color)
draw_text(x, y, 32, line_height, Vocab::level_a)
change_color(normal_color)
draw_text(x + 32, y, 24, line_height, actor.level, 2)
end
#--------------------------------------------------------------------------
# ● ステートおよび強化/弱体のアイコンを描画
#--------------------------------------------------------------------------
def draw_actor_icons(actor, x, y, width = 96)
icons = (actor.state_icons + actor.buff_icons)[0, width / 24]
icons.each_with_index {|n, i| draw_icon(n, x + 24 * i, y) }
end
#--------------------------------------------------------------------------
# ● 現在値/最大値を分数形式で描画
# current : 現在値
# max : 最大値
# color1 : 現在値の色
# color2 : 最大値の色
#--------------------------------------------------------------------------
def draw_current_and_max_values(x, y, width, current, max, color1, color2)
change_color(color1)
xr = x + width
if width < 96
draw_text(xr - 40, y, 42, line_height, current, 2)
else
draw_text(xr - 92, y, 42, line_height, current, 2)
change_color(color2)
draw_text(xr - 52, y, 12, line_height, "/", 2)
draw_text(xr - 42, y, 42, line_height, max, 2)
end
end
#--------------------------------------------------------------------------
# ● HP の描画
#--------------------------------------------------------------------------
def draw_actor_hp(actor, x, y, width = 124)
draw_gauge(x, y, width, actor.hp_rate, hp_gauge_color1, hp_gauge_color2)
change_color(system_color)
draw_text(x, y, 30, line_height, Vocab::hp_a)
draw_current_and_max_values(x, y, width, actor.hp, actor.mhp,
hp_color(actor), normal_color)
end
#--------------------------------------------------------------------------
# ● MP の描画
#--------------------------------------------------------------------------
def draw_actor_mp(actor, x, y, width = 124)
draw_gauge(x, y, width, actor.mp_rate, mp_gauge_color1, mp_gauge_color2)
change_color(system_color)
draw_text(x, y, 30, line_height, Vocab::mp_a)
draw_current_and_max_values(x, y, width, actor.mp, actor.mmp,
mp_color(actor), normal_color)
end
#--------------------------------------------------------------------------
# ● TP の描画
#--------------------------------------------------------------------------
def draw_actor_tp(actor, x, y, width = 124)
draw_gauge(x, y, width, actor.tp_rate, tp_gauge_color1, tp_gauge_color2)
change_color(system_color)
draw_text(x, y, 30, line_height, Vocab::tp_a)
change_color(tp_color(actor))
draw_text(x + width - 42, y, 42, line_height, actor.tp.to_i, 2)
end
#--------------------------------------------------------------------------
# ● シンプルなステータスの描画
#--------------------------------------------------------------------------
def draw_actor_simple_status(actor, x, y)
draw_actor_name(actor, x, y)
draw_actor_level(actor, x, y + line_height * 1)
draw_actor_icons(actor, x, y + line_height * 2)
draw_actor_class(actor, x + 120, y)
draw_actor_hp(actor, x + 120, y + line_height * 1)
draw_actor_mp(actor, x + 120, y + line_height * 2)
end
#--------------------------------------------------------------------------
# ● 能力値の描画
#--------------------------------------------------------------------------
def draw_actor_param(actor, x, y, param_id)
change_color(system_color)
draw_text(x, y, 120, line_height, Vocab::param(param_id))
change_color(normal_color)
draw_text(x + 120, y, 36, line_height, actor.param(param_id), 2)
end
#--------------------------------------------------------------------------
# ● アイテム名の描画
# enabled : 有効フラグ。false のとき半透明で描画
#--------------------------------------------------------------------------
def draw_item_name(item, x, y, enabled = true, width = 172)
return unless item
draw_icon(item.icon_index, x, y, enabled)
change_color(normal_color, enabled)
draw_text(x + 24, y, width, line_height, item.name)
end
#--------------------------------------------------------------------------
# ● 通貨単位つき数値(所持金など)の描画
#--------------------------------------------------------------------------
def draw_currency_value(value, unit, x, y, width)
cx = text_size(unit).width
change_color(normal_color)
draw_text(x, y, width - cx - 2, line_height, value, 2)
change_color(system_color)
draw_text(x, y, width, line_height, unit, 2)
end
#--------------------------------------------------------------------------
# ● 能力値変化の描画色取得
#--------------------------------------------------------------------------
def param_change_color(change)
return power_up_color if change > 0
return power_down_color if change < 0
return normal_color
end
end

View file

@ -0,0 +1,38 @@
#==============================================================================
# ■ Window_BattleActor
#------------------------------------------------------------------------------
#  バトル画面で、行動対象のアクターを選択するウィンドウです。
#==============================================================================
class Window_BattleActor < Window_BattleStatus
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# info_viewport : 情報表示用ビューポート
#--------------------------------------------------------------------------
def initialize(info_viewport)
super()
self.y = info_viewport.rect.y
self.visible = false
self.openness = 255
@info_viewport = info_viewport
end
#--------------------------------------------------------------------------
# ● ウィンドウの表示
#--------------------------------------------------------------------------
def show
if @info_viewport
width_remain = Graphics.width - width
self.x = width_remain
@info_viewport.rect.width = width_remain
select(0)
end
super
end
#--------------------------------------------------------------------------
# ● ウィンドウの非表示
#--------------------------------------------------------------------------
def hide
@info_viewport.rect.width = Graphics.width if @info_viewport
super
end
end

View file

@ -0,0 +1,69 @@
#==============================================================================
# ■ Window_BattleEnemy
#------------------------------------------------------------------------------
#  バトル画面で、行動対象の敵キャラを選択するウィンドウです。
#==============================================================================
class Window_BattleEnemy < Window_Selectable
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# info_viewport : 情報表示用ビューポート
#--------------------------------------------------------------------------
def initialize(info_viewport)
super(0, info_viewport.rect.y, window_width, fitting_height(4))
refresh
self.visible = false
@info_viewport = info_viewport
end
#--------------------------------------------------------------------------
# ● ウィンドウ幅の取得
#--------------------------------------------------------------------------
def window_width
Graphics.width - 128
end
#--------------------------------------------------------------------------
# ● 桁数の取得
#--------------------------------------------------------------------------
def col_max
return 2
end
#--------------------------------------------------------------------------
# ● 項目数の取得
#--------------------------------------------------------------------------
def item_max
$game_troop.alive_members.size
end
#--------------------------------------------------------------------------
# ● 敵キャラオブジェクト取得
#--------------------------------------------------------------------------
def enemy
$game_troop.alive_members[@index]
end
#--------------------------------------------------------------------------
# ● 項目の描画
#--------------------------------------------------------------------------
def draw_item(index)
change_color(normal_color)
name = $game_troop.alive_members[index].name
draw_text(item_rect_for_text(index), name)
end
#--------------------------------------------------------------------------
# ● ウィンドウの表示
#--------------------------------------------------------------------------
def show
if @info_viewport
width_remain = Graphics.width - width
self.x = width_remain
@info_viewport.rect.width = width_remain
select(0)
end
super
end
#--------------------------------------------------------------------------
# ● ウィンドウの非表示
#--------------------------------------------------------------------------
def hide
@info_viewport.rect.width = Graphics.width if @info_viewport
super
end
end

View file

@ -0,0 +1,40 @@
#==============================================================================
# ■ Window_BattleItem
#------------------------------------------------------------------------------
#  バトル画面で、使用するアイテムを選択するウィンドウです。
#==============================================================================
class Window_BattleItem < Window_ItemList
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# info_viewport : 情報表示用ビューポート
#--------------------------------------------------------------------------
def initialize(help_window, info_viewport)
y = help_window.height
super(0, y, Graphics.width, info_viewport.rect.y - y)
self.visible = false
@help_window = help_window
@info_viewport = info_viewport
end
#--------------------------------------------------------------------------
# ● アイテムをリストに含めるかどうか
#--------------------------------------------------------------------------
def include?(item)
$game_party.usable?(item)
end
#--------------------------------------------------------------------------
# ● ウィンドウの表示
#--------------------------------------------------------------------------
def show
select_last
@help_window.show
super
end
#--------------------------------------------------------------------------
# ● ウィンドウの非表示
#--------------------------------------------------------------------------
def hide
@help_window.hide
super
end
end

428
Scripts/Window_BattleLog.rb Normal file
View file

@ -0,0 +1,428 @@
#==============================================================================
# ■ Window_BattleLog
#------------------------------------------------------------------------------
#  戦闘の進行を実況表示するウィンドウです。枠は表示しませんが、便宜上ウィンド
# ウとして扱います。
#==============================================================================
class Window_BattleLog < Window_Selectable
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super(0, 0, window_width, window_height)
self.z = 200
self.opacity = 0
@lines = []
@num_wait = 0
create_back_bitmap
create_back_sprite
refresh
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
super
dispose_back_bitmap
dispose_back_sprite
end
#--------------------------------------------------------------------------
# ● ウィンドウ幅の取得
#--------------------------------------------------------------------------
def window_width
Graphics.width
end
#--------------------------------------------------------------------------
# ● ウィンドウ高さの取得
#--------------------------------------------------------------------------
def window_height
fitting_height(max_line_number)
end
#--------------------------------------------------------------------------
# ● 最大行数の取得
#--------------------------------------------------------------------------
def max_line_number
return 6
end
#--------------------------------------------------------------------------
# ● 背景ビットマップの作成
#--------------------------------------------------------------------------
def create_back_bitmap
@back_bitmap = Bitmap.new(width, height)
end
#--------------------------------------------------------------------------
# ● 背景スプライトの作成
#--------------------------------------------------------------------------
def create_back_sprite
@back_sprite = Sprite.new
@back_sprite.bitmap = @back_bitmap
@back_sprite.y = y
@back_sprite.z = z - 1
end
#--------------------------------------------------------------------------
# ● 背景ビットマップの解放
#--------------------------------------------------------------------------
def dispose_back_bitmap
@back_bitmap.dispose
end
#--------------------------------------------------------------------------
# ● 背景スプライトの解放
#--------------------------------------------------------------------------
def dispose_back_sprite
@back_sprite.dispose
end
#--------------------------------------------------------------------------
# ● クリア
#--------------------------------------------------------------------------
def clear
@num_wait = 0
@lines.clear
refresh
end
#--------------------------------------------------------------------------
# ● データ行数の取得
#--------------------------------------------------------------------------
def line_number
@lines.size
end
#--------------------------------------------------------------------------
# ● 一行戻る
#--------------------------------------------------------------------------
def back_one
@lines.pop
refresh
end
#--------------------------------------------------------------------------
# ● 指定した行に戻る
#--------------------------------------------------------------------------
def back_to(line_number)
@lines.pop while @lines.size > line_number
refresh
end
#--------------------------------------------------------------------------
# ● 文章の追加
#--------------------------------------------------------------------------
def add_text(text)
@lines.push(text)
refresh
end
#--------------------------------------------------------------------------
# ● 文章の置き換え
# 最下行を別の文章に置き換える。
#--------------------------------------------------------------------------
def replace_text(text)
@lines.pop
@lines.push(text)
refresh
end
#--------------------------------------------------------------------------
# ● 最下行の文章の取得
#--------------------------------------------------------------------------
def last_text
@lines[-1]
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
draw_background
contents.clear
@lines.size.times {|i| draw_line(i) }
end
#--------------------------------------------------------------------------
# ● 背景の描画
#--------------------------------------------------------------------------
def draw_background
@back_bitmap.clear
@back_bitmap.fill_rect(back_rect, back_color)
end
#--------------------------------------------------------------------------
# ● 背景の矩形を取得
#--------------------------------------------------------------------------
def back_rect
Rect.new(0, padding, width, line_number * line_height)
end
#--------------------------------------------------------------------------
# ● 背景色の取得
#--------------------------------------------------------------------------
def back_color
Color.new(0, 0, 0, back_opacity)
end
#--------------------------------------------------------------------------
# ● 背景の不透明度を取得
#--------------------------------------------------------------------------
def back_opacity
return 64
end
#--------------------------------------------------------------------------
# ● 行の描画
#--------------------------------------------------------------------------
def draw_line(line_number)
rect = item_rect_for_text(line_number)
contents.clear_rect(rect)
draw_text_ex(rect.x, rect.y, @lines[line_number])
end
#--------------------------------------------------------------------------
# ● ウェイト用メソッドの設定
#--------------------------------------------------------------------------
def method_wait=(method)
@method_wait = method
end
#--------------------------------------------------------------------------
# ● エフェクト実行のウェイト用メソッドの設定
#--------------------------------------------------------------------------
def method_wait_for_effect=(method)
@method_wait_for_effect = method
end
#--------------------------------------------------------------------------
# ● ウェイト
#--------------------------------------------------------------------------
def wait
@num_wait += 1
@method_wait.call(message_speed) if @method_wait
end
#--------------------------------------------------------------------------
# ● エフェクト実行が終わるまでウェイト
#--------------------------------------------------------------------------
def wait_for_effect
@method_wait_for_effect.call if @method_wait_for_effect
end
#--------------------------------------------------------------------------
# ● メッセージ速度の取得
#--------------------------------------------------------------------------
def message_speed
return 20 + $game_variables[90]
end
#--------------------------------------------------------------------------
# ● ウェイトとクリア
# メッセージが読める最低限のウェイトを入れた後クリアする。
#--------------------------------------------------------------------------
def wait_and_clear
wait while @num_wait < 2 if line_number > 0
clear
end
#--------------------------------------------------------------------------
# ● 現在のステートの表示
#--------------------------------------------------------------------------
def display_current_state(subject)
unless subject.most_important_state_text.empty?
add_text(subject.name + subject.most_important_state_text)
wait
end
end
#--------------------------------------------------------------------------
# ● スキル/アイテム使用の表示
#--------------------------------------------------------------------------
def display_use_item(subject, item)
if item.is_a?(RPG::Skill)
add_text(item.message1)
unless item.message2.empty?
wait
add_text(item.message2)
end
else
add_text(sprintf(Vocab::UseItem, subject.name, item.name))
end
end
#--------------------------------------------------------------------------
# ● 反撃の表示
#--------------------------------------------------------------------------
def display_counter(target, item)
Sound.play_evasion
add_text(sprintf(Vocab::CounterAttack, target.name))
wait
back_one
end
#--------------------------------------------------------------------------
# ● 反射の表示
#--------------------------------------------------------------------------
def display_reflection(target, item)
Sound.play_reflection
add_text(sprintf(Vocab::MagicReflection, target.name))
wait
back_one
end
#--------------------------------------------------------------------------
# ● 身代わりの表示
#--------------------------------------------------------------------------
def display_substitute(substitute, target)
add_text(sprintf(Vocab::Substitute, substitute.name, target.name))
wait
back_one
end
#--------------------------------------------------------------------------
# ● 行動結果の表示
#--------------------------------------------------------------------------
def display_action_results(target, item)
if target.result.used
last_line_number = line_number
display_critical(target, item)
display_damage(target, item)
display_affected_status(target, item)
display_failure(target, item)
wait if line_number > last_line_number
back_to(last_line_number)
end
end
#--------------------------------------------------------------------------
# ● 失敗の表示
#--------------------------------------------------------------------------
def display_failure(target, item)
if target.result.hit? && !target.result.success
add_text(sprintf(Vocab::ActionFailure, target.name))
wait
end
end
#--------------------------------------------------------------------------
# ● クリティカルヒットの表示
#--------------------------------------------------------------------------
def display_critical(target, item)
if target.result.critical
text = target.actor? ? Vocab::CriticalToActor : Vocab::CriticalToEnemy
add_text(text)
wait
end
end
#--------------------------------------------------------------------------
# ● ダメージの表示
#--------------------------------------------------------------------------
def display_damage(target, item)
if target.result.missed
display_miss(target, item)
elsif target.result.evaded
display_evasion(target, item)
else
display_hp_damage(target, item)
display_mp_damage(target, item)
display_tp_damage(target, item)
end
end
#--------------------------------------------------------------------------
# ● ミスの表示
#--------------------------------------------------------------------------
def display_miss(target, item)
if !item || item.physical?
fmt = target.actor? ? Vocab::ActorNoHit : Vocab::EnemyNoHit
Sound.play_miss
else
fmt = Vocab::ActionFailure
end
add_text(sprintf(fmt, target.name))
wait
end
#--------------------------------------------------------------------------
# ● 回避の表示
#--------------------------------------------------------------------------
def display_evasion(target, item)
if !item || item.physical?
fmt = Vocab::Evasion
Sound.play_evasion
else
fmt = Vocab::MagicEvasion
Sound.play_magic_evasion
end
add_text(sprintf(fmt, target.name))
wait
end
#--------------------------------------------------------------------------
# ● HP ダメージ表示
#--------------------------------------------------------------------------
def display_hp_damage(target, item)
return if target.result.hp_damage == 0 && item && !item.damage.to_hp?
if target.result.hp_damage > 0 && target.result.hp_drain == 0
target.perform_damage_effect
end
Sound.play_recovery if target.result.hp_damage < 0
add_text(target.result.hp_damage_text)
wait
end
#--------------------------------------------------------------------------
# ● MP ダメージ表示
#--------------------------------------------------------------------------
def display_mp_damage(target, item)
return if target.result.mp_damage == 0 && item && !item.damage.to_mp?
if target.result.mp_damage > 0 && target.result.mp_drain == 0
target.perform_damage_effect
end
Sound.play_recovery if target.result.mp_damage < 0
add_text(target.result.mp_damage_text)
wait
end
#--------------------------------------------------------------------------
# ● TP ダメージ表示
#--------------------------------------------------------------------------
def display_tp_damage(target, item)
return if target.dead? || target.result.tp_damage == 0
Sound.play_recovery if target.result.tp_damage < 0
add_text(target.result.tp_damage_text)
wait
end
#--------------------------------------------------------------------------
# ● 影響を受けたステータスの表示
#--------------------------------------------------------------------------
def display_affected_status(target, item)
if target.result.status_affected?
add_text("") if line_number < max_line_number
display_changed_states(target)
display_changed_buffs(target)
back_one if last_text.empty?
end
end
#--------------------------------------------------------------------------
# ● 自動で影響を受けたステータスの表示
#--------------------------------------------------------------------------
def display_auto_affected_status(target)
if target.result.status_affected?
display_affected_status(target, nil)
wait if line_number > 0
end
end
#--------------------------------------------------------------------------
# ● ステート付加/解除の表示
#--------------------------------------------------------------------------
def display_changed_states(target)
display_added_states(target)
display_removed_states(target)
end
#--------------------------------------------------------------------------
# ● ステート付加の表示
#--------------------------------------------------------------------------
def display_added_states(target)
target.result.added_state_objects.each do |state|
state_msg = target.actor? ? state.message1 : state.message2
target.perform_collapse_effect if state.id == target.death_state_id
next if state_msg.empty?
replace_text(target.name + state_msg)
wait
wait_for_effect
end
end
#--------------------------------------------------------------------------
# ● ステート解除の表示
#--------------------------------------------------------------------------
def display_removed_states(target)
target.result.removed_state_objects.each do |state|
next if state.message4.empty?
replace_text(target.name + state.message4)
wait
end
end
#--------------------------------------------------------------------------
# ● 能力強化/弱体の表示
#--------------------------------------------------------------------------
def display_changed_buffs(target)
display_buffs(target, target.result.added_buffs, Vocab::BuffAdd)
display_buffs(target, target.result.added_debuffs, Vocab::DebuffAdd)
display_buffs(target, target.result.removed_buffs, Vocab::BuffRemove)
end
#--------------------------------------------------------------------------
# ● 能力強化/弱体の表示(個別)
#--------------------------------------------------------------------------
def display_buffs(target, buffs, fmt)
buffs.each do |param_id|
replace_text(sprintf(fmt, target.name, Vocab::param(param_id)))
wait
end
end
end

View file

@ -0,0 +1,34 @@
#==============================================================================
# ■ Window_BattleSkill
#------------------------------------------------------------------------------
#  バトル画面で、使用するスキルを選択するウィンドウです。
#==============================================================================
class Window_BattleSkill < Window_SkillList
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# info_viewport : 情報表示用ビューポート
#--------------------------------------------------------------------------
def initialize(help_window, info_viewport)
y = help_window.height
super(0, y, Graphics.width, info_viewport.rect.y - y)
self.visible = false
@help_window = help_window
@info_viewport = info_viewport
end
#--------------------------------------------------------------------------
# ● ウィンドウの表示
#--------------------------------------------------------------------------
def show
select_last
@help_window.show
super
end
#--------------------------------------------------------------------------
# ● ウィンドウの非表示
#--------------------------------------------------------------------------
def hide
@help_window.hide
super
end
end

View file

@ -0,0 +1,110 @@
#==============================================================================
# ■ Window_BattleStatus
#------------------------------------------------------------------------------
#  バトル画面で、パーティメンバーのステータスを表示するウィンドウです。
#==============================================================================
class Window_BattleStatus < Window_Selectable
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super(0, 0, window_width, window_height)
refresh
self.openness = 0
end
#--------------------------------------------------------------------------
# ● ウィンドウ幅の取得
#--------------------------------------------------------------------------
def window_width
Graphics.width - 128
end
#--------------------------------------------------------------------------
# ● ウィンドウ高さの取得
#--------------------------------------------------------------------------
def window_height
fitting_height(visible_line_number)
end
#--------------------------------------------------------------------------
# ● 表示行数の取得
#--------------------------------------------------------------------------
def visible_line_number
return 4
end
#--------------------------------------------------------------------------
# ● 項目数の取得
#--------------------------------------------------------------------------
def item_max
$game_party.battle_members.size
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
contents.clear
draw_all_items
end
#--------------------------------------------------------------------------
# ● 項目の描画
#--------------------------------------------------------------------------
def draw_item(index)
actor = $game_party.battle_members[index]
draw_basic_area(basic_area_rect(index), actor)
draw_gauge_area(gauge_area_rect(index), actor)
end
#--------------------------------------------------------------------------
# ● 基本エリアの矩形を取得
#--------------------------------------------------------------------------
def basic_area_rect(index)
rect = item_rect_for_text(index)
rect.width -= gauge_area_width + 10
rect
end
#--------------------------------------------------------------------------
# ● ゲージエリアの矩形を取得
#--------------------------------------------------------------------------
def gauge_area_rect(index)
rect = item_rect_for_text(index)
rect.x += rect.width - gauge_area_width
rect.width = gauge_area_width
rect
end
#--------------------------------------------------------------------------
# ● ゲージエリアの幅を取得
#--------------------------------------------------------------------------
def gauge_area_width
return 220
end
#--------------------------------------------------------------------------
# ● 基本エリアの描画
#--------------------------------------------------------------------------
def draw_basic_area(rect, actor)
draw_actor_name(actor, rect.x + 0, rect.y, 100)
draw_actor_icons(actor, rect.x + 104, rect.y, rect.width - 104)
end
#--------------------------------------------------------------------------
# ● ゲージエリアの描画
#--------------------------------------------------------------------------
def draw_gauge_area(rect, actor)
if $data_system.opt_display_tp
draw_gauge_area_with_tp(rect, actor)
else
draw_gauge_area_without_tp(rect, actor)
end
end
#--------------------------------------------------------------------------
# ● ゲージエリアの描画TP あり)
#--------------------------------------------------------------------------
def draw_gauge_area_with_tp(rect, actor)
draw_actor_hp(actor, rect.x + 0, rect.y, 72)
draw_actor_mp(actor, rect.x + 82, rect.y, 64)
draw_actor_tp(actor, rect.x + 156, rect.y, 64)
end
#--------------------------------------------------------------------------
# ● ゲージエリアの描画TP なし)
#--------------------------------------------------------------------------
def draw_gauge_area_without_tp(rect, actor)
draw_actor_hp(actor, rect.x + 0, rect.y, 134)
draw_actor_mp(actor, rect.x + 144, rect.y, 76)
end
end

View file

@ -0,0 +1,88 @@
#==============================================================================
# ■ Window_ChoiceList
#------------------------------------------------------------------------------
#  イベントコマンド[選択肢の表示]に使用するウィンドウです。
#==============================================================================
class Window_ChoiceList < Window_Command
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(message_window)
@message_window = message_window
super(0, 0)
self.openness = 0
deactivate
end
#--------------------------------------------------------------------------
# ● 入力処理の開始
#--------------------------------------------------------------------------
def start
update_placement
refresh
select(0)
open
activate
end
#--------------------------------------------------------------------------
# ● ウィンドウ位置の更新
#--------------------------------------------------------------------------
def update_placement
self.width = [max_choice_width + 12, 96].max + padding * 2
self.width = [width, Graphics.width].min
self.height = fitting_height($game_message.choices.size)
self.x = Graphics.width - width
if @message_window.y >= Graphics.height / 2
self.y = @message_window.y - height
else
self.y = @message_window.y + @message_window.height
end
end
#--------------------------------------------------------------------------
# ● 選択肢の最大幅を取得
#--------------------------------------------------------------------------
def max_choice_width
$game_message.choices.collect {|s| text_size(s).width }.max
end
#--------------------------------------------------------------------------
# ● ウィンドウ内容の高さを計算
#--------------------------------------------------------------------------
def contents_height
item_max * item_height
end
#--------------------------------------------------------------------------
# ● コマンドリストの作成
#--------------------------------------------------------------------------
def make_command_list
$game_message.choices.each do |choice|
add_command(choice, :choice)
end
end
#--------------------------------------------------------------------------
# ● 項目の描画
#--------------------------------------------------------------------------
def draw_item(index)
rect = item_rect_for_text(index)
draw_text_ex(rect.x, rect.y, command_name(index))
end
#--------------------------------------------------------------------------
# ● キャンセル処理の有効状態を取得
#--------------------------------------------------------------------------
def cancel_enabled?
$game_message.choice_cancel_type > 0
end
#--------------------------------------------------------------------------
# ● 決定ハンドラの呼び出し
#--------------------------------------------------------------------------
def call_ok_handler
$game_message.choice_proc.call(index)
close
end
#--------------------------------------------------------------------------
# ● キャンセルハンドラの呼び出し
#--------------------------------------------------------------------------
def call_cancel_handler
$game_message.choice_proc.call($game_message.choice_cancel_type - 1)
close
end
end

152
Scripts/Window_Command.rb Normal file
View file

@ -0,0 +1,152 @@
#==============================================================================
# ■ Window_Command
#------------------------------------------------------------------------------
#  一般的なコマンド選択を行うウィンドウです。
#==============================================================================
class Window_Command < Window_Selectable
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(x, y)
clear_command_list
make_command_list
super(x, y, window_width, window_height)
refresh
select(0)
activate
end
#--------------------------------------------------------------------------
# ● ウィンドウ幅の取得
#--------------------------------------------------------------------------
def window_width
return 160
end
#--------------------------------------------------------------------------
# ● ウィンドウ高さの取得
#--------------------------------------------------------------------------
def window_height
fitting_height(visible_line_number)
end
#--------------------------------------------------------------------------
# ● 表示行数の取得
#--------------------------------------------------------------------------
def visible_line_number
item_max
end
#--------------------------------------------------------------------------
# ● 項目数の取得
#--------------------------------------------------------------------------
def item_max
@list.size
end
#--------------------------------------------------------------------------
# ● コマンドリストのクリア
#--------------------------------------------------------------------------
def clear_command_list
@list = []
end
#--------------------------------------------------------------------------
# ● コマンドリストの作成
#--------------------------------------------------------------------------
def make_command_list
end
#--------------------------------------------------------------------------
# ● コマンドの追加
# name : コマンド名
# symbol : 対応するシンボル
# enabled : 有効状態フラグ
# ext : 任意の拡張データ
#--------------------------------------------------------------------------
def add_command(name, symbol, enabled = true, ext = nil)
@list.push({:name=>name, :symbol=>symbol, :enabled=>enabled, :ext=>ext})
end
#--------------------------------------------------------------------------
# ● コマンド名の取得
#--------------------------------------------------------------------------
def command_name(index)
@list[index][:name]
end
#--------------------------------------------------------------------------
# ● コマンドの有効状態を取得
#--------------------------------------------------------------------------
def command_enabled?(index)
@list[index][:enabled]
end
#--------------------------------------------------------------------------
# ● 選択項目のコマンドデータを取得
#--------------------------------------------------------------------------
def current_data
index >= 0 ? @list[index] : nil
end
#--------------------------------------------------------------------------
# ● 選択項目の有効状態を取得
#--------------------------------------------------------------------------
def current_item_enabled?
current_data ? current_data[:enabled] : false
end
#--------------------------------------------------------------------------
# ● 選択項目のシンボルを取得
#--------------------------------------------------------------------------
def current_symbol
current_data ? current_data[:symbol] : nil
end
#--------------------------------------------------------------------------
# ● 選択項目の拡張データを取得
#--------------------------------------------------------------------------
def current_ext
current_data ? current_data[:ext] : nil
end
#--------------------------------------------------------------------------
# ● 指定されたシンボルを持つコマンドにカーソルを移動
#--------------------------------------------------------------------------
def select_symbol(symbol)
@list.each_index {|i| select(i) if @list[i][:symbol] == symbol }
end
#--------------------------------------------------------------------------
# ● 指定された拡張データを持つコマンドにカーソルを移動
#--------------------------------------------------------------------------
def select_ext(ext)
@list.each_index {|i| select(i) if @list[i][:ext] == ext }
end
#--------------------------------------------------------------------------
# ● 項目の描画
#--------------------------------------------------------------------------
def draw_item(index)
change_color(normal_color, command_enabled?(index))
draw_text(item_rect_for_text(index), command_name(index), alignment)
end
#--------------------------------------------------------------------------
# ● アライメントの取得
#--------------------------------------------------------------------------
def alignment
return 0
end
#--------------------------------------------------------------------------
# ● 決定処理の有効状態を取得
#--------------------------------------------------------------------------
def ok_enabled?
return true
end
#--------------------------------------------------------------------------
# ● 決定ハンドラの呼び出し
#--------------------------------------------------------------------------
def call_ok_handler
if handle?(current_symbol)
call_handler(current_symbol)
elsif handle?(:ok)
super
else
activate
end
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
clear_command_list
make_command_list
create_contents
super
end
end

104
Scripts/Window_DebugLeft.rb Normal file
View file

@ -0,0 +1,104 @@
#==============================================================================
# ■ Window_DebugLeft
#------------------------------------------------------------------------------
#  デバッグ画面で、スイッチや変数のブロックを指定するウィンドウです。
#==============================================================================
class Window_DebugLeft < Window_Selectable
#--------------------------------------------------------------------------
# ● クラス変数
#--------------------------------------------------------------------------
@@last_top_row = 0 # 先頭の行 保存用
@@last_index = 0 # カーソル位置 保存用
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :right_window # 右ウィンドウ
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(x, y)
super(x, y, window_width, window_height)
refresh
self.top_row = @@last_top_row
select(@@last_index)
activate
end
#--------------------------------------------------------------------------
# ● ウィンドウ幅の取得
#--------------------------------------------------------------------------
def window_width
return 164
end
#--------------------------------------------------------------------------
# ● ウィンドウ高さの取得
#--------------------------------------------------------------------------
def window_height
Graphics.height
end
#--------------------------------------------------------------------------
# ● 項目数の取得
#--------------------------------------------------------------------------
def item_max
@item_max || 0
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
super
return unless @right_window
@right_window.mode = mode
@right_window.top_id = top_id
end
#--------------------------------------------------------------------------
# ● モードの取得
#--------------------------------------------------------------------------
def mode
index < @switch_max ? :switch : :variable
end
#--------------------------------------------------------------------------
# ● 先頭に表示する ID の取得
#--------------------------------------------------------------------------
def top_id
(index - (index < @switch_max ? 0 : @switch_max)) * 10 + 1
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
@switch_max = ($data_system.switches.size - 1 + 9) / 10
@variable_max = ($data_system.variables.size - 1 + 9) / 10
@item_max = @switch_max + @variable_max
create_contents
draw_all_items
end
#--------------------------------------------------------------------------
# ● 項目の描画
#--------------------------------------------------------------------------
def draw_item(index)
if index < @switch_max
n = index * 10
text = sprintf("S [%04d-%04d]", n+1, n+10)
else
n = (index - @switch_max) * 10
text = sprintf("V [%04d-%04d]", n+1, n+10)
end
draw_text(item_rect_for_text(index), text)
end
#--------------------------------------------------------------------------
# ● キャンセルボタンが押されたときの処理
#--------------------------------------------------------------------------
def process_cancel
super
@@last_top_row = top_row
@@last_index = index
end
#--------------------------------------------------------------------------
# ● 右ウィンドウの設定
#--------------------------------------------------------------------------
def right_window=(right_window)
@right_window = right_window
update
end
end

View file

@ -0,0 +1,119 @@
#==============================================================================
# ■ Window_DebugRight
#------------------------------------------------------------------------------
#  デバッグ画面で、スイッチや変数を個別に表示するウィンドウです。
#==============================================================================
class Window_DebugRight < Window_Selectable
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :mode # モード(:switch / :variable
attr_reader :top_id # 先頭に表示する ID
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#-------------------------------------------------------------------------
def initialize(x, y, width)
super(x, y, width, fitting_height(10))
@mode = :switch
@top_id = 1
refresh
end
#--------------------------------------------------------------------------
# ● 項目数の取得
#--------------------------------------------------------------------------
def item_max
return 10
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
contents.clear
draw_all_items
end
#--------------------------------------------------------------------------
# ● 項目の描画
#--------------------------------------------------------------------------
def draw_item(index)
data_id = @top_id + index
id_text = sprintf("%04d:", data_id)
id_width = text_size(id_text).width
if @mode == :switch
name = $data_system.switches[data_id]
status = $game_switches[data_id] ? "[ON]" : "[OFF]"
else
name = $data_system.variables[data_id]
status = $game_variables[data_id]
end
name = "" unless name
rect = item_rect_for_text(index)
change_color(normal_color)
draw_text(rect, id_text)
rect.x += id_width
rect.width -= id_width + 60
draw_text(rect, name)
rect.width += 60
draw_text(rect, status, 2)
end
#--------------------------------------------------------------------------
# ● モードの設定
# mode : 新しいモード
#--------------------------------------------------------------------------
def mode=(mode)
if @mode != mode
@mode = mode
refresh
end
end
#--------------------------------------------------------------------------
# ● 先頭に表示する ID の設定
# id : 新しい ID
#--------------------------------------------------------------------------
def top_id=(id)
if @top_id != id
@top_id = id
refresh
end
end
#--------------------------------------------------------------------------
# ● 選択中 ID の取得
#--------------------------------------------------------------------------
def current_id
top_id + index
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
super
update_switch_mode if active && mode == :switch
update_variable_mode if active && mode == :variable
end
#--------------------------------------------------------------------------
# ● スイッチモード時の更新
#--------------------------------------------------------------------------
def update_switch_mode
if Input.trigger?(:C)
Sound.play_ok
$game_switches[current_id] = !$game_switches[current_id]
redraw_current_item
end
end
#--------------------------------------------------------------------------
# ● 変数モード時の更新
#--------------------------------------------------------------------------
def update_variable_mode
return unless $game_variables[current_id].is_a?(Numeric)
value = $game_variables[current_id]
value += 1 if Input.repeat?(:RIGHT)
value -= 1 if Input.repeat?(:LEFT)
value += 10 if Input.repeat?(:R)
value -= 10 if Input.repeat?(:L)
if $game_variables[current_id] != value
$game_variables[current_id] = value
Sound.play_cursor
redraw_current_item
end
end
end

View file

@ -0,0 +1,35 @@
#==============================================================================
# ■ Window_EquipCommand
#------------------------------------------------------------------------------
#  スキル画面で、コマンド(装備変更、最強装備など)を選択するウィンドウです。
#==============================================================================
class Window_EquipCommand < Window_HorzCommand
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(x, y, width)
@window_width = width
super(x, y)
end
#--------------------------------------------------------------------------
# ● ウィンドウ幅の取得
#--------------------------------------------------------------------------
def window_width
@window_width
end
#--------------------------------------------------------------------------
# ● 桁数の取得
#--------------------------------------------------------------------------
def col_max
return 3
end
#--------------------------------------------------------------------------
# ● コマンドリストの作成
#--------------------------------------------------------------------------
def make_command_list
add_command(Vocab::equip2, :equip)
add_command(Vocab::optimize, :optimize)
add_command(Vocab::clear, :clear)
end
end

View file

@ -0,0 +1,77 @@
#==============================================================================
# ■ Window_EquipItem
#------------------------------------------------------------------------------
#  装備画面で、装備変更の候補となるアイテムの一覧を表示するウィンドウです。
#==============================================================================
class Window_EquipItem < Window_ItemList
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :status_window # ステータスウィンドウ
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(x, y, width, height)
super
@actor = nil
@slot_id = 0
end
#--------------------------------------------------------------------------
# ● アクターの設定
#--------------------------------------------------------------------------
def actor=(actor)
return if @actor == actor
@actor = actor
refresh
self.oy = 0
end
#--------------------------------------------------------------------------
# ● 装備スロット ID の設定
#--------------------------------------------------------------------------
def slot_id=(slot_id)
return if @slot_id == slot_id
@slot_id = slot_id
refresh
self.oy = 0
end
#--------------------------------------------------------------------------
# ● アイテムをリストに含めるかどうか
#--------------------------------------------------------------------------
def include?(item)
return true if item == nil
return false unless item.is_a?(RPG::EquipItem)
return false if @slot_id < 0
return false if item.etype_id != @actor.equip_slots[@slot_id]
return @actor.equippable?(item)
end
#--------------------------------------------------------------------------
# ● アイテムを許可状態で表示するかどうか
#--------------------------------------------------------------------------
def enable?(item)
return true
end
#--------------------------------------------------------------------------
# ● 前回の選択位置を復帰
#--------------------------------------------------------------------------
def select_last
end
#--------------------------------------------------------------------------
# ● ステータスウィンドウの設定
#--------------------------------------------------------------------------
def status_window=(status_window)
@status_window = status_window
call_update_help
end
#--------------------------------------------------------------------------
# ● ヘルプテキスト更新
#--------------------------------------------------------------------------
def update_help
super
if @actor && @status_window
temp_actor = Marshal.load(Marshal.dump(@actor))
temp_actor.force_change_equip(@slot_id, item)
@status_window.set_temp_actor(temp_actor)
end
end
end

110
Scripts/Window_EquipSlot.rb Normal file
View file

@ -0,0 +1,110 @@
#==============================================================================
# ■ Window_EquipSlot
#------------------------------------------------------------------------------
#  装備画面で、アクターが現在装備しているアイテムを表示するウィンドウです。
#==============================================================================
class Window_EquipSlot < Window_Selectable
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :status_window # ステータスウィンドウ
attr_reader :item_window # アイテムウィンドウ
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(x, y, width)
super(x, y, width, window_height)
@actor = nil
refresh
end
#--------------------------------------------------------------------------
# ● ウィンドウ高さの取得
#--------------------------------------------------------------------------
def window_height
fitting_height(visible_line_number)
end
#--------------------------------------------------------------------------
# ● 表示行数の取得
#--------------------------------------------------------------------------
def visible_line_number
return 5
end
#--------------------------------------------------------------------------
# ● アクターの設定
#--------------------------------------------------------------------------
def actor=(actor)
return if @actor == actor
@actor = actor
refresh
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
super
@item_window.slot_id = index if @item_window
end
#--------------------------------------------------------------------------
# ● 項目数の取得
#--------------------------------------------------------------------------
def item_max
@actor ? @actor.equip_slots.size : 0
end
#--------------------------------------------------------------------------
# ● アイテムの取得
#--------------------------------------------------------------------------
def item
@actor ? @actor.equips[index] : nil
end
#--------------------------------------------------------------------------
# ● 項目の描画
#--------------------------------------------------------------------------
def draw_item(index)
return unless @actor
rect = item_rect_for_text(index)
change_color(system_color, enable?(index))
draw_text(rect.x, rect.y, 92, line_height, slot_name(index))
draw_item_name(@actor.equips[index], rect.x + 92, rect.y, enable?(index))
end
#--------------------------------------------------------------------------
# ● 装備スロットの名前を取得
#--------------------------------------------------------------------------
def slot_name(index)
@actor ? Vocab::etype(@actor.equip_slots[index]) : ""
end
#--------------------------------------------------------------------------
# ● 装備スロットを許可状態で表示するかどうか
#--------------------------------------------------------------------------
def enable?(index)
@actor ? @actor.equip_change_ok?(index) : false
end
#--------------------------------------------------------------------------
# ● 選択項目の有効状態を取得
#--------------------------------------------------------------------------
def current_item_enabled?
enable?(index)
end
#--------------------------------------------------------------------------
# ● ステータスウィンドウの設定
#--------------------------------------------------------------------------
def status_window=(status_window)
@status_window = status_window
call_update_help
end
#--------------------------------------------------------------------------
# ● アイテムウィンドウの設定
#--------------------------------------------------------------------------
def item_window=(item_window)
@item_window = item_window
update
end
#--------------------------------------------------------------------------
# ● ヘルプテキスト更新
#--------------------------------------------------------------------------
def update_help
super
@help_window.set_item(item) if @help_window
@status_window.set_temp_actor(nil) if @status_window
end
end

View file

@ -0,0 +1,97 @@
#==============================================================================
# ■ Window_EquipStatus
#------------------------------------------------------------------------------
#  装備画面で、アクターの能力値変化を表示するウィンドウです。
#==============================================================================
class Window_EquipStatus < Window_Base
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(x, y)
super(x, y, window_width, window_height)
@actor = nil
@temp_actor = nil
refresh
end
#--------------------------------------------------------------------------
# ● ウィンドウ幅の取得
#--------------------------------------------------------------------------
def window_width
return 208
end
#--------------------------------------------------------------------------
# ● ウィンドウ高さの取得
#--------------------------------------------------------------------------
def window_height
fitting_height(visible_line_number)
end
#--------------------------------------------------------------------------
# ● 表示行数の取得
#--------------------------------------------------------------------------
def visible_line_number
return 7
end
#--------------------------------------------------------------------------
# ● アクターの設定
#--------------------------------------------------------------------------
def actor=(actor)
return if @actor == actor
@actor = actor
refresh
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
contents.clear
draw_actor_name(@actor, 4, 0) if @actor
6.times {|i| draw_item(0, line_height * (1 + i), 2 + i) }
end
#--------------------------------------------------------------------------
# ● 装備変更後の一時アクター設定
#--------------------------------------------------------------------------
def set_temp_actor(temp_actor)
return if @temp_actor == temp_actor
@temp_actor = temp_actor
refresh
end
#--------------------------------------------------------------------------
# ● 項目の描画
#--------------------------------------------------------------------------
def draw_item(x, y, param_id)
draw_param_name(x + 4, y, param_id)
draw_current_param(x + 94, y, param_id) if @actor
draw_right_arrow(x + 126, y)
draw_new_param(x + 150, y, param_id) if @temp_actor
end
#--------------------------------------------------------------------------
# ● 能力値の名前を描画
#--------------------------------------------------------------------------
def draw_param_name(x, y, param_id)
change_color(system_color)
draw_text(x, y, 80, line_height, Vocab::param(param_id))
end
#--------------------------------------------------------------------------
# ● 現在の能力値を描画
#--------------------------------------------------------------------------
def draw_current_param(x, y, param_id)
change_color(normal_color)
draw_text(x, y, 32, line_height, @actor.param(param_id), 2)
end
#--------------------------------------------------------------------------
# ● 右向き矢印を描画
#--------------------------------------------------------------------------
def draw_right_arrow(x, y)
change_color(system_color)
draw_text(x, y, 22, line_height, "", 1)
end
#--------------------------------------------------------------------------
# ● 装備変更後の能力値を描画
#--------------------------------------------------------------------------
def draw_new_param(x, y, param_id)
new_value = @temp_actor.param(param_id)
change_color(param_change_color(new_value - @actor.param(param_id)))
draw_text(x, y, 32, line_height, new_value, 2)
end
end

38
Scripts/Window_GameEnd.rb Normal file
View file

@ -0,0 +1,38 @@
#==============================================================================
# ■ Window_GameEnd
#------------------------------------------------------------------------------
#  ゲーム終了画面で、タイトルへ/シャットダウンを選択するウィンドウです。
#==============================================================================
class Window_GameEnd < Window_Command
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super(0, 0)
update_placement
self.openness = 0
open
end
#--------------------------------------------------------------------------
# ● ウィンドウ幅の取得
#--------------------------------------------------------------------------
def window_width
return 160
end
#--------------------------------------------------------------------------
# ● ウィンドウ位置の更新
#--------------------------------------------------------------------------
def update_placement
self.x = (Graphics.width - width) / 2
self.y = (Graphics.height - height) / 2
end
#--------------------------------------------------------------------------
# ● コマンドリストの作成
#--------------------------------------------------------------------------
def make_command_list
add_command(Vocab::to_title, :to_title)
add_command(Vocab::shutdown, :shutdown)
add_command(Vocab::cancel, :cancel)
end
end

47
Scripts/Window_Gold.rb Normal file
View file

@ -0,0 +1,47 @@
#==============================================================================
# ■ Window_Gold
#------------------------------------------------------------------------------
#  所持金を表示するウィンドウです。
#==============================================================================
class Window_Gold < Window_Base
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super(0, 0, window_width, fitting_height(1))
refresh
end
#--------------------------------------------------------------------------
# ● ウィンドウ幅の取得
#--------------------------------------------------------------------------
def window_width
return 160
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
contents.clear
draw_currency_value(value, currency_unit, 4, 0, contents.width - 8)
end
#--------------------------------------------------------------------------
# ● 所持金の取得
#--------------------------------------------------------------------------
def value
$game_party.gold
end
#--------------------------------------------------------------------------
# ● 通貨単位の取得
#--------------------------------------------------------------------------
def currency_unit
Vocab::currency_unit
end
#--------------------------------------------------------------------------
# ● ウィンドウを開く
#--------------------------------------------------------------------------
def open
refresh
super
end
end

43
Scripts/Window_Help.rb Normal file
View file

@ -0,0 +1,43 @@
#==============================================================================
# ■ Window_Help
#------------------------------------------------------------------------------
#  スキルやアイテムの説明、アクターのステータスなどを表示するウィンドウです。
#==============================================================================
class Window_Help < Window_Base
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(line_number = 2)
super(0, 0, Graphics.width, fitting_height(line_number))
end
#--------------------------------------------------------------------------
# ● テキスト設定
#--------------------------------------------------------------------------
def set_text(text)
if text != @text
@text = text
refresh
end
end
#--------------------------------------------------------------------------
# ● クリア
#--------------------------------------------------------------------------
def clear
set_text("")
end
#--------------------------------------------------------------------------
# ● アイテム設定
# item : スキル、アイテム等
#--------------------------------------------------------------------------
def set_item(item)
set_text(item ? item.description : "")
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
contents.clear
draw_text_ex(4, 0, @text)
end
end

View file

@ -0,0 +1,106 @@
#==============================================================================
# ■ Window_HorzCommand
#------------------------------------------------------------------------------
#  横選択形式のコマンドウィンドウです。
#==============================================================================
class Window_HorzCommand < Window_Command
#--------------------------------------------------------------------------
# ● 表示行数の取得
#--------------------------------------------------------------------------
def visible_line_number
return 1
end
#--------------------------------------------------------------------------
# ● 桁数の取得
#--------------------------------------------------------------------------
def col_max
return 4
end
#--------------------------------------------------------------------------
# ● 横に項目が並ぶときの空白の幅を取得
#--------------------------------------------------------------------------
def spacing
return 8
end
#--------------------------------------------------------------------------
# ● ウィンドウ内容の幅を計算
#--------------------------------------------------------------------------
def contents_width
(item_width + spacing) * item_max - spacing
end
#--------------------------------------------------------------------------
# ● ウィンドウ内容の高さを計算
#--------------------------------------------------------------------------
def contents_height
item_height
end
#--------------------------------------------------------------------------
# ● 先頭の桁の取得
#--------------------------------------------------------------------------
def top_col
ox / (item_width + spacing)
end
#--------------------------------------------------------------------------
# ● 先頭の桁の設定
#--------------------------------------------------------------------------
def top_col=(col)
col = 0 if col < 0
col = col_max - 1 if col > col_max - 1
self.ox = col * (item_width + spacing)
end
#--------------------------------------------------------------------------
# ● 末尾の桁の取得
#--------------------------------------------------------------------------
def bottom_col
top_col + col_max - 1
end
#--------------------------------------------------------------------------
# ● 末尾の桁の設定
#--------------------------------------------------------------------------
def bottom_col=(col)
self.top_col = col - (col_max - 1)
end
#--------------------------------------------------------------------------
# ● カーソル位置が画面内になるようにスクロール
#--------------------------------------------------------------------------
def ensure_cursor_visible
self.top_col = index if index < top_col
self.bottom_col = index if index > bottom_col
end
#--------------------------------------------------------------------------
# ● 項目を描画する矩形の取得
#--------------------------------------------------------------------------
def item_rect(index)
rect = super
rect.x = index * (item_width + spacing)
rect.y = 0
rect
end
#--------------------------------------------------------------------------
# ● アライメントの取得
#--------------------------------------------------------------------------
def alignment
return 1
end
#--------------------------------------------------------------------------
# ● カーソルを下に移動
#--------------------------------------------------------------------------
def cursor_down(wrap = false)
end
#--------------------------------------------------------------------------
# ● カーソルを上に移動
#--------------------------------------------------------------------------
def cursor_up(wrap = false)
end
#--------------------------------------------------------------------------
# ● カーソルを 1 ページ後ろに移動
#--------------------------------------------------------------------------
def cursor_pagedown
end
#--------------------------------------------------------------------------
# ● カーソルを 1 ページ前に移動
#--------------------------------------------------------------------------
def cursor_pageup
end
end

Some files were not shown because too many files have changed in this diff Show more