最終更新:ID:FSIY/G1oKw 2011年09月21日(水) 09:05:45履歴
eraで何かを開発したい人たち向けの覚え書きです。なお対象はeramakerおよびEmueraを想定しています。eramaker2およびなでしこに関しては各自研究するなりしてください。
また、以降においては、WINDOWSXP/Vista/7での開発を想定しています。WINDOWS95/98/98SE/Me/NT/2000やMacや携帯OSなどでの開発に関しては各自研究するなりしてください。
下段の構文においては、変数名であるAも演算子である+=も加算されるべき数字である1もいずれも全角文字では認識できずにエラーになってしまいます。
これは、eramakerおよびEmueraにおいては命令や変数や演算子に関しては半角文字でしか認識しないために起こることです。
下段の構文においては命令語であるPRINTLのRのみが全角文字になってしまっています。これも命令語として認識できないためエラーになってしまうのです。
中の段の構文においては命令語であるPRINTFORMの直後に必要な半角スペースがありませんのでエラーになってしまいます。
下の段の構文においては命令語であるPRINTFORMの直後に全角スペースが空いていますが、全角スペースは半角スペースの変わりとはなりえませんのでこれもエラーとなってしまいます。
下の段の構文のように半角スペースを複数並べた場合についてはeramakerとEmueraとで動作が異なります。
また、下段の構文においては、条件式は数字の0以外であるので「真」になります。
また、以降においては、WINDOWSXP/Vista/7での開発を想定しています。WINDOWS95/98/98SE/Me/NT/2000やMacや携帯OSなどでの開発に関しては各自研究するなりしてください。
- 拡張子を表示させられるようにする。
- CSVフォルダ内のファイル
- ERBフォルダ内のファイル
- 全角文字と半角文字の区別をつける。
- 空白文字について知る
- 「真」と「偽」について
- ブロック構文
- ブロック構文とは?
- IF〜ELSEIF〜ELSE〜ENDIFブロック
- REPEAT〜CONTINUE〜BREAK〜RENDブロック
- SELECTCASE〜CASE〜CASEELSE〜ENDSELECTブロック
- FOR〜CONTINUE〜BREAK〜NEXTブロック
- WHILE〜CONTINUE〜BREAK〜WENDブロック
- DO〜CONTINUE〜BREAK〜LOOPブロック
- PRINTDATA系〜DATA〜DATALIST〜ENDLIST〜ENDDATAブロック
- TRYCCALL系〜CATCH〜ENDCATCHブロック
- TRYCJUMP系〜CATCH〜ENDCATCHブロック
- TRYCGOTO系〜CATCH〜ENDCATCHブロック
- TRYCALLLIST〜FUNC〜ENDFUNCブロック
- TRYJUMPLIST〜FUNC〜ENDFUNCブロック
- TRYGOTOLIST〜FUNC〜ENDFUNCブロック
- ブロック構文とは?
WINDOWSのファイルには必ず、拡張子と呼ばれるファイル属性をあらわす部分が存在しますが、OSのデフォルト設定でそれが表示されないようになっています。そのままではeramakerで開発することはできないと断言できますので表示されるように設定しましょう。詳しくは各OSの説明をみるかネットで検索してください。以下では代表的なOSについて説明します。
- 「スタート」ボタンから「マイ コンピュータ」を開きます。
- 「メニューバー」の「ツール」から「フォルダオプション」を選択します。
- 「フォルダオプション」画面が表示されるので「表示」タブを選択します。
- 「詳細設定」の「登録されているファイルの拡張子は表示しない」のチェックを外します。
- 「ファイルとフォルダの表示」で「すべてのファイルとフォルダを表示する」を選択します。
- 「OK」ボタンをクリックすれば設定変更が完了です、これで全てのファイルの拡張子が表示されます。
- 適当なフォルダから、整理、フォルダと検索のオプションをクリックします。
- 表示タブから、登録されている拡張子は表示しない、のチェックを外します。
- 適用をクリックし、ウィンドウを閉じます。
- [スタート]→[コントロールパネル]の順にクリックします。
- コントロールパネルの表示方法:[小さいアイコン]をクリックします。
- [フォルダオプション]をクリックします。
- フォルダオプションウィンドウが開かれたら、[表示]タブを選択します。
- 『登録されている拡張子は表示しない(下から3つ目)』のレ点を外す。
- [適用]ボタンをクリックします。
eramakerとEmueraが正常に動くにはそれらの実行ファイル(eramakerならばeramaker.exe、EmueraならばEmueraXXX.exe XXXにはEmueraのバージョンが入っています)と同じフォルダにCSVフォルダとERBフォルダが必要になります。
ここでは、そのうちCSVフォルダ内のファイルについての基礎を説明します。
なお、CSVフォルダ内のファイルに関しては、規則にしたがったファイル名前のファイルのみ読み込まれます。また、そのファイルの中身はテキストファイルでなければなりません。
ここでは、そのうちCSVフォルダ内のファイルについての基礎を説明します。
なお、CSVフォルダ内のファイルに関しては、規則にしたがったファイル名前のファイルのみ読み込まれます。また、そのファイルの中身はテキストファイルでなければなりません。
Emuera専用に、_default.configと_fixed.configという2つのファイルが存在しています。これらはEmuera自体の設定のためのファイルでEmuera起動時に最初に読み込まれて設定されるものです。なお、上の2つ以外の.configファイルが存在したとしてもそれらは無視されます。また、当然ですが、eramakerはこれらのファイルを読み込みません。
拡張子がCSVとなっていますが、一般的な「表計算」ファイルではなくて単なるテキストファイルです。ですが、拡張子がTXTとかERBとかになっていたら読み込まれませんので注意してください。また、内部での記述ルールはERBファイルとは異なります。
eramakerでもEmueraでも読み込まれるCSVファイルは以下の通りです。
CHARA**.CSV ABL.CSV TALENT.CSV EXP.CSV MARK.CSV PALAM.CSV ITEM.CSV STR.CSV TRAIN.CSV GAMEBASE.CSV
Emueraでのみ読み込まれるCSVファイルは以下の通りです。
BASE.CSV SOURCE.CSV EX.CSV EQUIP.CSV TEQUIP.CSV FLAG.CSV TFLAG.CSV CFLAG.CSV TCVAR.CSV CSTR.CSV STAIN.CSV CDFLAG1.CSV CDFLAG2.CSV _REPLACE.CSV _RENAME.CSV VARIABLESIZE.CSV (ここより以下はEmuera ver.1804より) STRNAME.CSV TSTR.CSV SAVESTR.CSV GLOBAL.CSV GLOBALS.CSV上にあるCSV以外の名前のCSVファイルがあっても読み込まれません。
- JUEL.CSV
- NOWEX.CSV
CSVファイルのほとんどは必要でなければあえて作っておく必要はありません。たとえば、ABL.CSVがなくても基本的には問題なく動きます。しかしながらABL.CSVを設定しておくと以下のようなメリットがあります。
以上のことは、TALENT.CSV・EXP.CSV・MARK.CSV・PALAM.CSV・ITEM.CSV・TRAIN.CSVにも当てはまります。
またEmueraならばBASE.CSV・SOURCE.CSV・EX.CSV・EQUIP.CSV・TEQUIP.CSV・FLAG.CSV・TFLAG.CSV・CFLAG.CSV・TCVAR.CSV・CSTR.CSV・STAIN.CSV・CDFLAG1.CSV・CDFLAG2.CSVにも当てはまるでしょう。
また、Emuera専用である_REPLACE.CSV・_RENAME.CSV・VARIABLESIZE.CSVについても以下の理由があれば必要はないでしょう。
・ABLNAME文字列変数にABL.CSVの内容が代入される。 ・ABLという数値変数がどういう意味なのかを呈示できる。Emueraの場合はさらに
・ABL:{ABLNAMEの中身} という記述をERBコード内ですることができる。 (ABL.CSVの中で 「0,従順」と指定されていた場合 従来は ABL:0 などとすべきところを、 ABL:従順 とも記述できる)これらのメリットを考慮しても不必要だと思ったならABL.CSVは必要ありません。ですが、ABL.CSVがあるほうが結果的にわかりやすくなると思われます。
以上のことは、TALENT.CSV・EXP.CSV・MARK.CSV・PALAM.CSV・ITEM.CSV・TRAIN.CSVにも当てはまります。
またEmueraならばBASE.CSV・SOURCE.CSV・EX.CSV・EQUIP.CSV・TEQUIP.CSV・FLAG.CSV・TFLAG.CSV・CFLAG.CSV・TCVAR.CSV・CSTR.CSV・STAIN.CSV・CDFLAG1.CSV・CDFLAG2.CSVにも当てはまるでしょう。
また、Emuera専用である_REPLACE.CSV・_RENAME.CSV・VARIABLESIZE.CSVについても以下の理由があれば必要はないでしょう。
・_REPLACE.CSV ハードコードされた処理の一部を入れ替える処理を行わない場合。 ・_RENAME.CSV コードの一部について書き換え処理をしない場合。 ・VARIABLESIZE.CSV 各変数の配列要素の上限を特に設定しない場合。これらについて詳しくは、EmueraWikiおよびそのほかera関連の開発資料を各自調査してください。ここではこれ以上は説明しません。
eramakerとEmueraが正常に動くにはそれらの実行ファイル(eramakerならばeramaker.exe、EmueraならばEmueraXXX.exe XXXにはEmueraのバージョンが入っています)と同じフォルダにCSVフォルダとERBフォルダが必要になります。
ここでは、そのうちERBフォルダ内のファイルについての基礎を説明します。
なお、ERBフォルダ内のファイルに関しては、ERBの拡張子のついたすべてのファイルを読み込みます。そして、それらはテキストファイルでなければなりません。
ここでは、そのうちERBフォルダ内のファイルについての基礎を説明します。
なお、ERBフォルダ内のファイルに関しては、ERBの拡張子のついたすべてのファイルを読み込みます。そして、それらはテキストファイルでなければなりません。
eramakerやEmueraが起動するとCSVフォルダ内のファイルによる初期設定およびエラーチェックをおこない、その後に特定の順序にしたがってひとつずつ順番にERBファイル内の記述を実行していきます。同時に複数のERBファイル内の記述を実行することはありません。
A += 1 A += 1ここで上の例のうち上段の構文は、A:0変数に1を加算するというものです。
下段の構文においては、変数名であるAも演算子である+=も加算されるべき数字である1もいずれも全角文字では認識できずにエラーになってしまいます。
これは、eramakerおよびEmueraにおいては命令や変数や演算子に関しては半角文字でしか認識しないために起こることです。
PRINTL あいう PRINTL あいうここで上の例のうち上段の構文は、「あいう」という言葉を表示して改行するというものです。
下段の構文においては命令語であるPRINTLのRのみが全角文字になってしまっています。これも命令語として認識できないためエラーになってしまうのです。
PRINTFORM {COUNT} PRINTFORM{COUNT} PRINTFORM {COUNT}ここで上の例のうちの最上段の構文は、COUNT変数の数値を表示するというものです。
中の段の構文においては命令語であるPRINTFORMの直後に必要な半角スペースがありませんのでエラーになってしまいます。
下の段の構文においては命令語であるPRINTFORMの直後に全角スペースが空いていますが、全角スペースは半角スペースの変わりとはなりえませんのでこれもエラーとなってしまいます。
CALL HOGE CALL HOGEここで上の例のうち上段の構文は、関数HOGEを呼び出すというものです。
下の段の構文のように半角スペースを複数並べた場合についてはeramakerとEmueraとで動作が異なります。
・eramakerの場合 エラーを出して、CALLは行わずに次の行に処理を移します。 つまり、関数「@ HOGE」 が見つけられないのでこういう挙動になります。 ・Emueraの場合 エラーは出さずに、関数HOGEを呼び出します。つまり、関数名の前の半角スペースは一切無視されます。
この例からは以下のことが言えます。
・eramaker 関数名の冒頭に「半角スペースによる空白」が存在している場合はそれを関数名の一部として扱う。 >「HOGE」と「 HOGE」と「 HOGE」などはそれぞれ別の関数として扱われる。 ・Emuera 関数名の冒頭に「半角スペースによる空白」が存在してもそれを無視する。 >「HOGE」と「 HOGE」と「 HOGE」はすべて同名関数として扱われる。
eramakerやEmueraにおいては直接文字列を評価できないため、空文字列や"0"という文字列が真偽であるかどうかというのは直接判定することはできません。つまり…
SIF "0" SIF STR:0上の例の構文はいずれもエラーを出してしまいます。
IFおよびSIFにおける条件式において、eramakerやEmueraはその条件式が「真」であればその直後のコードを実行します。その際に「真」か「偽」かいずれかの結果が必ず判定されます。それ以外の「第三の値」はとりえません。
SIF 0 SIF 2ここで上の例のうち上段の構文においては、条件式は数字の0であるので「偽」となります。
また、下段の構文においては、条件式は数字の0以外であるので「真」になります。
この例はEmuera専用です。eramakerでは意図通り動作しません。
また、この例がEmuera専用なのは、eramakerが文字列演算や文字列操作に不自由な仕様になっているからです。
SIF STR:0 == "HIGH"ここで上の例の構文においては、条件式は文字列変数STR:0の中身が「HIGH」ならば成り立つので「真」、そうでなければ「偽」となります。なお「"HIGH"」とか「HIGH」とかは成り立たないことに注意してください。
また、この例がEmuera専用なのは、eramakerが文字列演算や文字列操作に不自由な仕様になっているからです。
条件分岐をおこなうためのブロック構文です。
IF (条件A) ^ (条件A)が真ならば実行されるべきコード ELSEIF (条件B) ^ (条件A)が偽であり、なおかつ(条件B)が真ならば実行されるべきコード ELSE ^ (条件A)も(条件B)も偽であるならば実行されるべきコード ENDIF特定の条件を満たしているかどうかで処理を分けたいときに使われるものです。なお、ELSEIFやELSEについては不要ならば記述しなくても問題はありませんが、ENDIFはIFブロックの終点を表すので必ず記述しなければなりません。
ループ(繰り返し)処理をおこなうためのブロック構文です。
なお、REPEATループ中はCOUNT:0変数がループの最初に0にセットされ、ループするごとに+1されていきます。このCOUNT:0変数のことをカウンター変数と言うこともあります。
SIFというのは、その直後の条件が真であるならばその次の一行を実行するが、偽ならばその次の一行は実行しないという分岐構文です。IF文の簡略系だと考えればいいです。
CONTINUEとは、それ以降からRENDまでのコードを実行せずにループの最初であるREPEATに飛ばすというものです。
BREAKとは、その時点でループを打ち切ってRENDの次の行に飛ばすというものです。
REPEAT (数値or数値型変数) ^ ループ中に実行されるべきコード ^ SIF (条件C) ^ ^ CONTINUE ^ SIF (条件D) ^ ^ BREAK RENDREPEAT文の後ろの数字の回数だけREPEAT〜RENDの中を繰り返し実行したいときに使われるものです。なお、CONTINUEやBREAKについては不要ならば記述しなくても問題ありませんが、RENDはREPEATブロックの終点を表すので必ず記述しなければなりません。
なお、REPEATループ中はCOUNT:0変数がループの最初に0にセットされ、ループするごとに+1されていきます。このCOUNT:0変数のことをカウンター変数と言うこともあります。
SIFというのは、その直後の条件が真であるならばその次の一行を実行するが、偽ならばその次の一行は実行しないという分岐構文です。IF文の簡略系だと考えればいいです。
CONTINUEとは、それ以降からRENDまでのコードを実行せずにループの最初であるREPEATに飛ばすというものです。
BREAKとは、その時点でループを打ち切ってRENDの次の行に飛ばすというものです。
Emuera専用の条件分岐をおこなうためのブロック構文です。
SELECTCASE (条件式) ^ CASE (条件式の評価E) ^ ^ (条件式の評価E)のときに実行されるべきコード ^ CASE (条件式の評価F) ^ ^ (条件式の評価E)でなくて、なおかつ(条件式の評価F)のときに実行されるべきコード ^ CASEELSE ^ ^ (条件式の評価E)でも(条件式の評価F)でもない場合において実行されるべきコード ENDSELECTIFブロックと違って、条件式は真偽ではなくて得られた値(数値の場合もあれば文字列の場合もある)そのものにより分岐させるために使われるものです。なお、CASEELSEについては不要ならば記述しなくても問題ありませんが、ENDSELECTはSELECTCASEブロックの終点を表すので必ず記述しなければなりません。
Emuera専用のループ(繰り返し)処理をおこなうためのブロック構文です。
なお、CONTINUEやBREAKについては不要ならば記述しなくても問題ありませんが、NEXTはFORブロックの終点を表すので必ず記述しなければなりません。CONTINUEやBREAKの働きはREPEAT文のときと同じです。
FOR (数値型変数),数式1,数式2,数式3 ^ ループ中に実行されるべきコード ^ SIF (条件G) ^ ^ CONTINUE ^ SIF (条件H) ^ ^ BREAK NEXTREPEAT文の完全上位構文で、カウンター変数に数値変数ならばなんでも利用していいものとなっています。数式1はそのカウンター変数のループに入るときの初期値で、数式2はそのカウンター変数がその数値になった時点でループを抜け出すというもので、数式3はループを1回まわるごとにカウンター変数にどれだけ加算させるかというものです。数式3がマイナスならばカウンター変数は減少していきますし省略すれば1を加算していくことになります。
なお、CONTINUEやBREAKについては不要ならば記述しなくても問題ありませんが、NEXTはFORブロックの終点を表すので必ず記述しなければなりません。CONTINUEやBREAKの働きはREPEAT文のときと同じです。
Emuera専用のループ(繰り返し)処理をおこなうためのブロック構文です。
DOループと違うのはこちらはループ内を実行しないことがありえるということです。
WHILE (数式) ^ ループ中に実行されるべきコード ^ SIF (条件G) ^ ^ CONTINUE ^ SIF (条件H) ^ ^ BREAK WENDWHILEの後ろの数式が真である(0以外である)限りはループし続けるという構文です。当然、ループ内でその数式が真になるコードを記述しなければ無限ループに陥るでしょう。なお、CONTINUEやBREAKについては不要ならば記述しなくても問題ありませんが、WENDはWHILEブロックの終点を表すので必ず記述しなければなりません。CONTINUEやBREAKの働きはREPEAT文のときと同じです。
DOループと違うのはこちらはループ内を実行しないことがありえるということです。
Emuera専用のループ(繰り返し)処理をおこなうためのブロック構文です。
WHILEブロックと違うのはこちらは必ずループ内部を一回は実行するということです。
DO ^ ループ中に実行されるべきコード ^ SIF (条件G) ^ ^ CONTINUE ^ SIF (条件H) ^ ^ BREAK LOOP (数式)LOOPの後ろの数式が真である(0以外である)限りはループし続けるという構文です。当然、ループ内でその数式が真になるコードを記述しなければ無限ループに陥るでしょう。なお、CONTINUEやBREAKについては不要ならば記述しなくても問題ありませんが、DOはDOブロックの始点を表すので必ず記述しなければなりません。CONTINUEやBREAKの働きはREPEAT文のときと同じです。
WHILEブロックと違うのはこちらは必ずループ内部を一回は実行するということです。
Emuera専用の表示に特化した分岐ブロック構文です。
並んでいるどのDATAが表示されたのか?については、PRINTDATAの後ろの数値変数に数値として代入されますので、その後のコードで参照することができます。ちなみに、一番上のDATAなら1、その次なら2…というふうに代入されています。
あくまで表示に特化しており演算や関数呼び出しなど他の用途には利用できません。
PRINTDATAには以下の亜種が存在します。
PRINTDATA (数値変数) ^ DATA (表示されるべき文字) ^ DATAFORM (表示されるべきFORM文字列) ^ DATALIST ^ ^ DATA (表示されるべき文字) ^ ^ DATAFORM (表示されるべきFORM文字列) ^ ENDLIST ENDDATAブロックの中の DATALIST〜ENDLIST部分の部分およびそのLISTの中にないDATAおよびDATAFORMの後ろにある文字を確率均一でランダムに選別して表示するという構文です。DATAとDATAFORMの違いはFORM文字列を使えないか使えるかの違いです。また、DATAやDATAFORMは通常では一行分しか表示できませんが、DATALIST〜ENDLISTで囲むことによりその中で何行でも記述することができます。
並んでいるどのDATAが表示されたのか?については、PRINTDATAの後ろの数値変数に数値として代入されますので、その後のコードで参照することができます。ちなみに、一番上のDATAなら1、その次なら2…というふうに代入されています。
あくまで表示に特化しており演算や関数呼び出しなど他の用途には利用できません。
PRINTDATAには以下の亜種が存在します。
PRINTDATA FORCEKANAの指定を無視し、SETCOLORによる色指定の影響を受けて表示します。 PRINTDATAK FORCEKANAによる指定の影響を受けて表示します。 PRINTDATAD SETCOLORによる色指定を無視してCONFIG指定の色で表示します。 PRINTDATAL 表示した後に改行します。 PRINTDATAW 表示した後に改行して、WAITします。 PRINTDATAKL PRINTDATAKとPRINTDATALのそれぞれを合わせて適用します。 PRINTDATADL PRINTDATADとPRINTDATALのそれぞれを合わせて適用します。 PRINTDATAKW PRINTDATAKとPRINTDATAWのそれぞれを合わせて適用します。 PRINTDATADW PRINTDATADとPRINTDATAWのそれぞれを合わせて適用します。
Emuera専用の関数呼び出しに特化した分岐構文です。
また、この構文にはFORM構文を利用できる派生が存在します。
TRYCCALL (関数1) (, 引数1, ……) ^ (関数1)が存在し、(関数1)の処理が終わったあとに実行されるべきコード。 CATCH ^ (関数1)が存在しなかったときに実行されるべきコード。 ENDCATCHただのTRYCALLの場合ならば、関数がなかった場合の専用処理を記述することができませんが、このTRYCCALLならば可能です。なお、TRYCCALLとCATCHの間のコードについては不要ならばなくてもエラーにはなりません。
また、この構文にはFORM構文を利用できる派生が存在します。
TRYCCALLFORM (FORM構文で記述された関数) (, 引数1, ……) ^ (関数)が存在し、(関数)の処理が終わったあとに実行されるべきコード。 CATCH ^ (関数)が存在しなかったときに実行されるべきコード。 ENDCATCH
Emuera専用の関数移動に特化した分岐構文です。
また、この構文にはFORM構文を利用できる派生が存在します。
TRYCJUMP (関数2) (, 引数1, ……) CATCH ^ (関数2)が存在しなかったときに実行されるべきコード。 ENDCATCHただのTRYJUMPの場合ならば、関数がなかった場合の専用処理を記述することができませんが、このTRYCJUMPならば可能です。
また、この構文にはFORM構文を利用できる派生が存在します。
TRYCJUMPFORM (FORM構文で記述された関数) (, 引数1, ……) CATCH ^ (関数)が存在しなかったときに実行されるべきコード。 ENDCATCH
Emuera専用の関数内移動に特化した分岐構文です。
また、この構文にはFORM構文を利用できる派生が存在します。
TRYCGOTO (ラベル1) CATCH ^ (ラベル1)が存在しなかったときに実行されるべきコード。 ENDCATCHただのTRYGOTOの場合ならば、ラベル1がなかった場合の専用処理を記述することができませんが、このTRYCGOTOならば可能です。
また、この構文にはFORM構文を利用できる派生が存在します。
TRYCGOTOFORM (FORM構文で記述されたラベル) (, 引数1, ……) CATCH ^ (ラベル)が存在しなかったときに実行されるべきコード。 ENDCATCH
Emuera専用の関数呼び出しに特化した分岐構文です。
TRYCALLLIST ^ FUNC (関数3) (, 引数1, 引数2……) ^ FUNC (関数4) (, 引数1, 引数2……) ENDFUNC複数の関数を上から順に存在を調べ、最初に見つかった関数のみを呼び出す(CALLする)というもので、戻ってきたらENDFUNCの次に飛びます。なお、ENDFUNCはTRYCALLLISTブロックの終点を表すので必ず記述しなければなりません。
Emuera専用の関数移動に特化した分岐構文です。
TRYJUMPLIST ^ FUNC (関数5) (, 引数1, 引数2……) ^ FUNC (関数6) (, 引数1, 引数2……) ENDFUNC複数の関数を上から順に存在を調べ、最初に見つかった関数へ移動する(JUMPする)というもので、どの関数も見つからなければENDFUNCの次に飛びます。なお、ENDFUNCはTRYJUMPLISTブロックの終点を表すので必ず記述しなければなりません。