幻日幻月環

作成した伺かの更新情報などをつぶやくところ

里々で複雑なロジックを書く場合の注意点

2016/01/04追記:
一部表記を修正、最後にメリット・デメリットを追加

----
里々のちょっとしたロジックを提供するコーナー。
全て、里々wikiukadocの情報の組み合わせで作ります。
里々でミニゲームを作れるくらいの知識が必要です。

里々は、(「*」から始まるもの。例:*起動)を実行したとき、「\1\s[10]\0\s[0]」を補完します。
(*を既に実行済みで、さらに別の*を実行したときは、「\1」のみを補完します)
これにより、\Cなどスクリプトの先頭にないと動かないものが使えません。
これを回避するために、$スクリプトの一番頭があるのですが、スクリプトのどこで書いても先頭に入るため、見通しの悪いコードになってしまいがちです。
さらに、余分なさくらスクリプトが大量に入ってしまうので、ログを見て原因箇所を特定するのが難しくなってしまいます。
トーク以外のこともしたい方に向けて、メンテナンス性を考えた記述について記したいと思います。
里々の利点は、「さくらスクリプトを見なくてすむ」という点につきます。
メタプログラミングとか、高級言語とか、言い方は色々ありますがひとまず置いておきます。
この自動的に処理を補ってくれる部分が初心者向けと言われる所以です。
ただ、それゆえに少し凝ったことをしようとすると、この仕様が邪魔をしてしまいます。
ミニゲームなどを考える場合は、以下の1点だけ覚えておいてください。

を使わない。を使う。

ただし、里々独自の処理($○○タイマで呼び出される「*○○」や、「☆☆」のジャンプ先「*☆☆」など)は*でなければなりません。
@は単語群で、サンプルなどで使い方を知っている方も多いと思います。
実際は、文字をそのまま出力する上、通常のトークにも出来るので非常に便利です。
例えば、毎秒ごとに、秒数を\Cで追加表示するという処理は*と@で以下のように書けます。
OnSecondChangeは毎秒呼び出されるSHIORIイベント)

*OnSecondChange
(set,スクリプトの一番頭,\C)
:(現在秒)秒
#出力スクリプト→\C\0\s[0]\1\s[10]\059秒\e

@OnSecondChange
\C\0(現在秒)秒\e
#出力スクリプト→\C\059秒\e

さくらスクリプトさえ書けるのであれば、@で書いた方が楽だし、出力にも無駄なものが入りません。
@は候補を1つにしてしまえば、ほぼ関数代わりに出来ます。
改行は行末にφを書くことで無効化出来るため、長い処理でも見やすく書くことが可能です。
下記のように再帰関数なども作れます。

@トーク
\0逆ポーランド記法の計算をするよ。\nφ
13+542/-* = (set,スタック,)(call,逆ポーランド記法,13+542/-*,0)\e
#出力スクリプト→\0逆ポーランド記法の計算をするよ。\n13+542/-* = 12\e

@逆ポーランド記法
(set,ワーク,(substr,(A0),(A1),1))φ
(when,(変数「ワーク」の存在),
(when,(is_digit,(ワーク)),
(call,プッシュ,(ワーク)),
(set,右,(ポップ))
(set,左,(ポップ))
(call,プッシュ,(calc,(左)(ワーク)(右)))

(call,逆ポーランド記法,(A0),(calc,(A1) + 1)),
(nop,(split,(スタック),○,0,0))(S0)


@プッシュ
(when,(変数「スタック」の存在),
(set,スタック,(スタック)○(A0)),
(set,スタック,(A0))


@ポップ
(nop,(split,(スタック),○,0,0))φ
(set,スタック,
(when,(Sの数) > 1,
(for,0,(calc,(Sの数) - 2),(S(C0))○),
#変数クリア

)φ
(S(calc,(Sの数) - 1))

選択肢raiseembedget,propertyなどで発生させたイベントも@で受けることが出来ます。
ただし、選択肢の場合はIDをOnで始まるものにしてください。
それ以外だと、里々が処理を行い、IDにラベルと通し番号がバイト値1区切りで付与されたものとなります。

@テスト
\0\q[選択肢1,てすとID]\q[選択肢2,OnてすとID]\e
#出力スクリプト→\0\q[選択肢1,てすとID(バイト値1)選択肢1(バイト値1)1]\q[選択肢2,OnてすとID]\e
@てすとID
\0これは呼び出されない\e
@OnてすとID
\0こっちは呼び出される\e
#*てすとID
#:こう書くと呼び出される

OnChoiceSelectでIDを判別する方法もありますが、OnIDで直接イベントを呼び出した方が楽です。
ゲームなどを作る場合は、バルーンを消さずに追加することが多いと思います。
その場合、@を使うと予期せぬバグを減らすことが出来ると思います。


まとめ
@で書くメリット
余計なさくらスクリプトが入らず、バグの原因特定などが用意
処理などを作る際は@の方が有用

@で書くデメリット
里々の機能である、>$_などが使えない
「>ジャンプ先」は(ジャンプ先)、「$変数名【タブ】値」は(set,変数名,値)、「_表示【タブ】ジャンプ先」は\q[表示,Onジャンプ先]を使用
行末にφをつける必要があり、改行のたびに\nを書く必要がある
トークを書く際は*の方が有用
PageTop

コメント


管理者にだけ表示を許可する