=begin
★シンボルエンカウント補助★
イベントでのシンボルエンカウントの動作を補助します。
● 仕様 ●==========================================================
指定したキャラクターは、基本ランダム移動を行い、
プレイヤーが一定距離内に近づくと、プレイヤーを追跡、
またプレイヤーレベルによっては逃走をするようになります。
====================================================================
● 使い方 ●========================================================
イベント>自律移動>カスタム>移動ルート>スクリプトに
@symbol_encount = [true, n]
と記述してください。nはシンボルが逃げるプレイヤーのレベルです。
シンボルを逃がしたくない場合は、nにnilを入れてください。
--------------------------------------------------------------------
イベント>自立移動の速度を1/4倍速、頻度を最高にするといい感じの
動作をするかもしれません。
====================================================================
● 注意 ●==========================================================
ニューゲームから始めないとエラーを吐きます。
====================================================================
ver1.32
Last Update : 2011/12/14
12/14 : ソースコードの見直し
----------------------2011--------------------------
03/05 : イベントページ切り替えごとにシンボルエンカウント判定をリセットするようにした
: シンボルイベントの一時削除が正常に機能しなくなる不具合修正
02/27 : クラスをGame_CharacterからGame_Eventに変更
: 一度見つかったら反応するプレイヤーとの距離が増加するようになりました
: 見つかった際にフキダシアイコンとSEを再生する機能の追加
: ダッシュボタンを押していても移動していなければ反応距離が増加しないようになりました
----------------------2010--------------------------
08/08 : プレイヤーレベルによって、シンボルが逃げる機能を追加
: 追跡の挙動を少し変更
05/17 : プレイヤーがダッシュしていると発見されやすくなる機能を追加
05/06 : 新規
----------------------2009--------------------------
ろかん [url]http://kaisou-ryouiki.sakura.ne.jp/[/url]
=end
#===========================================
# 設定箇所
#===========================================
module Rokan
module Symbol_Encount
# シンボルが反応するプレイヤーとの距離(プレイヤー徒歩時)
DISTANCE_SYMBOL = 3
# シンボルが反応するプレイヤーとの距離(プレイヤーダッシュ時)
DISTANCE_SYMBOL_DASH = 5
# 反応後上昇する移動速度値(変化させたくない場合は 0 にしてください)
SPEED_SYMBOL = 2
# プレイヤーレベルの判定タイプ
# 0 => メンバーの平均レベル
# 1 => メンバーの最大レベル
# 2 => 主人公(先頭キャラ)のレベル
ESCAPE_SYMBOL_TYPE = 0
# シンボル反応時にフキダシアイコンエフェクトをかけるかどうか
SE_EFFECT = true
end
end
#===========================================
# ここまで
#===========================================
$rsi ||= {}
$rsi["シンボルエンカウント補助"] = true
class Game_Event < Game_Character
#--------------------------------------------------------------------------
# ● インクルード Rokan::Symbol_Encount
#--------------------------------------------------------------------------
include Rokan::Symbol_Encount
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias symbol_encount_initialize initialize
def initialize(map_id, event)
symbol_encount_initialize(map_id, event)
ini_symbol_encount
end
#--------------------------------------------------------------------------
# ● シンボルエンカウント関連初期化
#--------------------------------------------------------------------------
def ini_symbol_encount
@forming = false # 追跡中判定
@symbol_encount = [false, false]
end
#--------------------------------------------------------------------------
# ● イベントページのセットアップ
#--------------------------------------------------------------------------
alias symbol_encount_setup setup
def setup(new_page)
ini_symbol_encount
symbol_encount_setup(new_page)
end
#--------------------------------------------------------------------------
# ● プレイヤーレベルの取得
#--------------------------------------------------------------------------
def get_player_level
n = 0
case ESCAPE_SYMBOL_TYPE
when 0
$game_party.members.each{|i| n += i.level}
n /= $game_party.members.size
when 1
a = []
$game_party.members.each{|i| a << i.level}
n = a.max
when 2
n = $game_party.members[0].level
end
return n
end
#--------------------------------------------------------------------------
# ● プレイヤーからの距離を取得
#--------------------------------------------------------------------------
def distance_from_player
return distance_x_from_player.abs + distance_y_from_player.abs
end
#--------------------------------------------------------------------------
# ● プレイヤーが指定距離内にいるか
#--------------------------------------------------------------------------
def distance_symbol
if @forming
d = DISTANCE_SYMBOL_DASH.next
else
d = $game_player.dash? && $game_player.moving? ? DISTANCE_SYMBOL_DASH : DISTANCE_SYMBOL
end
return distance_from_player <= d
end
#--------------------------------------------------------------------------
# ● シンボルエンカウントを動作させるか
#--------------------------------------------------------------------------
def active_symbol_encount?
# イベント中・一時削除中は動作しない
if $game_map.interpreter.running?
return false
elsif @erased
@forming = false
return false
end
return true
end
#--------------------------------------------------------------------------
# ● プレイヤーに反応しているか
#--------------------------------------------------------------------------
def symbol_encount_forming?
return false unless active_symbol_encount?
result = distance_symbol
unless @forming
if SE_EFFECT && result
RPG::SE.new("Decision1", 50, 150).play unless $rsi["フキダシSE"]
@balloon_id = 1
end
end
@forming = result
return result
end
#--------------------------------------------------------------------------
# ● 追うか逃げるか
#--------------------------------------------------------------------------
def toward_or_away?
if @symbol_encount[1] && get_player_level > @symbol_encount[1]
move_away_from_player
else
move_toward_player
end
end
#--------------------------------------------------------------------------
# ● 自律移動の更新 ※再定義
#--------------------------------------------------------------------------
def update_self_movement
if @stop_count > 30 * (5 - @move_frequency)
if @symbol_encount[0]
symbol_encount_forming? ? toward_or_away? : move_type_random
else
case @move_type
when 1; move_type_random
when 2; move_type_toward_player
when 3; move_type_custom
end
end
end
end
#--------------------------------------------------------------------------
# ● 移動時の更新 ※再定義
#--------------------------------------------------------------------------
def update_move
distance = @symbol_encount[0] && distance_symbol ?
2 ** (@move_speed + SPEED_SYMBOL) : 2 ** @move_speed
distance *= 2 if dash? # ダッシュ状態ならさらに倍
@real_x = [@real_x - distance, @x * 256].max if @x * 256 < @real_x
@real_x = [@real_x + distance, @x * 256].min if @x * 256 > @real_x
@real_y = [@real_y - distance, @y * 256].max if @y * 256 < @real_y
@real_y = [@real_y + distance, @y * 256].min if @y * 256 > @real_y
update_bush_depth unless moving?
if @walk_anime
@anime_count += 1.5
elsif @step_anime
@anime_count += 1
end
end
end