69 lines
2.5 KiB
Python
69 lines
2.5 KiB
Python
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"
|