吉里吉里Z 上の Elements ベース汎用ダイアログ/画面 UI (cycfi/elements + elements_modal) の作り方リファレンス。TJS で JSON / Dictionary 定義のダイアログを作る・出す・イベントを受ける・複数画面フロー(navigator)や常駐メニューを組む・入力/フォーカス/モーダルを制御する・Agent で動作検証する、といった場面で使う。基本的なダイアログ画面の作り方(最小例・レイアウト JSON スキーマ・ウィジェット一覧)から、モーダル/非モーダル/独立ウィンドウ/常駐フロー、複数インスタンス/z-order、DrawDevice 登録タイミング等のハマりどころまで網羅。Win32 ネイティブの WIN32Dialog(win32dialog プラグイン)とは別物。TJS2 言語仕様は skill `tjs2`、本体クラス API は `krkrz`、REPL/Agent 駆動は `krkrz-repl` を参照。
tjs2
TJS2 (吉里吉里Z 内蔵スクリプト言語) の言語仕様と組み込みクラスのリファレンス。.tjs ファイル / *.ks (KAG) 内の埋め込みスクリプト / TJS2 コード断片 を扱う、書く、レビューする、デバッグするときに使う。JavaScript / TypeScript に似ているが文法と意味論が違うので、JS の感覚で書くと壊れる場合が多い。組み込みクラス (Array / Dictionary / Date / Math / RegExp / Exception) の API もここに集約。**呼び出されたら必ず「JS との主な違い」セクションを最初に確認し、その上で必要な詳細リファレンスを Read で取りに行くこと。** 吉里吉里Z 本体のクラス API (Window / Layer / System / Storages / Bitmap 等) や engine 内部はこのスキルの対象外。
インストール方法を見る含まれるファイル(1)
- SKILL.md12.3 KB
SKILL.md(原文)
インストールする前に、エージェントに与えられる指示の中身を確認できます。
パスの基点: 本文の相対パスは krkrz_dev リポジトリルート基準。作業ディレクトリが krkrz_dev 以外 (krkrz_android / krkrz_ios などの外枠や案件フォルダ) のときは
${KRKRZ_BASE}/krkrz_dev/を前置して読む (echo $KRKRZ_BASEで実パスを確認。マシンごとに値が違うので絶対パスは書き込まない)。
TJS2 言語リファレンス
TJS2 (TJS Just Script 2) は吉里吉里 / 吉里吉里Z (kirikiri Z) 内蔵の スクリプト言語。本スキルは TJS2 言語仕様 と 組み込みクラス の 情報源で、本体エンジン API (Layer / System / Window 等) は対象外。
重要: 作業に入る前に
- JS や Python の感覚で書かない。下の「JS との主な違い」を必ず確認する
- 詳細はファイルを Read する。下の「ファイル索引」から該当ドキュメントを開く
- 疑わしい時はリファレンスを優先。記憶や類推より、ドキュメント原文を信頼する
JS との主な違い (高頻度の落とし穴)
変数と型
- 変数は 必ず
varで宣言。let/constは 存在しない。未宣言変数は使えない。 - 同じ名前の変数を二回
varで宣言してもエラーにならない。二度目に初期値があれば代入される。 - 内部型は 6 種類:
void/Integer(64bit) /Real(double) /String(UTF-16LE, サロゲートペア対応) /Object/Octet(バイナリ列)。 voidは JS の undefined / null とは別物。初期化されていない変数はvoid型。void同士の比較は===(識別演算子) を使う。==だと数値比較に巻き込まれる。typeofは文字列"void"/"Integer"/"Real"/"String"/"Object"/"Octet"を返す。
リテラル
- 配列リテラルは
[1, 2, 3](Array クラス) - 配列リテラルの末尾カンマは「もう 1 要素 void を追加」の意味 (JS と真逆)。
[a, b,]はcount == 3で[2] == voidになる。[]の中身を書き換えていて末尾に,を残すと空要素混入で下流が壊れるので必ず外す - 辞書リテラルは
%[ "key" => "value", "k2" => v2 ](%[ ... ]が正しい。JS の{}ではない。区切りは=>、:ではない ) - 辞書リテラルの末尾カンマは無害 (Array と挙動が違うので注意)
- 正規表現リテラルは
/pat/flags(RegExp クラス) - 文字列リテラルは
"..."または'...' - 整数は
0x(16進),0o(8進),0b(2進) リテラル可。123_456のように_で桁区切りも可
演算子
newには括弧が必須:new Foo()は OK、new Fooは 構文エラー>>>は符号なし右シフト (左辺を unsigned int として扱う唯一の演算子)<->は swap 演算子 (左右を交換、結果は取れない),(カンマ) は順次評価演算子 (左から評価、結果は最後の値)- 後置
if演算子:a = b if b != 0;(右側が真のときだけ左を評価) incontextofでオブジェクトのコンテキスト ( this 相当 ) を差し替えてクロージャを作るinstanceof "Class"のように クラス名を文字列で 指定する。instanceof "Array"等#演算子は文字コード取得 (#cでcの最初の一文字の char code を返す)、$nは逆 (文字コード → 一文字文字列)。JS のcharCodeAt/String.fromCharCode相当
クラスと関数
- クラス本体:
class Foo { var x; function Foo() { ... } function finalize() { ... } property p { getter() { ... } setter(v) { ... } } } - コンストラクタはクラスと同名のメソッド (JS の
constructorキーワードではない) finalize()は GC / 明示破棄時に呼ばれる省略可能なデストラクタ- メソッド内から 同じクラスを
newするときはglobal.Foo()と書く (new Foo()だとコンストラクタ自身を参照してエラー ) - プロパティ宣言は専用構文
property name { getter() { ... } setter(v) { ... } }、JS のget/setキーワード構文ではない - 関数の引数末尾に
*を書くと可変長引数 (function foo(a, b*)のbは arguments 相当 )
真偽値
- 0 / 空文字列 /
voidは偽 - それ以外の文字列は 数値に変換しようとして成功すればその値が真偽、失敗すれば偽
- → 文字列をそのまま truthy 判定すると JS と挙動が違うことがある (例:
"foo"は数値変換失敗で偽)
スコープ
- ブロック
{ ... }内でvar宣言すると ブロックスコープ (JS のvarと違って関数スコープではない、let相当の挙動) - 同名のシャドウィングは可、ブロックを抜けると消える
- 最外側 ( グローバルスコープ ) の
varはglobalオブジェクトのメンバになる
文字列操作 (JS の常識で壊れやすい)
Stringクラスは実在しない (typeof "abc" == "String"だが、実体は特殊化された値 )- 文字コード取得は
charCodeAt無し →#c演算子を使う (cは 1 文字文字列)。存在しないメソッド呼び出しは実行時例外 "メンバcharCodeAtが見つかりません" になる - 一文字取り出しは
str.charAt(n)(範囲外は空文字) またはstr[n](範囲外は例外) - ASCII 判定は
c >= "0" && c <= "9"のような文字列同士の比較が使える (ワイド文字コード順で比較される)。isDigit相当を書くならこの形が楽
クロージャの落とし穴 ( TJS のスコープキャプチャ )
- 無名関数 (関数リテラル) の中から外側関数の local 変数を参照できない 場合が多い
- 特にプラグイン (
Scripts.foreach/Array.some相当) にコールバックを渡すとき、コールバックの実行コンテキストは呼び出し元プラグイン側になり、外側の local 変数を参照するとランタイム例外 ( "メンバ 'foo' が見つかりません" ) - 対策 1: プラグインの追加引数機構でデータを渡す ( 例:
Scripts.foreach(obj, func, arg1, arg2, ...)→function(k, v, arg1, arg2)) - 対策 2:
Scripts.getObjectKeys(obj)で keys 配列を取ってから普通のforループでイテレートする ( 通常のスコープが効く ) - 対策 3:
function() { ... } incontextof thisでthisを捕捉 ( ただし外側 local var は依然として不可 ) - 推奨: 迷ったら「素の for ループ + Scripts.getObjectKeys」でよい。プラグイン依存のコールバック機構より確実
ファイル読み込み (テキストエンコーディング)
kirikiri のテキストストリーム (tTVPTextReadStream) 挙動 (src/core/common/base/TextStream.cpp より):
- BOM 判定が最優先
EF BB BF→ UTF-8 として decodeFF FE→ UTF-16 LE として直接ロードFE FE→ 暗号化テキスト (cモード 相当) / 圧縮テキスト (zモード 相当)
- BOM 無し:
DefaultReadEncodingで decode- "UTF-8" → UTF-8 として decode (失敗すれば
TJSNarrowToWideConversionError) - "Shift_JIS" → SJIS として decode (失敗すれば同上)
- それ以外 →
TVPUnsupportedEncodingを throw
- "UTF-8" → UTF-8 として decode (失敗すれば
DefaultReadEncodingの初期値はShift_JIS。TVPSetDefaultReadEncoding("UTF-8")(TJS からはScripts.textEncoding = "UTF-8"相当) で切替可能
BOM 無し UTF-8 が読めるかはプロジェクトの DefaultReadEncoding 設定次第。「新しい engine は BOM 必須」というのは誤りで、engine 実装は昔から同じ。プロジェクト側の設定を確認する。
ファイル書き出し (テキスト系)
Array.save(filename)は組み込みだが、UTF-16 LE + BOM 出力固定 (エンコーディング選べない)。git diff の可読性が悪い / 外部ツールとの相性が悪い- UTF-8 で書きたいときは
saveStruct.dllプラグインをリンクしてArray.save2(filename, utf8=true, newline=0)を使う (newlineは 0=CRLF, 1=LF ) Dictionary.saveStruct2(filename, utf8=true, newline=0, option=ssoIndent|ssoSort)で Dictionary をそのまま TJS 表現 ( saveStruct 形式 ) で保存できる- 同機能を持つ
PackinOne.dllも存在するが、init 時に fstat 経由で'/' must be specified at the end of given directory name.を throw する場合がある ( 呼び出し順や環境依存 )。standalone tool を書くなら素のsaveStruct.dllの方が事故が少ない saveStruct.dll/PackinOne.dllは Array / Dictionary / Scripts にtoStructString(newline=1, option=0)も生やす (メモリ上での文字列化)
組み込みクラス・型
| クラス | 用途 | 詳細 Read 先 |
|---|---|---|
| Array | 順序付きリスト、[ ] リテラル | tjs2/array.md |
| Dictionary | 文字列キー辞書、%[ k=>v ] リテラル | tjs2/dictionary.md |
| String | 文字列 (UTF-16LE) | tjs2/string.md |
| Octet | バイナリ列 | tjs2/octet.md |
| Math | 数学関数 | tjs2/math.md |
| Math.RandomGenerator | 乱数 | tjs2/randomgenerator.md |
| Date | 日付/時刻 | tjs2/date.md |
| RegExp | 正規表現、/.../ リテラル | tjs2/regexp.md |
| Exception | 例外オブジェクト | tjs2/exception.md |
ファイル索引 (深掘り時に Read する)
ドキュメントは krkrz_dev リポジトリルート相対で doc/tjs2/ にあります
( 以下の索引はこのディレクトリからの相対名 )。
オンライン版は https://wamsoft.github.io/krkrz_dev/tjs2/ 。
言語仕様
about.md— TJS2 概要simple.md— 基本的な使い方 / 埋め込み APItypes.md— データ型 (void / Integer / Real / String / Object / Octet)variant.md—tTJSVariant型 (C++ 連携時)variable.md— 変数 /var/ スコープclass.md— クラス、継承、コンストラクタ、finalizefunction.md— 関数、引数、可変長property.md— プロパティ宣言、getter/setterinterface.md—iTJSDispatch2(C++ 側のオブジェクトインターフェース)expr_and_op.md— 式と演算子全リスト (優先順位含む)factor.md— 項 (リテラル等の最小単位)token.md— 字句 / 予約語statement_and_block.md— 文とブロックif.md/for.md/while.md/switch.md/with.md/try.md— 制御構文pp.md— プリプロセッサstyle.md— 推奨スタイルvmcodes.md— TJS2 仮想マシンの命令コード一覧ttjs.md—tTJS(C++ ホスト側 API)
組み込みクラス
basictypes.md— 基本型全般のメソッド/プロパティarray.md—Arraydictionary.md—Dictionarystring.md— String 系メソッドoctet.md—Octetmath.md—Mathrandomgenerator.md—Math.RandomGeneratordate.md—Dateregexp.md—RegExpexception.md—Exception
周辺情報 (doc/topics/tjs2/)
tooltip.md/asyncimageload.md/playmovie.md/check_2_z.md/deleted.md/fileformat.md/type_specified.md
関連スキル
- 吉里吉里Z 本体クラス API (Window / Layer / System / Storages / Bitmap 等) は skill
krkrz - 吉里吉里Z 内部構造 (engine internals) は対象スキルなし
これらは本スキルの対象外。
レビュー
まだレビューはありません。使ってみた感想をお寄せください。
同じリポジトリのスキル
概要と使いどころ
吉里吉里Z (kirikiri Z) 本体クラス API のリファレンス。TJS2 で吉里吉里Z 上のスクリプトを書く、レビューする、デバッグするときに使う。Layer / Window / Bitmap / System / Storages / Font / Plugins / Timer / Debug / AsyncTrigger / Scripts / BinaryStream / Matrix32 / Matrix44 / Rect / ImageFunction のコア API、サウンド系 (WaveSoundBuffer / SoundBuffer / VideoOverlay)、DrawDevice (BasicDrawDevice / SDLDrawDevice / OGLDrawDevice / NullDrawDevice)、OpenGL 描画系 (Canvas / Texture / ShaderProgram / Offscreen / VertexBinder / VertexBuffer)、および主要プラグイン提供クラス (HttpRequest / GdiPlus.* / WIN32Dialog / CSVParser / LineParser / Process / Pad / MenuItem / Unzip / Zip / PSD / SimpleHTTPServer) を網羅。**呼び出されたら必ず「共通パターン」と「クロスカッティング概念」を確認し、必要な詳細クラスは doc/reference/*.md を Read しに行くこと。** TJS2 言語そのものや組み込みクラス (Array / Dictionary / Math 等) は別 skill (`tjs2`) を参照。エンジン内部構造 (C++ 実装、レンダリングパイプライン詳細) は対象外。
吉里吉里Z (krkrz) の SDL3 / WINVER ビルドを REPL 経由でエージェントから駆動するためのリファレンス。krkrz を起動して TJS スクリプトを評価・検証・デバッグする、startup.tjs を介さず明示的に処理を開始する、入力イベント (キー/マウス) を注入する、画面をキャプチャして目視確認する、Elements ダイアログを観測・操作する、例外やダイアログ表示をコンソールで観測する、コアデモ全シーンを自動巡回してキャプチャで表示確認する (-demotest / -demotestcap)、といった場面で使う。**外部エージェントは console(CONIN$) に打てないので -replfile ファイルチャネルが本命**。起動フラグ (-repl / -replfile / -nostartup / -loglevel / -display / -ignoremouse)、ファイルチャネルのプロトコル、Agent API (入力注入 / captureScreen / dialogs / dialogClick)、ドットコマンド (.cap/.dlg/.click/.mem 等)、REPL 駆動時の挙動変更 (例外で即終了しない / inform と例外ダイアログがコンソールに出る) を網羅。TJS2 言語仕様そのものは skill `tjs2`、本体クラス API は skill `krkrz` を参照。
吉里吉里Z (krkrz) の -replweb HTTP+SSE サーバ (WebServer クラス) にブラウザ UI を載せて、本体アプリの操作/編集/観測パネルをブラウザ側に組み込む方法論。ゲーム本体は 3D 表示やゲーム内 UI に専念させ、編集ツール・インスペクター・ダッシュボード・REPL コンソールをブラウザ (別ウィンドウ/別PC) から使う構成を作るときに読む。プラグインや TJS がサーバへエンドポイントを追加公開する手順 (WebServer.register / serveStatic / broadcast)、ハンドラ呼び出し規約 (req %[method,path,query,body,bytes] → 文字列/octet/整数/辞書)、状態同期パターン (fetch POST + SSE /sub push + throttle + 差分/tick 配信)、既存 REPL コンソール (/events + /cmd) の UI 埋め込み、ブラウザのアプリモード起動 (Chromium --app / -webui)、json.dll 連携、TJS2 由来のハマりどころ (ローカル関数クロージャ不在→クラス化 / ブロックコメントのネスト誤爆 / startup 例外の致命性 / ハンドラは必ずメインスレッド実行) を網羅。エンジン側 WebServer クラスそのものの仕様は krkrz core doc/REPL.md、REPL/Agent 駆動は skill krkrz-repl、Elements ネイティブ UI は skill elements、TJS2 言語は skill tjs2、本体 API は skill krkrz を参照。