個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Ukagaka Ghost Development Support Tool
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗English: README.en.md(英語版。こちらの日本語版が正です)
これは「なし栞 + なしスタジオ」のフォークです。 元のプロジェクトから名前を変え、独自に改修しています(元のものとは別物です)。
このソフトウェアは「なし栞 + なしスタジオ」をもとにしています。 https://github.com/miyagawa-yukinterface/nashi-shiori-studio 作者: 月見里 彩葉 (miyagawa-yukinterface)
元の名前 このフォークでの名前 なしスタジオ nashi-studio.exe伺かスタジオ / Ukagaka Studio ukagaka-studio.exeなし栞 nashi.dll如何栞 / ikaga SHIORI ikaga.dll(2.0 で栞 YAYA に置きかえました。いまは入っていません)
伺か(SSP)のゴーストを Scratch のようにブロックを積んで作れるアプリ です。 組んだブロックは、伺かでよく使われている栞 YAYA の辞書に訳して書き出すので、 書き出したものはふつうの YAYA ゴーストです。YAYA で手書きしたゴーストに、ブロックで作ったトークを足すこともできます。 Windows ネイティブ(C++ / MSVC)で、ランタイムのインストールは要りません。
伺かスタジオ ukagaka-studio.exe | ブロックエディタ本体(64bit・単体で動く1ファイル)。自前のウィンドウに WebView2 を埋め込んだネイティブアプリ。UI も YAYA 一式も exe の中 |
栞 YAYA yaya.dll | 書き出すゴーストが使う栞(公式ビルドをそのまま。SSP と同じく Windows 2000 から動きます)。スタジオの「ためす」も、同じ yaya.dll で動かします |
書き出したゴースト(yaya.dll が入ります) | Windows 2000 以降。SSP の動作環境に合わせてあります |
伺かスタジオ(ukagaka-studio.exe) | Windows 10 / 11(WebView2 が要ります) |
ゴーストを作るのは新しい Windows で、配ったゴーストが動くのは古い Windows から、 という形です。エディタは WebView2(Edge)の上に乗っているので、古い Windows では動きません。
栞の yaya.dll は、そこに合わせるために 公式のビルドをそのまま入れています。
いまの Visual Studio でソースから組むと、Vista からの API が混ざってしまい、
そこから下の Windows では読みこみ自体が失敗するためです。
Windows 2000 にある API だけを使っているかは node tools\check-imports.js がいつでも確かめます
(くわしくは docs/maintenance.md)。
| どこから | 要るもの | 中身 |
|---|---|---|
| Releases | 何も要りません | 版ごとの zip。ふつうはこちら |
| Actions の実行ページ | GitHub のログイン | 押すたびの最新。30 日間 |
Actions のほうは、実行ページをいちばん下まで送ると Artifacts の
ukagaka-studio-<版>-<sha> にあります。Releases の zip と同じ中身です
(exe / README(日本語・英語)/ CHANGELOG / LICENSE / docs / third_party(YAYA のライセンス))。
Actions の成果物は、GitHub にログインしていないと落とせません(ボタンが出ません)。 ログインしたくなければ Releases のほうを使ってください。
どちらもコード署名していない ので、Windows に止められることがあります。 そのときは スマートアプリコントロールでブロックされたら を見てください。
自分でビルドするなら .\build.ps1 です(docs/maintenance.md)。
ukagaka-studio.exe をダブルクリック するだけです。
はじめてなら「開く」→「お手本から始める」で、動くゴーストを読みこんで
中を見るのがいちばん早いです(あいさつ/好感度/時間で変わる/名前をきく/ゴースト間通信)。
はじめて起動したときは、キャンバスの右上に はじめてガイド(お手本をひらく → ▶ で動かす → SSP に入れる)が出ます。
閉じたあとは、ヘルプ(右上の ?)の「はじめてガイドをもう一度」でまた出せます。
ポートは開きません。 画面からの要求は WebView2 の中で受け取って、そのまま exe の中で処理しています。
外に出る通信もしません(SSP と話すときだけ 127.0.0.1:9801 へ接続します)。
画面表示に Microsoft Edge WebView2 ランタイム(Windows 11 標準搭載)を使います。 万一入っていない場合は、起動時に案内と配布ページへのリンクを出します。
上のバーの 新規 で、ひな形ウィザードが開きます。ゴーストと 2 人の名前を入れ、はじめから入れておくもの (あいさつ・ダブルクリックやなでたときの反応・ランダムトーク・アラーム・記念日・SSP のメニューの項目)をえらぶと、 そのブロックを置いた状態ではじまります。なにもえらばなければ、からっぽのキャンバスです。
画面は、上のバーのすぐ下で トーク/セリフ/辞書/キャラと絵/ゴースト情報/書き出し に切りかえます。
「話す」ブロックのセリフの欄の横の ☺ で、表情を変える印({表情:1})や少し待つ印({待つ:500})を、カーソルのところに入れられます。
セリフ の画面には「話す」ブロックのセリフが一覧で出て、その場で直せます。CSV に書き出して表計算で直し、
読みこむと、変わったセリフだけを書きもどします。
辞書 の画面では、YAYA の辞書(.dic)をプロジェクトの中に作って、テキストで書けます。行番号と色分けが付き、YAYA として読めない行は
行番号の横と下の一覧に出ます(押すとその行へ動きます)。書き出すとゴーストに入り、辞書にあるイベントは、同じイベントのブロックのかわりに動きます。
テキストのとなりには、同じ辞書をブロックにしたものが出ます(YAYA の構文と 1 対 1 のブロック)。テキストを打つとブロックが、ブロックを
変えるとテキストが書きかわります(ブロックを変えたときは、テキストを整えた形に書きなおします。コメントは残ります)。
ブロックからは「YAYA の関数 F を A B でよぶ」で、辞書の関数をよべます。チェックタブは、辞書の読めない行・かぶった関数に加えて、
どこにも無い関数をよんでいるところも知らせます(押すと、その行へ動きます)。辞書のブロックも、トークのブロックと同じキーと右クリックで
コピー・はりつけ・複製・削除ができます(辞書のブロックは辞書の画面に、トークのブロックはトークの画面にだけはりつけます)。
「さがす」タブは辞書の中もさがし、「すべて置きかえる」は辞書の文字列の中(セリフ)も置きかえます(コードと名前は置きかえません)。
「いまある YAYA ゴーストから読みこむ」にゴーストのフォルダを入れて「読みこむ」を押すと、そのゴーストの辞書(yaya.txt に書いてあるもの。yaya_base はのぞく)を、プロジェクトに写せます。
Shift_JIS の辞書も UTF-8 にして読みこみ、ゴーストのファイルは変えません。
辞書の関数は「ためす」でも動きます(右の列の「ためす」の「辞書の関数」か、辞書の画面の関数の帽子の ▶)。辞書にあるイベントは、
書き出したゴーストと同じく、ためすときも辞書のほうが動きます。トークの画面の右の列の YAYA タブには、キャンバスで最後に押したかたまりが
書き出したときになる YAYA が出て、ブロックを変えるとその場で書きかわります。
ゴースト情報 の画面の「サムネイルと readme」で、SSP のゴーストの一覧などに出る絵(thumbnail.png)と、
readme.txt に書くことを決められます(readme を空にしておくと、名前・作者・バージョン・説明から作ります)。
ブロックを組むのは トーク の画面です。つかいかたとキーボードは、右上の ? で開けます。
yaya_variable.cfg)
でやり直せます。ステージの立ち絵をクリック・ダブルクリック・なでると、さわった場所(当たり判定)に応じた
マウスのイベントを、SSP と同じえらびかたでためせます。shell\master など)を「いまあるシェルのフォルダから読みこむ」に入れると、
surface0.png のような番号の絵を、まとめてその番号に割り当てます。surfaces.txt のうごき(SERIKO/2.0 の書きかた)と
四角い当たり判定、descript.txt の着せ替えの名前も読みこみます(四角でない当たり判定と、古い SERIKO/1 の書きかたは読みません。
surfaces.txt で絵を組み合わせている番号は、1 枚の絵が無いので読みこめません)。
同じ画面の「うごき」で、立ち絵をパラパラ切りかえるアニメーションを作れます
(こまは左から順に、絵の見本つきでならびます)。
「いつ動く」を決めておけば勝手に動きますし、「うごき N を再生する」ブロックでも呼べます。
こまごとに重ねかたと位置を決められ、「そのうごきの間だけ触れる場所」も足せます。キーボードだけでも組めます。 / を押すと(キャンバスの右下の「+ ブロック」でも)ブロックを探す欄が開くので、 「話す」「なで」のように名前の一部を打って Enter で置きます。えらんでいるブロックのすぐ下につながり、 置いたブロックの文字の欄にそのまま打てます。Enter で決めて、また / を押せば、下へ下へと組んでいけます。
右クリックすると、ブロックの上ならコピー・切り取り・はりつけ・複製・部品にする・無効にする・メモ・削除、 かたまりの帽子の上なら実行・複製・たたむ・メモ・部品にする・YAYA を見る・削除、何もないところなら「ここにブロックを探して置く」「ここにはりつけ」「整列」 「すべてたたむ」「すべてひろげる」が出ます。たたんだかたまりは、帽子と「◯ 個のブロック」の帯だけになります(帯を押すか、かたまりの上の ▸ でひろげます)。 キーの一覧は ? か F1 で開くつかいかたの画面にあります。
「YAYA を見る」は、そのかたまりが書き出すとどんな YAYA の関数になるかを、書き出すものとそのままの形で出します。 手で YAYA を書くほうへ移っていくときの見本になります。
部品は、よく使う組みかたに名前を付けて取っておくものです。ブロックの右クリックの「ここから下を部品にする」
(帽子なら「このかたまりを部品にする」)で保存すると、パレットの 部品 に並び、どのプロジェクトにもドラッグで置けます。
使っている変数が置いた先に無ければ、初期値つきで足します。部品の名前を変える・消すのは、パレットの部品の右クリックです。
パレットの 部品 の上の「部品をファイルに書き出す」「部品のファイルを読みこむ」で、部品を .parts.json のファイルにして人と分けあえます
(1 つだけなら、部品の右クリックの「この部品をファイルに書き出す」)。読みこんだ部品の名前がかぶったら「名前 (2)」にします。
人からもらった部品は、プロジェクトと同じく、中身をたしかめてから使ってください。
メモは、右クリックの「メモを付ける」で、ブロックやかたまりに書いておける覚え書きです。かたまりの右に付せんのように出て、
その場で書きなおせます(全部消すとメモも消えます)。動きには関係しません。書き出すと、YAYA の辞書の
そのブロックの前に // メモ: … のコメントとして入るので、手で YAYA を読むときの手がかりにもなります。
さがす タブでもメモの中をさがせます。
書き出し の画面の「SSP に入れて動かす」を押すだけです。
ssp.exe)を自動で探します。動いていれば実行中のプロセスから、
止まっていれば C:\ssp などのよくある場所から見つけます。
見つからないときは、同じ画面の欄に ssp.exe のパスを入れて「この場所を使う」。ghost\ フォルダへ直接書き出し、そのまま SSP のゴーストを切り替えます。配布用にまとめるときは、同じ画面の「.nar を作る」。
できた .nar を SSP のウィンドウにドラッグ&ドロップするとインストールできます。
SSP で動いているゴーストに書き出し直すときは、下の「SSP に入れて動かす」を使ってください。 書き出したあと、栞に読みなおさせます(ふつうに書き出しただけでは、YAYA は読みなおしません)。
ためす タブに SSP の接続状態が出ます。つながっていれば:
OnMouseDoubleClick など)を SSP に投げて、
入れたゴーストが実際にどう反応するかを確かめます。内部では SSP の SSTP(127.0.0.1:9801)に SEND / NOTIFY / EXECUTE /
COMMUNICATE を送っています。
SSP 側で「SSTP を受け付ける」設定が有効(既定でオン)になっている必要があります。
絵を用意していない場合は、簡単な立ち絵(サーフェス 0/1/2 と 10/11/12)を自動生成します。
自分で描いた絵に差し替えるときは shell/master/ の PNG を置き換えてください。
既にあるシェル画像は、書き出し直しても上書きされません。
**バルーン(吹き出し)**も、キャラと絵 の「バルーンも作る」を入れると同梱できます
(balloon/ に PNG と descript.txt が入り、install.txt に置き場所が書かれます)。
入れないときは、使う人が持っているバルーンで表示されます。
色のほかに、かたち(角丸・四角・大きくまるい)・大きさ・しっぽの有無・線と文字の色もえらべます。
こちらも自分で描いた PNG があれば、書き出し直しても上書きしません。
配ったあとのゴーストを、こちらの直したものに追いつかせるしくみです。
/ を付けます。例: https://example.com/ghost/ikagako/)。
ここが descript.txt の homeurl になります。空なら何も書かないので、更新もしません。updates2.dau(中身の照合表)も一緒に作られます。
使う人の SSP はこれを見て、変わったファイルだけを落としてきます。
自分で差し替えた絵やあとから足したファイルも、フォルダの中身から作るので入ります。
updates2.dauの形式は公式には公開されていません。伺かスタジオは、公開されている 読み取り側の実装(ninix-kagari のlib/ninix/update.rb)に合わせて書いています。md5 missなどでうまくいかないときは、アップロードするフォルダを SSP のウィンドウに ドラッグ&ドロップすると SSP が作り直してくれるので、それを上書きしてください。.narの中には入れていません(アーカイブでは無くてもかまわないためです)。
更新のようすは OnUpdateBegin / OnUpdateReady / OnUpdateComplete / OnUpdateFailure
のイベントで受け取れます。ブロックを書かなくても、更新できたときと失敗したときは
栞が一言いいます(「変わりなし」と途中経過は黙っています)。
消したいファイルがあるときは、置き場所に
delete.txtを用意します (ネットワーク更新は上書きだけで、消す操作はしないためです)。
YAYA で手書きしたゴースト(YAYA のテンプレートで作ったものなど)に、ブロックで作ったトークを足せます。
書き出し の画面の「手書きの YAYA ゴーストにつなぐ」に、ゴーストのフォルダ
(ghost\master が中にあるフォルダ)を入れて つなぐ を押します。
名前(descript.txt の name・sakura.name・kero.name)は、そのゴーストのものになります。
つないでいるあいだは、書き出す(または SSP に入れて動かす)と、そのゴーストに書きこみます。 書くのは スタジオのファイルだけ です。
ghost/master/studio_runtime.dic と studio_program.dic(1 行目に // ukagaka-studio: generated の印)yaya.txt の中の、// ukagaka-studio: begin から // ukagaka-studio: end までの数行(無ければ末尾に足します)手書きの辞書・descript.txt・シェル・yaya.dll・yaya_base には触りません。
スタジオのファイルと同じ名前で、印の無いもの(人が書いたもの)があれば、上書きせずに止めます。
同じイベントは手書きが優先 です。手書きの辞書にもあるイベント(たとえば OnBoot)は、
スタジオは入り口を書きません(両方あると YAYA が辞書を読めず、ゴーストがだまるため)。
ブロックも動かしたいときは、手書きの関数の中で Studio.Event('OnBoot') をよんでください。
チェックタブが、そういうかたまりを知らせます。
ゴーストの yaya.dll と yaya_base はそのまま使います。古くてスタジオのしくみが動かないとき
(YAYA 6 系でない・yaya_base を使っていない・古い)は、つなぐところに出して、書き出しを止めます。
ブロックの変数は、手書きの YAYA から Studio.var['名前'] で読み書きできます。
反対に、ブロックから手書きの YAYA を使うときは、「YAYA の関数 F を A B でよぶ」(制御)と
「YAYA の式 C の値」(演算)のブロックを使います(関数の名前と式の欄には、ブロックをはめられません)。
つないでいるあいだは、関数の名前の横の ▾ で、手書きの辞書にある関数からえらべます(イベントとしくみの関数は出しません)。
つないでいるあいだは .nar は作りません。つなぐのをやめると、ふつうの書き出しにもどります。
ukagaka-studio.exe と同じフォルダに作られます。
projects\ | プロジェクト(作りかけのブロック)。初回起動時にサンプルが入ります(日本語なら いかがちゃん.json、英語なら Ikaga.json) |
projects\.history\ | プロジェクトの前の版。保存するたびに、上書きする前のものを残します(自動保存は 10 分おき・1 つのプロジェクトにつき新しいほうから 30 こ)。「開く」の 🕘 から開けます |
output\ | 書き出したゴースト(書き出し先を変えていない場合) |
parts.json | 部品(よく使う組みかた。どのプロジェクトからも使います) |
ukagaka-studio.json | 最後に開いたプロジェクト・書き出し先・ウィンドウの大きさ・言語 |
webview-data\ | WebView2 の作業フォルダ(消しても再生成されます) |
書き出すゴーストには、exe に埋めこんだ YAYA 一式(yaya.dll・yaya_base・studio_runtime.dic)が入ります。
Visual Studio の「C++ によるデスクトップ開発」が入っていれば、これだけです。
.\build.ps1 # 32bit の手伝い(yaya_host.exe)→ スタジオ(64bit EXE)
.\build.ps1 -Test # 画面を出さずに動かすコンソールも作り、テストも走らせる
.\build.ps1 -Release # きれいに作り直してテストし、配布用の zip を作る
-Release は dist\ukagaka-studio-<版>.zip を作ります(中身は exe と読みもの)。
版の数字は ルートの VERSION ファイルの 1 行だけです。ここを直すと、
zip の名前と exe のプロパティ(右クリック→プロパティ→詳細)の両方に入ります。
変わったことは CHANGELOG.md に足してください。
-Test を付けると、10 のテストが走ります。
そろい点検(tools\check-blocks.js) | ブロックが「定義・YAYA への訳・説明(日本語と英語)・テスト」のすべてにそろっているか。ビルドが要らないので、いちばん先に走ります |
一致テスト(shiori\test\parity\parity.js) | ブロックごとのかたまりを YAYA に訳して動かし、出てきたさくらスクリプトが決めておいた答え(expected.json)と同じか。同じかたまりを「ためす」と同じやりかた(yaya_host.exe)でも動かして、「ためす」と SSP の答えが同じかも見ます |
ふるまいテスト(shiori\test\behavior\behavior.js) | しくみの辞書が持っている判断 — 同じイベントに複数あるときどれを選ぶか、ブロックが無いときの既定の反応(英語のゴーストなら英語で)、OnClose の \-、「◯秒ごと」の間引き、ランダムトーク、なでなでの生成、通信の届け先、SAORI(テスト用のおそい DLL を実際に呼びます) — が期待どおりか |
YAYA のテスト(shiori\test\yaya\yaya.js) | YAYA(third_party\yaya\)が公式のビルドのままで動くか。変数が次の起動に残るか、exe の書き出しがそのまま YAYA で動くか、手書きの YAYA ゴーストにつないで書き出しても手書きのファイルがバイトのまま変わらないか、いまある YAYA ゴーストの辞書を UTF-8 にして読みこめるか、「ためす」で辞書の関数を動かせるか |
書き出しテスト(studio\test\export.js) | 書き出したファイル(surfaces.txt / descript.txt / ghost.json / install.txt / yaya.txt / studio_program.dic とファイルの一覧)の中身が期待どおりか。updates2.dau は MD5 を node の crypto と突き合わせます |
YAYA の文のテスト(ui\test\yayatext.js) | YAYA の辞書を読むところ(パーサー)と整えて書くところが、YAYA の構文をすべて読めるか。yaya_base・しくみの辞書・手書きのテスト用ゴーストがひとつ残らず読めて、書きなおしてもくずれないか。読めない関数があっても、ほかを読んで、読めない関数は書いたままで残すか。辞書のブロックにしてもどしても、同じ辞書になるか |
エディタテスト(ui\test\editor.js) | 読みこんだプロジェクトの整形と形の版の確かめ(model.js)と、チェックタブが出す注意(lint.js)、ブロックを字でさがすところが期待どおりか。お手本がどれもチェックに引っかからないか。ヘルプの「このソフトについて」の表示が README・LICENSE と同じ文か |
輸入の点検(tools\check-imports.js) | 書き出すゴーストに入れる yaya.dll の輸入表を直に読んで、Windows 2000 に無い API が混ざっていないか。混ざると、そこから下の Windows では DLL の読みこみ自体が失敗します(版を上げたときのため) |
画面ファイルの点検(ui\test\modules.js) | ui\js\*.js(ES モジュール)が入り口の main.js からたどれるか、どれを最初に読みこんでも落ちないか、Xxx.yyy() の呼び先がそろっているか。ファイルを分けたときの移し忘れを捕まえます。style.css の色がトークンを通っているか(暗い表示で色がぬけないように)も見ます |
この 10 だけ Node.js(22.12 以降)を使います(入っていなければ飛ばします。アプリの動作には要りません)。
ふるまいテストには、わざと待つ場面(おそい SAORI と終了が重なるところ)があるので、
10 秒ほどかかります。
ブロックやふるまいを足したら、shiori\test\ studio\test\ ui\test\ の材料と期待値も
いっしょに直してください。書き出しかたや、ブロックの出すものをわざと変えたときは、出てきたものを目で確かめてから
node studio\test\export.js --update / node shiori\test\parity\parity.js --update で期待値を作りなおします。
ブロックを 1 つ足すときの手順(どのファイルに何を書くか)と、つまずきやすいところは
docs/maintenance.md にまとめてあります。
この 10 は GitHub でも自動で走ります(main への push・v* タグ・プルリク)。
打ち忘れても止まるようにするためのものです。設定は .github/workflows/build.yml。
個別に作るときは shiori\build.ps1(32bit の手伝いとテスト用のコンソール)/ studio\build.ps1。
スタジオのビルドでは studio\tools\embed.ps1 が ui\ 以下と YAYA 一式(yaya.dll・yaya_host.exe・
しくみの辞書・yaya_base)をリソースにまとめ、exe に埋め込みます(UI や辞書を直したら再ビルドしてください)。
栞 YAYA の公式ビルド(yaya.dll)と、その受け口の辞書 yaya_base は third_party\ に入れてあります。
ソースからは組みません(いまの Visual Studio で組むと Windows 2000 で動かなくなるため)。どこから持ってきたか・版の上げかたは
third_party/README.md にあります。YAYA のライセンス(AYA Ver.5 の条件/BSD 3-Clause)の
本文は third_party\yaya\ にあり、配布用の zip にも入ります。
WebView2 の SDK は studio\third_party\webview2\ に入れてあります(ヘッダと静的リンク用の
WebView2LoaderStatic.lib だけ。BSD 3-Clause)。ダウンロードは不要です。
exe に静的リンクしているので、配るときは著作権表示の同梱が要ります。
その本文はルートの LICENSE の後ろに入れてあり、配布用の zip にも入ります。
Windows 11 の スマートアプリコントロール(既定でオンの環境があります)は、
署名がなく実績のない exe をブロックすることがあります。ビルドしたばかりの
ukagaka-studio.exe が「アプリケーション制御ポリシーによってブロックされました」と
言われた場合は、次のどれかで対応してください。
.\studio\build.ps1 -SignThumbprint <証明書の拇印>
自己署名証明書ではスマートアプリコントロールの信頼は得られません。作りたての yaya_host.exe や test_host.exe が、テストの途中で同じように止められることも
あります(error 4551)。もう一度ビルドすると通ることが多いです。
ukagaka-studio/
├── .github/workflows/
│ └── build.yml push のたびにビルドしてテストを走らせる
├── ukagaka-studio.exe ビルド結果(これ1つで動く)
├── build.ps1 まとめてビルド
├── LICENSE なしライセンス(+同梱物の表示)
├── shiori/ 栞(YAYA)を動かすテストと、32bit のものを組むところ
│ ├── build.ps1 yaya_host.exe(-Test で test_host.exe・slow_saori.dll も)を 32bit で組む
│ ├── test/ SSP なしで動かせるテスト
│ │ ├── test_host.cpp SSP のかわりに yaya.dll を読みこんで、イベントを順にたずねる
│ │ ├── lib/ テスト用の道具箱(ブロックを YAYA に訳して動かし、応答をほどく)
│ │ ├── parity/ ブロックごとの答えを見る一致テスト(expected.json が決めておいた答え)
│ │ ├── saori/ テスト用の「わざとおそい SAORI」
│ │ ├── behavior/ ふるまい(どれを選ぶか・既定の反応・間引き)のテスト
│ │ └── yaya/ YAYA そのもの・保存・書き出し・つなぐテスト。handwritten/ はつなぐテスト用の手書きゴースト
│ └── dist/ ビルド結果(yaya_host.exe / test_host.exe)
├── studio/ 伺かスタジオ(C++ / 64bit EXE)
│ ├── build.ps1
│ ├── test/ 答え合わせテスト(-Test で export_host.exe も作る。書き出したファイルの中身を見る)
│ ├── res/ アイコン・はじめて起動したときに置くサンプル(日本語と英語)
│ │ └── yaya/ しくみの辞書 studio_runtime.dic と「ためす」の入り口 studio_preview.dic
│ ├── yaya_host/ 「ためす」が YAYA を動かす 32bit の手伝い(shiori\build.ps1 が組む)
│ ├── third_party/ WebView2 SDK(ヘッダ + 静的ローダ)
│ ├── tools/embed.ps1 ui\ と YAYA 一式をリソース化
│ ├── tools/make-icon.mjs ロゴ(ui/img/logo.svg)から exe のアイコンを作る
│ └── src/
│ ├── main.cpp ウィンドウ・起動終了・多重起動防止
│ ├── lang.cpp exe が自分で出す言葉の言語(日本語・英語)
│ ├── webview.cpp WebView2 の埋め込みと要求の横取り
│ ├── webreq.cpp 要求の解析(URL デコードなど)
│ ├── assets.cpp exe に埋め込んだ ui\ と YAYA 一式を取り出す
│ ├── sstp.cpp SSP との連携(SSTP と ssp.exe の検出)
│ ├── api.cpp /api/* の受け口(パスと関数の対応表 kRoutes)
│ ├── api_project.cpp 状態・プロジェクトの保存と読み込み
│ ├── project_history.cpp プロジェクトの前の版(projects\.history\)
│ ├── api_shell.cpp 立ち絵(仮シェルの描画・用意した画像)
│ ├── api_ghost.cpp ためす・書き出したゴーストの記憶と記録
│ ├── api_export.cpp 書き出し・エクスプローラで開く・手書きの YAYA ゴーストを調べる
│ ├── yaya_ghost.cpp 手書きの YAYA ゴーストを調べる・つないだゴーストに書き出す(スタジオのファイルだけ)
│ ├── shell_import.cpp いまあるシェルのフォルダから、番号ごとの立ち絵を集める
│ ├── api_ssp.cpp 動いている SSP との連携
│ ├── yaya_preview.cpp 「ためす」を YAYA で動かす(yaya_host.exe に頼む)
│ ├── exporter.cpp ゴースト一式の組み立てと、フォルダ / .nar への書きこみ
│ ├── export_program.cpp ghost.json(ブロックの写し。伺かスタジオで読みこみなおすためのもの)
│ ├── export_shell.cpp 仮の立ち絵・shell の descript.txt・surfaces.txt
│ ├── export_seriko.cpp surfaces.txt の SERIKO のうごき
│ ├── export_balloon.cpp 同梱するバルーン
│ ├── export_dau.cpp ネットワーク更新の照合表(updates2.dau)
│ ├── image.cpp PNG 出力と簡易ラスタライザ
│ ├── zip.cpp .nar (ZIP) 出力
│ ├── deflate.cpp deflate 圧縮(固定ハフマン + LZ77)
│ ├── json.cpp 小さな JSON パーサ
│ ├── util.cpp 文字コード・ファイル・数の書きかた
│ └── fsutil.cpp ファイル操作
├── ui/ 画面(exe に埋め込まれる)
│ ├── index.html
│ ├── style.css
│ ├── samples/ お手本(「お手本から始める」)。英語のお手本は samples/en/
│ ├── test/ 画面を出さずに動かすテスト
│ │ editor.js … 整形・形の版・チェックタブ・ブロックを字でさがす・お手本・このソフトについて
│ │ yayatext.js … YAYA の文を読む・整えて書く
│ │ modules.js … 読みこみ・層の向き・呼び先・色のトークン
│ │ i18n.js … t() の包み忘れ・英語の辞書・exe のエラーのコード・文書の英語版
│ └── js/ ES モジュール(index.html は main.js だけを読む)
│ ├── main.js 入り口と組み立て(各部品の init と、まとめて描きなおす)
│ ├── shortcuts.js キーボードのショートカット
│ ├── i18n/ 画面の言葉(t() と英語の辞書 en.js)
│ ├── model/ データと規則(DOM を触らない)
│ │ ├── blocks.js ブロック定義(ここを増やすとブロックが増える)
│ │ ├── model.js プロジェクトのデータと Undo
│ │ ├── lint.js チェックタブ(空のセリフ・無い変数・行き先のない選択肢・よばれないトーク)
│ │ ├── blockindex.js ブロックを字でさがす(/ キーの「探して置く」)
│ │ ├── player.js さくらスクリプトをほどく(動かすのは YAYA)
│ │ ├── yaya.js ブロックを YAYA の辞書に訳す
│ │ ├── yayatext.js YAYA の辞書のテキストを読む(パーサー)・整えて書く
│ │ ├── dics.js プロジェクトの中の YAYA の辞書(名前の決まり・関数のかぶり・どこにも無い関数)
│ │ ├── yblocks.js 辞書のブロック(YAYA の構文と 1 対 1)と、辞書の木とのあいだの行き来
│ │ ├── lines.js セリフの一覧と CSV の出し入れ
│ │ ├── replace.js 文字をまとめて置きかえる(ブロックの文字の欄と、辞書の文字列)
│ │ ├── partsfile.js 部品のファイル(.parts.json)の書き出しと読みこみ
│ │ ├── diff.js 前の版と、いまのプロジェクトのちがい
│ │ ├── graph.js 選択肢と「よぶ」のつながり
│ │ └── sample.js 「新規」のひな形(ひな形ウィザードがえらんだ部品で作る)
│ ├── core/ 画面の土台(API・お知らせ・画面の状態・上の層への受け口・できごとの知らせ)
│ ├── editor/ キャンバスとパレット(描画・ドラッグ・ズーム・右クリック・探して置く・コピー・メモ・部品)
│ └── panels/ 画面(トーク・キャラと絵・ゴースト情報・書き出し・ヘルプ)
│ ├── pages.js 画面の切りかえ(上のバーのすぐ下)
│ ├── guide.js はじめてガイド(キャンバスの右上のカード)
│ ├── about.js ヘルプの「このソフトについて」(版と、もとにしたプロジェクトの表示)
│ ├── language.js 画面の言語の切りかえ(上のバーの English/日本語)
│ ├── run.js トークの右の「ためす」(実行・変数のようす・ゴーストの記録)
│ ├── stage.js 「ためす」のステージ(吹き出しと立ち絵を動かす)
│ ├── vars.js トークの右の「変数」
│ ├── search.js トークの右の「チェック」と「さがす」
│ ├── chara.js 「キャラと絵」(立ち絵・仮シェルの色・バルーン・うごき)
│ ├── ghost.js 「ゴースト情報」(名前・作者・しゃべる間隔・ネットワーク更新・ゴーストの言語・サムネイルと readme)
│ ├── dialog.js 保存 / 読込 と 書き出し
│ ├── starter.js 上のバーの「新規」のひな形ウィザード
│ ├── dictionary.js 「辞書」(プロジェクトの YAYA の辞書と、そのテキストエディタとブロック)
│ ├── graph.js キャンバスの「つながり」(選択肢のつながりの図)
│ ├── ssp.js 動いている SSP との連携
│ └── yayalink.js 書き出しの「手書きの YAYA ゴーストにつなぐ」
├── tools/
│ ├── check-blocks.js ブロックが全部のファイルにそろっているか見る(ビルド不要)
│ └── check-imports.js yaya.dll が Windows 2000 から読みこめるか見る
├── third_party/ よそから持ってきたもの(手を入れない)
│ ├── yaya/ YAYA の公式ビルド yaya.dll とライセンス
│ └── yaya-dic/ YAYA のシステム辞書 yaya_base(SHIORI/3.0 の受け口)
└── docs/
├── blocks.md ブロック一覧
├── ghost-json.md ghost.json の仕様
├── maintenance.md 手を入れるときの手引き(ブロックの足しかた・落とし穴)
├── plugins.md SSP のプラグインと組むときの早見表
├── roadmap.md 改修の計画
└── en/ 上の英語版(日本語版が正です)
書き出したゴーストの ghost/master/ には、次のものが入ります。
yaya.dll | 栞 YAYA(公式ビルド)。descript.txt の shiori がこれを指します |
yaya.txt | YAYA の設定。どの辞書を読むかが書いてあります |
yaya_base\ | YAYA のシステム辞書(SHIORI/3.0 の受け答えをして、イベントの名前の関数をよぶ) |
studio_runtime.dic | しくみの辞書。どのかたまりを選ぶか・間引き・既定の反応などの決まった部分(どのゴーストでも同じ) |
studio_program.dic | ブロックを訳した辞書。かたまり 1 つが YAYA の関数 1 つになります |
ghost.json | ブロックの写し。YAYA は読みません(「読み込み」でプロジェクトとして開けるように置いています) |
スタジオが書く 2 つの辞書は、1 行目の // ukagaka-studio: generated で見分けます。書き出すたびに上書きするので、
手で YAYA を書くときは、べつの辞書ファイルに書いて yaya.txt に足してください。
OnBoot、OnMouseDoubleClick など)は、yaya_base がイベントの名前の関数をよび、
studio_program.dic のその関数が、しくみの辞書に「このイベントのかたまりを動かして」と頼みます。
出てきたさくらスクリプトが Value: で返ります。weight(えらばれやすさ)で抽選します。
直前に選んだものは避けます。しぼり込みを書いたブロックは、条件なしの同じイベントより優先されます。OnSecondChange を数えて、設定した間隔で ランダムトーク(kind: "talk")を再生します。
直近に出したトークは候補から外すので、同じ話が続きません(外す数はゴーストの設定で変えられます。
既定はトーク数の半分・最大 8)。そのあいだ、yaya_base のランダムトーク(aitalkinterval)は止めます。yaya_variable.cfg に残り、次の起動で続きから使えます。
ブロックの変数は Studio.var['名前'] の 1 つの入れものにまとめてあるので、どんな名前でもそのまま使え、
手書きの YAYA の変数ともぶつかりません。OnFirstBoot / OnBoot)・定常ループ(OnSecondChange)・
その他のイベントの 3 つに分かれます。定常ループは SSP が毎秒たたいてくるので、
帽子ブロックの「◯秒ごと」で間引けます(everySec)。OnMouseMove が同じ場所で続いたら OnNadeNade(なでられたとき) を自分で作ります。
SSP にはこのイベントはありません。しくみの辞書の中で数えています。OnCommunicate)に対応しています。相手の名前と言われたことで
しぼり込めます。こちらから話しかけるときは応答に Reference0: 相手の名前 を付けます。
話しかけ合いが 8 往復続いたら、しゃべるだけにして通信は打ち切ります。REQUESTLIB でよびます(答えが返るまで待ちます)。
「答えを待たずによぶ」ブロックも、中では答えを待ってから、つぎの OnSecondChange で OnSaoriDone を作って知らせます。
YAYA には別のスレッドで動かすしくみが無いので、時間のかかる SAORI のあいだはゴーストが止まります。OnClose では必ず \- を付けて、ゴーストがちゃんと終了するようにします。studio_debug.txt)は、そのファイルがあるときだけ書きます(「ためす」の「記録をはじめる」で作ります)。
読みこんだこと・YAYA の注意・SAORI を読みこめないことなどが残ります。エディタの「ためす」も、SSP に入るのと同じ 32bit の yaya.dll が動かしています。画面はブロックを YAYA の辞書に訳して
POST /api/preview で頼み、伺かスタジオは exe に埋めこんだ 32bit の手伝い yaya_host.exe で、それを動かします
(画面側にブロックの解釈はありません)。違うのは 2 つだけで、SAORI は呼びません(ゴーストのフォルダの DLL が無いため)、
起動してからの時間や起動回数などは画面から渡します。「ためす」と SSP で同じ答えになることは、一致テストが確かめています。
1.x までは、自前の栞 如何栞(
ikaga.dll)がブロックを動かしていました。2.0 で YAYA に置きかえ、 動きは如何栞と同じになるように作ってあります。わざと、または YAYA ではできないために同じにならないところは、docs/roadmap.mdの 3-3 にあります。 前に如何栞で書き出したゴーストも、プロジェクトを開いて書き出しなおせば YAYA のゴーストになります (如何栞の変数の保存ikaga_save.jsonは引きつぎません。変数はプロジェクトの初期値から始まります)。
.\build.ps1 -Test
.\shiori\dist\test_host.exe .\output\いかがちゃん\ghost\master OnBoot OnMouseDoubleClick:0,0,0,0,Head OnClose
test_host.exe は SSP のかわりに、フォルダの yaya.dll を読みこんでイベントを順にたずねます
(ほかの栞の DLL を試すときは --dll <名前>)。イベント名:参照0,参照1,... の形で指定します。OnSecondChange:0,1*200 のように *回数 を付けると繰り返せます。
!sleep:300 を挟むと、その場で 300 ミリ秒待ちます(答えを待たない SAORI のように、
裏で動いているものが終わるのを待つとき用)。
できること:
\q)とその行き先、リンク(\_a)、音(\_v)OnCommunicate)— 話しかけられたときの反応と、こちらから話しかけること\p[n])の切りかえ\![raiseplugin,…])と、
プラグインから届くイベントの帽子ブロック(天気予報・日記・スタンプ帳・バルーンをえらぶ・メッセージ・Nostr など)。
プラグインごとの使いかたは docs/plugins.mdinterpolate や blend-* など)を選べます。
ほかのうごきを動かす/止める(いくつかのうちどれか・まとめて も)、大きさを変える、APNG を差しこむ、
そのうごきの間だけ触れる当たり判定(四角・だ円・丸・多角形)を足す、もできます)homeurl・updates2.dau の書き出し・更新のイベント・更新のブロック)まだできないことは、いまのところ挙がっていません。足したいものがあれば、docs/maintenance.md の
「ブロックを 1 つ足す」を見てください。
127.0.0.1:9801 だけです。https://ikaga.example/ という見せかけのアドレスで動いていて、
そこから外のページへは移動しません(移動しようとしたら、既定のブラウザに渡します)。
外部リンクを開くときも http / https だけを渡します。[ ] と改行を落とします。
ただし さくらスクリプトをそのまま出す ブロックは素通しなので、そこに外から来た文字を
入れないでください。.. や絶対パスは、しくみの辞書が断ります)。なしライセンス 1.1(元のプロジェクト「なし栞 + なしスタジオ」独自のものです。英語の参考訳も LICENSE に入っています)。
Copyright (c) 2026 月見里 彩葉 (miyagawa-yukinterface)
このフォークも同じ条件で配っています。上の「もとにしています」の表示は、その条件(3 節)に従って置いています。 アプリの中でも、ヘルプ(右上の ?)の「このソフトについて」に、版と同じ表示を出しています。
だれでも無償で、目的を問わず、使う・直す・配ることができます。
伺かスタジオで書き出したゴーストは、まるごとあなたのものです。
ゴーストの中には栞(yaya.dll。伺かのゴーストに組みこむときは AYA Ver.5 の条件で、自由に配れます)が入りますが、
伺かスタジオのものを配るときに
書いてくださるとうれしいですが、義務ではありません。 ゴーストを配る人に手間をかけたくないので、そこははっきり免除してあります。
ukagaka-studio.exe を単体で、あるいはソースを配るときは、
LICENSE を一緒に入れてください。
書きかえたもの(フォークを含みます)を配るときは、あわせて
README でも、アプリのヘルプでも、置きやすいところで構いません。こんな形です。
このソフトウェアは「なし栞 + なしスタジオ」をもとにしています。
https://github.com/miyagawa-yukinterface/nashi-shiori-studio
作者: 月見里 彩葉 (miyagawa-yukinterface)
(ゴーストを配るときは、これらは一切要りません。 フォークしたもので 書き出したゴーストについても同じです。)
現状のまま提供されます。何かあっても作者は責任を負えません。自己責任でお使いください。
ukagaka-studio.exe には Microsoft Edge WebView2 SDK(BSD 3-Clause)を
静的リンクしています。その著作権表示は LICENSE の後ろに入っていて、
配布用の zip にも必ず入ります。
また、栞 YAYA(yaya.dll。伺かのゴーストとその周りに組みこむときは AYA Ver.5 の条件、それ以外は BSD 3-Clause)を
exe に埋めこんでいます。その表示とライセンスの本文は、配布用の zip の third_party\ に入っています。
独自ライセンスなので、GitHub はライセンス名を表示しません。 中身は許諾型(MIT や zlib と同じ系統)で、コピーレフトではありません。
https://ikaga.example/ という
見せかけのアドレスから exe の中身を直接返しているだけで、通信はしていません。ui\index.html をブラウザで直接開くと、画面の見た目は出ますが、保存・書き出し・
「ためす」は動きません(どれも exe の中の処理を呼んでいるためです)。画面の言葉の点検(ui\test\i18n.js) | 画面の日本語がすべて t() を通り、英語の訳があるか(英語の画面でそこだけ日本語が残らないように)、英語の辞書に古い訳や {差しこみ} のずれが無いか、exe が返すエラーのコードがすべて画面の文になるか。文書の英語版がそろっているか |