eramaker2 マニュアル



改造の次のステップ

KAGについてもう少し理解する - TJSについてもう少し理解する - 口上を変えてみる - デバッグのやり方 基礎

KAGについてもう少し理解する

タグの属性 - KAGの変数 - KAGのif

タグの属性


KAGで文章を表示するやり方、簡単なタグ(命令)を使うやり方はすでに勉強しました。
またeramainフォルダのtitle.ksを開いてみて下さい。


[endscript]

*loop

例によってここに書き込んでいきます。


[endscript]
[font size=20 color=0xff0000]大きい表示[r]
*loop

[font size=20 color=0xff0000]は全て半角です。この状態で保存し、ゲームを起動してみましょう。
大きな赤い文字で表示されましたね?

はじめから、つづきからの部分も大きな赤い文字になっています。

このように、fontというタグにはsize(文字の大きさ)、color(文字の色)といった属性を指定することができるのです。
0xff0000というのが見慣れない表現だと思いますが、これはコンピュータで色を指定するときによく使う表現です。0xというのは16進法という意味、ff 00 00 という2文字ずつがそれぞれ「赤 緑 青」を表しています。
「16進法 色」でGoogle検索するのが一番すぐイメージできるでしょう。
http://www.google.co.jp/search?q=%ef%bc%91%ef%bc%96%e9%80%b2%e6%b3%95%e3%80%80%e8%89%b2
必要に応じて使いたい色を検索し、0x88ccffなどのように使えばいいわけです(ちなみにこれは明るい水色)。

さて、続いて

[endscript]
[font size=20 color=0xff0000]大きい表示[font size=default color=default][r]
*loop

こんな風に加筆して保存し、ゲームを起動してみてください。[font size=default color=default]も全部半角です。

今度ははじめから、つづきからは白くて小さい字に戻っていますね?
sizeやcolorは、defaultという値を指定すると「元に戻れ」という意味になるのです。

タグにもタグに指定できる属性にもきわめて多くのものがありますが、eramaker2でよく使うものはそう多くないので必要に応じて覚えていけばよいでしょう。

KAGの変数


パラメータを保存する変数。そして、「もし〜〜だったら」ということを表現するif
この2つはeramaker2でゲームを作るときにもっともキモになる部分です。KAGでもTJSでもこれをしっかり書いて読める(最低でも読める)ようにならないとキッチリゲームを作ることはできません。まずは変数から見ていきましょう。


[endscript]

*loop

今回もtitle.ksのここに書き込んでいきます。


[endscript]
[e v="MONEY = 12000"]
[e m="MONEY"]円持っています。[l][r]
[e v="MONEY -= 3000"]
[e m="MONEY"]円持っています。[l][r]
*loop

このようにして、保存しゲームを起動します。「円持っています。」以外は半角です。スペースを全角にしたりしないように注意して下さい。


このように表示されました。1行目はMONEYを12000に設定。2行目はそのMONEYを表示。3行目はMONEYを3000減らす。4行目で再びそのMONEYを表示。12000から3000減ったから9000になったわけです。

このようにデータを入れたり計算したりできるものを「変数」と呼びます

MONEYはeramaker2で最初から作られている変数の1つです。MONEY、つまりお金ですね。


[e v="MONEY = 12000"]

KAGで変数をいじるときの基本は、このように[e v=" "]です。そして、変数を左、半角のイコールをはさんで右に入れたい数字を書きます。

[e v="MONEY = 5000+7000"]

こんな風に、足し算などの計算をしてその結果を変数に入れることも出来ます。

[e v="MONEY = 15000-3000"]
[e v="MONEY = 200*60"]
[e v="MONEY = 60000/5"]
[e v="MONEY = 100000%44000"]

どれもMONEYには12000が入ります。かけ算は * 割り算は / です。%は割り算のあまりを求めるというやや特殊な計算です。


[e v="MONEY = 2+1.5"]
[e v="MONEY = 7/2"]
[e v="MONEY = int(4-0.5)"]

上の2つはどちらもMONEYが3.5になります。3つめは「むりやり整数にしろ」という意味で、小数点部分が切り捨てされます。つまり3.5ではなく3が入るわけです。このように、eramaker2ではeramaker1と違って自由に小数を使うことができます


[e v="MONEY -= 3000"]

この-=というのは「右側の数字を引く」という意味です。つまり「3000を引く」ですね。
+=なら足し算、*=ならかけ算、/=なら割り算です。よく使います。


[e v="DAY = 5"]
[e v="TIME = DAY+10"]
[e v="MONEY = TIME*(DAY+2)"]
[e m="MONEY"]円持っています。[l][r]

こんな風に、変数同士で計算をしたり、変数を別の変数に入れる(代入といいます)こともできます。カッコを使った計算もできます。DAYもTIMEもeramaker2で最初から作られている変数です。

そしてさっきから出てきている[e m="MONEY"]というのは、「MONEYの中身を画面に表示しろ」という意味です。いくら変数の中身が変わっても、画面にその結果がわからなければ意味がありませんね。
このように、KAGで変数を使うときは[e v=" "]と[e m=" "]が肝心です。

(※ちなみにこのeというのは吉里吉里に最初から用意されているタグではなく、eramaker2が用意したものです。本当は[eval exp=" "]あるいは[emb exp=" "]と書かなくてはいけないのですが、長くなるので[e v=" "]と[e m=" "]で済むようにしました。このオリジナルのタグを用意する仕組みをマクロと言いますが、いまのところは意識しなくて大丈夫です)

KAGのif


続いて、ifについて見ていきましょう。

[endscript]

*loop

title.ksのおなじみのところです。


[endscript]
[e v="MONEY = 12000"]
[if exp="MONEY >= 20000"]
20000円以上です。[r]
[elsif exp="MONEY > 10000"]
10000円より多いです。[r]
[else]
10000円以下です。[r]
[endif]
*loop

exp=" " の部分の " "を抜かさないように注意して下さい。
また4行目、6行目、8行目の頭にある数文字分の空白はTabキーで打ち込んでください。キーボードの左端中央あたりにあるはずです。
さらに、elsifをelseifと打たないようにしてください。eramaker1と違います。

こんな結果になりました。

さて、最初の行は、前の変数のところで学んだとおりMONEYに12000を入れているわけですね。

その次の行に、ifタグがあります。そしてexpという属性に、"MONEY >= 20000"、つまりMONEYは20000以上か?という条件を指定しているわけです。MONEYは12000なのでこれは不成立です。
こうなった場合、次のelsifに飛びます。すなわち「20000円以上です。[r]」は実行されません。
次のelsifのところの条件はどうか。"MONEY > 10000"、MONEYは10000より多い。これは成立しています。この場合、次の行から順番に実行されていきます。つまり「10000円より多いです。[r]」が実行されるわけです。
そして[else]まで来ると、その後は[endif]まで一気にジャンプしてしまいます。よって「10000円以下です。[r]」は実行されません。

結果を見れば、12000は10000より多いという当たり前のメッセージが表示されただけということになります。
しかし、最初のところでMONEY = 12000を色々な数字に変えてみて下さい。たとえばMONEY = 8000やMONEY = 10000やMONEY = 20000に。それぞれの値にしたがって表示される結果が違うはずです。


[if exp="○○"]
;もし○○なら
[elsif exp="△△"]
;○○でなく、△△なら
[elsif exp="□□"]
;○○でも△△でもなく、□□なら
[else]
;○○でも△△でも□□でもないなら
[endif]


こういう流れがifの基本です。なお、[elsif]は基本的にいくつでも並べていくことができます。

A == B 左と右が等しい(==と2つ並べることに注意!!)
A > B 左が右より大きい
A >= B 左が右以上
A < B 左が右より小さい
A <= B 左が右以下
A != B 左と右が等しくない
また、比較に使うこうした記号も覚えておきましょう。特に == が大切です。= が1つだと変数に値を入れる(代入)、== と2つになると「等しいかどうか」という比較の意味になるのです。

ところで、「10000円より多いです。」と表示されたとき、テキストエディタ上では

10000円より多いです。[r]

と左端にTabのスペースがあるのに、ゲームでは左端の数文字分の空白が表示されていないですよね?
このように、行頭にTabで作ったスペースは無視されます。このため、ifなどを使った文を書くときに構造を見やすくすることができます。


[if exp="○○"]
[if exp="△△"]
;もし○○で、しかも△△なら
[else]
;もし○○で、しかし△△でないなら
[endif]
[else]
[if exp="××"]
;もし○○でなく、そして××なら
[elsif exp="□□"]
;もし○○でなく、××でなく、そして□□なら
[elsif exp="◇◇"]
;もし○○でなく、××でなく、□□でなく、◇◇なら
[endif]
[endif]

ifはこんな風に入れ子にすることもできるのです。こういうとき、Tabによるスペースで構造を明確にすると見やすくなります。

ifの書き方はきっちりとマスターしておきましょう。特にifで始まったらendifで終わることは忘れずに。ゲームを開発しているときに非常に出しやすいバグはendif忘れです。他にもif絡みはバグの出やすいところですから(expの後の" "の閉じ忘れとか)、気をつけましょう。

TJSについてもう少し理解する

TJSの変数 - TJSのif - *変数について - *変数の注意 - *変数の簡易リスト

TJSの変数


先ほどKAGで変数を使うやり方を勉強しましたが、実はあれはKAGから一瞬TJSを呼び出しているだけです。
つまり、「TJSを呼び出す」部分を省略すればそれだけでTJSの変数を操ることができます。

dataフォルダのeracomフォルダから000愛撫.tjsを開いてみてください。


COM.COM0 = function() {
*STR(0) = "愛撫";

*LOSEBASE("体力") += 5;
*LOSEBASE("気力") += 50;

TJSについてちょっと理解する」でも見た部分ですね。


COM.COM0 = function() {
MONEY += 100;
*STR(0) = "愛撫";

*LOSEBASE("体力") += 5;
*LOSEBASE("気力") += 50;

こんな風に変えてみましょう。
KAGであれば[e v="MONEY += 100"]と書くところを、[e v=""] を省き、代わりに ; が加わった形と見ることもできますね(「TJSについてちょっと理解する」でも見たとおり、TJSでは行の終わりには基本的に半角の;を入れます)。

これを保存してゲームを起動し、愛撫を実行してみてください。実行するたびにお金が100$増えるはずです。
TJSで変数を扱うのは、KAGでの変数の使い方を理解していれば簡単です。

TJSのif


続いて、TJSのifについて見てみましょう。


COM.COM0 = function() {
*STR(0) = "愛撫";

MONEY = 12000;
if(MONEY >= 20000) {
PrintQ("20000円以上です。");
} else if(MONEY > 10000) {
PrintQ("10000円より多いです。");
} else {
PrintQ("10000円以下です。");
}

*LOSEBASE("体力") += 5;
*LOSEBASE("気力") += 50;

使うのはさっきと同じ愛撫000.tjsです。
KAGのifで取り上げたのと同じ分岐にしてみました。
PrintQのあとは (" で始まり、 "); で終わることに注意して下さい。(※PrintQの意味についてはまた別のところで)

これで保存して起動してみましょう。


KAGのifのときと同じような結果になりましたね。
MONEY = 12000の部分をいじれば、結果も変化します。
KAGと違うのは、

[if exp=" "]ではなくif( )という書き方をすること。
elsifはelse ifと書くこと。
endifは要らないこと。
{ }で区切りを作ること

以上ですね。

なお、今回の例のようにifの後で処理する命令が1個だけのときは{ }を省いてもかまいません。
maker1のSIFみたいな感じですね。

MONEY = 12000;
if(MONEY >= 20000)
PrintQ("20000円以上です。");
else if(MONEY > 10000)
PrintQ("10000円より多いです。");
else
PrintQ("10000円以下です。");

これでも正常に動作します。


MONEY = 12000;
if(MONEY >= 20000) {
PrintQ("20000円");
PrintQ("以上です。");
} else if(MONEY > 10000)
PrintQ("10000円");
PrintQ("より多いです。");
} else {
PrintQ("10000円");
PrintQ("以下です。");
}

このように命令が2つ以上のときは{ }で区切ることが必須です。

KAGのifと同様に、TJSのifの使い方もしっかりマスターしておいてください。
調教SLGを作るためにはほぼ必須です。

*変数について


普通の変数の使い方についてはもう学びました。が、MONEYやTIMEなどの変数と違う、*で始まる妙な変数がよく出てきているのは皆さんも気づいていると思います。たとえばもっと色々なデータを変えてみるのときは、名雪.txtを改変して作った早苗.txtで


*TALENT("素直") = 1;
*TALENT("献身的") = 1;
*TALENT("保守的") = 1;
*TALENT("V敏感") = 1;
*TALENT("謎の魅力") = 1;

*ABL("従順") = 1;
*ABL("欲望") = 2;
*ABL("技巧") = 2;
*ABL("C感覚") = 2;
*ABL("V感覚") = 3;

*EXP("自慰経験") = 20;
*EXP("V経験") = 100;

*RELATION("渚") = 200;

*OUTLINE_PARTS(0) = "ロングヘア";

こんな感じの部分が出てきました。

これは*変数(コメ変数とでも読んでください)といいます。maker1でいうところの配列にあたるものです。
*変数の特徴は、
・数字でも文字列でもアクセスできる
・キャラデータの場合、何も指定しないとTARGETのキャラ(多くの場合は調教中キャラ)のデータを指していることになる
この2点です。順番に見ていきましょう。

*TALENTというのはキャラの素質についての*変数です。早苗.txtで


*TALENT("素直") = 1;

とすれば早苗に「素直」の素質が付きますし、

*TALENT("素直") = 0;

とすれば「素直」の素質は消えます。

*TALENT("すなお") = 1;

のようにして実行すると、そんな素質はないのでエラーメッセージが出ます。

maker1で開発していた方はご存じのとおり、maker1では

TALENT:13 = 1

このようにすればキャラに「素直」の素質を付けることができました。素質の13番に「素直」が当てられていたからです。
eradataフォルダのeradic.tjs、その200行目あたりを見るとありますが、

SetTalentData("素直",13);

こういう風に書かれています。maker2でも*TALENTにおいて"素直"という文字列が数字の13に関連づけられているのです。


*TALENT(13) = 1;

そのため、こんな風に書いても、「素直」の素質が付けられます。

*TALENT("素直") = 1;
*TALENT(13) = 1;

この2行は全く同じ意味を持っているのです。このように文字列でも数字でもアクセスできるのが*変数の特徴です。

続いてみていきましょう。000愛撫.tjsを開いて下さい。


COM.COM0 = function() {
*STR(0) = "愛撫";

*TALENT("C敏感") = 1;

*LOSEBASE("体力") += 5;
*LOSEBASE("気力") += 50;

おなじみの部分をこう変えて保存し、ゲームを起動して愛撫を実行します。
そして調教中のキャラのデータを見てみると、「C敏感」の素質が付いているはずです。

この時点でも調教者(「あなた」)と調教されているキャラの2人がいるわけですが、キャラデータの*変数は特に指定しない限り調教中のキャラのデータを変更するのです。


COM.COM0 = function() {
*STR(0) = "愛撫";

*TALENT(MASTER,"C敏感") = 1;

*LOSEBASE("体力") += 5;
*LOSEBASE("気力") += 50;

こうしてみるとどうでしょうか?
愛撫を実行しても、調教中キャラに「C敏感」はつきません。代わりに調教者(「あなた」)のデータを見てみると、「C敏感」が付いているはずです。

MASTERという変数には、調教者のキャラ番号が入っています。*変数は、このようにキャラ番号を指定することで調教中キャラ以外のデータにアクセスすることもできるのです。maker1における配列と同じですね。


*TALENT("早苗","C敏感") = 1;

なおこんな風に、名前で指定することもできます。ただこれはちょっと使いどころが少ないかもしれません。

*変数の注意


まず注意しないといけないのは、*ABL("c感覚")や*TALENT("クリ敏感")のように間違った文字列を使わないことです。エラーが出てしまいます。
eradataフォルダのeradic.tjsを見れば、やや長いですが素質名や能力名の正確な文字列を知ることができるでしょう。

また、*ABLや*EXPなどキャラデータを扱う*変数は*ABL("あなた","技巧")のようにアクセスすることができますが、*FLAGなどのようにキャラデータでない*変数、あるいは*NAMEのようにキャラごとに1つしかデータのない*変数は無理です。

キャラ変数で、データが複数あるもの
*BASE *MAXBASE *ABL *TALENT *EXP *MARK *RELATION *JUEL *CFLAG *CFLAGB *PARAM *STAIN *TEQUIP *EX *SOURCE *NOWEX *GOTJUEL *LOSEBASE *UP *DOWN *OUTLINE_PARTS
キャラ変数で、データが1つしかないもの
*NO *NAME *CALLNAME *SYSNAME *ISASSI
キャラ変数ではないもの
*ITEM *ITEMSALES *ITEMPRICES *FLAG *FLAGB *TFLAG *SFLAG *STR *SAVESTR
現時点での*変数はこのような感じになっています。

そして、何より重要なのは*変数で * を抜かさないことです。
たとえば*ABL("欲望")をABL("欲望")と書いた場合、意図したのと違う動作を起こす可能性が高いです。しかもエラーメッセージが出るとは限りません。
これを避けるため、eramaker2では簡単な*変数チェックの機能があります。Config.txtで

var MAKER2_TJS_CHECK = 0;



var MAKER2_TJS_CHECK = 1;

このように変えると、ゲームの起動時に*変数で * が抜けているところがないかチェックされます。
ただしかなり重いので、MAKER2_TJS_CHECK = 1とするのはあくまでデバッグ中にとどめ、ゲームを配布するときには元に戻しておきましょう。

*変数の簡易リスト

より詳しい説明はそのうちリファレンスとしてまとめます。とりあえずの簡易リストです。

割と使うキャラデータ
*BASE
キャラの基礎能力が入ります。体力、気力、射精など。
*MAXBASE
キャラの基礎能力の最大値が入ります。
*PARAM
現在のパラメータが入ります。快C、欲情、恐怖、反感など。
*ABL
キャラの能力が入ります。従順、技巧、C感覚、奉仕精神など。
*TALENT
キャラの素質が入ります。処女、臆病、気丈、習得早い、自慰しやすい、A敏感など。
*EXP
キャラの経験が入ります。V経験、自慰経験、奉仕快楽経験など。
*MARK
キャラの刻印が入ります。快楽刻印、反発刻印など。
*JUEL
現在持っている珠が入ります。快C(の珠)、苦痛(の珠)、否定(の珠)など。
*STAIN
現在の汚れデータが入ります。
*TEQUIP
現在の「調教装備」のデータが入ります。バイブ(挿入中)、媚薬(効果発揮中)など。
*CFLAG
そのキャラに関する様々なフラグです。休憩中、好感度など。
*CFLAGB
そのキャラの口上を主に管理するフラグです。

割と使うキャラデータ(単一データ)
*NO
そのキャラのキャラ番号です。あゆ.txtの最初のほうにDATA_NO = 1;とありますが、それと同じ数字が入っています。
*NAME
そのキャラの名前です。
*CALLNAME
そのキャラが呼ばれるときの名前です。口上などで使います。

割と使うデータ
*ITEM
そのアイテムを持っている個数です。
*ITEMSALES
そのアイテムが店で売っているかどうかです。
*ITEMPRICES
そのアイテムの店での値段です。
*FLAG
様々なフラグを管理します。
*FLAGB
これもフラグを管理する変数ですが、ゲームによって大きく異なるフラグを管理するのに使います。
*TFLAG
調教中フラグです。調教中に発生した状況を管理するのに使っています。
*SFLAG
システムフラグです。画面の表示や声再生など、システムの基本に関わる部分を管理します。他のフラグと違い、ゲームを一度終わらせたり別のセーブデータをロードしたりしても残っています。


大体内部処理で使うキャラデータ
*EX
今回の調教で何回絶頂したかの数字が入っています。
*SOURCE
今の調教コマンドで発生した「ソース」が入っています。接触、性行動など。
*NOWEX
今の調教コマンドで絶頂したときの数字が入っています。
*RELATION
別のキャラとの相性が入ります。100なら100%(修正なし)、200なら200%です。
*GOTJUEL
今回の調教で得た珠の数が入ります。
*LOSEBASE
今の調教コマンドで失う体力や気力の数字が入っています。
*UP
今の調教コマンドで上がったパラメータの数字が入っています。
*DOWN
今の調教コマンドで下がったパラメータの数字が入っています。
*OUTLINE_PARTS
シルエットシステムのパーツのデータが入っています。「シルエットシステムを使う」を参照して下さい。

大体内部処理で使うキャラデータ(単一データ)
*SYSNAME
キャラの内部名が入っています。同じ名前のキャラが複数登録されたとき区別するために使っています。
*ISASSI
そのキャラが助手かどうかです。

大体内部処理で使うデータ
*STR
文字列保存用の変数です。主にmaker1との互換を保つために残っています。
*SAVESTR
文字列保存用の変数です。主にmaker1との互換を保つために残っています。

口上を変えてみる

口上を作る準備 - 口上を書いてみる

口上を作る準備


eramaker1では、一番多いパターンがキャラのデータと口上を作る改造でした。やはりキャラに台詞があると個性がぐっと強まりますし、台詞を書くのは絵を書いたり声を当てたりするのに比べれば手軽です。

まず、口上を作る準備をしましょう。
erakojoフォルダを見てみてください。erakanon eramaker2 テンプレート版の場合、ここにあゆ自発口上.ksなど8つのファイルが入っています。この「あゆ」という部分を自分が口上を書きたいキャラの名前に買えます。例えば渚なら「渚自発口上.ks」や「渚開始口上.ks」になるわけです。

続いて、ファイル名を変更してできた「渚口上設定.tjs」を開きます。

// ↓ ここにはキャラの番号を指定する.あゆだったら1,名雪だったら2,...といった具合に.
KOJOFUNC.KOJO_VIDEOTITLE_1 = function() {

こうなっているので、適当なキャラ番号に変えます。キャラ番号はキャラフォルダに入っている各キャラのデータ(渚なら渚.txt)の先頭付近に、


var DATA_NO = 1;

こんな感じで書いてあります。キャラ番号が1ならKOJOFUNC.KOJO_VIDEOTITLE_1を変える必要はありませんね。

さて、準備はここまでです。次に実際に口上を書いていきます。

口上を書いてみる


「○○開始口上.ks」を開きましょう。渚にしているなら「渚開始口上.ks」ですね。
ファイル名がksで終わっているので文法はKAGです。


*「「テンプレート」」開始口上
[if exp="*CFLAG('調教開始口上カウンタ') == 0"]
;調教開始時(一回のみ)
[e v="*CFLAG('調教開始口上カウンタ') = 1"]

これを、


*「「テンプレート」」開始口上
[if exp="*CFLAG('調教開始口上カウンタ') == 0"]
;調教開始時(一回のみ)
「な、なにをするんですか」[l][r]
「……え? え?」[l][r]
 あなたが近づくにつれ、渚のあどけない表情の端に不安が少しずつ見えてきた……[l]
[e v="*CFLAG('調教開始口上カウンタ') = 1"]

こんな風に変えて保存し、ゲームを起動してみてください。
カードを買い、調教キャラに指定すると、調教前に上のメッセージが表示されましたね?

このように、口上テンプレートのしかるべき位置にKAGでテキストを書いていけばそれだけで口上が表示されるのです。
[l]と[r]の意味はKAGについてちょっと理解するでやりましたね。それぞれ「クリック待ち」と「改行」です。

続いて、○○調教口上.ksを開いてみましょう。

[if exp="IsSelectCom('愛撫')"]
;初めて
[if exp="*CFLAG('愛撫') == 0"]
;恋慕
[if exp="*TALENT(TARGET,'恋慕') == 1"]
;屈服刻印Lv2以上
[elsif exp="*MARK('屈服刻印') >= 2"]
;それ以外
[else]
[endif]
[e v="*CFLAG('愛撫') = 1"]



[if exp="IsSelectCom('愛撫')"]
;初めて
[if exp="*CFLAG('愛撫') == 0"]
;恋慕
[if exp="*TALENT(TARGET,'恋慕') == 1"]
;屈服刻印Lv2以上
[elsif exp="*MARK('屈服刻印') >= 2"]
;それ以外
[else]
「だっ。[l]だめです!」[l][r]
「変なことを……しないでくださいっ」[l][r]
「あ、あ……」[l]
[endif]
[e v="*CFLAG('愛撫') = 1"]

保存してゲームを起動し、愛撫を実行してみましょう。台詞が表示されるはずです。

口上テンプレートは単純なifによる分岐がほとんどですから、どこに文章を書けばどのようなときに台詞が表示されるかは比較的簡単に理解できるでしょう。これをどんどん埋めていけば、キャラデータだけの調教SLGと比べて独自性は非常に高まります。

デバッグのやり方 基礎

デバッグを始める前に - エラーが起きた場所にできるだけ近づく - 起こしやすいバグとそのとき出やすい症状 - DMを使ってデバッグメッセージを出す - コンソールから変数をいじる

デバッグを始める前に


ゲームを作っていく過程では、エラーメッセージが出てしまったり意図した動作になっていなかったりと、「バグ」がどうしても出てしまいます。バグは出さないことも大切ですが、出したときに修正できることがより大切です。

erakanon eramaker2テンプレートバージョンには、krkr.exeのあるフォルダにkrkr.cfというファイルが同梱してあります。これがあると「デバッグモード」でゲームが起動し、右側に「eramaker2 デバッグサブウィンドウ」も出てきます。
この状態だとデバッグをするときに色々と便利ですが、少し実行速度が落ちてしまいます。開発中はこの状態で進め、ゲームを配布するときにはkrkr.cfを削除するとよいでしょう。

なお、「eramaker2 デバッグサブウィンドウ」にメッセージが大量にたまってくると動作が遅くなります。適当なタイミングで「文消去」ボタンを押してメッセージを消しましょう。

エラーが起きた場所にできるだけ近づく


キャラフォルダのあゆ.txt(改変したなら渚.txt)を開いてください。

*BASE("射精") = 0;

*TALENT("処女") = 1;



*BASE("射精") = 0;

*ABL("欲情") = 1;

*TALENT("処女") = 1;

このようにして保存し、あゆのカード(渚のカード)を買って調教を開始します。
すると、エラーが出ます。

*ABL("欲望")はあっても*ABL("欲情")はないからエラーが出たわけですね。欲情は*PARAMのほうです。


あゆ.txt(28)[(top level script) global]
sysfuncs.tjs(16) EraAddChara
selectslave.ks(33)[(top level script) global]

selectslave.ksの33行目から呼ばれたsysfuncs.tjs、その16行目から呼ばれたあゆ.txtの28行目……という流れがわかります。その後も流れは続いているのですが、eravar.tjsやeravar_base.tjsなどシステムに中枢に関わる部分は書き直していないわけですから、基本的には無視してよいです。どこを書き直したか、きちんと把握しておくのはデバッグする上でとても大切なことです。


*ABL("欲") = 1;

さてこうすれば、無事にゲームをプレイできるようになります。


*ABL("欲望") = 1

ここで、このように ; を取ってしまうとどうでしょうか?

ゲームを起動するやいなや、こういうエラーが発生します。明らかな文法ミスがあると、このようにゲーム起動時の時点でエラーが発生するのです。
しかし、ここでinitialize.tjsの175行目を見に行ってもダメです。「欲情」と「欲望」を間違えるといったバグはeramaker2の範疇なのでeramaker2がデバッグサブウィンドウに細かい情報を表示できますが、 ; を忘れるようなバグは吉里吉里のほうがチェックしているので情報が表示できないのです。

こういうときは「コンソール」のほうを見に行きます。エラーが起きると表示される黒い画面です。
「コンソール」は吉里吉里が管理しているデバッグ用のツールです。よくわからないことがたくさん書いてありますが、少し上のほうにスクロールすると、

このように、

13:27:19 不正な代入か不正な式の操作です at あゆ.txt(30)

というメッセージを発見することができました。なんで28行目ではなく30行目と書かれているかというと、

*ABL("欲望") = 1

*TALENT("処女") = 1;

28行目がちゃんと ; で終わっていないので、30行目とセットになって

*ABL("欲望") = 1 *TALENT("処女") = 1;

という意味不明の命令として解釈されちゃっているのですね。

このように、 ; 忘れは実際にミスしたところを発見しづらいので注意が必要です。

起こしやすいバグとそのとき出やすい症状


全てを書くことはできませんが、特に起こしやすいものを取り上げてみます。


*ABL(欲望) = 1;

先ほどに引き続き、あゆ.txtの28行目。" "忘れをすると、

一応起動はするのですが、あゆの調教をしようとするとこのように謎なエラーメッセージが発生し、しかも発生箇所は「コンソール」を見てみないとわかりません。


*ABL("欲望) = 1;

同様に、" の閉じ忘れ。

これは起動時にエラーが出て、「コンソール」のほうで「文字列定数/正規表現/オクテット即値が終わらないままスクリプトの終端に達しました」というメッセージが見えます。要するに文字列はちゃんと " で閉じろということですね。

続いて、{ }の閉じ忘れも見てみます。


if(MONEY > 1000) {
*ABL("欲望") = 1;
*ABL("従順") = 1;

こんな風にしてみました。ifで { を使っているのに、 } で閉じていません。

起動時にエラーが出ましたが、「文法エラー」としか出ていない上にコンソールでは46行目という離れた位置が書かれています。{ }はきっちり書くようにしましょう。

「デバッグサブウィンドウ」を見てわかればそれでよし。ダメなら「コンソール」を見に行く。これがeramaker2のデバッグの基本です。


ABL("欲望") = 1;

*の付け忘れ。これはどうでしょうか?
実はこれ、ゲームは起動しますし、あゆの調教を始めてもエラーは起きません。しかし欲望はLV1になっておらず、LV0のままです。
このように*の付け忘れは非常に見つけづらいバグになるので、*変数の注意にもあった通り十分に注意しましょう。

DMを使ってデバッグメッセージを出す


バグやエラーが出てきたとき、「じゃあどこまでは正常に動いているのか?」を確認するのは昔から有効なテクニックとされてきました。eramaker2の場合、それをするにはDMというものを使います。

愛撫000.tjsを開いてみてください。

//C感覚をみる
if(*ABL("C感覚") == 0) {
*SOURCE("快c") = 20;
*SOURCE("情愛") = 50;
} else if(*ABL("C感覚") == 1) {
*SOURCE("快c") = 100;
*SOURCE("情愛") = 100;



//C感覚をみる
if(*ABL("C感覚") == 0) {
*SOURCE("快c") = 20;
*SOURCE("情愛") = 50;
DM("快感");
DM(*PARAM("快C"));
} else if(*ABL("C感覚") == 1) {
*SOURCE("快c") = 100;
*SOURCE("情愛") = 100;

こんな風にして起動し、あゆのカードを買って調教開始。愛撫コマンドを実行してみましょう。

こんなメッセージが出ました。
愛撫コマンドを何度も実行してみます。

このように、その時点での快Cのパラメータがどんどん表示されます。
DM( )の中に" "でくくった文字列を入れればそのままの文字列が表示されますし、*PARAM("快C")やMONEYといった変数を入れればそれが表示されるのです。
これを使えば、どの部分が実行されているのか? そのときの変数の値はいくつか? といったことを簡単に調べられます。

KAGのときはどうするか。[d]タグを使います。(正確にはeramaker2の用意したマクロですが)
title.ksを開き、おなじみのところを変えます。


[endscript]

[d s="あなたの技巧は"]
[d b="*ABL('技巧')"]

*loop
[iscript]

起動すると、同時に

こんな感じになっているはずです。
文字列をそのまま表示したいときは[d s=" "]、変数を表示したいときは[d b=" "]を使います。

なお、[d b="*ABL('技巧')"]のように" "でくくった中で" "を使いたいときは' '(シングルクォーテーション)を使います。普通のキーボードなら、SHIFTを押しながら 7 と や の書いてあるキーを押すと出てくる記号です。

コンソールから変数をいじる


ゲームのバランスを取っているときなど、ちょっとお金を増やしたいとか能力を増やしたいと思うことはあるでしょう。
そういうとき、コンソールから変数をいじることができます。

まずゲームを起動し、そして「SHIFT」を押しながら「F4」キーを押してみましょう。黒い画面のコンソールが表示されます。

ここで、一番下のあたりにある入力部分にMONEY = 10000と入れます。

ENTERキーを押すと、こんな風になるはずです。
そして「はじめから」でゲームをスタートすると、

所持金は$10000になっています。

このように、コンソールから変数をいじればゲームバランスやデバッグがしやすくなることがあるはずです。
もちろん、
*ABL("従順") = 5
のように入れることも可能です。ただし調教しているキャラがいないときはエラーが起こる可能性もあるので注意しましょう。

Last Updated : 2009-4-20


http://cbaku.com