====== データ操作・保存 ======
[[erabasicリファレンス|リファレンストップ]] · [[erabasicリファレンス_総索引|名前の総索引]]
文字列・配列・数値の操作、キャラクタデータ、セーブ・ロードを調べます。
===== 命令の説明 =====
==== TIMES 数値変数 , 数値(小数OK、変数は不可) ====
数値変数に数値を掛ける命令ですが通常の掛け算と異なり、小数を掛けることができます。
==== MONEYSTR <数値>{, <書式指定子>} ====
引数で与えられた数値に対して、設定されたお金の単位を付けた文字列をRESULTS:0に代入します。\\
単位の前置・後置も自動的に処理します。\\
第2引数はTOSTR命令と同様の数値の文字列化における変換書式指定子となります。\\
==== TOUPPER <文字列式> ====
==== TOLOWER <文字列式> ====
==== TOHALF <文字列式> ====
==== TOFULL <文字列式> ====
引数の文字列に特定の変換をかけた結果をRESULTS:0に代入します。\\
TOUPPERはアルファベットを大文字にした結果を、TOLOWERは小文字化した結果を代入します\\
TOHALFは全角文字を半角にしますが、対応する半角文字がない全角文字はそのままです。\\
TOFULLは半角文字を全角にします。\\
==== TOSTR <数式>, <書式指定子> ====
数値を文字列に変換する命令です。\\
変換したい数字を第一引数に、変換の書式を文字列で第二引数に指定します。\\
第二引数は省略できますが、省略した場合はPRINTFORMの{}内などと同じように単に文字列になります。\\
この関数は内部でC#のInt64.ToString()関数を呼んでおり、C#と同じ書式指定ができます。第二引数が適切でない場合、エラーになります。\\
簡単な書式指定の例は同名の式中で使える関数を確認してください。 書式指定の詳細はC#の数値書式指定文字列について解説しているWebサイトを参考にして下さい。\\
==== ISNUMERIC <文字列式> ====
文字列を数値としてパース可能か(TOINTで値を取れるか)を判断します。\\
引数を数値として解釈できる場合1を、それ以外の場合0をRESULT:0に代入します。\\
==== TOINT <文字列式> ====
引数文字列を数値化してRESULT:0に代入します。ただし、半角数字で構成された文字列のみ数値化できます。\\
引数を数値として解釈できない場合、0が代入されます。全角数字の場合も同様です。\\
==== STRLEN <文字列> ====
==== STRLENS <文字列式> ====
==== STRLENFORM <書式付文字列> ====
文字列の長さを測定し、RESULT:0に代入します。\\
長さはSHIFT-JISでのバイト数です。つまり全角文字を2文字と数えます。\\
STRLEN ABCあいう
PRINTFORML = {RESULT}
STR:0 = ABCあいう
STRLENS STR:0
PRINTFORML = {RESULT}
STRLENFORM abc%STR:0%
PRINTFORML = {RESULT}
;STRLENSは文字列式にも対応
STRLENS "abc" + STR:0
PRINTFORML = {RESULT}
WAIT
結果
= 9
= 9
= 12
= 12
==== STRLENU <文字列> ====
==== STRLENSU <文字列式> ====
==== STRLENFORMU <書式付文字列> ====
STRLEN、STRLENS、STRLENFORMのUnicode版です。違いは全角文字も1文字と数えることです。\\
==== SUBSTRING <文字列式>, <数式>, <数式> ====
指定した文字列式の部分文字列をRESULTS:0に代入します。\\
開始位置は文字列の最初が0です。元文字列の長さより後を指定した場合、空文字列""が返されます。\\
文字数はSHIFT-JISでのバイト数で指定します。つまり全角文字を2文字と数えます。\\
文字数に負の値を指定するか、元文字列の終端より後の位置を指定した場合、開始位置から最後までの文字列を返します。\\
開始位置または終了位置で文字を切ることができない場合(全角文字の途中を指している場合)、1つ後ろを指定されたと判断されます。\\
このことで指定した文字数よりも1文字分だけ長い文字列が返される場合があるので注意してください。\\
STR:0 = 01234あいうえお
SUBSTRING STR:0, 0, -1
PRINTFORML = %RESULTS:0%
SUBSTRING STR:0, 1, 3
PRINTFORML = %RESULTS:0%
SUBSTRING STR:0, 6, 3
PRINTFORML = %RESULTS:0%
WAIT
結果
= 01234あいうえお
= 123
= いう
==== SUBSTRINGU <文字列式>, <数式>, <数式> ====
SUBSTRINGのUnicode版です。違いは全角文字も1文字と数えることです。\\
==== CHARATU <文字列式>, <文字位置> ====
以下、私家改造版更新履歴より、\\
文字列中の任意の文字数目の文字を取得する式中関数CHARATU追加
書式:CHARATU(<参照文字列>, [取得文字位置])
内容:文字列の指定した位置の文字を取得する
処理系はユニコードとなります
==== STRFIND <文字列式>, <文字列式>(, <数式>) ====
文字列検索命令です。\\
第一引数には検索される対象の文字列を文字列式で、\\
第二引数には検索する文字列を文字列式で指定します。\\
RESULT:0に全角文字を2文字と数え、0から始まるインデックスが代入されます。見つからなかった場合は-1です。\\
STR:0 = abcdefghi
STR:1 = あいうえお
STR:2 = うえ
STRFIND STR:0, "cde"
PRINTFORML = {RESULT:0}
STRFIND STR:1, "いうえ"
PRINTFORML = {RESULT:0}
STRFIND STR:1, STR:2
PRINTFORML = {RESULT:0}
STRFIND STR:1, "か"
PRINTFORML = {RESULT:0}
;結果
= 2
= 2
= 4
= -1
1.712以降、STRFIND命令に第3引数が指定できるようにしました。\\
第3引数には検索の開始位置を0から始まるインデックスで指定します。\\
STRFIND "abcdeabced","a",3
上の行の結果、RESULTには5が代入されます。\\
"a"は0の位置にもありますが、第3引数により検索は3の位置("d")から開始されるので最初に見つかる"a"は5の位置になります。\\
==== STRFINDU <検索対象>, <検索する文字列>{, <開始インデックス>} ====
以下、私家改造版更新履歴より、\\
STRFINDのユニコード版STRFINDU実装
書式:STRFINDU(<検索対象>, <検索する文字列>{, <開始インデックス>})
内容:STRFINDのユニコード版、返り値の文字の位置と開始インデックスがユニコードでのカウントになっている
==== SPLIT <文字列式>, <文字列式>, <文字列変数> ====
第1引数で指定した文字列を、第2引数で指定した文字列を区切りとして分割し、第3引数で指定した文字列配列変数に代入します。\\
また、分割した数をRESULTに代入します。\\
第3引数で指定する変数は配列変数でなければなりません。\\
SPLIT "あい,うえ,,お", ",", LOCALS
上記のスクリプトの結果、LOCALS:0に"あい"、LOCALS:1に"うえ"、LOCALS:2に""(空文字列)、LOCALS:3に"お"、RESULTに4が代入されます。\\
分割後の要素数が第3引数に代入可能な要素数を超えた分については代入が行われません\\
RESULTには実際の分割数が入れられるのでそちらで判別してください\\
==== STRJOIN <配列変数>{, <区切り文字列>, <配列添え字開始位置>, <配列添え字要素数>} ====
文字列結合命令です。以下、私家改造版read meより\\
○文字列配列の結合関数STRJOINの追加
書式:STRJOIN(<配列変数>{, <区切り文字列>, <配列添え字開始位置>, <配列添え字要素数>})
内容:ツールチップの最大表示時間を[表示時間(ms)]に設定
引数:<配列変数>:結合した配列変数、キャラ変数を指定した場合エラーになるかも
<区切り文字列>:結合のさいに要素間に加える文字列、他の言語の同一処理同様、省略時は","が自動的に適用されます(区切り文字が必要ない場合は""を与えてください)
<配列添え字開始位置>、<配列添え字要素数>:指定した場合 配列添え字開始位置≦i<開始位置+配列添え字要素数 の範囲で結合する
後者を指定する場合、前者は省略不可
==== REPLACE <置換対象文字列>, <置換対象パターン>, <置換後の文字列> ====
以下、私家改造版更新履歴より、\\
文字列置換命令REPLACE実装
書式:REPLACE(<置換対象文字列>, <置換対象パターン>, <置換後の文字列>)
内容:置換対象文字列を置換対象パターンで検索し、ヒットしたら置換後の文字列で置き換えます。結果はRESULTSに代入されます。
内部処理は思いっきり正規表現です。第2引数はC#の正規表現の仕様に準じて動作します。
そのため、()や[]、$、/.*+等の正規表現で用いられる記号はエスケープ必須となります
==== ESCAPE <文字列> ====
以下、私家改造版更新履歴より、\\
文字列を正規表現用にエスケープする式中関数ESCAPEを追加
書式:ESCAPE([文字列])
内容:文字列が正規表現中で平文となるように、引数中の文字列の正規表現メタ文字をエスケープして返す
==== UNICODE <数式> ====
RESULTS:0に引数の値に対応したunicodeの文字を代入する命令です。\\
例えば、以下のスクリプトは白抜きのハートマークを表示します。\\
ただし、この関数ではサロゲートペアを扱うことはできません。\\
また、フォントが対応していなければ表示できません。\\
UNICODE 0x2661
PRINTFORMW %RESULTS%
なお、EmueraのUnicode対応は完全ではないことに注意してください。\\
例えばEmueraはサロゲートペアを使用した場合、正確な動作は保証できません。\\
==== ENCODETOUNI <対象文字列(FORM型文字列)> ====
以下、私家改造版更新履歴より、\\
文字列に対してUNICODEのバイトコードを返すENCODETOUNI実装
書式:ENCODETOUNI <対象文字列(FORM型文字列)>
内容:与えられた文字列をユニコードにエンコードしてそのバイトを数値として返す
RESULT:0 文字数
RESULT:1〜 バイト数値
==== POWER <変数>, <数式>, <数式> ====
指定した変数に累乗を代入します。\\
例えばPOWER A, X, Y ならば、AにXのY乗が代入されます。\\
演算結果がオーバーフローを起こすとエラーになります。\\
X = 11
Y = 2
POWER A, X, 2
PRINTFORML = {A}
POWER CFLAG:2, X + 1, Y + 1
PRINTFORML = {CFLAG:2}
結果(TARGETは適切に設定されているとする)
= 121
= 1728
==== ABS <数式> ====
引数の絶対値をRESULT:0に代入します。\\
==== SIGN <数式> ====
引数の符号をRESULT:0に代入します。\\
負の値なら-1、0なら0、正の値なら1を代入します。\\
==== SQRT <数式> ====
引数の平方根をRESULT:0に代入します。\\
==== GETBIT <数式>, <数式> ====
引数の特定のビットを取得し、RESULT:0に代入します。\\
第1引数に対象となる数字を、第2引数には取得したいビットの位置を指定します。 第2引数に指定できる値は0〜63までで、範囲外の数値を指定するとエラーになります。\\
第2引数が定数の場合、例えば5であれば、\\
GETBIT X, 5
RESULT = (X & 1p5) != 0
2つの行は同じ結果になります。\\
==== MAX <数式>(, <数式>...) ====
引数の中で最大の数値をRESULT:0に代入します。\\
==== MIN <数式>(, <数式>...) ====
引数の中で最小の数値をRESULT:0に代入します。\\
==== LIMIT <数式>, <数式>, <数式> ====
第一引数の値をRESULT:0に代入します。\\
ただし、第一引数が第二引数より小さいなら第二引数の値を、第三引数より大きいなら第三引数を返します。\\
例えばAに X - Y を代入したいが、代入後の値が0以上100以下であってほしい場合、通常は以下のように書きます。\\
A = X - Y
SIF A < 0
A = 0
SIF A > 100
A = 100
LIMIT命令を使うとこれを二行にまとめることができます。\\
LIMIT X - Y, 0, 100
A = RESULT
==== INRANGE <数式>, <数式>, <数式> ====
第一引数の値が第二引数以上かつ第三引数以下であれば1を、第一引数が第二引数より小さい、または第三引数より大きいなら0をRESULT:0に代入します。\\
==== SETBIT <数値型変数>, <数式>{, <数式>,...} ====
==== CLEARBIT <数値型変数>, <数式>{, <数式>,...} ====
==== INVERTBIT <数値型変数>, <数式>{, <数式>,...} ====
ビット操作関数です。\\
第1引数で指定した変数の、第2引数以降で指定した位置のビットを操作します。\\
SETBITはビットを1にし、CLEARBITは0にし、INVERTBITは反転させます。\\
SETBIT X, A
CLEARBIT Y, B
INVERTBIT Z, C
の結果は以下と同じです。\\
X |= 1 << A
Y &= ~(1 << B)
Z ^= 1 << C
また、これらのビット操作関数の書式はGETBIT関数と対応しています。\\
"SETBIT X, A" で変更したビットをGETBIT(X, A)で参照することができます。\\
==== ADDCHARA <数式>(, <数式>, <数式>, ...) ====
==== DELCHARA <数式>(, <数式>, <数式>, ...) ====
eramakerからある命令ですが、一度にたくさんのキャラを足したり消せるようになりました\\
==== SWAPCHARA <数式>, <数式> ====
指定した二人のキャラクタの登録番号を入れ替えます。\\
;MASTERしかいない状態とする
ADDCHARA 10
ADDCHARA 11
PRINTFORML NO:1 = {NO:1}, NO:2 = {NO:2}
SWAPCHARA 1,2
PRINTFORML NO:1 = {NO:1}, NO:2 = {NO:2}
結果
NO:1 = 10, NO:2 = 11
NO:1 = 11, NO:2 = 10
==== SORTCHARA <キャラクタ変数> {, } ====
任意のキーによる、キャラリストのソート。\\
ソートキーはNAMEのような文字列変数、NOのような数値型変数、CFLAGのような数値配列変数のいずれでも可能です。\\
<キャラクタ変数>は省略することができ、その場合はキャラ番号(NO:XX)でソートされます。\\
FORWARDなら昇順、BACKなら降順になります。省略した場合は昇順でソートされます。\\
MASTERはソートの対象になりません。\\
また、TARGET:0、ASSI:0は自動で追尾されますので使用後に手動で操作する必要はありません。\\
しかしTARGET:1などを使用しているバリアントはこれらを手動で追随させる必要があります。\\
;NOで昇順にソート
SORTCHARA
;NOで降順にソート
SORTCHARA BACK
;CFLAG:2で昇順にソート
SORTCHARA CFLAG:2
;NAMEで降順にソート
SORTCHARA NAME, BACK
なお、TARGET == -1の場合でも、CFLAG:2などの値を実際に参照するわけではないのでエラーにはなりません。\\
==== GETCHARA <キャラ番号(NO:XXXの方)> ====
現在所有しているキャラの中にそのキャラがいるかを判定し、いればリスト上での位置を、いなければ-1を返します\\
リスト全体から特定のキャラの有無を確認したい場合に使えます\\
==== ADDDEFCHARA ====
ゲーム開始時のシステム的なキャラ追加処理を行う命令です。\\
chara0*.csvで定義されたキャラと、gamebase.csvで指定された初期キャラを追加します。\\
"ADDCHARA 0"はキャラNOが0であるキャラを探して追加しますが、ADDDEFCHARAはcsvの番号でキャラを追加します。\\
該当するcsvが存在しない場合、ADDVOIDCHARA同様に空のキャラクタを作成します。\\
これはeramakerの初期化処理を再現するための命令であり、@SYSTEM_TITLE以外では使用できません。\\
==== ADDVOIDCHARA ====
csvに依らずにキャラを追加する命令です。\\
ADDVOIDCHARAで追加されたキャラは全ての変数に0又は""(空文字列)が代入されています。\\
==== DELALLCHARA ====
登録されている全てのキャラクタを削除します。 以下のスクリプトと同じことです。\\
REPEAT CHARANUM
DELCHARA 0
REND
==== PICKUPCHARA <対象キャラ>(, <対象キャラ>, ....) ====
引数で指定したキャラのみを残し、他のキャラを全て削除する命令です。\\
MASTER:0、TARGET:0、ASSI:0などは自動で追随します。命令後手動で設定し直す必要はありません。\\
対象キャラに負の値を指定した場合エラーになりますが、MASTER、TARGET、ASSI等を対象に設定し、\\
その結果それらの変数の中身が負の値だった場合は、例外でエラーになりません(無視される)。\\
==== EXISTCSV <数式> ====
対応するキャラが定義されているかどうかをチェックしRESULT:0に代入します。\\
定義されていれば1、されていなければ0を返します。\\
ADDCHARA noがエラーにならずに実行できるかどうかを調べることができます。\\
==== FINDCHARA <キャラクタ変数>, <式>(, <数式>, <数式>) ====
==== FINDLASTCHARA <キャラクタ変数>, <式>(, <数式>, <数式>) ====
FINDCHARA命令はキャラクタ変数と値を指定し、変数がその値であるキャラクタの登録番号をRESULT:0に返します。\\
複数見つかった場合、FINDCHARAは最初にヒットしたキャラを、\\
FINDLASTCHARAは最後にヒットしたキャラを返します。見つからなかった場合は-1を返します。\\
また、第3引数を指定することで検索の開始位置を、第4引数を指定することで検索の終了位置を指定できます。\\
ただし、検索範囲がキャラクタ数の範囲を超える場合はエラーとなります。\\
X = -1
WHILE 1
FINDCHARA CFLAG:10, 123, X + 1
X = RESULT
SIF X < 0
BREAK
PRINTFORML %NAME:X%
WEND
==== COPYCHARA <数式>, <数式> ====
第一引数で指定された登録番号のキャラの全てのデータを第二引数で指定された登録番号のキャラにコピーします。\\
==== ADDCOPYCHARA <数式> ====
引数で指定された登録番号のキャラと同じデータであるキャラを新たに追加します。つまり、ADDCHARAの変種です。\\
変数操作・変数参照・CSV参照\\
==== VARSIZE <変数名> ====
指定した変数の配列のサイズをRESULT:0に代入します。\\
多次元配列変数の場合、一番左の要素から順にRESULT:0, RESULT:1, RESULT:2と代入されます。\\
配列のサイズはVariableSize.csvで指定した値です。\\
VARSIZE FLAG
PRINTFORML = {RESULT:0}
VARSIZE SAVESTR
PRINTFORML = {RESULT:0}
VARSIZE TALENT
PRINTFORML = {RESULT:0}
WAIT
結果(サイズを変更していない場合)
= 10000
= 100
= 1000
※実際に変数を参照するわけではないので配列外参照が発生することはありません。 上の例ではTARGET == -1の場合でも-1人目のTALENTを参照しようとしてエラー、ということにはなりません。\\
==== RESETDATA ====
GLOBALとGLOBALSを除く全ての変数を初期化します。\\
具体的には全てのキャラを削除し、全てのローカル変数および全ての通常の変数に0又は空文字列を代入します。\\
また、PALAMLVやSTRなど初期値が設定されている変数については初期値を代入します。\\
==== RESETGLOBAL ====
グローバル変数を初期化します。\\
具体的にはGLOBALに0を代入し、GLOBALSに空文字列を代入します。\\
==== RESET_STAIN <数式> ====
第1引数で指定したキャラクタのSTAINを初期化する命令です。 初期値はBEGIN TRAINのときに代入される値と同様で、_replace.csvの「汚れの初期値」で指定できます。\\
==== SWAP <変数1>, <変数2> ====
変数1と変数2の中身を入れ替えます\\
交換する2つの変数は同じ型(整数型と整数型、文字列型と文字列型)である必要があります\\
==== CSVNAME <数式> ====
==== CSVCALLNAME <数式> ====
==== CSVNICKNAME <数式> ====
==== CSVMASTERNAME <数式> ====
CSVで定義されたNAME、CALLNAME、NICKNAME、MASTERNAMEを直接呼び出す関数です。\\
所有してないキャラの名前とかが欲しいときとかにどうぞ\\
第一引数がキャラ番号(NOの方)です。\\
==== CSVBASE <数式>, <数式> ====
==== CSVCSTR <数式>, <数式> ====
==== CSVABL <数式>, <数式> ====
==== CSVTALENT <数式>, <数式> ====
==== CSVMARK <数式>, <数式> ====
==== CSVEXP <数式>, <数式> ====
==== CSVRELATION <数式>, <数式>, <数式> ====
==== CSVJULE <数式>, <数式> ====
==== CSVEQUIP <数式>, <数式> ====
==== CSVCFLAG <数式>, <数式>, ====
CSVで定義された値を直接呼び出す関数です。\\
第一引数がキャラ番号、第二引数が各変数のインデックスです。\\
CSVCSTRはRESULTSに文字列を代入し、その他はRESULTに数値を代入します。\\
==== GETNUM <変数名>, <文字列式> ====
各csvで定義されている名称からその数値を取得し、RESULT:0に代入します。\\
例えば、abl.csvで"2,技巧"が定義されていれば、GETNUM ABL, "技巧"の結果、RESULT:0に2が代入されます。\\
定義されていない場合は-1になります。\\
csvと変数の対応はEmueraの拡張文法#一般のページの「文字列による配列変数の要素の指定」に準じます。\\
==== GETPALAMLV <数式>, <判定するLVの上限> ====
==== GETEXPLV <数式>, <判定するLVの上限> ====
与えられた値の内容とPALAMLV・EXPLVを比較し、その引数がPALAMLV・EXPLVでどこまで以上かをRESULT:0に代入します。\\
第2引数は調査する最大のLVを表します。PALAMLV・EXPLVの値を設定してから使用してください。\\
==== FINDELEMENT <一次元配列変数>, <検索対象(変数と同型)>, <検索初位置>, <検索終位置>, <厳密一致かのフラグ> ====
==== FINDLASTELEMENT <一次元配列変数>, <検索対象(変数と同型)>, <検索初位置>, <検索終位置>, <厳密一致かのフラグ> ====
配列中の特定範囲から特定の要素の位置を取得する関数です。\\
第3・第4引数で指定された配列要素の検索範囲に第2引数で指定されたものと同じ要素があれば、その位置を返します。\\
複数ある場合はFINDELEMENTは最初にヒットしたものを、\\
FINDLASTELEMENTは最後にヒットしたものを返します。ヒットしない場合は-1を返します。\\
検索対象が文字列の場合はREPLACEと同様に正規表現を使えます。\\
第5引数は文字列の場合のみ有効で、0であれば文字列の一部が一致でもOKとし、\\
0以外であれば文字列と完全に一致した場合のみOKとします。\\
==== VARSET <変数名>{, <数式 or 文字列式>, <配列範囲初値>, <配列範囲終値+1>} ====
指定した変数の配列の指定範囲に第二引数の値を代入します。\\
第二引数を省略した場合、0または空文字列が代入されます。\\
第三引数以降を省略した場合、配列の全てに代入されます。\\
例えば\\
VARSET FLAG, 0
VARSET STR, "あああ", 0, 10
VARSET TA:0:0:0,5678
この例ではFLAGの要素全てが0になります。\\
STR:0からSTR:9には"あああ"が代入され、TAについても三次元配列の全ての要素に5678が代入されます。\\
同じことはERB上でFOR-NEXTループなどを使って行うこともできますが、ループ回数が数十万回程度になると実行時間が無視できなくなります。\\
VARSET命令はERB上での代入よりはるかに早く処理を終わらせることができます。\\
キャラクタ変数をVARSET命令の対象にした場合、指定したキャラの要素のみに代入されます。\\
VARSET CFLAG:MASTER:0, 0
VARSET CSTR, ""
この例ではMASTERのCFLAG:0〜999(変更していなければ)が0になりますが、他のキャラのCFLAGは影響を受けません。\\
また、対象を省略した場合は通常通りTARGETとみなされるのでTARGETのCSTRが全て""になります。他のキャラのCSTRは影響を受けません。\\
1次元配列および配列型キャラクタ変数以外の、DITEMTYPEやTA等に使用した場合、第三引数以降は無視され配列の全てに代入されます。\\
==== CVARSET <キャラクタ変数>{, <数式>, <式>, <キャラクタ範囲初値>, <キャラクタ範囲終値+1>} ====
指定した登録キャラクタについてキャラクタ変数の特定要素へ代入する命令です。\\
第一引数で指定した変数の第四引数以降で指定した登録キャラクタについて、第二引数で指定した要素へ第三引数で指定した値を代入します。\\
NAME、ISASSIなどの一次元配列変数の場合、第二引数は処理に影響しません。そのため第三引数を省略しない場合、適当な値を指定してください。\\
第三引数を省略した場合、0又は""(空文字列)が代入されます。\\
第二引数も省略した場合、0番目の要素に代入されます。\\
第四引数以降を省略した場合、全ての登録キャラクタに代入されます。\\
==== CVARSET CFLAG, 10, 123 ====
このスクリプトは以下と同じことです。\\
REPEAT CHARANUM
CFLAG:COUNT:10 = 123
REND
==== ARRAYSHIFT <対象変数>, <ずらす数>, <ずらしてできた空白領域の初期値>{, <ずらす配列範囲の初値>, <ずらす配列要素の範囲の数>} ====
以下、私家改造版更新履歴より、\\
配列をシフトする命令ARRAYSHIFT実装
書式:ARRAYSHIFT <対象変数>, <ずらす数>, <ずらしてできた空白領域の初期値>{, <ずらず配列範囲の初値>, <ずらす配列要素の範囲の数>}
内容:配列変数を指定した数だけずらす、正の値で添え字の大きい方へ、負の値で小さい方にずらす
配列の範囲からはみでた値は掃き捨て、ずらして出来た空白領域は第2引数で指定した値で満たす
省略可能な第4および第5引数を使うと一部の範囲のみをずらすことができる
1次元配列および配列型キャラクタ変数のみに対応しています。DITEMTYPEやTA等に使用することはできません。
==== ARRAYREMOVE <対象変数>, <消す範囲初値>, <消す要素数> ====
以下、私家改造版更新履歴より、\\
配列要素を部分削除する命令ARRAYREMOVE実装
書式:ARRAYREMOVE <対象変数>, <消す範囲初値>, <消す要素数>
内容:配列変数を指定した初期値から要素数分だけ削除し、後ろを値を詰める
消す要素数を0以下にすると初期値から後ろ全て消去になります
1次元配列および配列型キャラクタ変数のみに対応しています。DITEMTYPEやTA等に使用することはできません。
==== ARRAYSORT <対象変数>{, <ソート方式(FORWARD or BACK)>, <開始インデックス>, <対象要素数>} ====
以下、私家改造版更新履歴より、\\
配列変数をソートするARRAYSORT実装
書式:ARRAYSORT [対象変数](, [ソート方式(FORWARD or BACK)], [開始インデックス], [対象要素数])
内容:開始インデックスから対象要素数個の配列データをソートする
FORWARDで昇順、BACKで降順
==== ARRAYCOPY <コピー元変数名>, <コピー先変数名> ====
以下、私家改造版更新履歴より、\\
無頓着な配列コピー命令ARRAYCOPY実装
書式:ARRAYCOPY <コピー元変数名>, <コピー先変数名>
内容:コピー元変数の値をコピー先変数へコピーする
型変数は型が同じで次元数が同じである必要がある
また、キャラクター変数には非対応
要素数が異なる場合はコピーできる分だけコピーする
書式例:ARRAYCOPY "A", "B"
==== ARRAYMSORT array1{, array2...} ====
ARRAYMSORTはarray1を昇順でソートし、それと同じ順序でarray2以降の配列を並び替えます。\\
array1は一次元配列である必要があります。array2以降は多次元配列も受け付けます。\\
array1に0または空文字列の要素があるとき、それを配列の終端とみなし以降の要素はソートしません。\\
array2以降の配列の要素数がarray1のソートされた要素数よりも少ない場合場合、命令を中断しRESULT:0に0を代入して終了します。\\
全ての配列のソートに成功した場合、この命令はRESULT:0に非0を代入して終了します。\\
@TEST
#DIM ARRAY1,4
#DIM ARRAY2,4
#DIM ARRAY3,4,3
ARRAY1 = 3,1,2,0
ARRAY2 = 1001,1002,1003,0
ARRAY3:0:0 = 1, 101, 2763
ARRAY3:1:0 = 2, 102, 9615
ARRAY3:2:0 = 3, 103, 7035
ARRAYMSORT ARRAY1,ARRAY2,ARRAY3
PRINTFORML > ARRAY1 == {ARRAY1:0},{ARRAY1:1},{ARRAY1:2},{ARRAY1:3}
PRINTFORML > ARRAY2 == {ARRAY2:0},{ARRAY2:1},{ARRAY2:2},{ARRAY2:3}
FOR I,0,3
PRINTFORML > ARRAY3:{I}:0 == {ARRAY3:I:0},{ARRAY3:I:1},{ARRAY3:I:2}
NEXT
;;;出力
> ARRAY1 == 1,2,3,0
> ARRAY2 == 1002,1003,1001,0
> ARRAY3:0:0 == 2,102,9615
> ARRAY3:1:0 == 3,103,7035
> ARRAY3:2:0 == 1,101,2763
==== CUPCHECK <登録キャラクター番号> ====
以下、私家改造版更新履歴より、\\
CUP、CDOWNに対応するUPCHECKであるCUPCHECK追加
書式:CUPCHECK <キャラ>
内容:引数で指定したキャラに対するUPCHECKを走らせる、それだけ
当然ですがUP,DOWNの影響はありません。また、UPCHECKでは結果を表示していましたが、CUPCHECKによる結果は表示されません。
==== LOADDATA <数式> ====
<数式>で示される番号のファイルのデータをロードします。\\
ロードに失敗した場合、エラー終了します。\\
必ずCHKDATA命令でロード可能かどうかを調べてから実行してください。\\
LOADDATAは(LOADGAME命令と違って)スクリプトのどの場所でも呼び出すことができます。\\
==== DELDATA <数式> ====
<数式>で示される番号のファイルのデータを削除します。\\
ファイルが存在しなくてもエラーにはなりません。\\
==== CHKDATA <数式> ====
<数式>で示される番号のファイルのデータの情報をRESULT:0とRESULTS:0に代入します。\\
RESULT:0は以下の値をとります。0の場合のみそのファイルをロードすることができます。\\
* 0 - このファイルはロード可能です。
* 1 - 指定されたファイルは存在しません。
* 2 - ゲームのコードが違います。(gamebase.csvの"コード"の値が違うデータ)
* 3 - バージョンが違います。(gamebase.csvの"バージョン"の値が異なり、許容されるバージョンでもないデータ)
* 4 - 上記以外の問題があるファイルです。
RESULT:0が0のとき、RESULTS:0にはセーブデータのコメント(@SAVEINFOのPUTFORMで入力した文字列、またはSAVEDATAの第2引数)が代入されます。\\
RESULT:0が0以外のとき、RESULTS:0には"セーブデータのバーションが異なります"などのエラーメッセージが代入されます。\\
==== SAVENOS <数値変数> ====
コンフィグ"表示するセーブデータ数"で指定された数を取得し指定された数値変数に代入します。標準は20です。\\
数値変数を省略することはできません。\\
==== SAVEGLOBAL ====
変数GLOBALとGLOBALSをセーブします。保存先は"global.sav"です。\\
ERHファイル内でGLOBAL及びSAVEDATAフラグを持つ変数が定義されていればそれもセーブします。\\
==== LOADGLOBAL ====
GLOBALとGLOBALSをロードします。保存先は"global.sav"です。\\
読み込みに失敗してもエラーにはなりません。\\
読み込みに成功するとRESULTに1を、失敗すると0を代入します。\\
通常のセーブデータと同様に、gamebase.csvで設定されたコード、バージョンが適切でないファイルはロードできません。\\
変数GLOBALの詳細は変数の節を参照してください。\\
==== OUTPUTLOG ====
以下、私家改造版更新履歴より、\\
ログ出力命令OUTPUTLOG実装
やり過ぎはディスクの寿命を縮めるのでほどほどに
なお、ログの文字コードはUnicodeです。
==== SAVECHARA str filename, str memo, int charano{, int charano2, ...} ====
指定したキャラクタのデータをファイルに保存する命令です。\\
第一引数はデータをセーブするファイル名(の一部)を指定します。実際のファイル名は"chara_*.dat"になります。\\
第二引数はセーブデータのメモとなる文字列を保存します。後にCHKCHARADATA関数により読むことができます。\\
第三引数以降にはセーブしたいキャラの登録番号を指定します。いくつでも可能ですが同一の登録番号を複数回指定することはできません。\\
datフォルダーが存在しない場合、フォルダの作成を試みます。作成に失敗した場合エラーになります。\\
また、第一引数が空文字列である、第一引数にファイル名に使えない文字が含まれるなどの場合エラーになります。\\
==== LOADCHARA str filename ====
第一引数はデータをロードするファイル名(の一部)を指定します。実際のファイル名は"chara_*.dat"になります。\\
RESULT:0に、読み取りに失敗した場合は0を、成功した場合は1を代入します。\\
LOADVARの前にCHKCHARADATA関数によりファイルの適切さを確認すべきです。\\
LOADCHARAはSAVEされているキャラの数だけ新しいキャラを登録します。\\
したがって既存の登録キャラには影響しません。\\
何名のキャラが追加されたかを知るにはロード前後でのCHARANUMを比較してください。\\
==== CHKCHARADATA str filename ====
datフォルダ内の"chara_*.dat"で示されるファイル名のデータの情報を返します。\\
RESULTにはロード可能な場合は0、何らかの理由により不可能な場合は非0が代入されます。\\
また、ロード可能な場合はRESULTS:0にセーブデータのメモを代入し、不可能な場合はその理由をRESULTS:0に代入します。\\
==== FIND_CHARADATA str filename ====
LOADCHARAの対象となり得るファイルをdatフォルダの中から探索しファイル名(chara_*.datの*の部分)をRESULTSに代入します。\\
RESULTにはヒット数(発見されたファイル数)が代入されます。\\
引数はchara_*.datの*の部分を指定できます。\\
例えばFIND_CHARADATA("*あなた*")であれば、chara_*あなた*.datを探し、chara_001あなた.datやchara_あなたABC.datがヒットします。\\
引数を省略した場合、"*"を指定したことになりchara_*.datを探します。\\
なお、chara_.dat(*が空文字列)はLOADCHARAで指定できないのでヒットしません。\\
ヒット数がRESULTSの要素数を超えた場合はエラーにはなりませんが超えた分のファイル名は代入されません。\\
==== SAVETEXT str text, int fileNo{, int force_savdir, int force_UTF8} ====
textで指定したテキストを、ファイル名textXX.txt(例えばfileNoが2ならtext02.txt)に保存します。\\
この命令はテキストにヘッダーなどを付け加えたり変更したりすることなく文字列そのままを保存します。\\
この命令は通常はオプション設定の影響を受け、savフォルダ内に作成されたり、UTF-8で保存されます。\\
第3引数に非0を指定した場合、オプションを無視して強制的にsavフォルダ内に保存します。savフォルダは必要に応じて作成されます。\\
第4引数に非0を指定した場合、オプションを無視して強制的にUTF-8エンコードで保存します。\\
成功した場合RESULT:0に非0が、失敗した場合0が代入されます。\\
短い時間中に同一ファイルに書き込むことを繰り返した場合、ウイルス対策ソフト等の影響で書き込みに失敗する可能性がありますので成否のチェックは重要です。\\
==== LOADTEXT int fileNo{, int force_savdir, int force_UTF8} ====
LOADTEXT命令版はtextXX.savを読み取りその結果をRESULTS:0に代入します。\\
第2引数に非0を指定した場合、オプションによらずsavフォルダ内のファイルを探します。\\
第3引数に非0を指定した場合、UTF-8エンコードで保存されているものとして読み取ります。\\
失敗した場合、RESULTS:0が空文字列になります。\\
同名の式中関数もあり、RESULTS:0の代わりに返り値に読取結果又は空文字列を返します\\
==== GETTIME ====
パソコンの現在日時・時刻に関する情報をRESULT:0とRESULTS:0に代入します。\\
現在日時が2009年3月28日13時5分23秒678ミリ秒であれば、RESULT:0には"20090328130523678"が代入されます。\\
RESULTS:0には"2009年03月28日 13:05:23"が代入されます。\\
RESULTS:0は主にセーブデータのコメントに使用することを想定しています。\\
年月日について独自の表記をしたい場合はRESULT:0を分解して使用してください。\\
なお、RESULT:0の精度は実行する環境にもよりますが、十数〜数十ミリ秒程度です。\\
(数ミリ秒しか経過していない場合、同じ値が帰ってくることがあります)\\
パフォーマンスの測定を目的とする場合は注意してください。\\
==== GETMILLISECOND ====
西暦0001年1月1日からの経過時間をミリ秒単位で取得し、RESULT:0に代入します。\\
そのまま加減算ができるので経過時間などを調べるにはGETTIMEよりも適しています。\\
なお、RESULT:0の精度は実行する環境にもよりますが、十数〜数十ミリ秒程度です。\\
(数ミリ秒しか経過していない場合、同じ値が帰ってくることがあります)\\
パフォーマンスの測定を目的とする場合は注意してください。\\
==== GETSECOND ====
西暦0001年1月1日からの経過時間を秒単位で取得し、RESULT:0に代入します。\\
そのまま加減算ができるので経過時間などを調べるにはGETTIMEよりも適しています。\\
==== RANDOMIZE <数式> ====
==== DUMPRAND ====
==== INITRAND ====
RAND:Xで得られる乱数を制御するための命令です。\\
RANDOMIZE命令は指定した値で乱数を初期化します。\\
同じ値で初期化したならば、RANDは必ず同じ結果を返します。\\
DUMPRANDは現在の乱数の状態をRANDDATA変数に保存します。\\
INITRANDはRANDDATA変数に保存したデータを読み出します。\\
DUMPRANDを行う前にINITRANDを行ってしまわないように注意してください。\\
RANDDATA変数の中身が不適当な場合、RANDが正常に動作しなくなります。\\
PRINTFORML {RAND:100000}/{RAND:100000}/{RAND:100000}/{RAND:100000}/{RAND:100000}/{RAND:100000}
RANDOMIZE 23478612
PRINTFORML {RAND:100000}/{RAND:100000}/{RAND:100000}/{RAND:100000}/{RAND:100000}/{RAND:100000}
RANDOMIZE 23478612
PRINTFORML {RAND:100000}/{RAND:100000}/{RAND:100000}/{RAND:100000}/{RAND:100000}/{RAND:100000}
DUMPRAND
PRINTFORML {RAND:100000}/{RAND:100000}/{RAND:100000}/{RAND:100000}/{RAND:100000}/{RAND:100000}
INITRAND
PRINTFORML {RAND:100000}/{RAND:100000}/{RAND:100000}/{RAND:100000}/{RAND:100000}/{RAND:100000}
INITRAND
PRINTFORML {RAND:100000}/{RAND:100000}/{RAND:100000}/{RAND:100000}/{RAND:100000}/{RAND:100000}
;結果
92539/49469/48337/15839/48368/1604
34536/91889/81167/22434/87922/95565
34536/91889/81167/22434/87922/95565
68286/10690/68868/82610/90769/60789
68286/10690/68868/82610/90769/60789
68286/10690/68868/82610/90769/60789
上記の結果のうち、最初の行は不定です。実行するたびに結果が変わります。\\
2行目、3行目は同じ値でRANDOMIZEした直後なので必ずこの結果になります。\\
4行目の前にDUMPRAND命令を実行しています。\\
5行目の前にINITRAND命令を行うことで、RANDの状態をDUMPRAND命令で保存した状態まで戻しています。\\
そのため、4行目と5行目は結果が同じになっています。\\
6行目では再度INITRAND命令を行うことで、繰り返し同じ結果を得ています。\\
RANDDATA変数はセーブされる変数なので、セーブ前にDUMPRANDを行い、ロード直後にINITRANDを行うことで同じ乱数状態を続けて使うことができます。\\
==== STRDATA ====
以下、私家改造版更新履歴より、\\
○PRINTDATAの非表示、選択文字列返し版STRATA追加
書式:STRDATA <代入先文字列変数>
DATA、DATAFORM、DATALIST〜ENDATA
ENDDATA
内容:DATA構文で指定された文字列からランダムで1つを返す
DATALIST構文中のDATA系は改行文字で連結して返されます
==== STRCOUNT <検索対象文字列>, <検索文字列> ====
文字列中の指定部分文字列の数を取得する命令です。ヒットした数をRESULT:0に代入します。
検索文字列の書式はC#の正規表現の仕様に準じます。
==== SAVEDATA <数式>, <文字列式> ====
<数式>で示される番号のファイルに現在の状態をセーブします。
SAVEDATA命令は@SAVEINFOを呼び出さないのでPUTFORMでコメントを入れることができません。
代わりに2つ目の引数の<文字列式>でコメントを指定します。
(1.704からは文字列変数だけでなく文字列式が使用できます) 以下に例を示します。
GETTIME
STR:0 = %RESULTS:0% {DAY+1}日目
SAVEDATA 14, STR:0
SAVEDATA 15, RESULTS:0 + " " + @"{DAY+1}日目"
結果(ロード画面)
[13] ----
[14] 2009年03月28日 00:31:27 1日目
[15] 2009年03月28日 00:31:27 1日目
[16] ----
上書きの確認などは行わないので必要ならERB側で用意してください。\\
既にデータがあるかどうかはCHKDATA命令で調べることができます。\\
SAVEDATAは(SAVEGAME命令と違って)スクリプトのどの場所でも呼び出すことができます。\\
==== MATCHALL ====
MATCHALL <変数>, <検索値>, <範囲始点>, <範囲終点>
MATCHALL <変数>, <インデックス>, <検索値>, <範囲始点>, <範囲終点>
* 対象変数の要件は非キャラクタ変数(1次元)かキャラクタ変数(無次元・1次元)のいずれか
* 変数の型は問わない
* 対象が1次元キャラクタ変数の場合走査対象のインデックスが定数として与えられる
* Iをループカウンタとして非キャラクタ変数の場合はVAR:Iを、キャラクタ変数の場合はVAR:IあるいはVAR:I:インデックスを走査する
* 一致した値の数がRESULT:0に代入され、RESULT:1以降には一致したIが順番に代入される。RESULTのサイズを超えた分は捨てられる(RESULT:0の値には判定される)
* 範囲終点は範囲に含まれません(0,3とした場合0,1,2が走査される)
* 文字列の場合、正規表現に対応しない
==== int HASH_XXH32(str ハッシュ名) ====
* ハッシュ名に対応したハッシュ値を、32bit内の数字で返す。
==== int HASH_XXH3(str ハッシュ名) ====
* ハッシュ名に対応したハッシュ値を、64bit内の数字で返す。
==== GETCSVNOBYNAME, GETCSVNOBYCALLNAME, GETCSVNOBYNICKNAME, GETCSVNOBYMASTERNAME(str 検索対象) ====
* 引数で指定した文字列と一致するNAME(CALLNAME/NICKNAME/MASTERNAME)が定義されているキャラクターCSVのNOを返す。
* 存在しない場合は-1を返す。
* 複数存在している場合は最初にヒットしたものを返す。
==== オプション[新しい高速なアルゴリズムを使う] ====
* 設定でONにすることにより、より高速なRANDが提供される。
* このオプションを利用する場合、[DUMPRAND][INITRAND][RANDOMAIZE]の乱数に関する命令3種が無視される。