NONAM

CONTACT

ランダムで起こるイベント(重複なし)をティラノビルダーで実装する

自分用に作ったやつです。ティラノビルダーの各機能はざっくりわかっている方向け。

考え方

ミニイベント用のシナリオをイベントの数だけ用意しておく。(ex. mini01、mini02、mini03…)

分岐ジャッジ用シナリオファイルを作成し、
特定のラベルへ飛ぶ(ここでランダムなラベルへ飛ぶ処理)

分岐ボタン(表示用。不要なら飛ばしていい)

ミニイベシナリオをコール(&リターン)

本筋シナリオに戻るためコールリターン

大筋は上記のような考え方です。

このほか、イベントがすべて出尽くした場合の処理などを加えて完成。

とりあえずコード

judge_miniEvent(.ks)というシナリオファイルで分岐の処理をします。
例ではイベント数が11のときで作成していますが、それ以上に膨大なイベント数のときは工夫が必要かもしれません…

特に、分岐ボタン~ミニイベントのコール・リターンをイベント数分作成しなければいけなかったのでこのあたりは改善の余地があるかと思います。

; イベントの数が11のときのみ(=最初のみ
[if exp="f.miniEventArray == 11"]
[iscript]
f.miniEvents = ["mini01","mini02","mini03","mini04","mini05","mini06","mini07","mini08","mini09","mini10","mini11"];
[endscript]
[else]
[endif]

[iscript]
;ミニイベントの配列の数
f.eveLength = f.miniEvents.length;
;何番目かをランダムにだす
f.rdmNum = Math.floor(Math.random() * f.eveLength );
;ランダム番目の配列の要素をラベル名用変数に格納
f.useNum = "*" + f.miniEvents[f.rdmNum];
[endscript]

;配列数が0ではないとき
[if exp="f.eveLength != 0"]
[jump target=&f.useNum]
[else]
;配列数が0のとき
[jump target="*no_miniEvent"]
[endif]

; 停止
; ラベル mini(n)
; 分岐ボタンイベントnのときのボタン
; 停止
; コール mini(n).ks
; ジャンプ *end_mini

; *end_mini
[iscript]
//配列から除く処理
f.miniEventsResult = f.miniEvents.filter(function(miniEvent){
return miniEvent !== f.miniEvents[f.rdmNum];
});
f.miniEvents = f.miniEventsResult;
f.miniEventArray = f.miniEventArray - 1;
[endscript]

; コールリターン
; ラベル *no_miniEvent
; 分岐ボタンすべて消化したときのボタン
; 停止
; すべてイベント消化していた場合の処理
; コールリターン

詳細解説(あんまり詳細じゃないかも…)

ランダムなラベルへジャンプする処理

1つ目のティラノスクリプト→

変数miniEventArrayは事前に初期値設定しておきます。メニューのプロジェクト>変数管理から設定できます。
今回は初期値11になっており、miniEventArrayの値が初期値のときのみminiEventsの値を設定します。miniEventArrayの値は1つのミニイベント通過後に-1するため、11なのは最初だけ(=miniEventsの右辺を設定するのは最初だけ)という想定です。

2つ目のティラノスクリプト→

miniEventsという配列の要素の数(今回で言えばmini01~mini11ってぜんぶで何個?)が知りたいので、miniEvents.lengthで要素の個数を数え、eveLengthに格納します。.lengthというのはなんか左側にある変数(配列)の要素の個数を数えてくれる便利な機能だと思っておいてください。

たとえば abc = [“a”,”b”,”c”,”d”,”e”]という配列がある場合、abc.length は5となります。

eveLengthはランダムな値を出すために使用します。(参考:https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Math/random
この値はminiEventsの「何番目の要素を取り出すか」を判定するために使用します。

useNumという変数で飛びたいラベル名を設定します。f.miniEvents[f.rdmNum]は「miniEvents(という配列)のrdmNum番目の要素」を指します。rdmNumが5のとき、miniEventsの5番目の要素”mini06″がラベル名になります(なんでmini05じゃないの?→0番目から数えるからです。0番目の要素が”mini01″となります。とりあえずそういうものだと思ってください)

3つ目のティラノスクリプト→

miniEventsの要素の個数が0でないとき(なにかのminiXX要素が残っているとき)は、↑で設定したラベルへジャンプします。

要素の個数が0のときはno_miniEventラベルに飛び、要素がない場合の処理を行います。
もうイベントないよ~というテキスト表示や本筋へ戻るためのコールリターン処理など…。

ミニイベント通過後miniEvents配列から通過済み要素を除く処理

ミニイベントからコールリターンで戻ってきたあと…
f.miniEventResultの右辺で、.filterを使用して今回使用したX番目の要素でない要素を残します。(参考:https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

miniEventsの中身にminiEventResultの中身を代入します。[“mini01″,”mini02″,”mini03”,…]で、mini02のイベントを通過した場合[“mini01″,”mini03”,…]となります。

f.miniEventArrayの数値を-1します。これをしないといちばん最初のminiEvents設定をまた通過してしまい、.filterで使用済み要素を除いたのが無駄になってしまいます。(miniEvents.lengthなどで要素の数を判定してもいいのかもしれません…分かりやすいので手動で-1しました)

まとめ

処理の流れも含めもっと効率化できた気がしますが、2~20くらいのミニイベントであればギリ対応できるのではないかと思います。

さらにたくさんのイベントをランダムで起こしたいよ~!もっと複雑な条件つけてやりたいよ~!という方は、(おそらくすでにそうしておられるように…)魔改造したり他の方の記事なども参考にしながら調整いただければとおもいます!

使える状況は限られますが、改造すれば色々できるかと思いますのでよしなに…

コメントを書く