ツナサンド定食

考えていたことや読んだ本の感想、作ったもの書いたものの告知を書いていこうかなぁというブログ

Naninovelのシナリオ文字カウントをするVSCode拡張を作った

※この記事は はてなエンジニア Advent Calendar 2025 の1月13日の記事です。

tunacook/vscode-naninovel-distiller というVSCode拡張機能を作ってみた。

github.com

前々から作らないとなと思っていたが、VSCode拡張機能なんて作るの初めてだったので、色々面白かった。

作った理由

Naninovel製インディゲームのローカライズする時に予算感の見積もりをするのに役立ちそうだから!

今NaninovelというUnityのアセットを使ってノベルゲームを作っている。

naninovel.com

sandwich-kitchen.com

インディゲームのローカライズ費用は、だいたいワード毎や文字数毎での費用決定が多くて、実際にどのぐらいの予算感になるのかをざっくりとでも(正確じゃなくても)知ることができるので便利そうだと思ったから。

これはローカライズする会社や翻訳者にもよるけど、 日本語->他言語 の場合は文字数、英語->他言語の場合はワード数で見ることが多そうなイメージがあるのだった。

www.activegamingmedia.com

Naninovelのシナリオファイルにはシナリオ文章以外にも、

のようなことを書かねばならず、純粋な文字数カウントだとノイズが多くて正確なシナリオ文字数が分からなかった。

また、テキストエディタのカウント方式によっては改行も1文字にカウントされる(改行文字を改行文字としてカウントしている)場合もあるため、その辺の揺らぎも排除したかった。

できること

文字数のカウント

純粋なシナリオの文字数だけをカウントする。 Naninovelのスクリプト構文やコメント構文などは除外。

この時、話者のラベルはカウントに含めない。

ワード数のカウント

同じようにワードを検出してその数を数える。

日本語のワード検出があまり精度高くないのだけど、今のところローカライズ見積もりにおいては重要じゃないのでそのままになっている。

話者のリストアップ

シナリオ中のセリフは

話す人: こんにちは!

みたいな構文で表現するのだけど、話す人:のところをユニークにリストアップできるようにした

Naninovelのシナリオ書式仕様を表現するライブラリも作った

昨年のアドベントカレンダーで、Textmesh proの豆腐を検出するGithub Actionsを作ったという話を書いた。

tunacook.hateblo.jp

その時に作ったNaninovelシナリオ構文のパースができる処理を、独立したライブラリにしておいた。

github.com

今回も、もちろん内部的な構文判定をこれで行っている。 こちらも安定してきたらバージョニングしたいわね。。

VSCode拡張機能の実装は案外簡単かも

VSCode拡張機能の実装を初めてやったけど、結構簡単にできそうだという感触があった。

code.visualstudio.com

github.com

pnpm install -g yo generator-code

でジェネレータを入れて、

yo code

で対話的に作っていけばひな形を作ることができる。

VSCodeでプロジェクトを開いて、F5キーでビルドすると、該当の拡張機能が入った状態で新しくVSCodeのウィンドウが開く。そのウィンドウで見たいファイルを開いて、その拡張機能がどのように適用されるかを見ていけば良い。

CIも作った

github.com

typescriptのプロダクトのCIは業務でもたくさん作ってきたのだけど、WebアプリケーションやライブラリじゃなくVSCode拡張のCIは書いたことがなかった。

pnpm run test ではあるんだけども(今回yarnじゃなくpnpmを使ってみてる)、VSCodeテスト実行に必要なモジュールをインストールする必要があって、ちょっと新鮮な部分があった

今後

色々まだ要件を満たしていないところもあるので改善していきたい

  • 話者ラベルリストはその文字数もカウントするようにする
  • 日本語でのワード検出の精度をある程度高める(ローカライズにおいてはそんなに必要なさそうだけど、どうせなら高めたい)
  • すでにローカライズのためのハッシュ管理されている場合はそれを見ないようにする
  • シナリオ校正のために印刷する用として、スクリプト構文やコメントを除いてPDF出力できるようにする
    • ルビは構文をパースしてゲーム側のように文字上に小さく乗せられるようにする

この辺をどうにかしつつ、個人で開発しているノベルゲームでドッグフーディングをして、ある程度できたらMarketplaceで公開したいと思う。

そのうちCDも作りたいけど、デプロイは自動化しなくても良いかも?

コミックマーケット107で頒布したゲームの通販を始めました

コミックマーケット107で、開発中のノベルゲーム『レイチェルの思い出』体験版を頒布しました。

tunacook.hateblo.jp

同じ物を少しだけですが通販します!

sandwich-kitchen.booth.pm

Boothのストアを作るのは初めてだったけど、かなりお手軽に開設できました。

が、色々と注意点があります。


1. 製品版とセーブデータの互換性を担保しません

製品版リリース時にはデータが引き継げない可能性が非常に高いです。「製品版を最初からプレイしても構わない」という方のみお楽しみください。

2. 物語は途中で終わります

制作途中のため、非常に気になる箇所で終わってしまうかもしれません。 「それでも応援したい!」という温かい心でプレイしていただけると幸いです。

3. パッチアップデートで製品版相当になることもありません

本データはあくまで体験版としての配布であり、将来的にパッチを当てることで製品版(フルバージョン)にアップグレードできる形式ではありません。製品版は別途、新規にダウンロード・ご購入いただく形となりますのでご注意ください。

4. 体験版を無料で配信する予定です

物理ディスクないし電子データとして、現時点のゲームを手元に置いておきたいという方向けのアイテムです。


あくまで『現時点でのゲームの体験版を遊びたい』『後日販売される完成版と見比べたい』といったマニアックな人向けの通販になります。 セーブデータの互換性やパッチでの製品版化は約束しないというものです。

頒布したビルドのクォリティには自信を持っていますが、 内容以外の約束を抱え込むのはしんどいのでね。

コミケではよく同人ゲームの体験版が頒布されていますが、完成版じゃないから買わないというのは勿体ないなとちょっと思ってます。

むしろ同人ゲームの体験版を買った方が良い!

大抵ゲーム開発では完成版と様相が異なってくるので、その時のビルドはさしずめそのときにしか存在していないタイムカプセルのようなもの…

完成版よりもある意味貴重なのではないでしょうか。

その時の体験版ビルドを買って、完成版と見比べてみるという楽しみ方もあるんじゃないかな。

コミックマーケット107に出展します

2025年12月31日に東京ビッグサイトにて行われる、コミックマーケット107にサークル出展します。

comiket.co.jp

頒布するもの

開発中のノベルゲーム『レイチェルの思い出』体験版のDVD-ROMと、クリア栞を持って行きます。

C106でも同じようなものを頒布していたけど、追加でシナリオを実装しているので、だいぶ進捗はしている……!

tunacook.hateblo.jp

夏コミから4ヶ月しか経っていないし、かなり頑張った方ではないか。

来年こそ完成させたい!

来年は8月ぐらいにリリースして、来年冬コミにメイキング本と別の新作を出したい! (そううまく行くかは不明)

2日目(12/31)南1”L”02bブースで握手!

誰も来なかったら淋しいので遊びに来てね!

store.steampowered.com

sandwich-kitchen.com

コミックマーケット106に出展します

2025年8月17日に東京ビッグサイトにて行われる、コミックマーケット106にサークル出展します。

www.comiket.co.jp

頒布するもの

開発中のノベルゲーム『レイチェルの思い出』体験版のDVD-ROMと、クリア栞を持って行きます。

この時代にDVD-ROMを焼くのは逆に新鮮な経験だった!

なんで物理DVD?

前回C105ではDLカードでの頒布だった。

tunacook.hateblo.jp

前回出展して分かったのは、コミックマーケット(同人ゲーム島)ではまだまだディスクメディアでの頒布が主流だということ。

Steamにて販売予定の『レイチェルの思い出』ですが、ビルドを配るのは久々。

store.steampowered.com

sandwich-kitchen.com

C89で出展した時の『ぎゃるちぇん』も物理DVDでの頒布だったけれど、もう10年以上前の事なので記憶が曖昧…… DVDのファイルシステムの違いとか、ディスククロージングの概念とか、ディスクフォーマット毎の違いとか、令和7年にimgburnを入れてDVDを焼く知見を得られた。

今回導入したデュプリケーター。大人気サークルでもないしそんなに部数出ないので1枚ずつ焼くやつ

https://www.amazon.co.jp/dp/B00CIQYQN6

これが大人気サークルになると5枚ずつとか10枚ずつになるけど、10万超えるのでまぁ、まぁ。

2日目(8/17)東”V”44bブースで握手!

誰も来なかったら淋しいので遊びに来てね!

store.steampowered.com

sandwich-kitchen.com

東京ゲームダンジョン7に出展します

東京ゲームダンジョン7ロゴ

2/15(土)と16(日)に、東京都立産業貿易センター 浜松町館 5階展示室にて開催されるインディゲーム展示イベント「東京ゲームダンジョン7」に出展します。

tokyogamedungeon.com

今回は2DAYS開催で、私は1日目のD-14ブースにいます。

展示するのは、このブログで何度も描いている、開発中のテキストアドベンチャーゲーム『レイチェルの思い出』。

store.steampowered.com

東京ゲームダンジョン7では、色々とUIのテイストを見直して実装し直したり、演出面の開発を進めていた。

変更点は主にこんな感じ。

また、直前になって色々とスチルを追加したり、それをPVに組み込んだりしていたので、結構頑張った!

www.youtube.com

イベントが終わったら、そろそろさすがにシナリオを終わらせてしまいたいなぁ。

どこでももくもく会セットを紹介したい

東京に来てからというもの、都内でたびたび開催されるインディゲーム開発者向けもくもく会に参加することが多くなった。

主催者や建付けは様々だが、目黒・渋谷・銀座・門前仲町・亀戸などなど、週に0回〜2回程度でどこかしらで開催されるので、週末はこれに参加して開発進捗を出していくのがほぼルーティン化している。

indiegame.connpass.com

tougebu.connpass.com

akimoku2024.connpass.com

そのときに持っていく荷物というものがだいたい定まってきたので、一旦紹介してみようと思う。

また、東京ゲームダンジョンやデジゲー博といったイベントにおいてもほぼ同じものを持っていくことが多い。

もくもく会に持っていくものはポータビリティを重要視している。

つまり、どこの会場に行っても同じ環境を展開できることだ。

前提

使用しているマシンはMacbook Proで、デスクトップ型のMacやPCはメインに使ってはいない。

普段自宅ではクラムシェルモードで、ドッキングステーションと外部ディスプレイに繋いで使っている。

なのでポータビリティを高めたいのであれば、メインマシンから持ち運び可能にするのは必須だと思う。

ついでにいうと絵を描くときもiPad Pro12.9インチをメインで使っている。板タブを使っていた時期もあったが、今はホコリを被ってしまっている。

もくもく会やイベントのたびに同じ荷物を作る

急いでいるときや、そうでなくても悩む負荷を減らすために、同じ荷物をすぐに再現できるようにしている。

その内容をご紹介したい。

Macbook Pro (M3 Max)

  • 画面サイズ:14インチ
  • ストレージ:2TB SSD
  • メモリ:64GB(16コアCPU搭載M3 Max)

まずはこれがないと作業にならない。

16インチも少し考えたが、持ち運びを考えると14インチが適当だった。

support.apple.com

スペックを盛っているので、だいたい70万円ぐらい。

家のメインマシンもこれで、家で使っているMacbook Proを直接持ち運んでいる。

作業環境のポータビリティが最高なので満足している。当然Apple Care+に加入済み。

いずれ家の環境も紹介したい〜

iPad Pro 12.9インチ(第3世代)+ Apple Pencil(第2世代)

support.apple.com

家でも外でも、絵を描くときはいつもiPadに入れたクリスタを使っている。絵の作業が溜まっている時はMacbookの代わりに持って行くこともある。

これにペーパーライクフィルムとカバーを使っている。

A1ポスター用のクソデカサイズの絵など、大判印刷用の絵はさすがに厳しくなってきたので、M4チップの第6世代にしたい気持ちもあるが、今のところ困ってないのでそのままになっている。

西川 AiR ポータブルクッション

www.airsleep.jp

特に初めて行く会場だとどのような椅子であるかわからないので、自分の体重を分散してくれるクッションは必要。

個人的に身体が大きく、尻や腰への負荷が高いので、腰の耐用年数を伸ばすために必須というわけ。

コミケとかデジゲー博はマジで普通のパイプ椅子なので、これがないと思うと恐ろしい。。。それでも尻が痛い時があったり。

ケーブルバッグ

https://www.yodobashi.com/product/100000001005717590/

このようにケーブルバッグでまとめてカバンに突っ込んでおくと、ほぼ荷造りせずにすぐ出かけることができて便利。

中身はこのようになっている。

USB-C to USB-Cケーブル(Macbook Pro用)

www.apple.com

USB-C to USB-Cケーブル(iPad Pro充電用)

これは純正じゃなくてもガラクタみたいなやつで事足りる。

USB-C to Lightningケーブル

www.apple.com

iPhone14 Proなので、iPhoneの充電をするのに使っている。

最近のやつに買い替えたらこれもUSB-C to USB-Cにできるのだけど、別にいいかなと思ってそのままになっている。

Macbook Pro用ACアダプタ(Macbook Proについてきたやつ)

www.apple.com

これがないとさすがに丸一日動かしっぱなしにはできない。

USB-C ACアダプタ×2

絵作業をすることが確定しているときは、Macbook Proを持っていかないときもあるので、これが給電用になる。

www.apple.com

デュアルポート的なやつがあるみたいなので、こちらに乗り換えても良いかも。

www.apple.com

靴べら

Amazon | [Temlum] 靴べら くつべら シューホーン 靴べら ミニ型 おしゃれ 携帯用 軽量 ステンレス製 キーホルダー 高級 PU 持ち運び便利 | Temlum | 靴べら

携帯用の靴べら。

Apple Watch充電台

https://www.yodobashi.com/product/100000001007579108/

Apple Watchを愛用しているので、さすがに一日で充電がなくなることはないが、泊まりのときは重宝している

純正品ではないが巻き取れるので便利。

ワイヤレスイヤホン充電器

jp.yamaha.com

イヤホンはYAMAHAのTW-E5Bを使っているが、充電器が別売りされているのでこれを別途購入している。

家にも当然充電器があるが、ケーブルバッグに入れっぱなしにするためにもう一つ用意している。

item.rakuten.co.jp

一口延長コード

パナソニック Panasonic 延長コードX 1m ブラック WHA4911BP

認知負荷の軽減は大事

Macbook Pro、(絵を描く時は)iPad Pro、ケーブルバッグ、ポータブルクッション、財布、メガネをカバンに入れればもう準備完了。

いちいち何を入れるか考えなくても良いし、定位置があるので失くすこともない。

考えなくてもよいというのが思いのほか重要で、そんなことを考える暇があったら睡眠に使ったりシナリオを考えたりするのに使うべきだ。

今年もまたこれらが活躍しそう〜