Article

WH40K ロスタービルダー 開発ログ(2026年3月)

2026年3月19日 / 開発日誌
#WH40K#ロスタービルダー#開発#アップデート

このサイトの WH40K ロスタービルダーについて、2026 年 3 月に行った主要な改修をまとめておきます。
機能追加というよりは「ちゃんと動くようにした」系の修正が多い回でした。


保存ロスターをどのブラウザ・端末でも見られるように

いちばん大きな変更はここです。

もともと「保存ロスター」は localStorage(ブラウザのローカルストレージ)に保存していたので、
Chrome で保存したロスターを Safari で開いても何も表示されない、という状態でした。
自分でも「スマホで確認しようとしたら空だった」という経験をしていたので、ずっと直したかった問題です。

今回、ロスター保存のデータを サーバー(PostgreSQL)に保存 するよう変更しました。
これでどのブラウザ・端末からでも「保存ロスター」ページで同じ一覧が表示されます。

内部的には以下の変更を行いました。

  • ロスター保存 API(POST /api/wh40k/rosters)を常に DB 保存に変更
  • ロスター一覧 API(GET /api/wh40k/rosters)がすべてのロスターを返すよう変更
  • ロスター詳細ページ(/wh40k/rosters/[id])の編集ボタンも別ブラウザから機能するよう修正
  • DB スキーマに detachment カラムを追加

⚠️ 移行時に、過去にローカルのみに保存されていたロスターは引き継げていません。申し訳ありません。


デタッチメント別のバトルライン表示

WH40K 10版では、デタッチメントによって「バトルライン扱いになる」ユニットが存在します。
たとえばスペースマリーンなら、デタッチメントによって Intercessors 以外のユニットがバトルライン扱いになるケースがあります。

ビルダー上では正しくバトルラインとして表示できていたのですが、
保存ロスターの詳細ページでは反映されていないという問題がありました。

原因は、ロスター詳細ページの初期データを DB から取得する際に detachment フィールドを渡し忘れていたことです。
あわせて、DB に detachment が保存されていない古いロスターについては localStorage から補完するフォールバックも入れました。


公式 PDF をもとにした日本語正式対応

今回のアップデートで、日本語訳の根拠を公式 PDF に統一しました。

GW が公式に発行している日本語版 PDF(Munitorum Field Manual v4.0 など)を精読し、
英語名との対訳表を整理した上でサイトのデータに反映しています。
これまでは独自の音写・意訳が混在していましたが、今後は公式表記を優先する方針です。

今回対応した主な項目は以下のとおりです。

  • ユニット名:全陣営にわたって公式日本語名を照合・修正
  • デタッチメント名:全陣営の公式日本語名を追加
  • エンハンスメント名・コスト:全陣営分を公式 PDF に基づき更新
  • インナーリ(Ynnari)表記の統一:これまで「イナーリ」と表記していましたが、公式日本語版に合わせ 「インナーリ」 に統一しました(14 箇所修正)

デタッチメント選択 UI・ロスター詳細ページ・ロスター一覧など、
日本語名が表示される箇所はすべて公式表記に揃っています。


共有 URL の短縮対応

以前の「共有 URL」はロスター全データを Base64 エンコードして URL に埋め込む方式だったので、
URL がとてつもなく長くなっていました(600 文字超えることもしばしば)。

今回、ロスターデータをサーバーの ShareLink テーブルに保存し、
短い ID だけで共有できるようにしました。

変更前: /wh40k/rosters/share?d=eyJuYW1lIjoiTXkgUm9zdGVy...(長い)
変更後: /wh40k/rosters/share/cm8xxxx(短い)

Prisma v7 への移行

地味に大変だったのがこれです。

データベース ORM の Prisma を v6 から v7 にアップデートしたところ、
schema.prisma での url 指定が廃止になり、
prisma.config.ts という新しい設定ファイルに移行する必要がありました。

あわせて、PostgreSQL アダプタ(@prisma/adapter-pg)をインストールし、
PrismaClient の初期化もアダプタを渡す形に変更しています。
seed スクリプト 5 本も同様に修正が必要でした。

移行自体は比較的シンプルでしたが、「エラーを見て→修正して→再実行」を
何往復かやることになり、地味に時間がかかりました。


まとめ

項目対応内容
ロスター共有localStorage → DB 保存に変更。クロスブラウザ対応
バトルラインデタッチメント別の表示を保存ロスター詳細にも反映
日本語正式対応公式 PDF をもとにユニット名・デタッチメント名・エンハンスメント名を更新
インナーリ表記「イナーリ」→「インナーリ」に統一(14 箇所)
共有 URL短縮 ID 方式に変更
Prisma v7設定ファイル・アダプタ移行

まだ [Crucible] ユニットの日本語名が積み残しですが、
全体的にかなり使いやすくなったと思います。引き続きちょこちょこ改善していきます。