call関数について。
自作関数は上級者向けと思われがちですが、callを使っていないだけで、無意識に同等のものを組んでいる人は多いです。




自作関数

里々で自作関数を使うには内部関数のcallで実現します。
関数と言うと難しそうに聞こえますが、

  • 『現在月を入れると、季節(春夏秋冬)を返す』
  • 『現在時や現在月を入れると、昼か夜かを返す』
  • 『郵便物の重さの数値を入れると、料金を返す』
  • 『地域情報を入れると、その地域の天気予報を返す』

といった具合に、掻い摘んで言えば何かを入れたら、何かが返ってくるものです。
使いこなせば制作・管理・仕様変更の労力の削減に役立つはず。

call関数

そもそもcall関数とは、*文または@単語群に引数を付けて呼ぶ関数です。

呼び出された文または単語群では、(A0)で引数0を、(A1)で引数1を、以下数字通りに参照できます。

(call,文または単語群,引数0,引数1,引数2......)

呼び出す文または単語群がいわゆる自作関数になります。
…と、こう書くとなんだか特別な何かに見えるかも知れませんが、
動作は普段()で呼び出すのと変わりません。
つまり(call,文または単語群)と(文または単語群)は同じものです。
もっと言えば、引数を指定しないcall関数はcall,の文字数分だけ無駄とも言えます。

call関数の使い方の例を以下に記します。

@箱の数
(A0)に(A1)が(A2)個あります。

*例1
(call,箱の数,部屋,箱,16)

*例2
(箱の数)

という風に書いた時、
例1では「部屋に箱が16個あります。」
例2では「にが個あります。」
と表示されます。
call関数を使わずに呼び出すと(A*)は空白となり表示されません。

replace.txtで自作関数っぽく

上記の例をreplace.txtを使って置き換えてcallを省略すると、自作関数らしく記述する事もできます。

(箱の数,【タブ】(call,箱の数,
*
:(箱の数,部屋,箱,16)

vncall関数

渡す文字を「名前」で与えるcall関数です。

例えば、以下の2つは両方とも同じ動作をします。

$v0【タブ】漆黒のユーザ
$v1【タブ】†
(vncall,自作関数,v0,v1)
(call,自作関数,(v0),(v1))

@自作関数
(A1)(A0)(A1)

#結果→†漆黒のユーザ†

大雑把に違いを述べると、vncall関数で渡す文字は、勝手に()が補われます。

(vncall,表示するだけ,3)

@表示するだけ
(A0)

#→(call,表示するだけ,(3))とほぼ同じ
#結果→\s[3]

これにより、変数だけでなく、文や単語群、情報取得変数も使うことが出来ます。

*
#単語群を使った例
(vncall、好き嫌い、好きな野菜、嫌いな野菜)

@好きな野菜
たまねぎ、かぼちゃ
さつまいも、じゃがいも

@嫌いな野菜
たまねぎ、かぼちゃ
にんじん、ピーマン

*好き嫌い
:(A0)は好き。(A1)は嫌い。
:そうか。
#A0など情報取得変数を使った例
>ツッコミ【タブ】(vncall、equal、A0、A1)

*ツッコミ
って、同じやないかい。

また、内部で括弧を補ってくれるという動作により、区切り文字問題を簡単に解消することが出来ます。
区切り文字を使い分けることなく、どれか1つのみに固定して使うことが可能となります。
例えば、上の例にあるequal関数の呼び出しを、以下のようにすると、
区切り文字と同じ文字が渡す文字に入っているためおかしくなります。

>ツッコミ【タブ】(equal、(A0)、(A1))

区切りに使っている「、」が、分割しようとしている文字の中にも含まれているため、区切る位置がおかしくなります。
equal関数に渡す文字は、2つでなければなりません。
(equal、(A0)、(A1))
→(equalたまねぎかぼちゃたまねぎかぼちゃ)

vncallは以下のような関数を呼び出した場合をサポートしておらず、よくわからない結果になることがあるので使わないように気をつけてください。

自作関数の例

季節を返す

引数に月を与えると季節を返します。
例えば、(call,季節,3)と呼び出すと「春」が返ってきます。

@季節
(nswitch,(A0),冬,冬,春,春,春,夏,夏,夏,秋,秋,秋,冬)

*
:3月の季節って(call,季節,3)?
:まだまだ寒いで。つーか今(call,季節,(現在月))やん。

月齢を返す

月齢を計算するより。年・月・日を入れるとその日の月齢に置き換わります。

@月齢
(calc,
((((A0)-11)%19)*11 +(nswitch,(A1),0,2,0,2,2,4,5,6,7,8,9,10)+ (A2))%30
)

*
:2016年1月1日の月齢は(call,月齢,2016,1,1)だよ。
:ちなみに今日の月齢は(call,月齢,(現在年),(現在月),(現在日))やね。

指定した音声を鳴らす

サウンド再生タグを楽に書く。
(※「sound」フォルダにbird.wavやbell.wavが入っている状態での例)

*
:(call、音、鳥)鳥のなきごえです。\w9\w9\w9
:(call、音、ベル)ベルの音です。

@音
(whenlist、(A0)==
	、鳥、\_v[sound/bird.wav]
	、ベル、\_v[sound/bell.wav]
)

このようにして鳴らすファイルを「@音」をcallで呼び出すようにして、鳥のなきごえを鳴らしたい場合は必ず(call、音、鳥)と記述します。
鳴らすファイルを変えたりしたい場合に、「@音」の中のファイル名だけを指定し直せば、鳥のなきごえが複数箇所で使われていても、まとめて修正されます。
とりあえず音を鳴らす処理は全部「@音」の中にある!と分かるようにしておくことで、機能の改造やバグの対応が楽になります。

計算する

2つの数字を足し算したり掛け算したり

*
:5と4で計算

(call,計算,5,4)

*
:8と16で計算

(call,計算,8,16)

*
:10と22で計算

(call,計算,10,22)

*計算
:(A0)と(A1)を足すと「(calc,(A0)+(A1))」になるよ。
(A0)と(A1)を掛け算すると「(calc,(A0)*(A1))」になるよ。

好感度などの管理をさせる

好感度を変更し、なおかつ上限値と下限値の範囲に収まるようにします。

*0Headなでられ
:ありがとう。
(call、好感度変更、1)

*0Bustなでられ
:変態!
(call、好感度変更、−2)

@好感度変更
(whenlist、(好感度)+(A0)
	、>1000、(set,好感度,1000)
	、<0、(set,好感度,0)
	、(set,好感度,(好感度)+(A0))
)

上限値1000、下限値0になるようにし、それ以外なら好感度に渡された数を足しています。
マイナスの数が渡されれば好感度が減ります。
加算や減算のたびに上限値をチェックするのは無駄なので、call関数で1箇所で行っています。
上限値や下限値を変えたい場合、「@好感度変更」の中の数字だけいじれば良いので修正も楽です。
機能の改造をしたいときも、「@好感度変更」だけ見れば良いので、どこを触れば良いかが分かりやすくなります。

#好感度200以下なら増加のみ2倍になるように機能を追加した
@好感度変更
(whenlist、(好感度)+(A0)
	、>1000、(set,好感度,1000)
	、<0、(set,好感度,0)
	、<200&&(A0)>0、(set,好感度,(好感度)+(A0)*2)
	、(set,好感度,(好感度)+(A0))
)

上記のサンプルの記述だと、(call、好感度変更、1)で1行を占めているので、改行が発生してしまいます。
そこで、今までと同様に変数の代入の形にし、改行を発生させないようにする方法が以下です。

*0Headなでられ
$ダミー【タブ】(call、好感度変更、1)
:ありがとう。

この$ダミーは使うことはありませんが、このような記述にすることで、全ての好感度増減の部分を一括で置換することが出来ます。
「$好感度=(好感度)+1」を「$ダミー【タブ】(call、好感度変更、1)」とすれば、機械的に一括置換できます。

記述の整理

自作関数は、複雑な記述を整理する際にも有用です。

関数を組み合わせて記述をすっきりさせる

*
:2d6するよ。(call,さいころをふる,2)
(さいころの目1)と(さいころの目2)か……。

*
:3d6してみようかな。(call,さいころをふる,3)
(さいころの目1)、(さいころの目2)、(さいころの目3)。

@さいころをふる
(nop,
	(set,さいころの目1,(乱数1〜6))
	(when,(A0)>1
		,(set,さいころの目2,(乱数1〜6))
		,(set,さいころの目2,)
	)
	(when,(A0)>2
		,(set,さいころの目3,(乱数1〜6))
		,(set,さいころの目3,)
	)
)

自作関数でさいころをふる処理を作り、ふる個数を指定できるようにしています。
when関数を使わずに処理を作ると、ジャンプを多用した処理を作る必要があります。

#上記と同じ結果になる処理
*
:2d6するよ。
$さいころをふる数=2
$さいころをふった後のジャンプ先=さいころ2個ふったトーク
>さいころをふる

*
:3d6してみようかな。
$さいころをふる数=3
$さいころをふった後のジャンプ先=さいころ3個ふったトーク
>さいころをふる

*さいころをふる
$さいころの目1=(乱数1〜6)
$さいころの目2=
$さいころの目3=
>さいころをふる2個目【タブ】(さいころをふる数)>1
>(さいころをふった後のジャンプ先)

*さいころをふる2個目
$さいころの目2=(乱数1〜6)
>さいころをふる3個目【タブ】(さいころをふる数)>2
>(さいころをふった後のジャンプ先)

*さいころをふる3個目
$さいころの目3=(乱数1〜6)
>(さいころをふった後のジャンプ先)

*さいころ2個ふったトーク
:(さいころの目1)と(さいころの目2)か……。

*さいころ3個ふったトーク
:(さいころの目1)、(さいころの目2)、(さいころの目3)。

単語一覧メニューの項目を書く時すっきりさせる

*
:いぬだいすき!
<単語一覧に「いぬ」項目が追加されました>
$単語_いぬ【タブ】1

*単語一覧
:単語一覧です。

(call,単語項目,いぬ)φ
(call,単語項目,ねこ)φ
(call,単語項目,とり)φ
(call,単語項目,くま)φ
(call,単語項目,うさぎ)φ

@単語項目
(when、(変数「単語_(A0)」の存在)、☆ \q[(A0),単語一覧の意味]\n)

*単語一覧の意味
((選択ラベル)の説明)

_単語一覧

*いぬの説明
:ワンワン吼える動物。

*ねこの説明
:にゃーにゃー鳴く動物。

*とりの説明
・・・(以下略)

(call,単語項目,いぬ)の場合、「$単語_いぬ」に値が設定されていれば、選択肢が表示されます。
選択肢自体も「いぬ」という文字から自動的に作っているため、項目を追加していく時に楽が出来ます。
(選択ラベル)には直前に選んだ選択肢が入ります。
以下のように展開されていきます。

((選択ラベル)の説明)
↓
(いぬの説明)
↓
:ワンワン吼える動物。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-10-30 (月) 18:25:56 (44d)