0a7076d5b9
Rewrites the i18n system introduced in PR #94 to use Next.js App Router [locale] dynamic segments with SSR-rendered translations and proper middleware locale routing. - Add middleware locale detection: / rewrites to /zh-CN/ internally, /en and /ja pass through, /zh-CN/... redirects to bare path - Move all 7 pages under app/[locale]/ with SSR translation injection - Fix server→client serialization: pre-evaluate function-valued translations (makeSerializable) to eliminate hydration flash - Fix language switch key flash: use hard navigation with localStorage- only persistence, avoiding React state update before page reload - Add <link rel="alternate" hreflang> tags for multilingual SEO - Fix Supabase setAll overwriting locale rewrite response - Trim locales from 22 to 3 (zh-CN/en/ja), delete 19 incomplete files - LLM-translate 240 firstact game preset JSONs (en + ja, landscape + portrait) and story titles via gemini-3.5-flash - Delete 11 one-off migration scripts and outdated i18n docs - Add useLocalePath hook and navigation utilities Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 line
11 KiB
JSON
1 line
11 KiB
JSON
{"sessionId":"s_1780421525670_342cr2","scene":{"id":"scene_1780421565130_puhn","scenePrompt":"Wide establishing shot of a cramped, cluttered shared apartment interior at deep night. The room is lit by the cold, harsh glow of a laptop screen and a phone on a low table, both displaying dense, overwhelming text and notification icons. Discarded takeout boxes, crumpled papers, and a half-empty mug litter the space. In the foreground, a closed door is slightly ajar, hinting at a hasty exit. Through the window, a distant, poorly-lit parking lot is visible, with a single battered sedan parked under a flickering streetlamp. The atmosphere is one of suffocating pressure and quiet despair, rendered in muted, desaturated tones with deep shadows.","beats":[{"id":"b1","narration":"スマホの画面の光が目に染みる。最新のメッセージは大家からの家賃の催促で、その前は人事からの解雇通知だ。シェアハウスの同居人の部屋のドアは固く閉ざされ、リビングにはデリバリーの空き箱が山積みになっている。あなたは自分が絞り尽くされたレモンのように感じられた。酸っぱくて、無力で、しわくちゃの皮だけが残されている。","next":{"type":"continue","nextBeatId":"b2"}},{"id":"b2","narration":"あなたは勢いよく立ち上がったが、膝をローテーブルにぶつけ、痛みに顔をしかめた。行き場のない怒りが一気に頭に血を上らせる。","speaker":"あなた","line":"クソッ……","next":{"type":"continue","nextBeatId":"b3"}},{"id":"b3","narration":"車のキーと上着をひったくり、玄関へと飛び出す。鍵穴で鍵が回る音が、妙に大きく響いた。","next":{"type":"continue","nextBeatId":"b4"}},{"id":"b4","narration":"階段のセンサーライトが反応して、青白く灯る。あなたは階段を駆け下りた。背後のドアが閉まった瞬間、それはただ閉じたのではなく、あなたの最後のプライドを封印してしまったかのように感じられた。街灯の下に佇む古い車は、まるでブリキの棺桶のようだ。","next":{"type":"continue","nextBeatId":"b5"}},{"id":"b5","narration":"エンジンをかけ、ナビも見ずにただ車を走らせる。バックミラーの中で、都会のネオンがかすんだ光の点へと縮んでいき、やがて闇に飲み込まれていった。エンジンの轟音だけが、今のあなたの頭の中で鳴り響く雑音をかき消してくれる唯一のものだった。燃料計の針は下がり続け、ついにレッドゾーンを指した。","next":{"type":"choice","choices":[{"id":"c1","label":"ガソリンが切れるまで走り続ける","effect":{"kind":"advance-beat","targetBeatId":"b6"}},{"id":"c2","label":"どこかに車を止め、タバコを吸って落ち着く","effect":{"kind":"advance-beat","targetBeatId":"b7"}}]}},{"id":"b6","narration":"何かを証明するかのように、あなたはアクセルを強く踏み込み続けた。やがて、エンジンが不満げな咳払いを残して停止した。車はゆっくりと路肩に滑り込み、止まった。辺りは静まり返り、虫の声だけが響いている。顔を上げると、遠くに真っ暗な山が見え、その山頂に、かすかで温かみのある黄色い光がぽつんと灯っているのが見えた。","next":{"type":"continue","nextBeatId":"b8"}},{"id":"b7","narration":"人寂しい路肩に車を止め、タバコに火をつける。紫煙が窓の外の闇をぼやけさせた。タバコを半分ほど吸ったところで燃料計に目をやると、針はほぼレッドラインに張り付いていた。苛立ち紛れに吸い殻を揉み消し、再びエンジンをかける。数キロ走ったところで、エンジンは悲鳴を上げて完全に沈黙した。あなたは荒れ果てた山の中に放り出された。唯一目に入るのは、遠い山頂にある、あのかすかな光だけだった。","next":{"type":"continue","nextBeatId":"b8"}},{"id":"b8","narration":"車を降りると、湿った土の匂いを孕んだ山風が吹きつけ、思わず身震いした。車をロックし、あの光を目指して山を登り始める。急な坂道に息を切らし、頭の中の雑音は次第に風の音と心臓の鼓動にかき消されていった。どれほど歩いたか、ついに光の正体が見えてきた。ぽつんと佇む古い木屋だ。そのすぐ裏手には、溶けることのない濃密な闇――森が広がっている。木屋の側面にある小さな窓から光が漏れているが、それ以上にあなたの目を引いたのは、裏手にある、隙間を開けてきしんでいる古い木製のドアだった。その隙間から漏れ出ているのは、全く異なる光――温かみのある金色で、まるでその奥に別の世界が隠されているかのようだった。","next":{"type":"choice","choices":[{"id":"c3","label":"まずは小屋のドアをノックして、誰かいないか確かめる","effect":{"kind":"advance-beat","targetBeatId":"b9"}},{"id":"c4","label":"森へと続くあの木のドアを直接開ける","effect":{"kind":"change-scene","nextSceneSeed":"きしむ音を立てる木のドアを開け、金色の陽光に包まれた古の森へと足を踏み入れると、目の前に巨大な影が形を成していった。"}}]}},{"id":"b9","narration":"あなたは少し躊躇した後、様子を窺うために光の漏れる小さな窓へと近づいた。窓ガラスはひどく汚れており、力を入れて一部を拭き取る。中は空っぽで、埃が積もっており、ずいぶんと長い間誰も住んでいないようだった。ただ、テーブルの上のオイルランプだけがぽつんと灯っている。あなたの視線は再び小屋の裏のドアへと引き寄せられた。あの金色の光には奇妙な誘引力があり、胸をざわつかせ、同時にかすかな不安を抱かせた。","next":{"type":"choice","choices":[{"id":"c5","label":"小屋の裏手に回り、あのドアを開ける","effect":{"kind":"change-scene","nextSceneSeed":"きしむ音を立てる木のドアを開け、金色の陽光に包まれた古の森へと足を踏み入れると、目の前に巨大な影が形を成していった。"}},{"id":"c6","label":"やはりやめておき、車に戻って夜が明けるのを待つ","effect":{"kind":"change-scene","nextSceneSeed":"古びた車に戻り、荒れ果てた山の闇の中で長い夜を過ごす。夜が明けると、車のドアに夜露で一行の文字が書かれているのを見つける。"}}]}}],"entryBeatId":"b1","sceneKey":"apartment-night","imageUuid":"73d0be87-a3fd-43e1-b784-d07c9c04add8","imageUrl":"/home/firstscene/m7.webp"},"imageUrl":"/home/firstscene/m7.webp","characters":[],"storyState":{"logline":"失業の絶望から逃れるために深山へと逃げ込んだあなたは、思いがけず精霊の契約を手にする。それは「一つの願いを叶える代わりに、この地を百年守護する」というものだった。しかし、その契約の代償は想像以上に重いものであることに、あなたはすぐに気づくことになる。それは、忘れ去られた千年の戦争の終章へと繋がっていたのだ。","genreTags":"ファンタジー / 冒険 / サスペンス / 契約 / 成長","protagonist":"あなたはリストラされたばかりで、心身ともに疲れ果てた都市の青年。現実から逃れるために深山の古い小屋へと逃げ込んだが、そこで偶然にも精霊の古の契約を呼び覚ましてしまう。あなたが求めていたのは富と解放だったが、今、「この莫大な代償を伴う贈り物を受け入れるべきか」という決断の瞬間に立たされ、心は未知への恐怖と、運命に翻弄されることへの一抹の悔しさで満たされている。","castNotes":"リンフウ:森の守護者である精霊。穏やかで背の高い少年の姿をしており、あなたの願いを一つ叶えると約束する。しかし、その瞳の奥には千年の疲労と秘密が隠されており、さらに古い使命を果たそうとしているようだ。\nスー・シャオ:深山の古い小屋の元住人の孫娘。祖父の失踪事件を調査している大学生。あなたの突然の出現と契約への接触を疑っているが、あなたが真相を知っているかもしれないため、協力せざるを得なくなる。","synopsis":"深夜、失業したばかりのあなたはシェアハウスで現実に打ちのめされ、ドアを叩きつけて飛び出し、おんぼろのマイカーで荒れ果てた山へと逃げ込む。ガソリンが切れた後、徒歩で山頂に灯りのともる古い木屋を発見し、その裏手に、奇妙な金色の光を放ちながら古の森へと通じる木のドアを見つける。","openThreads":["なぜ精霊は今、自分と契約を結ぶことを選んだのか?","古い小屋の元住人(スー・シャオの祖父)も同じ経験をしたのだろうか?","自分が願った「一攫千金」が実現した後、なぜ良からぬ「余波」を引き起こすことになったのか?"],"nextHook":"次回:木のドアを開けて森へと足を踏み入れ、精霊リンフウと出会い、願い事の選択を迫られる。"},"cardName":"m7","cardTitle":"トトロの契約","cardGender":"男性向け","worldSetting":"本作は【男性向け】のAIインタラクティブシナリオゲームであり、全体的にショートドラマのような強いドラマチックな衝突とスピーディーなどんでん返しが特徴です。\nストーリースタイル:マルチエンディング・急展開。テンポ:緊迫感があり爽快。\n厳選シナリオ『トトロの契約』のオープニング設定:失業した社畜が人里離れた山の古い小屋に逃げ込み、小屋の裏の森に巨大な精霊がいるのを発見する。精霊は彼の願いを一つ叶える代わりに、100年間森の守護者になることを要求する。彼は一攫千金を願うつもりだったが、人間界と精霊の国との千年にわたる戦争の残火に巻き込まれていく。\nこのオープニングから直接物語に入り、プレイヤーに強い没入感とカタルシスを与えてください。その後の分岐もショートドラマのような高頻度のどんでん返しを維持し、プレイヤーの選択がすぐに展開に反映されるようにしてください。","styleGuide":"Ghibli hand-painted style, vertical composition. An adventurous young boy hero with messy brown hair and bright, expressive eyes, standing next to a large friendly forest spirit in a lush, grassy woodland during golden hour. Soft watercolor washes, warm sunlight filtering through the trees.","imageUrlRemote":"https://im.runware.ai/image/os/a06dlim3/ws/3/ii/73d0be87-a3fd-43e1-b784-d07c9c04add8.png"} |