Shop-Leiste im TFT-Stil: Cards mit Splash, Trait-Pills, Shine, Upgrade-Sterne, Lock, Gold/Streak-Pills
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -75,6 +75,8 @@ def action(game_id: str, req: ActionRequest) -> dict:
|
||||
game.equip(req.item_idx, req.board_idx)
|
||||
elif req.action == "pick_augment":
|
||||
game.pick_augment(req.choice)
|
||||
elif req.action == "lock":
|
||||
game.toggle_lock()
|
||||
elif req.action == "next":
|
||||
game.step()
|
||||
else:
|
||||
@@ -86,6 +88,18 @@ def action(game_id: str, req: ActionRequest) -> dict:
|
||||
return serialize(game)
|
||||
|
||||
|
||||
def upgrade_hint(game: Game, api: str) -> int:
|
||||
"""0 = kein Upgrade, 2/3 = Kauf ergibt einen 2-/3-Sterner."""
|
||||
owned = [u for u in game.board + game.bench
|
||||
if u["api_name"] == api and u["stars"] < 3]
|
||||
copies = sum(3 ** (u["stars"] - 1) for u in owned)
|
||||
if copies + 1 >= 9:
|
||||
return 3
|
||||
if sum(1 for u in owned if u["stars"] == 1) == 2:
|
||||
return 2
|
||||
return 0
|
||||
|
||||
|
||||
def unit_view(game: Game, u: dict) -> dict:
|
||||
info = game.artifact["static"]["units"][u["api_name"]]
|
||||
return {
|
||||
@@ -148,12 +162,17 @@ def serialize(game: Game) -> dict:
|
||||
"api_name": api,
|
||||
"name": static["units"][api].get("name", api),
|
||||
"cost": static["units"][api]["cost"],
|
||||
"traits": [static["traits"][t].get("name", t) for t in static["units"][api]["traits"]
|
||||
if t in static["traits"]],
|
||||
"traits": [
|
||||
{"name": static["traits"][t].get("name", t),
|
||||
"icon": static["traits"][t].get("icon")}
|
||||
for t in static["units"][api]["traits"] if t in static["traits"]
|
||||
],
|
||||
"icon": static["units"][api].get("icon"),
|
||||
"upgrade": upgrade_hint(game, api),
|
||||
}
|
||||
for api in game.shop
|
||||
],
|
||||
"shop_locked": game.shop_locked,
|
||||
"traits": traits_panel,
|
||||
"augment_offer": [
|
||||
{"api_name": a, "name": static["augments"].get(a, {}).get("name", a),
|
||||
|
||||
@@ -36,6 +36,7 @@ class Game:
|
||||
self.augments: list[str] = []
|
||||
self.streak = 0
|
||||
self.shop: list[str | None] = []
|
||||
self.shop_locked = False
|
||||
self.augment_offer: list[str] = []
|
||||
self.placement: int | None = None
|
||||
self.log: list[str] = []
|
||||
@@ -166,6 +167,9 @@ class Game:
|
||||
raise InvalidAction("unit has 3 items")
|
||||
self.board[board_idx]["items"].append(self.items.pop(item_idx))
|
||||
|
||||
def toggle_lock(self) -> None:
|
||||
self.shop_locked = not self.shop_locked
|
||||
|
||||
def pick_augment(self, choice: int) -> None:
|
||||
if not self.augment_offer:
|
||||
raise InvalidAction("no augment offer")
|
||||
@@ -210,7 +214,8 @@ class Game:
|
||||
self.idx += 1
|
||||
if self.round["stage"] != prev_stage:
|
||||
self._refresh_bots()
|
||||
self._reroll_shop()
|
||||
if not self.shop_locked:
|
||||
self._reroll_shop()
|
||||
self._maybe_offer_augment()
|
||||
|
||||
def _resolve(self, rnd: dict) -> bool:
|
||||
|
||||
Reference in New Issue
Block a user