何を血迷ったのかまたRPGツクールを始めた。昨今はツクールMZなるものまで出現しているが、キャラ規格などがVX系に比べて大きいため、描ける自信が無い。あとRubyもまだ満足に扱えないのにJavaScriptなんて出来る気がしない。そんなわけで、まだまだVXAceを現役と思い愛でている次第だ。めでてめでてもう。
血迷いがてら、頑張ってスクリプトを書いてみた。といっても、ほぼほぼデータベースで設定させるので補助的なスクリプトに過ぎない。内容は「金縛り」ステートの作成補助スクリプトだ。金縛りと言ったものの、別に雪だるまだろうが蛆虫だろうが筋肥大で動きにくい翁だろうが何でもいい。とにかく金縛り状態になると、ステートのメモ欄に指定した確率で行動不能になる。行動不能判定を行動直前に実施するため、コマンドの選択が出来るのに、そのターンの行動が封じられるというもの。有名なゲームで言うとドラクエのみとれるに近い。あとあれにも似てる、俺の知らんゲーム、何だっけかな知らんけど。
ステート設定1あくまでダミーステートとなる。このステートが付与されている状態の時、行動不能判定を実施する。内部的には、確率で行動不能効果のあるステートを付与する。そのため行動制約は無しに設定する。メモ欄には<動けない:n>の表記になる。nは単純に1~100を入力するだけ。ただし100にすると100%行動不能になるため、このスクリプトを使用する必要性は無い。 ステートで設定できたほうが、他の効果を付けたりできるし、手軽で管理しやすいような気がした。
ステート設定2
実際に行動不能とさせるステート。名前はゲーム上に表示させないため、管理し易い名称にしておく。行動制約は「行動できない」を設定する。ゲーム上で急に状態異常が追加されると格好悪い(国家の粛清対象リストに載ります)ので、アイコンは設定せず、表示優先度も0にしておく。また、ターン終了時に解除とするが継続ターン数は0~0を設定する。このように設定すると、毎ターン人知れず付与され人知れず解除されるので、都度行動可否の判定がされる。人、それは窺い知れないもの。味方がこの状態のメッセージになった時、敵がこの状態になった時のメッセージは出力対象のため書き込むほうが雰囲気が出る。例えば幽霊に取りつかれてたまに行動できないとか、マザー2にそんなのがあったような気がするし、無かったとしても気にならない。
以下、黒文字で記載しているのがスクリプト。再定義があり競合し兼ねないので、利用は完全自己責任で。何故なら俺には対処できるスキルが無い。DUMMY_STATEには上記ステート設定1のステートIDを指定する。IDと言っても昔ゴシックバンドとしてたまに紹介されてたSPEED-iDは関係無い。本当に関係無い、俺は何も知らない、見逃してほしい。ほんでBIND_STATEでは上記ステート設定2のステートIDを指定する。IDと言っても、またか君は。どうしてそうなんだ、いつもいつもあれだ。本当にあれだから、とにかく勘弁してほしい。 そもそもどうなるのか分かり安くするため動画にした。昔は写真を貼り付けるのが精いっぱいだったGooブログも、もはや動画を載せられるまでに発展した。ここはブログの発展場だろうか。だから一応、動画も載せておく。せっかくツクール起動して実装しても、思ってた挙動と違ったら悲しくて身投げするもんね。十中八九だもんね。
module GCC ; module RANDBIND
##### 疑似的に行動不能ステートとして扱うステートID
DUMMY_STATE = 27
##### 実際に行動不能を設定するステートID
BIND_STATE = 28
# ダミーステートのメモ欄に書く言葉+動けなくなる確率
# 例 50%で動けなくなる場合 → <動けない:50>
WORD = /<動けない:(\d+)>/
end;end
#============================================================================
# ■ RPG::State
#----------------------------------------------------------------------------
# ステートのクラス。
#============================================================================
class RPG::State
#--------------------------------------------------------------------------
# ● 動けない確率を取得
#--------------------------------------------------------------------------
def random_bind_rate?
return @bind_rate if @bind_rate
if @bind_rate.nil?
@bind_rate = {}
@bind_rate = note[GCC::RANDBIND::WORD,1] ? $1.to_i : false
end
return @bind_rate ? @bind_rate : 0
end
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
attr :bind_rate
#--------------------------------------------------------------------------
# ● 実際動けなくする(行動不能のステートをかける)
#--------------------------------------------------------------------------
def random_bind(state)
if state.random_bind_rate? > rand(100)
self.add_state(GCC::RANDBIND::BIND_STATE)
return true
end
return false
end
end
class Scene_Battle
#--------------------------------------------------------------------------
# ● 戦闘行動の処理※再定義
#--------------------------------------------------------------------------
def process_action
return if scene_changing?
if !@subject || !@subject.current_action
@subject = BattleManager.next_subject
end
return turn_end unless @subject
@subject.states.each do | state |
if state.id == GCC::RANDBIND::DUMMY_STATE
@log_window.display_added_states(@subject) if @subject.random_bind(state)
end
end
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
end
※コメント投稿者のブログIDはブログ作成者のみに通知されます