ランダム性を持たせる
この記事は、「基本編」の内容を前提に記述しています。
先に、「基本編」を読んでください。
基本編では、ステータスを増減させたり、利用したりして、ゲームの基本的な要素を作ってきました。
ここでは、それらに、ランダム性を持たせてみます。
準備:乱数を取得できるようにする
ティラノスクリプトは、(v521c時点では、)標準で乱数の取得ができません。
可能にするために、「first.ks」に、以下のプログラムを貼り付けてください。場所は、一番下でなければ、どこでもよいはずです。
; ----------------------------------------------------------
; 乱数マクロ
; ----------------------------------------------------------
; [getrand var="XXX" min="XXX" max="XXX"]
; 一時変数 tf.rand に min 以上 max 以下の乱数(整数)をセットするマクロです。
; var には変数の名前を指定できます(var="f.a"のように)。
; 指定すると、tf.rand の内容をその変数にコピーします。
[macro name="getrand"]
[iscript]
var max = mp.max || '10'
var min = mp.min || '1'
max = Number(max)
min = Number(min)
tf.rand = min + Math.floor(Math.random() * (max - min + 1))
if (mp['var']) eval(mp['var'] + ' = ' + tf.rand)
[endscript]
[endmacro]
; [getrandname var="XXX" name="XXX" min="XXX" max="XXX"]
; 文字列 name の{R}部分を「min 以上 max 以下のランダムな整数」で置き換えた文字列を生成し、
; 一時変数 tf.randname にセットします。
; var には変数の名前を指定できます(var="f.a"のように)。
; 指定すると、tf.randname の内容をその変数にコピーします。
[macro name="getrandname"]
[iscript]
var name = mp.name || '*Label{R}'
var max = mp.max || '10'
var min = mp.min || '1'
max = Number(max)
min = Number(min)
var rand = min + Math.floor(Math.random() * (max - min + 1))
tf.randname = name.replace('{R}', rand)
if (mp['var']) eval(mp['var'] + ' = "' + tf.randname + '"')
[endscript]
[endmacro]
ちなみにこれは、公式のテクニックサンプル集からコピペしたものです。
乱数の使い方・取得方法
以下ようなのコードを使います。
[getrand var="f.○○" min="1" max="10"]
これは、「変数『f.○○』の数値を、1から10までのどれかにする」というものです。
もちろん、変数の名前や、最小値(min)・最大値(max)は、お好きなようにしてください。
ランダムな要素を追加したい場合は、上のコードを最初に書き、そこで設定した関数を利用していくことが基本になります。
公式の機能デモがわかりやすいので、詳しくは、それを見てください。
ステータスをランダムに変化させる
ここからは、育成コマンドを作るで挙げた例を応用して、ランダム性を持たせてみます。
ランダムな数値を増減させる
*筋トレ
[getrand var="f.増加値" min="1" max="5"]
[eval exp="f.パワー = f.パワー + f.増加値" ]
パワーが
[emb exp="f.増加値"]
上がった[l][cm]
[jump target="*育成画面" ]
これは、「『筋トレ』すると、『パワー』が『1~5』上がる」というもの。
ついでに、増加した数字が、文字でもわかるようにしました。
確率で増減する数値を変える
上では単純すぎるという方は、こんなシステムにしてみてはどうでしょう。
*筋トレ
[getrand var="f.確率" min="1" max="10"]
[if exp="f.確率 <= 7" ]
[eval exp="f.増加値 = 1" ]
[else]
[eval exp="f.増加値 = 5" ]
[endif]
[eval exp="f.パワー = f.パワー + f.増加値" ]
[if exp="f.増加値 == 1" ]
いつも通りの練習だった。[l][cm]
[else ]
今日は調子が良かった![l][cm]
[endif]
パワーが
[emb exp="f.増加値"]
上がった[l][cm]
[jump target="*育成画面" ]
これまでの解説と、簡単な数学の知識でわかるとは思いますが、「7割の確率でパワーが1上がり、残りの3割で5上がる」というものです。
前のコマンドでは、「1~5」でしたが、こうすることで「1か5」にすることができます。
ついでに、増加した数値ごとに、表示するメッセージも変えてみました。
乱数の最大値を増やしたり、「IF」部分を工夫したりすれば、より詳細な条件にすることができます。
勝敗・成功不成功をランダムに決定する
今度は、勝負・チャレンジ要素を作るで使った例に、ランダム性を持たせてみます。
基準値をランダムにする
*勝負
[getrand var="f.基準値" min="40" max="60"]
[if exp="f.パワー >= f.基準値"]
勝負に勝った![l][cm]
[else]
勝負に負けた…[l][cm]
[endif]
[jump target="*育成画面" ]
「40~60までを基準値とし、パワーが基準値より高ければ勝ち」というものです。
確率で基準値を変える
*勝負
[getrand var="f.確率" min="1" max="10"]
[if exp="f.確率 <= 5" ]
[eval exp="f.基準値 = 30" ]
[eval exp="f.対戦相手 = '雑魚' " ]
[elsif exp="f.確率 <= 8" ]
[eval exp="f.基準値 = 60" ]
[eval exp="f.対戦相手 = '幹部' " ]
[else]
[eval exp="f.基準値 = 100" ]
[eval exp="f.対戦相手 = 'ボス' " ]
[endif]
[emb exp="f.対戦相手"]
と勝負![l][cm]
[if exp="f.パワー >= f.基準値"]
勝負に勝った![l][cm]
[else]
勝負に負けた…[l][cm]
[endif]
[jump target="*育成画面" ]
一定確率ごとに、「基準値」と、「対戦相手」の名前を決定し、それをもとに、勝敗の判定や、メッセージの表示を行っています。
もしくは、こんな感じでもできます。↓
*勝負
[getrand var="f.確率" min="1" max="10"]
[if exp="f.確率 <= 5" ]
[jump target="*雑魚" ]
[elsif exp="f.確率 <= 8" ]
[jump target="*幹部" ]
[else]
[jump target="*ボス" ]
[endif]
[jump target="*育成画面" ]
一定確率ごとに、ラベルに飛ぶようにしています。そのラベルごとに、「勝負」の内容を変えます。
こっちの方が、色々と自由に指定できるかも。
自分のステータスをランダムにする(補正値)
ここまでは、相手の数値(基準値)をランダムにしていましたが、今度は、自分のステータスにランダム性を持たせます。
*勝負
[getrand var="f.補正値" min="0" max="5"]
[eval exp="f.実質パワー = f.パワー + f.補正値" ]
[if exp="f.実質パワー >= 50"]
勝負に勝った![l][cm]
[else]
勝負に負けた…[l][cm]
[endif]
[jump target="*育成画面" ]
「補正値」システムを、乱数を利用して実装してみました。
「0~5」の数値を「補正値」という変数に渡し、それと「パワー」の合計を「実質パワー」とし、それを使って、勝敗を判定します。
以上のアイデアを応用したり、組み合わせたりすれば、そこそこ本格的なゲームのシステムを作れるのではないでしょうか。いろいろ試してみてください。