mirror of
https://github.com/rr-/pq-cli.git
synced 2026-09-29 06:44:00 -06:00
Compare commits
1
Commits
1.0.2
..
cli_player
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ef9a7f9e20 |
+33
-1
@@ -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
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user