mirror of
https://github.com/rr-/pq-cli.git
synced 2026-09-29 06:44:00 -06:00
random: extract to a separate module
This commit is contained in:
+10
-22
@@ -1,9 +1,9 @@
|
|||||||
import datetime
|
import datetime
|
||||||
import enum
|
import enum
|
||||||
import random
|
|
||||||
import typing as T
|
import typing as T
|
||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
from pqcli import random
|
||||||
from pqcli.config import *
|
from pqcli.config import *
|
||||||
|
|
||||||
|
|
||||||
@@ -12,10 +12,6 @@ def level_up_time(level: int) -> int:
|
|||||||
return 20 * level * 60
|
return 20 * level * 60
|
||||||
|
|
||||||
|
|
||||||
def random_low(below):
|
|
||||||
return min(random.randint(0, below), random.randint(0, below))
|
|
||||||
|
|
||||||
|
|
||||||
def generate_name() -> str:
|
def generate_name() -> str:
|
||||||
parts = [
|
parts = [
|
||||||
"br|cr|dr|fr|gr|j|kr|l|m|n|pr||||r|sh|tr|v|wh|x|y|z".split("|"),
|
"br|cr|dr|fr|gr|j|kr|l|m|n|pr||||r|sh|tr|v|wh|x|y|z".split("|"),
|
||||||
@@ -160,10 +156,10 @@ class Player:
|
|||||||
def level_up(self) -> None:
|
def level_up(self) -> None:
|
||||||
self.level += 1
|
self.level += 1
|
||||||
self.stats[Stat.hp_max] += (
|
self.stats[Stat.hp_max] += (
|
||||||
self.stats[Stat.condition] // 3 + 1 + random.randint(0, 3)
|
self.stats[Stat.condition] // 3 + 1 + random.below(4)
|
||||||
)
|
)
|
||||||
self.stats[Stat.mp_max] += (
|
self.stats[Stat.mp_max] += (
|
||||||
self.stats[Stat.intelligence] // 3 + 1 + random.randint(0, 3)
|
self.stats[Stat.intelligence] // 3 + 1 + random.below(4)
|
||||||
)
|
)
|
||||||
self.win_stat()
|
self.win_stat()
|
||||||
self.win_stat()
|
self.win_stat()
|
||||||
@@ -171,12 +167,12 @@ class Player:
|
|||||||
self.exp_bar.reset(level_up_time(self.level))
|
self.exp_bar.reset(level_up_time(self.level))
|
||||||
|
|
||||||
def win_stat(self) -> bool:
|
def win_stat(self) -> bool:
|
||||||
if random.choice([False, True]):
|
if random.odds(1, 2):
|
||||||
chosen_stat = random.choice(list(Stat))
|
chosen_stat = random.choice(list(Stat))
|
||||||
else:
|
else:
|
||||||
# favor the beststat so it will tend to clump
|
# favor the beststat so it will tend to clump
|
||||||
t = sum(value ** 2 for _stat, value in self.stats)
|
t = sum(value ** 2 for _stat, value in self.stats)
|
||||||
t = random.randint(0, t - 1)
|
t = random.below(t)
|
||||||
chosen_stat: Stat = None
|
chosen_stat: Stat = None
|
||||||
for stat, value in self.stats:
|
for stat, value in self.stats:
|
||||||
chosen_stat = stat
|
chosen_stat = stat
|
||||||
@@ -194,11 +190,8 @@ class Player:
|
|||||||
def win_spell(self) -> None:
|
def win_spell(self) -> None:
|
||||||
self.spell_book.add(
|
self.spell_book.add(
|
||||||
SPELLS[
|
SPELLS[
|
||||||
random_low(
|
random.below_low(
|
||||||
min(
|
min(self.stats[Stat.wisdom] + self.level, len(SPELLS))
|
||||||
self.stats[Stat.wisdom] + self.level - 1,
|
|
||||||
len(SPELLS) - 1,
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
1,
|
1,
|
||||||
@@ -236,15 +229,10 @@ class StatsBuilder:
|
|||||||
stats = Stats()
|
stats = Stats()
|
||||||
for stat in PRIME_STATS:
|
for stat in PRIME_STATS:
|
||||||
stats[stat] = (
|
stats[stat] = (
|
||||||
3
|
3 + random.below(6) + random.below(6) + random.below(6)
|
||||||
+ 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.hp_max] = random.below(8) + stats[Stat.condition] // 6
|
||||||
stats[Stat.mp_max] = (
|
stats[Stat.mp_max] = random.below(8) + stats[Stat.intelligence] // 6
|
||||||
random.randint(0, 7) + stats[Stat.intelligence] // 6
|
|
||||||
)
|
|
||||||
self.history.append(stats)
|
self.history.append(stats)
|
||||||
return stats
|
return stats
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
import random
|
||||||
|
import typing as T
|
||||||
|
|
||||||
|
|
||||||
|
def seed(seed: T.Any) -> None:
|
||||||
|
random.seed(seed)
|
||||||
|
|
||||||
|
|
||||||
|
def choice(source: T.Iterable[T.Any]) -> T.Any:
|
||||||
|
return random.choice(source)
|
||||||
|
|
||||||
|
|
||||||
|
def below(num: int) -> int:
|
||||||
|
return random.randint(0, num - 1)
|
||||||
|
|
||||||
|
|
||||||
|
def below_low(num: int) -> int:
|
||||||
|
return min(below(num), below(num))
|
||||||
|
|
||||||
|
|
||||||
|
def odds(chance: int, out_of: int) -> bool:
|
||||||
|
return below(out_of) < chance
|
||||||
Reference in New Issue
Block a user