GOREとにゃんこの桃源郷

主観的にCDのレビューやら、日記やら、色々と。
ゴアとかメタルとかロックとか

2013.07.29 - 「ああああ」Lv99

2013-07-29 | RPGツクールMZ,VXace,VX,2000,95,1~5
 そしてまた、RPGツクールVXaceは動き続ける。ツクラーのコミュニティサイト、FSMの素材アップ掲示板にて、白雪レイカ様の【VxAce】カレンダーシステムがダウンロード可能だ。早速、導入し、試行を開始。前回紹介した暦システムとの一番大きな違いは、一ヶ月の流れが30日固定ではないこと。閏年こそ未実装だが、1月は31日まで、2月は28日まで、と現実に近い仕様が魅力的だ。天候をランダムに遷移してくれるのも気に入ったため、こちらをメインに使うことに決めた。とは言え、暦システムにも当然、魅力的な機能が多数搭載されている。そこで、勝手に統合することにした。全てでは無いが、現在製作中のゲームに於いて、欲しい機能だけ移植を行い、ほぼ理想通りの仕上がりとなった。

 暦システムからカレンダーシステムに移したのは、イベント実行中の時間経過禁止、バトル中の時間経過禁止、バトル終了時に時間経過、時間の自動経過間隔の4つ程度。スクリプト全容は載せられないが、記述したところだけ抜粋する。少しスクリプトが読めるのであれば、何処にどう書き加えているか想像に容易いだろう。
return if WhiteSnow::STOP_ON_EVENT && $calender.check_event_running?
return if WhiteSnow::STOP_ON_BATTLE && $game_party.in_battle

こちらが、イベント中と戦闘中に時間の自動経過を禁止するための追記。「check_event_running?」は、そのまま流用している。

if $calender.count % WhiteSnow::AUTO_TIME_PASS_DURATION == 0
$calender.min += 1

これは指定したフレーム数が経過すると、時間が1分進むという処理だ。今のところ、15フレームで1分、という速度が気に入っている。

TURN_END_TIME_PASS = 5
$calender.shift_min

今度は別々のところの表記なのだが、実はこれが今回のメインだ。カレンダーシステムを読んだ人は、日付の経過命令が実装されているが、時間(hour)及び分数「min」の経過命令が無いことに気付く。しかし宿屋のイベントで、時間単位の経過が必要になるため、自分で拵えるほかなかった。宿屋イベントは夜の宿泊であれば、日付経過だけで問題無いと思うが、深夜や朝方に宿泊する場合、昼になれば出発するのが正しい冒険者としての心得だ。もしくは、休憩と宿泊の選択制にしてもいい。

 さて、経過命令に関しては、日付経過の応用で簡単に作ることが可能だ。まずメインのclass Calender内に、次のスクリプトを追加する。
#--------------------------------------------------------------------------
# ●時間を進める
#--------------------------------------------------------------------------
def shift_hour(num)
num.times {@hour += 1}
if @hour >= 24
@hour = @hour - 24
shift_date
@min = 0
end
$game_variables[WhiteSnow::MIN_STORE_VID] = @min
end
#--------------------------------------------------------------------------
# ● 数分だけ進める
#--------------------------------------------------------------------------
def shift_min
@min += WhiteSnow::TURN_END_TIME_PASS
if @min >= 60
@min = @min - 60
shift_hour(1)
end
end

分単位の経過は、スクリプト内でしか使わないため、引数を設定していない。時間単位の経過については、イベント内でも利用するため、引数を設定した。インタープリターにこの命令を実行する処理を作っておけば、イベントで使う際に便利だ。次のスクリプトを、class Game_Interpreter内に追加する。
#--------------------------------------------------------------------------
# ● 時間を進める
#--------------------------------------------------------------------------
def shift_hour(num)
$calender.shift_hour(num)
$calender.change_weather
end

日付を進める「def shift_date(num)」のように、進める時間分、shift_hourを繰り返す必要は無い。何故なら、1日の時間は月日を問わず24時間と決まっているため。とにかくこれで、イベントコマンドのスクリプトに「shift_hour(num)」と記述すれば、指定した時間が経過する。括弧内のnumに、経過させたい時間を入れて使う。一応注意点として、24時間以上経過させたい場合は、先に日付を進めるためのshift_date(num)を実行すること。たとえば、56時間という半端な時間経過を行う時は、
shift_date(2)
shift_hour(8)

の順に書くことになる。また、数分だけ経過させる処理に関しては、戦闘中のターン経過時と、戦闘終了時にそれぞれ指定の値だけ、時間を進めるために作ったのだが、別に使いどころは限定的ではない。各種スクリプトの任意の箇所に、
$calender.shift_min
と記載するだけで、TURN_END_TIME_PASSで設定した値だけ、分単位で時間が進む。一応、class Scene_Battle内がおすすめ。

 ところで、先日言っていた、誕生日イベントやバレンタンデーイベントが完成した。試してみたところ問題無さそうなので、作り方を説明する。まずコモンイベントに「■日時イベント常時監視」とでも名付けてイベントを作る。並列処理で動かすため、起動スイッチに関してはカレンダーシステムを動作させる時(屋内フラグなどで時間を停止させない時)にオンにするよう設定しよう。そして実行内容は、
◆ウエイト:15フレーム
◆条件分岐スイッチ:プレゼント終了がON
◆スクリプト:if $game_variables[92] != $game_variables[98]
$game_switches[プレゼント終了のスイッチ番号] = false
end
それ以外の場合
◆スクリプト:$game_switches[21] = false
$game_switches[22] = false
$game_switches[23] = false
$game_switches[24] = false
$game_switches[34] = false
$game_switches[35] = false
$game_switches[36] = false
$game_switches[37] = false

s = $game_party.alive_members.size
$game_variables[10] = s
◆条件分岐:$game_variables[10](変数10番)== 8
actor = $game_party.alive_members[0]
actor.nickname.scan(/<誕生日s?(d+),(d+)>/)
if $game_variables[92] == $2.to_i
if $game_variables[91] == $1.to_i
$game_switches[21] = true;end;end

actor = $game_party.alive_members[1]
actor.nickname.scan(/<誕生日s?(d+),(d+)>/)
if $game_variables[92] == $2.to_i
if $game_variables[91] == $1.to_i
$game_switches[22] = true;end;end
# 変数10番に入るのはパーティ人数なので、7の場合、6の場合など、パーティ人数分、これを作成する。
◆条件分岐:PT1プレゼントがON
◆文章:Happy Birthday!
◆スイッチ:プレゼント終了をON
◆変数[誕生日終了した日]に変数[現在の日付]を代入

まずこれが、誕生日イベントの全貌だ。スイッチや変数の番号は、あくまで個人的に使っている番号をそのまま書いているため、適宜好きに数字を変えるべき。一度誕生日が終わると、日付が変わるまで誕生日イベントを起こさないように、スイッチ管理をする。日付が変わっていたのなら、誕生日イベント終了のスイッチは解除する。スイッチ[22]などはパーティ人数分用意する。そして人数ごとの分岐を作る。生存しているメンバーの誕生日をスキャンし、どちらも合っている時は、さきほど0を代入したスイッチ[22]をONにする。パーティが8人ならば、このスクリプトを8個、連番で用意する。7人の場合は7人分となる。

 最後、バレンタインデーイベントは、パーティに女性アクターと男性アクターがそれぞれ1人以上居て、なおかつ生存している状態の時に、チョコが貰える抽選が始まる。女性キャラ、男性キャラが各1人だけの場合、貰えるチョコは最低0個、最大1個。各2人の場合は、最低0個、最大4個となる。ちなみに性別設定については、RGSS研究所様の「性別設定」にて行っている。
◆条件分岐:スクリプト:$game_variables[92] == 2 && $game_variables[91] == 14 && !$game_switches[27]
◆スクリプト:s = $game_party.alive_members.size
$game_variables[10] = s

$game_variables[11] = 0
$game_variables[12] = 0
◆条件分岐:人数を格納した変数が4の時
◆スクリプト:a = $game_party.alive_members
$game_variables[11] += 1 if a[0].sex == "女"
$game_variables[11] += 1 if a[1].sex == "女"
$game_variables[11] += 1 if a[2].sex == "女"
$game_variables[11] += 1 if a[3].sex == "女"

$game_variables[12] += 1 if a[0].sex == "男"
$game_variables[12] += 1 if a[1].sex == "男"
$game_variables[12] += 1 if a[2].sex == "男"
$game_variables[12] += 1 if a[3].sex == "男"
◆条件分岐:スクリプト:$game_variables[11] >= 1 && $game_variables[12] >= 1
◆スクリプト:$game_variables[12] *= rand($game_variables[11])
◆条件分岐:変数チョコ判定が4以上の時
◆スクリプト:a=[320,320,320,320,320,320,320,320,320,320,320,320,
320,320,320,320,320,320,320,320,320,320,320,321]
item = $data_items[a[rand(a.size)]]
$game_party.gain_item(item,1)
◆条件分岐:変数チョコ判定が3以上の時
# 上のアイテムランダム入手と同じ。
◆フキダシアイコンの表示:プレイヤー,ハート
◆スイッチ:バレンタイン終了をON
◆(一行目の条件分岐に対して)それ以外の場合
◆条件分岐:スクリプト:$game_variables[91] != 14 or $game_variables[92] != 2
◆スイッチ:バレンタイン終了をOFF

これも同じように、パーティ人数に応じてそれぞれ作成する。チョコを貰う個数の判定は、○○以上の条件分岐にしておけば、義理チョコ1個と本命チョコ1個、などのように別々のチョコになる可能性を出せる。もっと凝るとすれば、この抽選で本命が出た場合は、本命スイッチをONにし、本命スイッチがONの時は、抽選が義理チョコで固定されるようにしてもいい。まぁ、全員に本命チョコを配る悪女的なキャラも、時には必要だろうが。

 こんな感じで、あとは正月イベントとクリスマスイベントを作らねばならない。


最新の画像もっと見る

コメントを投稿