Fix mobile broom flight with D-pad & touch-action, add Chamber II McGonagalls Wizard Chess

This commit is contained in:
Maxi
2026-09-22 19:24:26 +02:00
parent 9f5e5085ec
commit efb54befcc
10 changed files with 793 additions and 116 deletions
+46 -4
View File
@@ -64,6 +64,14 @@ ALL_ITEMS = {
"action": "examine_key",
"action_label": "Schloss prüfen 🔍"
},
"chess_knight": {
"id": "chess_knight",
"name": "Schwarzer Springer",
"icon": "♟️",
"desc": "Ein massiver schwarzer Springer aus McGonagalls verzaubertem Riesenschach. Hat das weiße Heer geschlagen!",
"action": "chess_piece",
"action_label": "Stein berühren ⚡"
},
"philosophers_stone": {
"id": "philosophers_stone",
"name": "Stein der Weisen",
@@ -90,6 +98,7 @@ def get_session_state(request: Request) -> dict:
"broom_solved": False,
"broom_score": 0,
"broom_time": 0,
"chess_solved": False,
"bottles_solved": False,
"sliding_solved": False,
"started_at": datetime.datetime.utcnow().isoformat(),
@@ -97,16 +106,19 @@ def get_session_state(request: Request) -> dict:
"lang": "de"
}
else:
# Ensure new fields exist for existing sessions
state = request.session["escape"]
if "inventory" not in state:
state["inventory"] = ["wand", "broom", "snape_scroll"]
if state.get("broom_solved"):
state["inventory"].append("silver_key")
if state.get("chess_solved"):
state["inventory"].append("chess_knight")
if state.get("bottles_solved"):
state["inventory"].append("philosophers_stone")
if "house" not in state:
state["house"] = "gryffindor"
if "chess_solved" not in state:
state["chess_solved"] = False
request.session["escape"] = state
return request.session["escape"]
@@ -147,6 +159,18 @@ async def page_broom(request: Request):
context=get_template_context(request, state, lang)
)
@app.get("/chess", response_class=HTMLResponse)
async def page_chess(request: Request):
state = get_session_state(request)
lang = request.query_params.get("lang", state.get("lang", "de"))
state["lang"] = lang
request.session["escape"] = state
return templates.TemplateResponse(
request=request,
name="chess.html",
context=get_template_context(request, state, lang)
)
@app.get("/bottles", response_class=HTMLResponse)
async def page_bottles(request: Request):
state = get_session_state(request)
@@ -199,6 +223,7 @@ async def api_get_inventory(request: Request):
"house": house_info,
"score": state.get("broom_score", 0),
"broom_solved": state.get("broom_solved", False),
"chess_solved": state.get("chess_solved", False),
"bottles_solved": state.get("bottles_solved", False),
"sliding_solved": state.get("sliding_solved", False)
})
@@ -226,6 +251,7 @@ async def api_reset_state(request: Request):
"broom_solved": False,
"broom_score": 0,
"broom_time": 0,
"chess_solved": False,
"bottles_solved": False,
"sliding_solved": False,
"started_at": datetime.datetime.utcnow().isoformat(),
@@ -244,7 +270,7 @@ async def api_broom_complete(request: Request):
state["broom_solved"] = True
state["broom_score"] = int(data.get("score", 100))
state["broom_time"] = int(data.get("time_taken", 30))
# Add Silver Key to Inventory!
# Add Silver Key to Inventory
if "inventory" not in state:
state["inventory"] = ["wand", "broom", "snape_scroll"]
if "silver_key" not in state["inventory"]:
@@ -252,11 +278,27 @@ async def api_broom_complete(request: Request):
request.session["escape"] = state
return JSONResponse({
"success": True,
"message": "Der Schlüssel passt ins Schloss! Die Tür zur Flammenkammer steht offen!",
"message": "Der Schlüssel passt ins Schloss! Die Tür zu McGonagalls Zauberschach steht offen!",
"new_item": ALL_ITEMS["silver_key"],
"state": state
})
@app.post("/api/chess/complete")
async def api_chess_complete(request: Request):
state = get_session_state(request)
state["chess_solved"] = True
if "inventory" not in state:
state["inventory"] = ["wand", "broom", "snape_scroll"]
if "chess_knight" not in state["inventory"]:
state["inventory"].append("chess_knight")
request.session["escape"] = state
return JSONResponse({
"success": True,
"message": "Schachmatt! Die weiße Königin senkt ihr Schwert. Der Weg zur Flammenkammer ist frei!",
"new_item": ALL_ITEMS["chess_knight"],
"state": state
})
@app.post("/api/bottles/drink")
async def api_bottles_drink(request: Request):
try:
@@ -307,7 +349,7 @@ async def api_bottles_drink(request: Request):
"result": "success_back",
"content": content,
"message": msg_de if lang == "de" else msg_en,
"next_url": "/broom"
"next_url": "/chess"
})
else:
msg_de = "Dieser Trank schützt vor den violetten Flammen, führt dich aber nicht vorwärts durch das schwarze Feuer!"