Skip to content
cccskills
FreePublished on 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 内部はこのスキルの対象外。

The English summary is being prepared. Showing the original description.

See how to install

Files included (1)

  • SKILL.md12.3 KB

SKILL.md (original)

Review the instructions the agent will receive before you install.

パスの基点: 本文の相対パスは 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) は対象スキルなし

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

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

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

The English summary is being prepared. Showing the original description.

wamsoft/krkrz_dev10Updated Oct 19, 2026

krkrz

Free

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

The English summary is being prepared. Showing the original description.

wamsoft/krkrz_dev10Updated Oct 19, 2026

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

The English summary is being prepared. Showing the original description.

wamsoft/krkrz_dev10Updated Oct 19, 2026

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

The English summary is being prepared. Showing the original description.

wamsoft/krkrz_dev10Updated Oct 19, 2026

See all skills by wamsoft

Report a problem with this skill