only legal actions can be taken

This commit is contained in:
2024-04-24 23:55:39 +02:00
parent e156d3a951
commit 8b397484cb
17 changed files with 710 additions and 359 deletions
+42 -60
View File
@@ -1,15 +1,11 @@
"""Instance of the game, with players and a market"""
import asyncio
from typing import List
import random
from model import (
Card,
CardRole,
CardParser,
Player,
Team,
Serializable,
load_cards,
)
from model import Card, CardRole, CardParser, Player, Team, Serializable, Effect
from model.card_loader import load_cards, create_card_effects, create_card
class Game(Serializable):
@@ -19,6 +15,7 @@ class Game(Serializable):
loaded_cards: List[CardParser] = load_cards()
cards: List[Card]
effects: List[Effect]
market_stack: List[Card]
market: List[Card]
gem_stack: List[Card]
@@ -29,63 +26,47 @@ class Game(Serializable):
default_health = 50
turn: Team
current_turn: Team
def __init__(self):
def __init__(self) -> None:
super().__init__()
self.market_stack: List[Card] = []
self.market: List[Card] = [None for _ in range(5)]
self.market: List[Card | None] = [None for _ in range(5)]
self.gem_stack: List[Card] = []
self.players: List[Player] = []
self.cards: List[Card] = []
self.effects: List[Effect] = []
self.teams: List[Team] = []
self.started = False
self.turn = None
self.current_turn = None
async def init_game(self):
await self.init_cards()
await self.distribute_market_cards()
async def instanciate_card(self, card_parser: CardParser) -> Card:
effects = create_card_effects(card_parser)
for e in effects:
self.effects.append(e)
await self.notify_controller("create", e.serialize())
card = create_card(card_parser, effects)
self.cards.append(card)
await self.notify_controller("create", card.serialize())
return card
async def init_cards(self):
"""Creates market cards and fire gem cards from previously loaded cards"""
market_only = [c for c in self.loaded_cards if c.role == CardRole.MARKET]
for c in market_only:
for _ in range(c.init_amount):
self.market_stack.append(
await self.create_card(
Card(
sprite="spritetest",
name=c.name,
cost=c.cost,
card_type=c.card_type,
faction=c.faction,
effects=c.effects,
)
)
)
self.market_stack.append(await self.instanciate_card(c))
random.shuffle(self.market_stack)
fire_gems = [c for c in self.loaded_cards if c.role == CardRole.FIRE_GEM]
for c in fire_gems:
for _ in range(c.init_amount):
self.gem_stack.append(
await self.create_card(
Card(
sprite="spritetest",
name=c.name,
cost=c.cost,
card_type=c.card_type,
faction=c.faction,
effects=c.effects,
)
)
)
async def create_card(self, card: Card) -> Card:
self.cards.append(card)
await self.notify_controller("create", card.serialize_guest())
return card
self.gem_stack.append(await self.instanciate_card(c))
async def create_base_deck(self, base_deck_name: str = "base") -> List[Card]:
"""Creates the starting base deck for a player.
@@ -98,18 +79,7 @@ class Game(Serializable):
base_deck = []
for c in base_deck_loaded:
for _ in range(c.init_amount):
base_deck.append(
await self.create_card(
Card(
sprite="spritetest",
name=c.name,
cost=c.cost,
card_type=c.card_type,
faction=c.faction,
effects=c.effects,
)
)
)
base_deck.append(await self.instanciate_card(c))
random.shuffle(base_deck)
return base_deck
@@ -121,6 +91,7 @@ class Game(Serializable):
self.players.append(player)
player.stack_pile = await self.create_base_deck("base")
await self.notify_controller("create", player.turn.serialize())
await self.notify_controller("create", player.serialize_guest())
await self.notify_controller("update", self.serialize_guest())
return player
@@ -158,21 +129,24 @@ class Game(Serializable):
"teams": [team.uuid for team in self.teams],
"started": self.started,
"default_health": self.default_health,
"turn": None if self.turn is None else self.turn.uuid,
"current_turn": (
None if self.current_turn is None else self.current_turn.uuid
),
"effects": [effect.uuid for effect in self.effects],
}
return {k: data[k] for k in data.keys() - ["loaded_cards"]}
async def start_game(self):
self.started = True
self.turn = random.choice(self.teams)
self.current_turn = random.choice(self.teams)
await self.notify_controller("update", self.serialize_guest())
draws = []
for p in [p for p in self.players if p.team == self.turn]:
for p in [p for p in self.players if p.team == self.current_turn]:
draws.append(p.draw(3))
for p in [p for p in self.players if p.team != self.turn]:
for p in [p for p in self.players if p.team != self.current_turn]:
draws.append(p.draw(5))
await asyncio.gather(*draws)
@@ -191,6 +165,14 @@ class Game(Serializable):
)
async def end_turn(self):
team_index = self.teams.index(self.turn)
self.turn = self.teams[(team_index + 1) % len(self.teams)]
team_index = self.teams.index(self.current_turn)
self.current_turn = self.teams[(team_index + 1) % len(self.teams)]
for p in self.players:
p.start_turn()
await self.notify_controller("update", self.serialize_guest())
def search_card_in_pile(self, card_id: str, pile: List[Card]):
return next(
(m for m in [f for f in pile if f is not None] if str(m.uuid) == card_id),
None,
)