group-b/group_b/stage_deck.py

116 lines
3.1 KiB
Python

from .deck import Deck, Card
from .action_deck import ActionCard
# from .player import PlayerState
from dataclasses import dataclass
from enum import Enum
from random import randint, choice, choices
class StageDeck(Deck):
DEFAULT_DECK_SIZE=25
def load_cards(self):
cards = list()
cards.extend(StageCard.generate(self, cnt=self.DEFAULT_DECK_SIZE))
return cards
def draw(self) -> Card:
if len(self._cards) == 0:
raise StageDeckEmpty()
return self._cards.pop()
@dataclass
class StageCard(Card):
# turn w/ numeric modifier (max speed you can take the turn)
# straight w/ distance modifier (would it scale the accelerate cards?)
# hazards (jump, gate, narrow, don't cut, over crest, unseen)
def __init__(self, name: str, deck: StageDeck):
super().__init__(name, deck)
def can_pass_with(self, player, action: ActionCard) -> bool:
raise NotImplemented()
@classmethod
def generate(cls, deck: StageDeck, cnt=1):
weights = [10, 5] # (ref:StageCardWeight)
cls_list = choices([TurnCard, StraightCard], weights=weights, k=cnt)
return [real_cls.generate(deck) for real_cls in cls_list]
class StageDeckEmpty(BaseException):
pass
class CardShape(str, Enum):
RIGHT = "right"
LEFT = "left"
ESSES = "esses"
class TurnCard(StageCard):
shape: CardShape
modifier: int
def __str__(self):
if self.modifier == 1:
return f"sharp hairpin {self.shape}"
if self.modifier == 2:
return f"hairpin {self.shape}"
if self.modifier == 8:
return f"fast {self.shape}"
if self.modifier == 9:
return f"flat out {self.shape}"
return f"{self.shape}-{self.modifier}"
def can_pass_with(self, player, action: ActionCard) -> bool:
# TKTKTK use certain action cards as pass?
if int(player._resources.speed) > self.modifier:
return False
if player._resources.focus <= 0:
return False
if player._resources.tire_health <= 0:
return False
if player._resources.car_health <= 0:
return False
return True
@classmethod
def generate(cls, deck: StageDeck):
mod = randint(1,9)
shape = choice(list(CardShape))
card = cls("", deck)
card.modifier=mod
card.shape=shape
return card
class StraightCard(StageCard):
# decameters lol
modifier: int
LENGTH_WEIGHTS = [10, 10, 7, 5, 5, 2, 2, 2, 1, 1]
def __str__(self):
if self.modifier == 1:
return f"into"
if self.modifier == 2:
return f"and"
return f"{self.modifier*10}"
@classmethod
def generate(cls, deck: StageDeck):
mod = randint(1,10)
shape = choices(range(10), weights=cls.LENGTH_WEIGHTS, k=1)[0] # (ref:StraightCardWeights)
card = cls("", deck)
card.modifier=mod
return card
def can_pass_with(self, player, action):
return True