Compare commits
7 Commits
8abb0acf59
...
ed7cdd21c1
| Author | SHA1 | Date | |
|---|---|---|---|
| ed7cdd21c1 | |||
| 43ee91c853 | |||
| bab32622ff | |||
| 587d93f7ea | |||
| 20a9aa5505 | |||
| 31e8d9fcb2 | |||
| b46d221173 |
@ -36,6 +36,7 @@ class Expansion:
|
|||||||
Attributes:
|
Attributes:
|
||||||
players (tuple of str):
|
players (tuple of str):
|
||||||
tags (tuple of flag):
|
tags (tuple of flag):
|
||||||
|
config: The config of the expansion. Can't be modified during execution.
|
||||||
|
|
||||||
Methods:
|
Methods:
|
||||||
step:
|
step:
|
||||||
@ -46,7 +47,7 @@ class Expansion:
|
|||||||
onError:
|
onError:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, ID: str, expansionsManager):
|
def __init__(self, ID: str, expansionsManager: "ExpansionsManager"):
|
||||||
"""
|
"""
|
||||||
Initialise the creation of an expansion and raise an error if not
|
Initialise the creation of an expansion and raise an error if not
|
||||||
available.
|
available.
|
||||||
@ -57,32 +58,32 @@ class Expansion:
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def config(self):
|
def config(self):
|
||||||
|
"""
|
||||||
|
The config of the expansion.
|
||||||
|
NOTE Can't be modified during execution.
|
||||||
|
"""
|
||||||
return copy.deepcopy(self._manager.config[self._ID]["config"])
|
return copy.deepcopy(self._manager.config[self._ID]["config"])
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def players(self):
|
def players(self):
|
||||||
""" Players that have access to this expansion. """
|
""" Players that have access to the expansion. """
|
||||||
return self._manager.config[self._ID]["players"]
|
return self._manager.config[self._ID]["players"]
|
||||||
|
|
||||||
@players.setter
|
@players.setter
|
||||||
def players(self, newPlayers):
|
def players(self, newPlayers):
|
||||||
""" Players that have access to this expansion. """
|
self._manager.expansionPlayersChanged(self._ID, newPlayers)
|
||||||
self._manager.config[self._ID]["players"] = tuple(newPlayers)
|
|
||||||
self._manager.expansionPlayersChanged(self._ID)
|
|
||||||
|
|
||||||
@players.deleter
|
@players.deleter
|
||||||
def players(self):
|
def players(self):
|
||||||
self._manager.config[self._ID]["players"] = ()
|
self._manager.expansionPlayersChanged(self._ID, ())
|
||||||
self._manager.expansionPlayersChanged(self._ID)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def tags(self):
|
def tags(self):
|
||||||
""" Players that have access to this expansion. """
|
""" Tags of the expansion. """
|
||||||
return self._manager.config[self._ID]["tags"]
|
return self._manager.config[self._ID]["tags"]
|
||||||
|
|
||||||
@tags.setter
|
@tags.setter
|
||||||
def tags(self, newPlayers):
|
def tags(self, newPlayers):
|
||||||
""" Players that have access to this expansion. """
|
|
||||||
self._manager.config[self._ID]["tags"] = tuple(newPlayers)
|
self._manager.config[self._ID]["tags"] = tuple(newPlayers)
|
||||||
|
|
||||||
@tags.deleter
|
@tags.deleter
|
||||||
@ -91,9 +92,6 @@ class Expansion:
|
|||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def step(self, action):
|
def step(self, action):
|
||||||
"""
|
|
||||||
Call close if an error is thrown
|
|
||||||
"""
|
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
@ -132,10 +130,23 @@ class serialShocker(Expansion):
|
|||||||
a float within the range [0.0, 1.0] that defines the intensity
|
a float within the range [0.0, 1.0] that defines the intensity
|
||||||
"""
|
"""
|
||||||
vibrateInstead, duration, intensity = action
|
vibrateInstead, duration, intensity = action
|
||||||
if vibrateInstead:
|
callFunc = self.shocker.vibrate if vibrateInstead else self.shocker.shock
|
||||||
self.shocker.vibrate(duration=duration, intensity=intensity)
|
# Try to execute the step
|
||||||
else:
|
try:
|
||||||
self.shocker.shock(duration=duration, intensity=intensity)
|
callFunc(duration=duration, intensity=intensity)
|
||||||
|
error = None
|
||||||
|
done = True
|
||||||
|
except Exception as e:
|
||||||
|
error = e
|
||||||
|
done = False
|
||||||
|
# Return additionnal info
|
||||||
|
step_info = {
|
||||||
|
"expansionID": self._ID,
|
||||||
|
"showOnScreen": None,
|
||||||
|
"error": error,
|
||||||
|
"done": done
|
||||||
|
}
|
||||||
|
return step_info
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
pass
|
pass
|
||||||
@ -163,10 +174,24 @@ class simplest(Expansion):
|
|||||||
"""
|
"""
|
||||||
vibrateInstead, duration, intensity = action
|
vibrateInstead, duration, intensity = action
|
||||||
values = f"duration={duration}, intensity={intensity}"
|
values = f"duration={duration}, intensity={intensity}"
|
||||||
if vibrateInstead:
|
interact_type = "Vibrate" if vibrateInstead else "Shock"
|
||||||
print(f"Vibrate with {values}")
|
# Try to execute the step
|
||||||
else:
|
try:
|
||||||
print(f"Shock with {values}")
|
message = f"{interact_type} with {values}"
|
||||||
|
error = None
|
||||||
|
done = True
|
||||||
|
except Exception as e:
|
||||||
|
message = None
|
||||||
|
error = e
|
||||||
|
done = False
|
||||||
|
# Return additionnal info
|
||||||
|
step_info = {
|
||||||
|
"expansionID": self._ID,
|
||||||
|
"showOnScreen": message,
|
||||||
|
"error": error,
|
||||||
|
"done": done
|
||||||
|
}
|
||||||
|
return step_info
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
print("Closing")
|
print("Closing")
|
||||||
|
|||||||
@ -227,20 +227,6 @@ class Player:
|
|||||||
"games": self._gamesSave
|
"games": self._gamesSave
|
||||||
}
|
}
|
||||||
|
|
||||||
def punish(self, value, preferedExpansion: str=None):
|
|
||||||
do_something = lambda value, preferedExpansion: value
|
|
||||||
additionalInfos = {
|
|
||||||
"expansionID": "challengeDB",
|
|
||||||
"balancedValue": 0.2,
|
|
||||||
"showOnScreen": "Do 100 push-up",
|
|
||||||
"error": None,
|
|
||||||
"done": False
|
|
||||||
}
|
|
||||||
# NOTE Make a result class instead and an error class
|
|
||||||
# TODO Implement a way to choose between the available expansions
|
|
||||||
additionalInfos = do_something(value, preferedExpansion)
|
|
||||||
return additionalInfos
|
|
||||||
|
|
||||||
|
|
||||||
class ExpansionsManager:
|
class ExpansionsManager:
|
||||||
"""
|
"""
|
||||||
@ -251,6 +237,9 @@ class ExpansionsManager:
|
|||||||
Container of the expansions to try making available
|
Container of the expansions to try making available
|
||||||
activeExpansions: dict of Expansion
|
activeExpansions: dict of Expansion
|
||||||
Container of the relevent expansions
|
Container of the relevent expansions
|
||||||
|
|
||||||
|
Methods:
|
||||||
|
expansionPlayersChanged
|
||||||
"""
|
"""
|
||||||
defaultExpansionConfig = {"players": (), "types": ()}
|
defaultExpansionConfig = {"players": (), "types": ()}
|
||||||
keysConvert2Tuple = ("players", "types")
|
keysConvert2Tuple = ("players", "types")
|
||||||
@ -265,6 +254,7 @@ class ExpansionsManager:
|
|||||||
"""
|
"""
|
||||||
# Create the attributes
|
# Create the attributes
|
||||||
self.playersManager = playersManager
|
self.playersManager = playersManager
|
||||||
|
self._playersLookUp = {}
|
||||||
self._cfg = playersManager.config["expansions"]
|
self._cfg = playersManager.config["expansions"]
|
||||||
if includedExpansions is not None:
|
if includedExpansions is not None:
|
||||||
self._includedExpansions = tuple(includedExpansions)
|
self._includedExpansions = tuple(includedExpansions)
|
||||||
@ -320,7 +310,7 @@ class ExpansionsManager:
|
|||||||
|
|
||||||
def _listPossiblyValidExpansions(self):
|
def _listPossiblyValidExpansions(self):
|
||||||
"""
|
"""
|
||||||
List expansions that are included, defined in expansionsLib and are available
|
List expansions that are: included, defined in expansionsLib and available
|
||||||
to at least one active player.
|
to at least one active player.
|
||||||
"""
|
"""
|
||||||
activePlayers = set(self.playersManager.keys())
|
activePlayers = set(self.playersManager.keys())
|
||||||
@ -333,13 +323,20 @@ class ExpansionsManager:
|
|||||||
|
|
||||||
def _createExpansion(self, expansionID):
|
def _createExpansion(self, expansionID):
|
||||||
try:
|
try:
|
||||||
|
# Create the expansion
|
||||||
expansion = getattr(expansionsLib, expansionID)(expansionID, self)
|
expansion = getattr(expansionsLib, expansionID)(expansionID, self)
|
||||||
except:
|
# Update the lookup
|
||||||
pass
|
for player in self._getPlayersFillMissing(expansionID):
|
||||||
else:
|
self._playersLookUp[player].append(expansionID)
|
||||||
self._activeExpansions[expansionID] = expansion
|
return expansion
|
||||||
|
except Exception as e:
|
||||||
|
return e
|
||||||
|
|
||||||
def _removeExpansion(self, expansionID):
|
def _removeExpansion(self, expansionID):
|
||||||
|
# Update the lookup
|
||||||
|
for player in self._getPlayersFillMissing(expansionID):
|
||||||
|
self._playersLookUp[player].pop(expansionID)
|
||||||
|
# Remove the expansion
|
||||||
expansion = self._activeExpansions.pop(expansionID)
|
expansion = self._activeExpansions.pop(expansionID)
|
||||||
expansion.close()
|
expansion.close()
|
||||||
del expansion
|
del expansion
|
||||||
@ -359,7 +356,11 @@ class ExpansionsManager:
|
|||||||
# Add the new expansions
|
# Add the new expansions
|
||||||
expansionsToAdd = possiblyValidExpansions.difference(previousExpansions)
|
expansionsToAdd = possiblyValidExpansions.difference(previousExpansions)
|
||||||
for expansionID in expansionsToAdd:
|
for expansionID in expansionsToAdd:
|
||||||
self._createExpansion(expansionID)
|
creation_out = self._createExpansion(expansionID)
|
||||||
|
if isinstance(creation_out, expansionsLib.Expansion):
|
||||||
|
self._activeExpansions[expansionID] = creation_out
|
||||||
|
else:
|
||||||
|
print(creation_out)
|
||||||
|
|
||||||
def _activePlayerAdded(self, playerName):
|
def _activePlayerAdded(self, playerName):
|
||||||
# Find the expansions that are to be created
|
# Find the expansions that are to be created
|
||||||
@ -371,7 +372,11 @@ class ExpansionsManager:
|
|||||||
]
|
]
|
||||||
# Create the expansions
|
# Create the expansions
|
||||||
for expansionID in filteredAddition:
|
for expansionID in filteredAddition:
|
||||||
self._createExpansion(expansionID)
|
creation_out = self._createExpansion(expansionID)
|
||||||
|
if isinstance(creation_out, expansionsLib.Expansion):
|
||||||
|
self._activeExpansions[expansionID] = creation_out
|
||||||
|
else:
|
||||||
|
print(creation_out)
|
||||||
|
|
||||||
def _activePlayerRemoved(self, playerName):
|
def _activePlayerRemoved(self, playerName):
|
||||||
# Find the expansions that are to be removed
|
# Find the expansions that are to be removed
|
||||||
@ -386,15 +391,55 @@ class ExpansionsManager:
|
|||||||
def _errorOccured(self, expansionID):
|
def _errorOccured(self, expansionID):
|
||||||
self._removeExpansion(expansionID)
|
self._removeExpansion(expansionID)
|
||||||
|
|
||||||
def expansionPlayersChanged(self, expansionID):
|
def expansionPlayersChanged(self, expansionID, newPlayers):
|
||||||
|
"""
|
||||||
|
Method that allows changing the assigned players of an expansion.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
expansionID (str):
|
||||||
|
newPlayers (tuple of str):
|
||||||
|
"""
|
||||||
|
# Save the change
|
||||||
|
previousPlayers = self._cfg[expansionID]["players"]
|
||||||
|
self._cfg[expansionID]["players"] = tuple(newPlayers)
|
||||||
|
# Check the state of the expansion
|
||||||
expansionIsActive = expansionID in self._activeExpansions
|
expansionIsActive = expansionID in self._activeExpansions
|
||||||
activePlayers = set(self.playersManager.keys())
|
activePlayers = set(self.playersManager.keys())
|
||||||
expansionHasNoPlayers = self._getPlayersFillMissing(expansionID).isdisjoint(activePlayers)
|
expansionHasNoPlayers = self._getPlayersFillMissing(expansionID).isdisjoint(activePlayers)
|
||||||
expansionDefined = hasattr(expansionsLib, expansionID)
|
expansionDefined = hasattr(expansionsLib, expansionID)
|
||||||
|
# Update the activation status
|
||||||
|
activeChanged = False
|
||||||
if expansionIsActive and expansionHasNoPlayers:
|
if expansionIsActive and expansionHasNoPlayers:
|
||||||
self._removeExpansion(expansionID)
|
self._removeExpansion(expansionID)
|
||||||
|
activeChanged = True
|
||||||
elif (not expansionIsActive) and (not expansionHasNoPlayers) and expansionDefined:
|
elif (not expansionIsActive) and (not expansionHasNoPlayers) and expansionDefined:
|
||||||
self._createExpansion(expansionID)
|
creation_out = self._createExpansion(expansionID)
|
||||||
|
if isinstance(creation_out, expansionsLib.Expansion):
|
||||||
|
self._activeExpansions[expansionID] = creation_out
|
||||||
|
activeChanged = True
|
||||||
|
elif isinstance(creation_out, Exception):
|
||||||
|
print(creation_out)
|
||||||
|
# Update the inverse lookup
|
||||||
|
if not activeChanged:
|
||||||
|
removedPlayers = set(previousPlayers).difference(newPlayers)
|
||||||
|
addedPlayers = set(newPlayers).difference(previousPlayers)
|
||||||
|
for playerName in removedPlayers:
|
||||||
|
self._playersLookUp[playerName].pop(expansionID)
|
||||||
|
for playerName in addedPlayers:
|
||||||
|
self._playersLookUp[playerName].append(expansionID)
|
||||||
|
|
||||||
|
def lookupPlayer(self, playerName):
|
||||||
|
"""
|
||||||
|
Get a tuple of all expansions available to a player.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
playerName (str): Name of the player
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
expansionsID (tuple of str): ID of the expansions available to the
|
||||||
|
player
|
||||||
|
"""
|
||||||
|
return tuple(self._playersLookUp[playerName])
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
Reference in New Issue
Block a user