|
|
|
@ -6,7 +6,7 @@ import copy
|
|
|
|
import json
|
|
|
|
import json
|
|
|
|
import logging
|
|
|
|
import logging
|
|
|
|
from pathlib import Path
|
|
|
|
from pathlib import Path
|
|
|
|
import NoPELib.expansionsLib as expansionsLib
|
|
|
|
import expansionsLib
|
|
|
|
|
|
|
|
|
|
|
|
_log = logging.getLogger('NoPE-Lib')
|
|
|
|
_log = logging.getLogger('NoPE-Lib')
|
|
|
|
|
|
|
|
|
|
|
|
@ -233,7 +233,7 @@ class ExpansionsManager:
|
|
|
|
Manager of the availability of the expansions.
|
|
|
|
Manager of the availability of the expansions.
|
|
|
|
|
|
|
|
|
|
|
|
Attributes:
|
|
|
|
Attributes:
|
|
|
|
includedExpansions: tuple of str
|
|
|
|
includeExpansions: tuple of str
|
|
|
|
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
|
|
|
|
@ -243,12 +243,10 @@ class ExpansionsManager:
|
|
|
|
lookupPlayer: Provide a list of expansion available to a player
|
|
|
|
lookupPlayer: Provide a list of expansion available to a player
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
defaultExpansionConfig = {"players": (), "types": ()}
|
|
|
|
defaultExpansionConfig = {"players": (), "types": ()}
|
|
|
|
keysConvert2Tuple = ("players", "types")
|
|
|
|
keysConvert2Tuple = ("players", "tags")
|
|
|
|
tags = ["shock", "spice", "sour", "drink", "challenge"]
|
|
|
|
tags = ["shock", "spice", "sour", "drink", "challenge"]
|
|
|
|
# (attributed players / types)
|
|
|
|
|
|
|
|
# TODO Allow to get a list of expansions with a specific tag/player
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def __init__(self, playersManager: PlayersManager, includedExpansions: tuple[str]=None):
|
|
|
|
def __init__(self, playersManager: PlayersManager, includeExpansions: tuple[str]=None):
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
Arguments:
|
|
|
|
Arguments:
|
|
|
|
tryInclude: bool=False, tryActivate: bool=False
|
|
|
|
tryInclude: bool=False, tryActivate: bool=False
|
|
|
|
@ -257,19 +255,23 @@ class ExpansionsManager:
|
|
|
|
self.playersManager = playersManager
|
|
|
|
self.playersManager = playersManager
|
|
|
|
self._playersLookUp = {}
|
|
|
|
self._playersLookUp = {}
|
|
|
|
self._cfg = playersManager.config["expansions"]
|
|
|
|
self._cfg = playersManager.config["expansions"]
|
|
|
|
if includedExpansions is not None:
|
|
|
|
if includeExpansions is not None:
|
|
|
|
self._includedExpansions = tuple(includedExpansions)
|
|
|
|
self._includeExpansions = tuple(includeExpansions)
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
self._includedExpansions = ()
|
|
|
|
self._includeExpansions = ()
|
|
|
|
# Convert the required lists into tuples
|
|
|
|
# Convert the required lists into tuples
|
|
|
|
for expansionID in self._cfg["expansions"]:
|
|
|
|
for expansionID in self._cfg:
|
|
|
|
for key in self.keysConvert2Tuple:
|
|
|
|
for key in self.keysConvert2Tuple:
|
|
|
|
converted = tuple(self._cfg["expansions"][expansionID][key])
|
|
|
|
converted = tuple(self._cfg[expansionID][key])
|
|
|
|
self._cfg["expansions"][expansionID][key] = converted
|
|
|
|
self._cfg[expansionID][key] = converted
|
|
|
|
# Compute the active expansions
|
|
|
|
# Compute the active expansions
|
|
|
|
self._activeExpansions = {}
|
|
|
|
self._activeExpansions = {}
|
|
|
|
for expansionID in self._listPossiblyValidExpansions():
|
|
|
|
for expansionID in self._listPossiblyValidExpansions():
|
|
|
|
self._createExpansion(expansionID)
|
|
|
|
creation_out = self._createExpansion(expansionID)
|
|
|
|
|
|
|
|
if isinstance(creation_out, expansionsLib.Expansion):
|
|
|
|
|
|
|
|
self._activeExpansions[expansionID] = creation_out
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
raise creation_out
|
|
|
|
|
|
|
|
|
|
|
|
# Connect the signals to the slots
|
|
|
|
# Connect the signals to the slots
|
|
|
|
playersManager.onMadePlayerActive.connect(self._activePlayerAdded)
|
|
|
|
playersManager.onMadePlayerActive.connect(self._activePlayerAdded)
|
|
|
|
@ -288,18 +290,18 @@ class ExpansionsManager:
|
|
|
|
return f"ExpansionsManager has {len(self._activeExpansions)} active expansions"
|
|
|
|
return f"ExpansionsManager has {len(self._activeExpansions)} active expansions"
|
|
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
@property
|
|
|
|
def includedExpansions(self):
|
|
|
|
def includeExpansions(self):
|
|
|
|
""" Dictionnary of the included expansions. """
|
|
|
|
""" Dictionnary of the included expansions. """
|
|
|
|
return self._includedExpansions
|
|
|
|
return self._includeExpansions
|
|
|
|
|
|
|
|
|
|
|
|
@includedExpansions.setter
|
|
|
|
@includeExpansions.setter
|
|
|
|
def includedExpansions(self, newIncluded: tuple[str]):
|
|
|
|
def includeExpansions(self, newIncluded: tuple[str]):
|
|
|
|
self._includedExpansions = tuple(newIncluded)
|
|
|
|
self._includeExpansions = tuple(newIncluded)
|
|
|
|
self._includeChanged()
|
|
|
|
self._includeChanged()
|
|
|
|
|
|
|
|
|
|
|
|
@includedExpansions.deleter
|
|
|
|
@includeExpansions.deleter
|
|
|
|
def includedExpansions(self):
|
|
|
|
def includeExpansions(self):
|
|
|
|
self._includedExpansions = ()
|
|
|
|
self._includeExpansions = ()
|
|
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
@property
|
|
|
|
def config(self):
|
|
|
|
def config(self):
|
|
|
|
@ -307,7 +309,10 @@ class ExpansionsManager:
|
|
|
|
return self._cfg
|
|
|
|
return self._cfg
|
|
|
|
|
|
|
|
|
|
|
|
def _getPlayersFillMissing(self, expansionID):
|
|
|
|
def _getPlayersFillMissing(self, expansionID):
|
|
|
|
return set(self._cfg["expansions"].get(expansionID, {}).get("players", []))
|
|
|
|
return set(self._cfg.get(expansionID, {}).get("players", []))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _getClassFillMissing(self, expansionID):
|
|
|
|
|
|
|
|
return self._cfg.get(expansionID, {}).get("class", "")
|
|
|
|
|
|
|
|
|
|
|
|
def _listPossiblyValidExpansions(self):
|
|
|
|
def _listPossiblyValidExpansions(self):
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
@ -316,8 +321,8 @@ class ExpansionsManager:
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
activePlayers = set(self.playersManager.keys())
|
|
|
|
activePlayers = set(self.playersManager.keys())
|
|
|
|
possiblyValidExpansions = [
|
|
|
|
possiblyValidExpansions = [
|
|
|
|
expansionID for expansionID in self._includedExpansions
|
|
|
|
expansionID for expansionID in self._includeExpansions
|
|
|
|
if hasattr(expansionsLib, expansionID) and
|
|
|
|
if hasattr(expansionsLib, self._getClassFillMissing(expansionID)) and
|
|
|
|
not self._getPlayersFillMissing(expansionID).isdisjoint(activePlayers)
|
|
|
|
not self._getPlayersFillMissing(expansionID).isdisjoint(activePlayers)
|
|
|
|
]
|
|
|
|
]
|
|
|
|
return possiblyValidExpansions
|
|
|
|
return possiblyValidExpansions
|
|
|
|
@ -325,10 +330,15 @@ class ExpansionsManager:
|
|
|
|
def _createExpansion(self, expansionID):
|
|
|
|
def _createExpansion(self, expansionID):
|
|
|
|
try:
|
|
|
|
try:
|
|
|
|
# Create the expansion
|
|
|
|
# Create the expansion
|
|
|
|
expansion = getattr(expansionsLib, expansionID)(expansionID, self)
|
|
|
|
expansionClass = self._getClassFillMissing(expansionID)
|
|
|
|
|
|
|
|
class_to_create = getattr(expansionsLib, expansionClass)
|
|
|
|
|
|
|
|
expansion = class_to_create(expansionID, self)
|
|
|
|
# Update the lookup
|
|
|
|
# Update the lookup
|
|
|
|
for player in self._getPlayersFillMissing(expansionID):
|
|
|
|
for player in self._getPlayersFillMissing(expansionID):
|
|
|
|
self._playersLookUp[player].append(expansionID)
|
|
|
|
if player in self._playersLookUp:
|
|
|
|
|
|
|
|
self._playersLookUp[player].append(expansionID)
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
self._playersLookUp[player] = [expansionID]
|
|
|
|
return expansion
|
|
|
|
return expansion
|
|
|
|
except Exception as e:
|
|
|
|
except Exception as e:
|
|
|
|
return e
|
|
|
|
return e
|
|
|
|
@ -348,7 +358,7 @@ class ExpansionsManager:
|
|
|
|
|
|
|
|
|
|
|
|
# Compute the expansions involved in the modification
|
|
|
|
# Compute the expansions involved in the modification
|
|
|
|
possiblyValidExpansions = set(self._listPossiblyValidExpansions())
|
|
|
|
possiblyValidExpansions = set(self._listPossiblyValidExpansions())
|
|
|
|
previousExpansions = set(self._includedExpansions)
|
|
|
|
previousExpansions = set(self._includeExpansions)
|
|
|
|
# Remove irrelevant expansions
|
|
|
|
# Remove irrelevant expansions
|
|
|
|
expansionsToRemove = previousExpansions.difference(possiblyValidExpansions)
|
|
|
|
expansionsToRemove = previousExpansions.difference(possiblyValidExpansions)
|
|
|
|
for expansionID in expansionsToRemove:
|
|
|
|
for expansionID in expansionsToRemove:
|
|
|
|
@ -360,14 +370,14 @@ class ExpansionsManager:
|
|
|
|
if isinstance(creation_out, expansionsLib.Expansion):
|
|
|
|
if isinstance(creation_out, expansionsLib.Expansion):
|
|
|
|
self._activeExpansions[expansionID] = creation_out
|
|
|
|
self._activeExpansions[expansionID] = creation_out
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
print(creation_out)
|
|
|
|
raise 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
|
|
|
|
possibleAddition = set(self._includedExpansions).difference(self._activeExpansions)
|
|
|
|
possibleAddition = set(self._includeExpansions).difference(self._activeExpansions)
|
|
|
|
filteredAddition = [
|
|
|
|
filteredAddition = [
|
|
|
|
expansionID for expansionID in possibleAddition
|
|
|
|
expansionID for expansionID in possibleAddition
|
|
|
|
if hasattr(expansionsLib, expansionID) and
|
|
|
|
if hasattr(expansionsLib, self._getClassFillMissing(expansionID)) and
|
|
|
|
playerName in self._getPlayersFillMissing(expansionID)
|
|
|
|
playerName in self._getPlayersFillMissing(expansionID)
|
|
|
|
]
|
|
|
|
]
|
|
|
|
# Create the expansions
|
|
|
|
# Create the expansions
|
|
|
|
@ -376,7 +386,7 @@ class ExpansionsManager:
|
|
|
|
if isinstance(creation_out, expansionsLib.Expansion):
|
|
|
|
if isinstance(creation_out, expansionsLib.Expansion):
|
|
|
|
self._activeExpansions[expansionID] = creation_out
|
|
|
|
self._activeExpansions[expansionID] = creation_out
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
print(creation_out)
|
|
|
|
raise 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
|
|
|
|
@ -406,7 +416,7 @@ class ExpansionsManager:
|
|
|
|
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, self._getClassFillMissing(expansionID))
|
|
|
|
# Update the activation status
|
|
|
|
# Update the activation status
|
|
|
|
activeChanged = False
|
|
|
|
activeChanged = False
|
|
|
|
if expansionIsActive and expansionHasNoPlayers:
|
|
|
|
if expansionIsActive and expansionHasNoPlayers:
|
|
|
|
@ -417,8 +427,8 @@ class ExpansionsManager:
|
|
|
|
if isinstance(creation_out, expansionsLib.Expansion):
|
|
|
|
if isinstance(creation_out, expansionsLib.Expansion):
|
|
|
|
self._activeExpansions[expansionID] = creation_out
|
|
|
|
self._activeExpansions[expansionID] = creation_out
|
|
|
|
activeChanged = True
|
|
|
|
activeChanged = True
|
|
|
|
elif isinstance(creation_out, Exception):
|
|
|
|
else:
|
|
|
|
print(creation_out)
|
|
|
|
raise creation_out
|
|
|
|
# Update the inverse lookup
|
|
|
|
# Update the inverse lookup
|
|
|
|
if not activeChanged:
|
|
|
|
if not activeChanged:
|
|
|
|
removedPlayers = set(previousPlayers).difference(newPlayers)
|
|
|
|
removedPlayers = set(previousPlayers).difference(newPlayers)
|
|
|
|
@ -439,21 +449,34 @@ class ExpansionsManager:
|
|
|
|
expansionsID (tuple of str): ID of the expansions available to the
|
|
|
|
expansionsID (tuple of str): ID of the expansions available to the
|
|
|
|
player
|
|
|
|
player
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
return tuple(self._playersLookUp[playerName])
|
|
|
|
return tuple(self._playersLookUp.get(playerName, []))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
if __name__ == "__main__":
|
|
|
|
# Test run to make sure nothing is flagrantly flawed
|
|
|
|
# Test run to make sure nothing is flagrantly flawed
|
|
|
|
configPath = Path(__file__).parent / "players.json"
|
|
|
|
configPath = Path(__file__).parent.parent.parent / "players.json"
|
|
|
|
pm = PlayersManager(playersPath=configPath, gameID="gameID0")
|
|
|
|
pm = PlayersManager(gameID="gameID0", activePlayers=["Brosef"], playersPath=configPath)
|
|
|
|
# Iteration
|
|
|
|
# Iteration
|
|
|
|
for name in pm:
|
|
|
|
for name in pm:
|
|
|
|
print(name)
|
|
|
|
print(name)
|
|
|
|
# Modification of a players data
|
|
|
|
# Modification of a players data
|
|
|
|
brosef = pm["Brosef"]
|
|
|
|
brosef = pm["Brosef"]
|
|
|
|
brosef.gameSave = [1]
|
|
|
|
brosef.gameSave = [1]
|
|
|
|
print(pm["Brosef"].gameSave)
|
|
|
|
|
|
|
|
brosef.state = ["alive"]
|
|
|
|
brosef.state = ["alive"]
|
|
|
|
# TODO Verify that changing the gameID works as intended
|
|
|
|
|
|
|
|
# TODO Test out the expansion manager
|
|
|
|
# Test run for the expansionsManager
|
|
|
|
# Implement a way to search within expansions
|
|
|
|
# Create the managers
|
|
|
|
|
|
|
|
configPath = Path(__file__).parent.parent.parent / "players.json"
|
|
|
|
|
|
|
|
pm = PlayersManager(gameID="gameID0", activePlayers=["Brosef"], playersPath=configPath)
|
|
|
|
|
|
|
|
em = ExpansionsManager(pm, includeExpansions=["Simple", "SourCandy"])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Use the expansion manager to interact with a player using the expansion "Simple"
|
|
|
|
|
|
|
|
brosefAvailableExpansionsID = em.lookupPlayer("Brosef")
|
|
|
|
|
|
|
|
if "Simple" in brosefAvailableExpansionsID:
|
|
|
|
|
|
|
|
# Define some random action
|
|
|
|
|
|
|
|
vibrateInstead, duration, intensity = False, 1.0, 100
|
|
|
|
|
|
|
|
action = vibrateInstead, duration, intensity
|
|
|
|
|
|
|
|
# Perform the action
|
|
|
|
|
|
|
|
expansionObject = em["Simple"]
|
|
|
|
|
|
|
|
return_infos = expansionObject(action)
|
|
|
|
|
|
|
|
assert return_infos["done"], "The step was not successfully completed"
|
|
|
|
|