Emueraバリアント用サンプルコード集
以下にEmueraバリアント向けのサンプルコードを適当に記述してみる。
eramaker用およびeramaker2用およびなでしこ用には使えないので注意せよ。また、以下のコードをコピペする場合には、表示の都合で横タブは必ずコピペ先で入れ直してほしい。(^をそのまま入力したりしたら誤動作する)
eramaker用およびeramaker2用およびなでしこ用には使えないので注意せよ。また、以下のコードをコピペする場合には、表示の都合で横タブは必ずコピペ先で入れ直してほしい。(^をそのまま入力したりしたら誤動作する)
ランダムによる分岐と文章表示
口上や地の文などによく使われるもので、均等ランダムでいずれかの文章(ブロック)を表示させるというもの。
IF分岐によるもの
速度的にはおそらく一番遅いもののeramaker時代から使用できることもあり、一番分かりやすいかもしれない。
IF RAND:4 = 0 ^ PRINTFORML %CALLNAME:MASTER%、こういうのって楽しいよね! ELSEIF RAND:3 = 0 ^ PRINTFORML %CALLNAME:MASTER%のおかげなんだよね? ^ PRINTL とっても楽しいよっ! ELSEIF RAND:2 = 0 ^ PRINTL なんだか、凄く楽しいんだよ! ELSE ^ PRINTL うわい! 楽しいなあ! ENDIF
SELECTCASE分岐によるもの
単純な数値(や文字列)による分岐ならばSELECTCASEの方がコードはすっきりできる。
SELECTCASE RAND:4 ^ CASE 0 ^ ^ PRINTFORML %CALLNAME:MASTER%、こういうのって楽しいよね! ^ CASE 1 ^ ^ PRINTFORML %CALLNAME:MASTER%のおかげなんだよね? ^ ^ PRINTL とっても楽しいよっ! ^ CASE 2 ^ ^ PRINTL なんだか、凄く楽しいんだよ! ^ CASEELSE ^ ^ PRINTL うわい! 楽しいなあ! ENDSELECT
PRINTDATAによるもの
単にRANDによる表示だけならこいつが一番高速である。
PRINTDATAL ^ DATAFORM %CALLNAME:MASTER%、こういうのって楽しいよね! ^ DATALIST ^ ^ DATAFORM %CALLNAME:MASTER%のおかげなんだよね? ^ ^ DATA とっても楽しいよっ! ^ ENDLIST ^ DATA なんだか、凄く楽しいんだよ! ^ DATA うわい! 楽しいなあ! ENDDATA
なお、どれに分岐したのか?を取得する必要がある場合は、上のコードのPRINTDATALを以下にすればいい。
PRINTDATAL LOCAL
ここで、LOCALには、DATAブロックのうちどれが表示されたのかが数値として代入される。一番上のブロックから順番に1,2,3,4と。
CFLAG:5001~5999までをクリアする
複数、それも極めて多くのフラグをクリア(0を代入)するというもの。なお、CFLAGはキャラクター変数なので、TARGETが指定されていることが前提である。そうでないとエラーで落ちる。
なお、事前にTARGETが指定されているかどうかを調べるのは基本的に、TARGETが負の値(たいていは-1)でないことを見ればいいわけだが、バリアントによっては0もしくはそれ以上の特定の数値においてもそうなることがおかしいと思われるケースもありえるので詳しくは当該バリアントをしっかりと見て、その意図を感じ取ってほしい。自作してるならきっちりと定義しておこう。
なお、事前にTARGETが指定されているかどうかを調べるのは基本的に、TARGETが負の値(たいていは-1)でないことを見ればいいわけだが、バリアントによっては0もしくはそれ以上の特定の数値においてもそうなることがおかしいと思われるケースもありえるので詳しくは当該バリアントをしっかりと見て、その意図を感じ取ってほしい。自作してるならきっちりと定義しておこう。
数式を列記するもの
eramakerでも使えるシベリア風人海戦術コードである。
CFLAG:5001 = 0 CFLAG:5002 = 0 (中略) CFLAG:5998 = 0 CFLAG:5999 = 0
REPEATループを使うもの
eramaker時代から利用可能なものである。
REPEAT 999 ^ CFLAG:(5001+COUNT) = 0 REND
FORループを使うもの
REPEATを使うよりちょっぴり楽である。
FOR COUNT, 5001, 6000 ^ CFLAG:COUNT = 0 NEXT
WHILEループを使うもの
単なるへそ曲がりである。
LOCAL = 999 WHILE LOCAL ^ LOCAL-- ^ CFLAG:(5001+LOCAL) = 0 WEND
なお、LOCAL--とは、デクリメントと呼ばれるものであるが、ここではLOCAL:0変数を-1する処理を行っていると考えてOKである。
DOループを使うもの
やはり単なるへそ曲がりである。
LOCAL = 999 DO ^ LOCAL-- ^ CFLAG:(5001+LOCAL) = 0 LOOP LOCAL
VARSETを使うもの
ループを回すよりは高速である。VARSETの第2引数が代入すべき値(今回は0である)、第3引数が目的変数のうちVARSETで操作すべき最初の配列要素の数であるし、第4引数が目的変数のうちVARSETで操作すべき最後の配列要素の数に1を加えたものである。すなわち、以下のコードに関してCFLAG:TARGET:6000に0が代入されることはない。
VARSET CFLAG:TARGET:0, 0, 5001, 6000
ARRAYREMOVEを使うもの
配列そのものをごっそり抹殺する。
ARRAYREMOVE CFLAG, 5001, 999
登録キャラの中から特定のキャラ番号のキャラをサーチする
ここではキャラ番号3のキャラを探してみる。そーなのかー。なお、キャラ番号3のキャラの位置(登録キャラ番号)を一文字変数A:0に代入しているが、存在しない場合のA:0には-1が代入されているはずである。
REPEATループを使うもの
eramaker時代からの伝統的手法であるが、手堅い。
A = -1 REPEAT CHARANUM ^ SIF NO:COUNT == 3 ^ ^ A = COUNT REND
GETCHARA命令を使うもの
GETCHARAを使うとシンプルな表記になる。
GETCHARA 3, 1 A = RESULT:0
なお、GETCHARAの第2引数は省略可能であるが上の場合の「1」は、非SPとSPキャラの両方をサーチするということである。ちなみに両方存在する場合には非SPキャラの場所を返す。
GETCHARA関数を使うもの
GETCHARA関数ならばもっとシンプルになるし、RESULT:0を汚さない。
A = GETCHARA(3)
FINDCHARA命令を使うもの
FINDCHARAだって、NOをサーチできる!
FINDCHARA NO, 3, 0 A = RESULT:0
なお、FINDCHARAの第3引数はサーチ開始位置を表す。上の場合の「0」は、登録キャラリストのNo.0すなわち先頭(通常はMASTER)からサーチするということである。
FINDCHARA関数を使うもの
FINDCHARAにも関数形が存在する。
A = FINDCHARA(NO, 3, 0)
処女のときとそうでないときで表示を変えてみる
なお、以下のを使う場合には必然的に、TARGETが指定されていることが前提である。そうでないとエラーで落ちる。また、TALENT:処女の中身が0ならば非処女、0以外なら処女とし、再生処女とかは考慮しない場合である。
注意:「TALENT:処女」という表記はEmuera専用である。eramakerお姉さまはそんなわがままは許さないので注意せよ。
注意:「TALENT:処女」という表記はEmuera専用である。eramakerお姉さまはそんなわがままは許さないので注意せよ。
IF分岐を使うもの
eramaker時代からの伝統的な手法だが分かりやすい。
IF TALENT:処女 ^ PRINTL 初めてだから… ELSE ^ PRINTL 初めてでなくても… ENDIF
SELECTCASE分岐を使うもの
へそ曲がり?
SELECTCASE TALENT:処女 ^ CASE 0 ^ ^ PRINTL 初めてでなくても… ^ CASEELSE ^ ^ PRINTL 初めてだから… ENDSELECT
三項式を使うもの
みんな大好き三項式です。
PRINTFORML 初めて\@TALENT:処女 ? だから # でなくても\@…
上のコードにおいて、\というのは実際には円マークを打ち込むことになるだろう。ともかく、三項式はうまく使えばここまでコードを圧縮できるわけであるがあんまり使いすぎると却ってわかりづらくなるかもしれない。コーディングにおいて最重要なのは読みやすいコードを記述することであるが、実際にコーディングしている作者にとって分かりづらいコーディングを自ら行うことは愚の骨頂なのかもしれない。