ゲーム画面33枚をJSONにした — 名前が6件合わなかった

スマホゲーム「大三国志」の編成を相談するための、非公式の補助アプリを作っています。 持っている武将・戦法・武器を、1枚ずつ「持っている」にするのは手間です。そこで、ゲーム画面のスクリーンショットから、持ち物をまとめて入れる機能を作りました。
書き起こしはClaude Codeと進めました。この記事は、できあがったJSONをどう確かめたかの記録です。
入れたもの
2026-11-09に、画面33枚から書き起こしました。
| 元の画面 | 枚数 | 取り出したもの |
|---|---|---|
| 武将の一覧 | 12 | 武将106人(全291人のうち一部) |
| 戦法の庫蔵 | 9 | 戦法122(全193のうち一部) |
| 宝物の庫蔵 | 3 | 鋳造効果つきの武器23(全88のうち一部) |
| 敵部隊の編成 | 1 | (所持の書き起こし25枚のうちの1枚) |
| 自分の部隊編成 | 8 | 部隊8(24営) |
流れは次のとおりです。
名前が6件合わなかった
画面の名前は日本の字体で、アプリのデータは簡体字です。
そこで、名前は opencc-js(日本の字体から簡体字への変換)に通して、データの名前と突き合わせました。
多くの名前は、1回の変換でそのまま合います。趙雲は赵云、劉備は刘备、曹操は曹操、諸葛亮は诸葛亮になり、データと一致しました。
合わなかったのは、次の6件です。

見た目では、どれも同じ名前に見えます。 文字コードを並べると、違いは3種類の字だけでした。
- 姫(U+59EB)が、データでは姬(U+59EC)
- 衞(U+885E)が、データでは卫(U+536B)
- 馬雲騄の最後の字が、変換でU+2B627という珍しい字になり、データでは禄(U+7984)
3つの置き換えを、変換のあとに足しました。
import * as OpenCC from "opencc-js";
const toCn = OpenCC.Converter({ from: "jp", to: "cn" });
const fix = (s) =>
s.replaceAll("姫", "姬").replaceAll("衞", "卫").replaceAll("\u{2B627}", "禄");
const match = (name) => fix(toCn(name));
直したあとで確かめたこと
今回、手元で10件を流し直しました。
- 合わなかった6件は、すべてデータと一致した
- 最初から合っていた4件(趙雲・劉備・曹操・諸葛亮)は、一致のまま変わらなかった
直した置換が、合っていた名前を壊していないかも、同時に見ておく必要があります。
確かめたのはこの10件だけです。106人全員を流し直してはいません。取り込み時に突き合わせた記録を信用しています。
画面に写っていてもデータに無い武将は、入れませんでした。二人札を含めて11人分の名前です。データに無いものを無理に近い名前へ寄せると、別の武将の持ち物になってしまうためです。
取り込みは何度押しても増えない
JSONを入れる処理は、状態を触らない関数(planOwnedImport)に、必要な操作の一覧だけ作らせています。
すでに持っているものは、一覧に入れません。
空の状態にプレイヤーを1人入れて、実データで2回流しました。
| 回 | 操作の数 |
|---|---|
| 1回目 | 460 |
| 2回目(同じJSON) | 0 |
2回目は「同じ」と判定された項目が259件あり、足す操作はゼロでした。 画面のボタンを何度押しても、持ち物は増えません。
別の編成がある部隊は飛ばす
部隊は、すでに別の編成が置かれていたら、部隊ごと飛ばす決まりにしています。
1回目のあとで、部隊0の本営だけ別の武将に変えたJSONを流してみました。
| 設定 | 反映する部隊 | 飛ばす部隊 | 操作 |
|---|---|---|---|
| 既定 | 0 | 部隊0 | 0 |
| 置き換えを許す | 1 | なし | 2(place 1、tech 1) |
置き換えを許した場合も、変わるのは本営の武将と、その武将の兵種汎用技法だけでした。 戦法と武器は同じなので、操作は増えません。
設計文書と食い違っていた点
設計文書の表には、戦法が121と書いてあります。実データのJSONは122でした。 部隊を書き起こすとき、持ち物に無かった桃園結義を1件足したためです。表の更新が漏れていました。
数値は、文書ではなく実データから数えます。
次に同じことをするなら
- 突き合わせで落ちた名前を、一覧にして数える
- 落ちた名前は、見た目ではなく文字コードを並べる。字体の差と、データに無いものを分ける
- 直したら、一致していた名前も一緒に流し直す
- 取り込みは「計画」と「反映」を分け、同じJSONを2回流して、2回目が0になるか見る
関連する記事です。
- 字体違いの名前合わせ — 日本の字体と簡体字データを突き合わせる手順と、3文字の置き換え表
- JSONの返事を受け取る型 — 外から来たJSONを、形で検査してから使う考え方
- ハッシュタグ必須と書いても止まらない — 同じく、決まりを検査の関数へ移した記録
- 制作物の一覧 — 作っているプロダクトの一覧