From d83c29e1ec3ecd8d5453fa05a4cd998f948a02a6 Mon Sep 17 00:00:00 2001 From: oclaim Date: Thu, 3 Jul 2025 18:42:30 -0400 Subject: [PATCH] Made some expansions and removed PDOLib --- players.json | 8 ++-- src/NoPELib/expansion.py | 20 --------- src/NoPELib/expansionsLib.py | 74 ++++++++++++++++++++++++++++++++++ src/NoPELib/player_settings.py | 40 ++++++------------ 4 files changed, 91 insertions(+), 51 deletions(-) delete mode 100644 src/NoPELib/expansion.py create mode 100644 src/NoPELib/expansionsLib.py diff --git a/players.json b/players.json index 5625211..9d5adc5 100644 --- a/players.json +++ b/players.json @@ -1,10 +1,10 @@ { "expansions": { - "ShockColar1": {"players": ["Brosef"], "tags": ["shock"]}, - "RobotBarman": {"players": ["Tango", "TRS_MML"], "tags": ["drink"]}, - "ChallengeDB": {"players": ["TRS_MML"], "tags": ["challenge"]}, - "SourCandy": {"players": [], "tags": ["food"]} + "ShockColar1": {"players": ["Brosef"], "tags": ["shock"], "config": {"COM_port": "COM3", "shocker_ID": 24770}}, + "RobotBarman": {"players": ["Tango", "TRS_MML"], "tags": ["drink"], "config": {}}, + "ChallengeDB": {"players": ["TRS_MML"], "tags": ["challenge"], "config": {}}, + "SourCandy": {"players": [], "tags": ["food"], "config": {}} }, "players": { "Brosef": {"flags": [], "expansions": {"exampleExpansion": {"playerOption": 5}}, "gamesSave": {"gameID0": 2}}, diff --git a/src/NoPELib/expansion.py b/src/NoPELib/expansion.py deleted file mode 100644 index b3d9bb8..0000000 --- a/src/NoPELib/expansion.py +++ /dev/null @@ -1,20 +0,0 @@ -from player_settings import Expansion - -class serialShockers(Expansion): - _api = None - - def __init__(self, ID, expansionsManager): - super().__init__(ID, expansionsManager) - if serialShockers._api is None: - pass - else: - pass - - def step(self, action): - pass - - def reset(self): - pass - - def close(self): - pass diff --git a/src/NoPELib/expansionsLib.py b/src/NoPELib/expansionsLib.py new file mode 100644 index 0000000..20eee28 --- /dev/null +++ b/src/NoPELib/expansionsLib.py @@ -0,0 +1,74 @@ +""" + +""" +from .player_settings import Expansion + + +class serialShocker(Expansion): + """ + Shockers + + TODO Describe the config file + """ + _api = {} + + def __init__(self, ID, expansionsManager): + super().__init__(ID, expansionsManager) + if self.config["COM_port"] not in serialShocker._api: + self._assignApi() + self.shocker = serialShocker._api[self.config["COM_port"]].shocker(["shocker_ID"]) + + def _assignApi(self): + from pishock import SerialAPI + serialShocker._api[self.config["COM_port"]] = SerialAPI(self.config["COM_port"]) + + def step(self, action): + """ + Arguments: + action (tuple): Tuple containing: + a bool deciding if vibrate should be used instead of shock + a positive float that defines the duration + a float within the range [0.0, 1.0] that defines the intensity + """ + vibrateInstead, duration, intensity = action + if vibrateInstead: + self.shocker.vibrate(duration=duration, intensity=intensity) + else: + self.shocker.shock(duration=duration, intensity=intensity) + + def close(self): + pass + + def reset(self): + if self.config["COM_port"] not in serialShocker._api: + serialShocker._api[self.config["COM_port"]].restart() + else: + self._assignApi() + + +class simplest(Expansion): + """ A very simple expansion that only prints on screen. """ + def __init__(self, ID, expansionsManager): + super().__init__(ID, expansionsManager) + print(f"Initialising with config {self.config}") + + def step(self, action): + """ + Arguments: + action (tuple): Tuple containing: + a bool deciding if vibrate should be used instead of shock + a positive float that defines the duration + a float within the range [0.0, 1.0] that defines the intensity + """ + vibrateInstead, duration, intensity = action + values = f"duration={duration}, intensity={intensity}" + if vibrateInstead: + print(f"Vibrate with {values}") + else: + print(f"Shock with {values}") + + def close(self): + print("Closing") + + def reset(self): + print("Reseting") diff --git a/src/NoPELib/player_settings.py b/src/NoPELib/player_settings.py index 8838fe9..680618d 100644 --- a/src/NoPELib/player_settings.py +++ b/src/NoPELib/player_settings.py @@ -7,7 +7,7 @@ import copy import json import logging from pathlib import Path -import PDOLib +import NoPELib.expansionsLib as expansionsLib _log = logging.getLogger('NoPE-Lib') @@ -275,7 +275,6 @@ class ExpansionsManager: defaultExpansionConfig = {"players": (), "types": ()} keysConvert2Tuple = ("players", "types") tags = ["shock", "spice", "sour", "drink", "challenge"] - # TODO Add an interface to allow the modification of the expansion settings # (attributed players / types) # TODO Allow to get a list of expansions with a specific tag/player @@ -341,20 +340,20 @@ class ExpansionsManager: def _listPossiblyValidExpansions(self): """ - List expansions that are included, defined in PDOLib and are available + List expansions that are included, defined in expansionsLib and are available to at least one active player. """ activePlayers = set(self.playersManager.keys()) possiblyValidExpansions = [ - expansion for expansion in self._includedExpansions - if hasattr(PDOLib, expansion) and - not self._getPlayersFillMissing(expansion).isdisjoint(activePlayers) + expansionID for expansionID in self._includedExpansions + if hasattr(expansionsLib, expansionID) and + not self._getPlayersFillMissing(expansionID).isdisjoint(activePlayers) ] return possiblyValidExpansions def _createExpansion(self, expansionID): try: - expansion = getattr(PDOLib, expansionID)(expansionID, self) + expansion = getattr(expansionsLib, expansionID)(expansionID, self) except: pass else: @@ -387,7 +386,7 @@ class ExpansionsManager: possibleAddition = set(self._includedExpansions).difference(self._activeExpansions) filteredAddition = [ expansionID for expansionID in possibleAddition - if hasattr(PDOLib, expansionID) and + if hasattr(expansionsLib, expansionID) and playerName in self._getPlayersFillMissing(expansionID) ] # Create the expansions @@ -411,30 +410,12 @@ class ExpansionsManager: expansionIsActive = expansionID in self._activeExpansions activePlayers = set(self.playersManager.keys()) expansionHasNoPlayers = self._getPlayersFillMissing(expansionID).isdisjoint(activePlayers) - expansionDefined = hasattr(PDOLib, expansionID) + expansionDefined = hasattr(expansionsLib, expansionID) if expansionIsActive and expansionHasNoPlayers: self._removeExpansion(expansionID) elif (not expansionIsActive) and (not expansionHasNoPlayers) and expansionDefined: self._createExpansion(expansionID) - def initilizeExpansion(self, expansionID: str, suppressError: bool=False): - """ - Initilise (possibly again) the expansion. - - Arguments: - expansionID (str): - suppressError (bool): - """ - if expansionID in self._activeExpansions: - self._removeExpansion(expansionID) - # Make sure that the expansion is relevent - if not suppressError: - # Verify that creating the expansion was successful - pass - # Try creating a new instance of the expansion - # Update the list of relevent expansions - # TODO Implement the rest - class Expansion: """ @@ -462,6 +443,10 @@ class Expansion: self._ID = ID self._manager = expansionsManager self.onError = Hook() + + @property + def config(self): + return copy.deepcopy(self._manager.config[self._ID]["config"]) @property def players(self): @@ -522,3 +507,4 @@ if __name__ == "__main__": print(pm["Brosef"].gameSave) brosef.state = ["alive"] # TODO Verify that changing the gameID works as intended + # TODO Test out the expansion manager