Archived
only legal actions can be taken
This commit is contained in:
+42
-60
@@ -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,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user