''' Liste et gestion des pions du plateau ''' from lib.Combattant import Combattant from lib.Decor import Decor class ListePions(object): def __init__(self): self._pions = {} def __getstate__(self): state = {key:value for key, value in self.__dict__.items() if not key in ["plateau"]} return (state) def __setstate__(self, state): self.__dict__ = state def __getitem__(self, num): if not num in self._pions: return None return self._pions[num] def __iter__(self): return self._pions.__iter__() def initialiser(self, plateau): self.plateau = plateau def pions(self): return self._pions def combattants(self): return {key:value for key, value in self._pions.items() if key > 0} def combattantsVisibles(self): retour = {} for num in self.combattants(): if not self._pions[num].estCache(): retour[num] = self._pions[num] return retour def decors(self): return {key:value for key, value in self._pions.items() if key < 0} def pjs(self): return {key:value for key, value in self._pions.items() if key > 10000} def pnjs(self): return {key:value for key, value in self._pions.items() if key > 0 and key <= 10000} def nouveau(self, modele): """creer un pion (combattant ou decor) aux coordonnees indiquees""" if self.plateau.proj.valide(): #instanciation du nouveau pion instance = modele.__class__ pion = instance() #on duplique le modele for elt in modele.__dict__: pion.__dict__[elt] = modele.__dict__[elt] #nouvel Id numero = self.nouvelId(modele.__class__.__name__) #creation du pion pion.numero = numero if modele.__class__.__name__ == "Combattant": pion.numComplementaire = self.numeroterNom(pion.nom()) self._pions[numero] = pion pion.position = self.plateau.proj.coord() pion.nbRotations = self.plateau.proj.nbRotations() pion.ajouterAuPlateau(self.plateau) if pion.numero >= 10000 : self.plateau.majListePJ() self.plateau.gC.reinitialiser() return True def nouvelId(self, nomClasse): if nomClasse == "Combattant": if not len(self.pnjs()) > 0: return 1 return max(self.pnjs()) + 1 elif nomClasse == "PJ": if not len(self.pjs()) > 0: return 10001 return max(self.pjs()) + 1 else: if not len(self.decors()) > 0: return -1 return min(self._pions) - 1 def numeroterNom(self, nom): """renvoie le nom du pion avec un numero complementaire si necessaire """ i = 1 for num in self.combattants(): if self._pions[num].nom() == nom: i += 1 return str(i) if i > 1 else "" def supprimer(self, num): """supprime le pion entre en parametre""" pionSuppr = self._pions.pop(num) pionSuppr.retirerDuPlateau() self.plateau.gC.reinitialiser() if pionSuppr.__class__.__name__ == "PJ": self.plateau.majListePJ() def materialiser(self,actif): """active/desactive la reception par les pions des hover events""" for num in self._pions: self.decors[num].setAcceptsHoverEvents(actif) self.decors[num].polygoneGraphique.setAcceptsHoverEvents(actif)