吉里吉里 2.25 beta 6 / KAG3 3.25 beta 6 が公開されました。
先日紹介したTJS スクリプト中から KAG のタグを実行するというハックも 本家に取り込んでいただきました。
詳しい変更点は吉里吉里 開発版(β版)の詳細よりどうぞ。
今日は夏コミのカタログ発売日です。(コミケットサービスとかだと前日には置いてあったりしますが)
今年の冬コミ、コミックマーケット69は2日間開催 によると、 今年の冬コミは29, 30日の2日間開催みたいですね。
米沢代表も、確か「ずっと冬を3日間にするわけじゃなくて、たまたま日程がよかったから3日間にできた」みたいな 趣旨の事を言っていましたし、さすがに冬は、年末と土日がうまく重ならないと3日間開催は厳しいようです。もし年末開催が続くとして、3日間できそうなのは再来年かな? (年末以外にずれるという話も検討されているそうですが……?)
吉里吉里情報局に、Wiki を設置しました。http://www.kirikiri.info/w/k/
まだほとんどページがありませんが、ぼちぼち作っていこうと思います。
みなさんの編集も大歓迎ですので、もし何かあったらお気軽にどうぞ。
1周クリアしました。8時間15分25秒。
「少女の手をとって進む」ことがとてもうまく表現されているゲームだと思いました。
少女と離れて一人で進まなければいけない場所もあるのですが、 少年が感じている「不安感」を、あたかも自分のもののように感じたりとか。
ゲームとしての難易度は、難しすぎず易しすぎずという感じでしょうか。
そんなに長いゲームでもないんで、気になっている方はやってみて損はないかと。
コミックマーケットの第三回拡大準備集会に参加してきました。
逆三角形の中に入る、数少ない機会です。
「まだマンガを描いてない人もいると思いますが…… そういう人はこんなところにいる場合じゃないんじゃないかと(笑)」みたいな話が出ましたが…… うーむ。
else と elsif タグを追加するパッチ。 コンパイルすらしてないのでエラーがあるかもしれません。
std::vector<bool> IfLevelExecutedStack と std::vector<tjs_int> ExcludeLevelStack が必要。
--- tmp/tvp2win32/kirikiri2/src/core/utils/KAGParser.cpp 2005-04-02 00:27:22.000000000 +0900
+++ tmp/KAGParser.cpp 2005-07-28 16:24:46.140625000 +0900
@@ -464,6 +464,8 @@
// copy ExcludeLevel, IfLevel
ExcludeLevel = ref.ExcludeLevel;
IfLevel = ref.IfLevel;
+ ExcludeLevelStack = ref.ExcludeLevelStack;
+ IfLevelExecutedStack = ref.IfLevelExecutedStack;
}
//---------------------------------------------------------------------------
iTJSDispatch2 *tTJSNI_KAGParser::Store()
@@ -862,6 +864,8 @@
// break condition state and macro recording
RecordingMacro = false;
ExcludeLevel = -1;
+ ExcludeLevelStack.clear();
+ IfLevelExecutedStack.clear();
IfLevel = 0;
PopMacroArgsTo(MacroArgStackBase);
// clear macro argument down to current base stack position
@@ -1411,7 +1415,7 @@
// check special control tags
enum tSpecialTags
- { tag_other, tag_if, tag_ignore, tag_endif, tag_endignore,
+ { tag_other, tag_if, tag_else, tag_elsif, tag_ignore, tag_endif, tag_endignore,
tag_emb, tag_macro, tag_endmacro, tag_macropop, tag_erasemacro,
tag_jump, tag_call, tag_return} tagkind;
static bool tag_checker_init = false;
@@ -1428,6 +1432,10 @@
special_tags_hash.Add(
ttstr(TJS_W("endignore")), (tjs_int)tag_endignore);
special_tags_hash.Add(
+ ttstr(TJS_W("else")), (tjs_int)tag_else);
+ special_tags_hash.Add(
+ ttstr(TJS_W("elsif")), (tjs_int)tag_elsif);
+ special_tags_hash.Add(
ttstr(TJS_W("emb")), (tjs_int)tag_emb);
special_tags_hash.Add(
ttstr(TJS_W("macro")), (tjs_int)tag_macro);
@@ -1551,39 +1559,101 @@
break;
}
- // if/endif
+ // if/ignore
if(tagkind == tag_if || tagkind == tag_ignore)
{
- tTJSVariant val;
- ttstr exp;
- DicObj->PropGet(0, __exp_name.c_str(), __exp_name.GetHint(), &val, DicObj);
- exp = val;
- if(exp == TJS_W(""))
- TVPThrowExceptionMessage(TVPKAGSyntaxError);
- TVPExecuteExpression(exp, &val);
IfLevel ++;
+ IfLevelExecutedStack.push_back(false);
+ ExcludeLevelStack.push_back(ExcludeLevel);
+
+ if(ExcludeLevel == -1)
+ {
+ tTJSVariant val;
+ ttstr exp;
+ DicObj->PropGet(0, __exp_name.c_str(), __exp_name.GetHint(), &val, DicObj);
+ exp = val;
+ if(exp == TJS_W(""))
+ TVPThrowExceptionMessage(TVPKAGSyntaxError);
+ TVPExecuteExpression(exp, &val);
+
+ bool cond = val.operator bool();
- bool cond = val.operator bool();
- if(tagkind == tag_if) cond = !cond;
+ IfLevelExecutedStack.back() = cond;
+ if(!cond)
+ {
+ if(ExcludeLevel == -1)
+ {
+ ExcludeLevel = IfLevel;
+ }
+ }
+ }
+ }
- if(cond)
+ // elsif
+ if(tagkind == tag_elsif){
+ if(IfLevelExecutedStack.empty())
+ {
+ // no preceded if/ignore tag.
+ // should throw an exception?
+ }
+ else if(IfLevelExecutedStack.back())
{
- if(ExcludeLevel == -1)
+ ExcludeLevel = IfLevel;
+ }
+ else if(IfLevel == ExcludeLevel){
+ tTJSVariant val;
+ ttstr exp;
+ DicObj->PropGet(0, __exp_name.c_str(), __exp_name.GetHint(), &val, DicObj);
+ exp = val;
+ if(exp == TJS_W(""))
+ TVPThrowExceptionMessage(TVPKAGSyntaxError);
+ TVPExecuteExpression(exp, &val);
+
+ bool cond = val.operator bool();
+ if(cond)
{
- ExcludeLevel = IfLevel;
+ IfLevelExecutedStack.back() = true;
+ ExcludeLevel = -1;
+ }
+ else
+ {
+ if(ExcludeLevel == -1)
+ {
+ ExcludeLevel = IfLevel;
+ }
}
}
}
+ // else
+ if(tagkind == tag_else){
+ if(IfLevelExecutedStack.empty())
+ {
+ // no preceded if/ignore tag.
+ // should throw an exception?
+ }
+ else if(IfLevelExecutedStack.back())
+ {
+ ExcludeLevel = IfLevel;
+ }
+ else if(IfLevel == ExcludeLevel)
+ {
+ IfLevelExecutedStack.back() = true;
+ ExcludeLevel = -1;
+ }
+ }
// endif/endignore
if(tagkind == tag_endif || tagkind == tag_endignore)
{
// endif
- if(IfLevel == ExcludeLevel)
+ if(!ExcludeLevelStack.empty())
{
- ExcludeLevel = -1;
+ ExcludeLevel = ExcludeLevelStack.back();
+ ExcludeLevelStack.pop_back();
}
+ if(!IfLevelExecutedStack.empty())
+ IfLevelExecutedStack.pop_back();
IfLevel --;
if(IfLevel < 0) IfLevel = 0;
発売されたようですが、いくつかのゲームは最初から遊べないという仕掛けが入っていたようです。
何でそんなことするかなぁ……と思ったのですが、 今日になってみると解除コマンドが発表されてました。
とりあえずよかったよかった。近いうち買う予定。
CD-R 100枚購入。
タイトーメモリーズを買うか……と思ったが、なぜか買ったのは これとこれとこれ。
新宿のヨドバシカメラで Borland C++ Builder 6 Personal を買う。
毎度のこととは言え、メディア100枚持って歩きまわるのは非常に疲れる。
BCB6 を買ったので、dee さんの助けを借りて、吉里吉里をコンパイルできるようになりました。どうもありがとうございます。
早速、else パッチを試してみましたが…… elsif の exp 属性が、その前の if タグの exp 属性のままになっちゃってますね。
どこかで DicObj を更新しないといけないと思うのですが…… まだきちんと把握できていません。
2000行目過ぎの
if(!RecordingMacro && ExcludeLevel == -1)
を
if((!RecordingMacro && ExcludeLevel == -1) || tagkind == tag_elsif)
にしたら、とりあえず解決しました。(deeさんありがとうございます)
が、if ブロックの中から call でジャンプすると、return で戻ってきた ときに IfLevelExecutedStack と ExcludeLevelStack の情報を忘れているのでおかしくなるということに気付きました。
if の中にジャンプしてくるのは call-return のときだけのはずなので、 Stack の Stack を作って、保存しておけばいいのかなぁ……
後で試してみます。