116 lines
3.1 KiB
Python
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
|