diff --git a/.gitignore b/.gitignore index bfb04df3..f73e1fff 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ dist/ build/ **/*.egg-info +.DS_Store .idea scrap_engine.py diff --git a/pkg/server/.env b/pkg/server/.env index ccc7fd1c..682cc829 100644 --- a/pkg/server/.env +++ b/pkg/server/.env @@ -1,4 +1,4 @@ -POKETE_SERVER_CLIENT_VERSION="0.10.0-rc3" +POKETE_SERVER_CLIENT_VERSION="0.10.0-rc4" POKETE_SERVER_HOST="localhost" POKETE_SERVER_PORT="9988" POKETE_API_PORT="9989" diff --git a/src/pokete/base/ui/views/choose_box.py b/src/pokete/base/ui/views/choose_box.py index 699bc7f7..43ada3fe 100644 --- a/src/pokete/base/ui/views/choose_box.py +++ b/src/pokete/base/ui/views/choose_box.py @@ -78,11 +78,15 @@ def __init__( self.elems: list[HasArea] = [] self.up_down_switch = UpDownSwitch(self) self.__special_ret: Optional[T] = None - self.add_ob( - self.up_down_switch, - self.width - 3 - self.up_down_switch.width, - self.height - 1, - ) + self.__add_up_down_switch() + + def __add_up_down_switch(self): + if len(self.elems) / (self.height - 2) > 1: + self.add_ob( + self.up_down_switch, + self.width - 3 - self.up_down_switch.width, + self.height - 1, + ) @override def get_partial_interactors(self) -> list[MouseInteractor]: @@ -145,19 +149,13 @@ def add_elems(self): @abstractmethod def new_size(self) -> tuple[int, int]: ... - def resize(self, height, width): - super().resize(height, width) - self.add_ob( - self.up_down_switch, - self.width - 3 - self.up_down_switch.width, - self.height - 1, - ) - def resize_view(self): """Manages recursive view resizing""" self.remove() self.overview.resize_view() + self.rem_ob(self.up_down_switch) self.resize(*self.new_size()) + self.__add_up_down_switch() self.rem_elems() self.add_elems() if len(self.c_obs) == 0: @@ -193,6 +191,7 @@ def change_page(self, add_page, n_idx): def __call__(self, ctx: Context) -> Optional[T]: self.set_ctx(ctx) ctx = change_ctx(ctx, self) + self.__add_up_down_switch() while True: action, _ = get_action() diff --git a/src/pokete/classes/interactions/multi_text_choose_box.py b/src/pokete/classes/interactions/multi_text_choose_box.py index ed2fc67d..5461d50d 100644 --- a/src/pokete/classes/interactions/multi_text_choose_box.py +++ b/src/pokete/classes/interactions/multi_text_choose_box.py @@ -8,7 +8,7 @@ from .. import movemap as mvp -class MultiTextChooseBox(ChooseBoxView[str]): +class MultiTextChooseBox(ChooseBoxView[tuple[int, str]]): """ChooseBox wrapper for multitext conversations""" def __init__(self, keys: list[str], name: str): @@ -26,13 +26,13 @@ def __init__(self, keys: list[str], name: str): def new_size(self) -> tuple[int, int]: return self.height, self.width - def choose(self, ctx: Context, idx: int) -> Optional[str]: + def choose(self, ctx: Context, idx: int) -> Optional[tuple[int, str]]: if idx >= 0: - return self.keys[idx] + return idx, self.keys[idx] else: return None - def add(self, _map, x, y): + def add_relative(self, _map, x, y): assert self.fig mvp.movemap.assure_distance( self.fig.x, self.fig.y, self.width + 2, self.height + 2 @@ -41,9 +41,12 @@ def add(self, _map, x, y): _map, self.fig.x - mvp.movemap.x, self.fig.y - mvp.movemap.y + 1 ) - def __call__(self, ctx: Context) -> Optional[str]: + def __call__(self, ctx: Context) -> tuple[int, str]: self.fig = ctx.figure - self.add_elems() + ret: Optional[tuple[int, str]] = None - with self.add(ctx.map, -1, -1): - return super().__call__(ctx) + while ret is None: + self.add_elems() + with self.add_relative(ctx.map, -1, -1): + ret = super().__call__(ctx) + return ret diff --git a/src/pokete/classes/map_additions/center.py b/src/pokete/classes/map_additions/center.py index 20815310..38335d65 100644 --- a/src/pokete/classes/map_additions/center.py +++ b/src/pokete/classes/map_additions/center.py @@ -1,17 +1,27 @@ +import random import time import scrap_engine as se -from pokete.base import loops -from pokete.base.input import Action, _ev, get_action +from pokete.base.input import _ev from pokete.classes import deck from pokete.classes import movemap as mvp from pokete.classes.classes import PlayMap from pokete.classes.doors import CenterDoor +from pokete.classes.interactions.multi_text_choose_box import MultiTextChooseBox from pokete.classes.inv import buy from pokete.classes.landscape import MapInteract from pokete.release import SPEED_OF_TIME +CUDDLE_MESSAGES = [ + "{name} nuzzles against you affectionately!", + "{name} nuzzles against you lovingly!", + "{name} nuzzles against you happily!", + "{name} purrs contentedly in your arms!", + "{name} looks up at you with adoring eyes!", + "{name} snuggles closer to you!", +] + class CenterMap(PlayMap): """Contains all relevant objects for centermap @@ -87,6 +97,22 @@ def __init__(self, _he, _wi): class CenterInteract(se.Object, MapInteract): """Triggers a conversation in the Pokete center""" + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.menu = MultiTextChooseBox( + [ + "See your full deck", + "Heal all your Poketes", + "Cuddle with the Poketes", + "Quit", + ], + "Select", + ) + + def __normalize_pokes(self, ob): + while "__fallback__" in [p.identifier for p in ob.pokes]: + ob.pokes.pop([p.identifier for p in ob.pokes].index("__fallback__")) + def action(self, ob): """Triggers the interaction in the Pokete center ARGS: @@ -100,21 +126,15 @@ def action(self, ob): [ "Welcome to the Pokete-Center", "What do you want to do?", - "1: See your full deck\n 2: Heal all your Poketes\n 3: Cuddle with the Poketes", ], - passthrough=True, ) - while True: - action, _ = get_action() - if action.triggers(Action.ACT_1): - while "__fallback__" in [p.identifier for p in ob.pokes]: - ob.pokes.pop( - [p.identifier for p in ob.pokes].index("__fallback__") - ) + + match self.menu(self.ctx)[0]: + case 0: + self.__normalize_pokes(ob) ob.balls_label_rechar() deck.deck(self.ctx, len(ob.pokes)) - break - elif action.triggers(Action.ACT_2): + case 1: ob.heal() time.sleep(SPEED_OF_TIME * 0.5) mvp.movemap.text( @@ -123,10 +143,33 @@ def action(self, ob): 3, ["...", "Your Poketes are now healed!"], ) - break - elif action.triggers(Action.CANCEL, Action.ACT_3): - break - loops.std(self.ctx) + case 2: + self.__normalize_pokes(ob) + if ob.pokes: + selected_idx = deck.deck( + self.ctx, + len(ob.pokes), + label="Choose a Pokete to cuddle", + in_fight=True, + ) + if selected_idx is not None: + poke = ob.pokes[selected_idx] + message = random.choice(CUDDLE_MESSAGES).format( + name=poke.name + ) + mvp.movemap.text( + self.ctx, + mvp.movemap.bmap.inner.x - mvp.movemap.x + 8, + 3, + ["...", message], + ) + else: + mvp.movemap.text( + self.ctx, + mvp.movemap.bmap.inner.x - mvp.movemap.x + 8, + 3, + ["You don't have any Poketes to cuddle with!"], + ) mvp.movemap.full_show(init=True) diff --git a/src/pokete/classes/movemap.py b/src/pokete/classes/movemap.py index a396c295..d1e52145 100644 --- a/src/pokete/classes/movemap.py +++ b/src/pokete/classes/movemap.py @@ -100,7 +100,7 @@ def assure_distance(self, _x: int, _y: int, width: int, height: int): self.show() time.sleep(SPEED_OF_TIME * 0.045) - def text(self, ctx: Context, _x, _y, inp_arr, passthrough=False): + def text(self, ctx: Context, _x, _y, inp_arr): """Shows dialog text on movemap ARGS: _x: The message's X @@ -133,8 +133,7 @@ def text(self, ctx: Context, _x, _y, inp_arr, passthrough=False): loops.std(ctx.with_overview(self)) self.full_show() self.multitext.remove() - if not passthrough: - _ev.clear() + _ev.clear() def resize_view(self): """Manages recursive view resizing""" diff --git a/src/pokete/classes/multiplayer/interactions/context_menu.py b/src/pokete/classes/multiplayer/interactions/context_menu.py index 7690aa2f..52b6b996 100644 --- a/src/pokete/classes/multiplayer/interactions/context_menu.py +++ b/src/pokete/classes/multiplayer/interactions/context_menu.py @@ -20,13 +20,14 @@ def __call__(self, ctx: Context): rmtpl = pc_manager.get_interactable(ctx.figure) if rmtpl is None: return - match self.menu(ctx): - case "Fight": + match self.menu(ctx)[0]: + case 0: resp = com_service.request_fight(rmtpl.name) # ask_ok(ctx, f"{resp}") if resp: remote_fight_controller.start(rmtpl.ctx, rmtpl.name) - case "Trade": + case 1: + # TODO impl trading pass - case "Quit...": + case 2: pass diff --git a/src/pokete/classes/multiplayer/pc_manager/pc_manager.py b/src/pokete/classes/multiplayer/pc_manager/pc_manager.py index 1e4aba8a..15e3e834 100644 --- a/src/pokete/classes/multiplayer/pc_manager/pc_manager.py +++ b/src/pokete/classes/multiplayer/pc_manager/pc_manager.py @@ -1,10 +1,11 @@ """Manages remote players""" + import logging -from .remote_player import RemotePlayer -from ..interactions import movemap_deco -from ...multiplayer.msg.position.update import UpdateDict from ... import ob_maps as obmp +from ...multiplayer.msg.position.update import UpdateDict +from ..interactions import movemap_deco +from .remote_player import RemotePlayer class PCManager: @@ -48,7 +49,8 @@ def remove(self, name): logging.warning( "[PCManager] Trying to remove player with name `%s`, " "but is not present", - name) + name, + ) return pc.remove() del self.reg[name] @@ -62,9 +64,9 @@ def movemap_move(self): def get_interactable(self, figure) -> RemotePlayer | None: for _, rmtpl in self.reg.items(): if ( - rmtpl.map == figure.map and - (figure.x - 2 <= rmtpl.x <= figure.x + 2) and - (figure.y - 2 <= rmtpl.y <= figure.y + 2) + rmtpl.map == figure.map + and (figure.x - 2 <= rmtpl.x <= figure.x + 2) + and (figure.y - 2 <= rmtpl.y <= figure.y + 2) ): return rmtpl return None diff --git a/src/pokete/classes/multiplayer/pc_manager/remote_player.py b/src/pokete/classes/multiplayer/pc_manager/remote_player.py index 6f40c558..aa2a907f 100644 --- a/src/pokete/classes/multiplayer/pc_manager/remote_player.py +++ b/src/pokete/classes/multiplayer/pc_manager/remote_player.py @@ -1,7 +1,8 @@ import scrap_engine as se from pokete.base.color import Color -from ...interactions import Interactor, MultiTextChooseBox + +from ...interactions import Interactor from ...landscape import MapInteract @@ -14,9 +15,6 @@ def __init__(self, name): super().__init__("a", "float") self.name = name self.name_tag = NameTag(name) - self.interaction_choose_box = MultiTextChooseBox( - ["fight", "cancel"], - "Interact") def add(self, _map, x, y): """Adds the player remoteplayer to the map diff --git a/src/pokete/classes/npcs/npcs.py b/src/pokete/classes/npcs/npcs.py index 6a6cd898..1fea5455 100644 --- a/src/pokete/classes/npcs/npcs.py +++ b/src/pokete/classes/npcs/npcs.py @@ -117,12 +117,12 @@ def chat(self): return while True: self.text(q_a.q) - while get_action() is None: + while get_action()[0] is None: loops.std(self.ctx) if q_a.a == {}: break q_a = q_a.a[ - MultiTextChooseBox(list(q_a.a.keys()), "Answer")(self.ctx) + MultiTextChooseBox(list(q_a.a.keys()), "Answer")(self.ctx)[1] ]