Files
ProgressQuest-cli/pqcli/game_state.py
T
2018-11-05 21:04:39 +01:00

85 lines
2.0 KiB
Python

import datetime
import random
import typing as T
from dataclasses import dataclass
from pqcli.config import Stat, PRIME_STATS, Race, Class, RACES, CLASSES
def generate_name() -> str:
parts = [
"br|cr|dr|fr|gr|j|kr|l|m|n|pr||||r|sh|tr|v|wh|x|y|z".split("|"),
"a|a|e|e|i|i|o|o|u|u|ae|ie|oo|ou".split("|"),
"b|ck|d|g|k|m|n|p|t|v|x|z".split("|"),
]
result = ""
for i in range(6):
result += random.choice(parts[i % 3])
return result.title()
@dataclass
class Stats:
def __init__(self):
self.values = {stat: 0 for stat in Stat}
def __iter__(self) -> T.Iterable[T.Tuple[Stat, int]]:
return iter(self.values.items())
def __setitem__(self, stat: Stat, value: int) -> None:
self.values[stat] = value
def __getitem__(self, stat: Stat) -> int:
return self.values[stat]
@dataclass
class Player:
name: str
stats: Stats
race: Race
class_: Class
birthday: datetime.datetime
class Roster:
def __init__(self) -> None:
self.players: T.List[Player] = []
class StatsBuilder:
def __init__(self):
self.history: T.List[Stats] = []
def roll(self):
stats = Stats()
for stat in PRIME_STATS:
stats[stat] = (
3
+ random.randint(0, 5)
+ random.randint(0, 5)
+ random.randint(0, 5)
)
stats[Stat.hp_max] = random.randint(0, 7) + stats[Stat.condition] // 6
stats[Stat.mp_max] = (
random.randint(0, 7) + stats[Stat.intelligence] // 6
)
self.history.append(stats)
return stats
def unroll(self):
self.history.pop()
return self.history[-1]
def create_player(stats_builder: StatsBuilder) -> Player:
now = datetime.datetime.now()
random.seed(now)
return Player(
birthday=now,
name=generate_name(),
stats=stats_builder.roll(),
race=random.choice(RACES),
class_=random.choice(CLASSES),
)