M3: japanska skyltar – pixelfont, ordbok, kunskap, delvis översättning, hjälp
All checks were successful
release / build-release (push) Successful in 1m42s

- resources/text/fonts: PixelMplus 10/12 px (M+ FONT LICENSE) + licens;
  all text ritas via text/v2 på heltalspositioner, debugfonten är borta
- internal/lang: ordbok (60 ord, validerad), tokenisering med längsta
  matchning, Knowledge (ord + kana, nivå 0–5, hintar), Render (kända ord
  markerade/översatta, okända kvar, kana som romaji), EnglishShare/
  ShowEnglish per svårighet (deterministiskt per bana+position),
  HelpSeconds; datatest kräver att all japanska i banorna finns i ordboken
- sim.Run: AskHelp (H) med väntetid efter nivå, avbryts om man går,
  avslöjar skylten och lär första okända ordet; Knowledge delas mellan banor
- game: skylt- och avgångstavlor renderade genom kunskapen med färgkodning,
  engelsk rad på lätta banor, hjälp-förlopp, "Nytt ord"-notis, HUD visar
  resmålet på japanska från nivå 1 och japanska-nivå; meny med svårighet;
  pixelbaserad radbrytning av färgade textsegment; -know-flagga
- tools/shots: tre skyltbilder (skylt, hjälp, nytt ord) med förkunskap
- docs/README/wiki uppdaterade

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-10-23 20:14:36 +02:00
parent 0e10cbf123
commit b67493fddb
40 changed files with 1846 additions and 174 deletions

View File

@@ -48,9 +48,9 @@
},
{
"text": {
"en": "\u003c- Track 8 Chuo Line (Tokyo) Track 14 Yamanote Line (Shibuya) -\u003e",
"en": "<- Track 8 Chuo Line (Tokyo) Track 14 Yamanote Line (Shibuya) ->",
"ja": "← 8番線 中央線 東京方面 14番線 山手線 渋谷方面 →",
"sv": "\u003c- Spår 8 Chuo-linjen (Tokyo) Spår 14 Yamanote-linjen (Shibuya) -\u003e"
"sv": "<- Spår 8 Chuo-linjen (Tokyo) Spår 14 Yamanote-linjen (Shibuya) ->"
},
"x": 11,
"y": 15
@@ -58,7 +58,7 @@
{
"text": {
"en": "Track 14 Yamanote Line for Shibuya: the gate in the south-east corner.",
"ja": "14番線 山手線 渋谷方面 → 南東口改札",
"ja": "14番線 山手線 渋谷方面 → 南東口 改札",
"sv": "Spår 14 Yamanote-linjen mot Shibuya: spärren i sydöstra hörnet."
},
"x": 15,
@@ -108,4 +108,4 @@
"track": "8"
}
]
}
}

View File

@@ -1,8 +1,10 @@
# resources/text – text och språk
- `sv.json`, `en.json` – UI-strängar per språk (platt nyckel → text).
- `jp-dictionary.json` – ordboken över japanska skyltord: tecken, läsning
(romaji) och översättning. Används av skyltsystemet för att visa hel/delvis
översättning baserat på vad spelaren lärt sig.
- `fonts/` – (kommer) pixelfont med stöd för kana + kanji, t.ex. PixelMplus
eller Misaki. Licensfil ska ligga bredvid fonten.
- `jp-dictionary.json` – ordboken över japanska skyltord: nyckel = ordet på
japanska, `kana` (läsning), `romaji`, `en`, `sv`, `tier` (1 = vanligast).
Nycklar som börjar med `_` ignoreras. **Alla japanska ord i banorna**
(skyltar, bannamn, resmål, linjer) måste finnas här – testet
`internal/lang.TestAllJapaneseInLevelsIsInDictionary` kontrollerar det.
- `fonts/` – PixelMplus 10/12 px (kana + kanji, M+ FONT LICENSE). Se
`fonts/README.md`.

View File

@@ -30,5 +30,15 @@
"hud.sign": "Sign",
"result.wrong_detail": "You went to %s instead of %s.",
"result.gates": "Gates",
"result.card": "Card left"
"result.card": "Card left",
"hud.japanese": "日本語",
"hud.words": "words",
"hud.track_suffix_ja": "番線",
"hud.for_ja": "方面",
"hud.english": "EN",
"hud.help_prompt": "H: ask someone for help (%.0f s)",
"hud.help_progress": "Asking a passer-by…",
"hud.learned": "New word",
"hud.revealed": "Translated",
"result.helps": "asked for help"
}

View File

@@ -0,0 +1,16 @@
M+ FONTS Copyright (C) 2002-2013 M+ FONTS PROJECT
-
LICENSE_E
These fonts are free software.
Unlimited permission is granted to use, copy, and distribute them, with
or without modification, either commercially or noncommercially.
THESE FONTS ARE PROVIDED "AS IS" WITHOUT WARRANTY.
http://mplus-fonts.sourceforge.jp/mplus-outline-fonts/

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,15 @@
# Fonter
**PixelMplus** 10 och 12 px (Regular) av itouhiro, baserad på M+ BITMAP FONTS
(Copyright 2002-2013 M+ FONTS PROJECT). Pixelfont med JIS nivå 1+2-kanji,
kana och Latin-1. Hämtad från <https://github.com/itouhiro/PixelMplus>
(release v1.0.0, 2013-06-02).
Licens: **M+ FONT LICENSE** – fri användning, kopiering och vidaredistribution,
även kommersiellt, utan garanti. Se `LICENSE-PixelMplus.txt`.
- `PixelMplus10-Regular.ttf` – UI och skyltar (halvbredd 5 px, fullbredd 10 px).
- `PixelMplus12-Regular.ttf` – rubriker.
Rita alltid i exakt 10 resp. 12 px på heltalspositioner så att pixlarna
hamnar på rutnätet.

View File

@@ -1,23 +1,423 @@
{
"_comment": "Skyltord. Nyckel = japanska. kana = läsning i hiragana/katakana, romaji = latinsk läsning. tier = hur tidigt ordet brukar läras (1 = allra vanligast).",
"出口": { "kana": "でぐち", "romaji": "deguchi", "en": "Exit", "sv": "Utgång", "tier": 1 },
"入口": { "kana": "いりぐち", "romaji": "iriguchi", "en": "Entrance", "sv": "Ingång", "tier": 1 },
"改札": { "kana": "かいさつ", "romaji": "kaisatsu", "en": "Ticket gate", "sv": "Spärr", "tier": 1 },
"のりば": { "kana": "のりば", "romaji": "noriba", "en": "Platform", "sv": "Perrong", "tier": 1 },
"番線": { "kana": "ばんせん", "romaji": "bansen", "en": "Track no.", "sv": "Spår nr", "tier": 1 },
"切符": { "kana": "きっぷ", "romaji": "kippu", "en": "Ticket", "sv": "Biljett", "tier": 1 },
"トイレ": { "kana": "トイレ", "romaji": "toire", "en": "Toilet", "sv": "Toalett", "tier": 1 },
"方面": { "kana": "ほうめん", "romaji": "hōmen", "en": "Direction / for", "sv": "Riktning / mot", "tier": 2 },
"乗換": { "kana": "のりかえ", "romaji": "norikae", "en": "Transfer", "sv": "Byte", "tier": 2 },
"快速": { "kana": "かいそく", "romaji": "kaisoku", "en": "Rapid", "sv": "Snabbtåg", "tier": 2 },
"各駅停車": { "kana": "かくえきていしゃ", "romaji": "kakueki teisha", "en": "Local (all stops)", "sv": "Lokaltåg (alla stopp)", "tier": 3 },
"特急": { "kana": "とっきゅう", "romaji": "tokkyū", "en": "Limited express", "sv": "Expresståg", "tier": 3 },
"空港": { "kana": "くうこう", "romaji": "kūkō", "en": "Airport", "sv": "Flygplats", "tier": 2 },
"東口": { "kana": "ひがしぐち", "romaji": "higashiguchi", "en": "East exit", "sv": "Östra utgången", "tier": 2 },
"西口": { "kana": "にしぐち", "romaji": "nishiguchi", "en": "West exit", "sv": "Västra utgången", "tier": 2 },
"南口": { "kana": "みなみぐち", "romaji": "minamiguchi", "en": "South exit", "sv": "Södra utgången", "tier": 2 },
"北口": { "kana": "きたぐち", "romaji": "kitaguchi", "en": "North exit", "sv": "Norra utgången", "tier": 2 },
"終点": { "kana": "しゅうてん", "romaji": "shūten", "en": "Terminus", "sv": "Slutstation", "tier": 3 },
"自動券売機": { "kana": "じどうけんばいき", "romaji": "jidō kenbaiki", "en": "Ticket machine", "sv": "Biljettautomat", "tier": 3 },
"チャージ": { "kana": "チャージ", "romaji": "chāji", "en": "Top up (IC card)", "sv": "Fyll på (kort)", "tier": 2 }
"_comment": "Skyltord. Nyckel = japanska. kana = läsning, romaji = latinsk läsning, sv/en = översättning, tier = hur tidigt ordet brukar läras (1 = allra vanligast). Alla japanska ord i banorna måste finnas här (testas).",
"出口": {
"kana": "でぐち",
"romaji": "deguchi",
"en": "exit",
"sv": "utgång",
"tier": 1
},
"入口": {
"kana": "いりぐち",
"romaji": "iriguchi",
"en": "entrance",
"sv": "ingång",
"tier": 1
},
"改札": {
"kana": "かいさつ",
"romaji": "kaisatsu",
"en": "ticket gate",
"sv": "spärr",
"tier": 1
},
"のりば": {
"kana": "のりば",
"romaji": "noriba",
"en": "platform",
"sv": "perrong",
"tier": 1
},
"番線": {
"kana": "ばんせん",
"romaji": "bansen",
"en": "track",
"sv": "spår",
"tier": 1
},
"切符": {
"kana": "きっぷ",
"romaji": "kippu",
"en": "ticket",
"sv": "biljett",
"tier": 1
},
"トイレ": {
"kana": "トイレ",
"romaji": "toire",
"en": "Toilet",
"sv": "Toalett",
"tier": 1
},
"方面": {
"kana": "ほうめん",
"romaji": "hōmen",
"en": "for",
"sv": "mot",
"tier": 2
},
"乗換": {
"kana": "のりかえ",
"romaji": "norikae",
"en": "transfer",
"sv": "byte",
"tier": 2
},
"快速": {
"kana": "かいそく",
"romaji": "kaisoku",
"en": "Rapid",
"sv": "Snabbtåg",
"tier": 2
},
"各駅停車": {
"kana": "かくえきていしゃ",
"romaji": "kakueki teisha",
"en": "Local (all stops)",
"sv": "Lokaltåg (alla stopp)",
"tier": 3
},
"特急": {
"kana": "とっきゅう",
"romaji": "tokkyū",
"en": "Limited express",
"sv": "Expresståg",
"tier": 3
},
"空港": {
"kana": "くうこう",
"romaji": "kūkō",
"en": "Airport",
"sv": "Flygplats",
"tier": 2
},
"東口": {
"kana": "ひがしぐち",
"romaji": "higashiguchi",
"en": "East exit",
"sv": "Östra utgången",
"tier": 2
},
"西口": {
"kana": "にしぐち",
"romaji": "nishiguchi",
"en": "West exit",
"sv": "Västra utgången",
"tier": 2
},
"南口": {
"kana": "みなみぐち",
"romaji": "minamiguchi",
"en": "South exit",
"sv": "Södra utgången",
"tier": 2
},
"北口": {
"kana": "きたぐち",
"romaji": "kitaguchi",
"en": "North exit",
"sv": "Norra utgången",
"tier": 2
},
"終点": {
"kana": "しゅうてん",
"romaji": "shūten",
"en": "Terminus",
"sv": "Slutstation",
"tier": 3
},
"自動券売機": {
"kana": "じどうけんばいき",
"romaji": "jidō kenbaiki",
"en": "Ticket machine",
"sv": "Biljettautomat",
"tier": 3
},
"チャージ": {
"kana": "チャージ",
"romaji": "chāji",
"en": "Top up (IC card)",
"sv": "Fyll på (kort)",
"tier": 2
},
"新宿": {
"kana": "しんじゅく",
"romaji": "Shinjuku",
"en": "Shinjuku",
"sv": "Shinjuku",
"tier": 2
},
"渋谷": {
"kana": "しぶや",
"romaji": "Shibuya",
"en": "Shibuya",
"sv": "Shibuya",
"tier": 2
},
"東京": {
"kana": "とうきょう",
"romaji": "Tōkyō",
"en": "Tokyo",
"sv": "Tokyo",
"tier": 1
},
"上野": {
"kana": "うえの",
"romaji": "Ueno",
"en": "Ueno",
"sv": "Ueno",
"tier": 2
},
"京成上野": {
"kana": "けいせいうえの",
"romaji": "Keisei-Ueno",
"en": "Keisei-Ueno",
"sv": "Keisei-Ueno",
"tier": 3
},
"京成線": {
"kana": "けいせいせん",
"romaji": "Keisei-sen",
"en": "Keisei Line",
"sv": "Keisei-linjen",
"tier": 3
},
"山手線": {
"kana": "やまのてせん",
"romaji": "Yamanote-sen",
"en": "Yamanote Line",
"sv": "Yamanote-linjen",
"tier": 2
},
"中央線": {
"kana": "ちゅうおうせん",
"romaji": "Chūō-sen",
"en": "Chuo Line",
"sv": "Chuo-linjen",
"tier": 2
},
"成田エクスプレス": {
"kana": "なりたエクスプレス",
"romaji": "Narita Ekusupuresu",
"en": "Narita Express",
"sv": "Narita Express",
"tier": 3
},
"成田": {
"kana": "なりた",
"romaji": "Narita",
"en": "Narita",
"sv": "Narita",
"tier": 3
},
"駅": {
"kana": "えき",
"romaji": "eki",
"en": "station",
"sv": "station",
"tier": 1
},
"線": {
"kana": "せん",
"romaji": "sen",
"en": "line",
"sv": "linje",
"tier": 1
},
"南東": {
"kana": "なんとう",
"romaji": "nantō",
"en": "south-east",
"sv": "sydöst",
"tier": 3
},
"南西": {
"kana": "なんせい",
"romaji": "nansei",
"en": "south-west",
"sv": "sydväst",
"tier": 3
},
"南東口": {
"kana": "なんとうぐち",
"romaji": "nantōguchi",
"en": "South-east exit",
"sv": "Sydöstra utgången",
"tier": 3
},
"電車": {
"kana": "でんしゃ",
"romaji": "densha",
"en": "train",
"sv": "tåg",
"tier": 1
},
"バス": {
"kana": "バス",
"romaji": "basu",
"en": "bus",
"sv": "buss",
"tier": 1
},
"案内": {
"kana": "あんない",
"romaji": "annai",
"en": "Information",
"sv": "Information",
"tier": 2
},
"出発": {
"kana": "しゅっぱつ",
"romaji": "shuppatsu",
"en": "Departure",
"sv": "Avgång",
"tier": 2
},
"到着": {
"kana": "とうちゃく",
"romaji": "tōchaku",
"en": "Arrival",
"sv": "Ankomst",
"tier": 2
},
"注意": {
"kana": "ちゅうい",
"romaji": "chūi",
"en": "Caution",
"sv": "Varning",
"tier": 2
},
"禁煙": {
"kana": "きんえん",
"romaji": "kin'en",
"en": "No smoking",
"sv": "Rökning förbjuden",
"tier": 3
},
"お手洗い": {
"kana": "おてあらい",
"romaji": "otearai",
"en": "Restroom",
"sv": "Toalett",
"tier": 2
},
"階段": {
"kana": "かいだん",
"romaji": "kaidan",
"en": "Stairs",
"sv": "Trappa",
"tier": 2
},
"エレベーター": {
"kana": "エレベーター",
"romaji": "erebētā",
"en": "Elevator",
"sv": "Hiss",
"tier": 2
},
"エスカレーター": {
"kana": "エスカレーター",
"romaji": "esukarētā",
"en": "Escalator",
"sv": "Rulltrappa",
"tier": 2
},
"コンビニ": {
"kana": "コンビニ",
"romaji": "konbini",
"en": "Convenience store",
"sv": "Närbutik",
"tier": 1
},
"売店": {
"kana": "ばいてん",
"romaji": "baiten",
"en": "Kiosk",
"sv": "Kiosk",
"tier": 3
},
"飲み物": {
"kana": "のみもの",
"romaji": "nomimono",
"en": "Drinks",
"sv": "Dryck",
"tier": 2
},
"食べ物": {
"kana": "たべもの",
"romaji": "tabemono",
"en": "Food",
"sv": "Mat",
"tier": 2
},
"満員": {
"kana": "まんいん",
"romaji": "man'in",
"en": "Full (crowded)",
"sv": "Fullt",
"tier": 3
},
"遅延": {
"kana": "ちえん",
"romaji": "chien",
"en": "Delay",
"sv": "Försening",
"tier": 3
},
"普通": {
"kana": "ふつう",
"romaji": "futsū",
"en": "Local",
"sv": "Lokaltåg",
"tier": 2
},
"急行": {
"kana": "きゅうこう",
"romaji": "kyūkō",
"en": "Express",
"sv": "Expresståg",
"tier": 2
},
"新幹線": {
"kana": "しんかんせん",
"romaji": "shinkansen",
"en": "Shinkansen",
"sv": "Shinkansen (snabbtåg)",
"tier": 2
},
"地下鉄": {
"kana": "ちかてつ",
"romaji": "chikatetsu",
"en": "Subway",
"sv": "Tunnelbana",
"tier": 2
},
"次": {
"kana": "つぎ",
"romaji": "tsugi",
"en": "Next",
"sv": "Nästa",
"tier": 1
},
"分": {
"kana": "ふん",
"romaji": "fun",
"en": "minute(s)",
"sv": "minut(er)",
"tier": 1
},
"円": {
"kana": "えん",
"romaji": "en",
"en": "yen",
"sv": "yen",
"tier": 1
},
"京成本線": {
"kana": "けいせいほんせん",
"romaji": "Keisei Honsen",
"en": "Keisei Main Line",
"sv": "Keisei huvudlinje",
"tier": 3
}
}

View File

@@ -30,5 +30,15 @@
"hud.sign": "Skylt",
"result.wrong_detail": "Du åkte mot %s i stället för %s.",
"result.gates": "Spärrar",
"result.card": "Kort kvar"
"result.card": "Kort kvar",
"hud.japanese": "日本語",
"hud.words": "ord",
"hud.track_suffix_ja": "番線",
"hud.for_ja": "方面",
"hud.english": "EN",
"hud.help_prompt": "H: fråga någon om hjälp (%.0f s)",
"hud.help_progress": "Frågar en förbipasserande…",
"hud.learned": "Nytt ord",
"hud.revealed": "Översatt",
"result.helps": "frågat om hjälp"
}