from __future__ import annotations import json def _ai_json(*, narration, add_clues=None, set_flags=None, danger_delta=0): payload = { "narration": narration, "npc_dialogues": [{"npc": "老板", "line": "我在看着你们", "tone": "cold"}], "state_updates": { "danger_delta": danger_delta, "add_clues": add_clues or [], "set_flags": set_flags or {}, "npc_changes": {}, "inventory_add": {}, }, "private_player_updates": [], "choices": ["继续调查", "与NPC交谈"], "should_end_scene": False, "should_end_game": False, "ending_summary": None, } return json.dumps(payload, ensure_ascii=False) def test_state_machine_start_progress_end(room_manager, persistence): created = room_manager.create_room("Host") room_id = created["room_id"] host_id = created["player_id"] room_manager.start_game(room_id, host_id) snapshot = room_manager.get_snapshot(room_id) assert snapshot["status"] == "running" assert snapshot["game_state"]["game_phase"] == "running" responses = [ _ai_json(narration="你们在大厅发现被撕毁的船务清单。", add_clues=["torn_manifest"]), _ai_json( narration="餐厅里传来钟铃声,301 房门钥匙的线索浮现。", add_clues=["silver_bell"], set_flags={"room_301_unlocked": True}, ), _ai_json(narration="走廊尽头客房内找到女仆日记。", add_clues=["maid_diary"]), _ai_json( narration="地下室入口出现,你们洞悉真相并找到逃生通道。", add_clues=["cellar_sigil", "bloodied_key"], set_flags={"cellar_entry_found": True, "truth_revealed": True, "escape_route_open": True}, ), ] def fake_chat_json(messages, temperature=0.6, max_tokens=800): return {"ok": True, "content": responses.pop(0)} room_manager.deepseek_client.chat_json = fake_chat_json for i in range(4): room_manager.submit_action(room_id, host_id, f"第{i + 1}轮行动") room_manager.resolve_round(room_id, host_id) final_snapshot = room_manager.get_snapshot(room_id) game_state = final_snapshot["game_state"] assert game_state["game_phase"] == "ended" assert game_state["ending_state"] == "escaped" assert game_state["scene_id"] == "basement" assert len(game_state["discovered_clues"]) >= 4 room = persistence.get_room(room_id) assert room["status"] == "ended"