本文へ移動
cccskills
無料GitHub で公開

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 等) は対象外。

重要: 作業に入る前に

  1. JS や Python の感覚で書かない。下の「JS との主な違い」を必ず確認する
  2. 詳細はファイルを Read する。下の「ファイル索引」から該当ドキュメントを開く
  3. 疑わしい時はリファレンスを優先。記憶や類推より、ドキュメント原文を信頼する

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 より):

  1. BOM 判定が最優先
    • EF BB BF → UTF-8 として decode
    • FF FE → UTF-16 LE として直接ロード
    • FE FE → 暗号化テキスト (c モード 相当) / 圧縮テキスト (z モード 相当)
  2. BOM 無し: DefaultReadEncoding で decode
    • "UTF-8" → UTF-8 として decode (失敗すれば TJSNarrowToWideConversionError)
    • "Shift_JIS" → SJIS として decode (失敗すれば同上)
    • それ以外 → TVPUnsupportedEncoding を throw
  3. 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 — 基本的な使い方 / 埋め込み API
  • types.md — データ型 (void / Integer / Real / String / Object / Octet)
  • variant.md — tTJSVariant 型 (C++ 連携時)
  • variable.md — 変数 / var / スコープ
  • class.md — クラス、継承、コンストラクタ、finalize
  • function.md — 関数、引数、可変長
  • property.md — プロパティ宣言、getter/setter
  • interface.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 — Array
  • dictionary.md — Dictionary
  • string.md — String 系メソッド
  • octet.md — Octet
  • math.md — Math
  • randomgenerator.md — Math.RandomGenerator
  • date.md — Date
  • regexp.md — RegExp
  • exception.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) は対象スキルなし

これらは本スキルの対象外。

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

elements

無料日本語概要

吉里吉里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` を参照。

wamsoft/krkrz_dev102026年10月9日 更新

krkrz

無料日本語概要

吉里吉里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++ 実装、レンダリングパイプライン詳細) は対象外。

wamsoft/krkrz_dev102026年10月9日 更新

krkrz-repl

無料日本語概要

吉里吉里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` を参照。

wamsoft/krkrz_dev102026年10月9日 更新

krkrz-webui

無料日本語概要

吉里吉里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 を参照。

wamsoft/krkrz_dev102026年10月9日 更新

wamsoft のスキルをすべて見る

このスキルの問題を報告する