ui: allow loading characters directly from cli (#16)

This commit is contained in:
Marcin Kurczewski
2020-09-30 20:20:29 +02:00
committed by GitHub
parent 1ad563ad93
commit bbe3842a2f
4 changed files with 65 additions and 10 deletions
+33 -1
View File
@@ -1,8 +1,11 @@
import argparse
import sys
import typing as T
from pathlib import Path
import xdg
from pqcli.mechanic import Player
from pqcli.roster import Roster
from pqcli.ui.basic import BasicUserInterface
from pqcli.ui.curses import CursesUserInterface
@@ -44,15 +47,44 @@ def parse_args() -> argparse.Namespace:
help=argparse.SUPPRESS,
)
parser.add_argument("--cheats", action="store_true", help="???")
parser.add_argument(
"--list-saves",
action="store_true",
help="list saved characters and exit",
)
parser.add_argument(
"--load-save",
type=int,
metavar="NUM",
help="play chosen character",
)
return parser.parse_args()
def list_players(roster: Roster, file: T.Optional[T.Any] = None) -> None:
for i, player in enumerate(roster.players, start=1):
print(f"{i}. {player.name}", file=file)
def main() -> None:
args = parse_args()
roster = Roster.load(SAVE_PATH)
if args.list_saves:
list_players(roster)
exit(0)
player: T.Optional[Player] = None
if args.load_save:
try:
ui = args.ui(roster, args)
player = list(roster.players)[args.load_save - 1]
except IndexError:
print(f"Invalid player. Available players:", file=sys.stderr)
list_players(roster, file=sys.stderr)
exit(1)
try:
ui = args.ui(roster, player, args)
ui.run()
finally:
if args.use_saves:
+9 -1
View File
@@ -1,13 +1,21 @@
import abc
import argparse
import typing as T
from pqcli.mechanic import Player
from pqcli.roster import Roster
class BaseUserInterface(abc.ABC):
def __init__(self, roster: Roster, args: argparse.Namespace) -> None:
def __init__(
self,
roster: Roster,
player: T.Optional[Player],
args: argparse.Namespace,
) -> None:
self.roster = roster
self.args = args
self.player = player
@abc.abstractmethod
def run(self) -> None:
+10 -2
View File
@@ -32,8 +32,13 @@ class MainMenu(enum.IntEnum):
class BasicUserInterface(BaseUserInterface):
def __init__(self, roster: Roster, args: argparse.Namespace) -> None:
super().__init__(roster, args)
def __init__(
self,
roster: Roster,
player: T.Optional[Player],
args: argparse.Namespace,
) -> None:
super().__init__(roster, player, args)
def signal_handler(sig: T.Any, frame: T.Any) -> None:
logging.info("Quitting")
@@ -51,6 +56,9 @@ class BasicUserInterface(BaseUserInterface):
)
self.logo()
if self.player:
self.play(self.player)
else:
self.main_menu()
def logo(self) -> None:
+10 -3
View File
@@ -39,8 +39,10 @@ class StopMainLoop(Exception):
class CursesUserInterface(BaseUserInterface):
def __init__(self, roster: Roster, args: argparse.Namespace) -> None:
super().__init__(roster, args)
def __init__(
self, roster: Roster, player: Player, args: argparse.Namespace
) -> None:
super().__init__(roster, player, args)
os.environ.setdefault("ESCDELAY", "25")
self._screen = curses.initscr()
self._screen.nodelay(True)
@@ -77,6 +79,9 @@ class CursesUserInterface(BaseUserInterface):
def run(self) -> None:
try:
if self.player:
self._switch_to_game_view(self.player)
else:
self._switch_to_roster_view()
while True:
@@ -130,9 +135,11 @@ class CursesUserInterface(BaseUserInterface):
view.on_cancel += lambda: self._switch_to_create_char_race_view(
player_name, race
)
view.on_confirm += lambda class_: self._switch_to_create_char_stats_view(
view.on_confirm += (
lambda class_: self._switch_to_create_char_stats_view(
player_name, race, class_
)
)
self._switch_view(view)
def _switch_to_create_char_stats_view(