ui: allow loading characters directly from cli

This commit is contained in:
rr-
2020-09-16 22:13:07 +02:00
parent 1ad563ad93
commit ef9a7f9e20
4 changed files with 65 additions and 10 deletions
+33 -1
View File
@@ -1,8 +1,11 @@
import argparse import argparse
import sys
import typing as T
from pathlib import Path from pathlib import Path
import xdg import xdg
from pqcli.mechanic import Player
from pqcli.roster import Roster from pqcli.roster import Roster
from pqcli.ui.basic import BasicUserInterface from pqcli.ui.basic import BasicUserInterface
from pqcli.ui.curses import CursesUserInterface from pqcli.ui.curses import CursesUserInterface
@@ -44,15 +47,44 @@ def parse_args() -> argparse.Namespace:
help=argparse.SUPPRESS, help=argparse.SUPPRESS,
) )
parser.add_argument("--cheats", action="store_true", help="???") 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() 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: def main() -> None:
args = parse_args() args = parse_args()
roster = Roster.load(SAVE_PATH) roster = Roster.load(SAVE_PATH)
if args.list_saves:
list_players(roster)
exit(0)
player: T.Optional[Player] = None
if args.load_save:
try: 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() ui.run()
finally: finally:
if args.use_saves: if args.use_saves:
+9 -1
View File
@@ -1,13 +1,21 @@
import abc import abc
import argparse import argparse
import typing as T
from pqcli.mechanic import Player
from pqcli.roster import Roster from pqcli.roster import Roster
class BaseUserInterface(abc.ABC): 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.roster = roster
self.args = args self.args = args
self.player = player
@abc.abstractmethod @abc.abstractmethod
def run(self) -> None: def run(self) -> None:
+10 -2
View File
@@ -32,8 +32,13 @@ class MainMenu(enum.IntEnum):
class BasicUserInterface(BaseUserInterface): class BasicUserInterface(BaseUserInterface):
def __init__(self, roster: Roster, args: argparse.Namespace) -> None: def __init__(
super().__init__(roster, args) 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: def signal_handler(sig: T.Any, frame: T.Any) -> None:
logging.info("Quitting") logging.info("Quitting")
@@ -51,6 +56,9 @@ class BasicUserInterface(BaseUserInterface):
) )
self.logo() self.logo()
if self.player:
self.play(self.player)
else:
self.main_menu() self.main_menu()
def logo(self) -> None: def logo(self) -> None:
+10 -3
View File
@@ -39,8 +39,10 @@ class StopMainLoop(Exception):
class CursesUserInterface(BaseUserInterface): class CursesUserInterface(BaseUserInterface):
def __init__(self, roster: Roster, args: argparse.Namespace) -> None: def __init__(
super().__init__(roster, args) self, roster: Roster, player: Player, args: argparse.Namespace
) -> None:
super().__init__(roster, player, args)
os.environ.setdefault("ESCDELAY", "25") os.environ.setdefault("ESCDELAY", "25")
self._screen = curses.initscr() self._screen = curses.initscr()
self._screen.nodelay(True) self._screen.nodelay(True)
@@ -77,6 +79,9 @@ class CursesUserInterface(BaseUserInterface):
def run(self) -> None: def run(self) -> None:
try: try:
if self.player:
self._switch_to_game_view(self.player)
else:
self._switch_to_roster_view() self._switch_to_roster_view()
while True: while True:
@@ -130,9 +135,11 @@ class CursesUserInterface(BaseUserInterface):
view.on_cancel += lambda: self._switch_to_create_char_race_view( view.on_cancel += lambda: self._switch_to_create_char_race_view(
player_name, race 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_ player_name, race, class_
) )
)
self._switch_view(view) self._switch_view(view)
def _switch_to_create_char_stats_view( def _switch_to_create_char_stats_view(