対象
対象読者は、TyranoScript初学者です。
V5で動作確認しました。
経緯
探して見つからなかったので、テクニックサンプルを参考に作りました。
マクロで実現しています。
即席なので改善の余地があると思います。
マクロ定義
macro
;rand word
;一時変数tf.randwordに結果が格納されます
;var属性に変数名を指定すると、そこにも結果を格納できます。var属性は省略可能です
;使用例:今日は[randword a="'赤','緑','青'" var="f.tobira"]の扉を選ぶぜ。選んだ扉は[emb exp="f.tobira"]だ
[macro name="randword"]
[iscript]
var max = eval("tf.a = [" + mp.a + "]; tf.a.length - 1")
var min = 0
max = Number(max)
min = Number(min)
var rand = min + Math.floor(Math.random() * (max - min + 1))
tf.randword = tf.a[rand]
if (mp['var']) eval(mp['var'] + ' = "' + tf.randword + '"')
[endscript]
[emb exp="tf.randword"]
[endmacro]
使用例
上記マクロ定義をfirst.ks
等で実行し、
sample
今日は[randword a="'赤','緑','青'" var="f.tobira"]の扉を選ぶぜ[r]
;一時変数tf.randwordに結果が格納されます
何?[emb exp="tf.randword"]の扉を選ぶだって?[r]
; var属性に変数名を指定すると、結果を格納できます。var属性は省略可能です
選んだ扉は[emb exp="f.tobira"]だ[r]
を実行します。
補足
長い文章をランダムで選ぶ場合、複数行に書いたほうが読みやすいことがあります。
複数行に書きたい場合、変数を経由する手があります。
sample2
[eval exp="tf.a0='燃え盛る太陽のような、何よりも熱く眩しく輝く赤'"]
[eval exp="tf.a1='生い茂った森林のような、どこまでも深く豊かな緑'"]
[eval exp="tf.a2='果てしない大空のような、雄大に澄み切った青'"]
今日は[randword a="tf.a0,tf.a1,tf.a2" var="f.tobira"]の扉を選ぶぜ。選んだ扉は[emb exp="f.tobira"]だ
備忘
まず以下を作成しました。のち、それをマクロ化し、機能の追加を行いました。
getrandname_sample
;公式テクニックサンプル2の getrandname を使い、
;複数単語からランダムに1つ選んで表示する
;公式テクニックサンプル2 https://tyrano.jp/sample/sample2
[getrandname name="tf.a[{R}]" min="0" max="& tf.a = ['赤','緑','青'];tf.a.length - 1"]
今日は[emb exp="& tf.randname"]の扉を選ぶぜ