ListePions.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. '''
  2. Liste et gestion des pions du plateau
  3. '''
  4. from lib.Combattant import Combattant
  5. from lib.Decor import Decor
  6. class ListePions(object):
  7. def __init__(self):
  8. self._pions = {}
  9. def __getstate__(self):
  10. state = {key:value for key, value in self.__dict__.items() if not key in ["plateau"]}
  11. return (state)
  12. def __setstate__(self, state):
  13. self.__dict__ = state
  14. def __getitem__(self, num):
  15. if not num in self._pions: return None
  16. return self._pions[num]
  17. def __iter__(self):
  18. return self._pions.__iter__()
  19. def initialiser(self, plateau):
  20. self.plateau = plateau
  21. def pions(self):
  22. return self._pions
  23. def combattants(self):
  24. return {key:value for key, value in self._pions.items() if key > 0}
  25. def combattantsVisibles(self):
  26. retour = {}
  27. for num in self.combattants():
  28. if not self._pions[num].estCache(): retour[num] = self._pions[num]
  29. return retour
  30. def decors(self):
  31. return {key:value for key, value in self._pions.items() if key < 0}
  32. def pjs(self):
  33. return {key:value for key, value in self._pions.items() if key > 10000}
  34. def pnjs(self):
  35. return {key:value for key, value in self._pions.items() if key > 0 and key <= 10000}
  36. def nouveau(self, modele):
  37. """creer un pion (combattant ou decor) aux coordonnees indiquees"""
  38. if self.plateau.proj.valide():
  39. #instanciation du nouveau pion
  40. instance = modele.__class__
  41. pion = instance()
  42. #on duplique le modele
  43. for elt in modele.__dict__:
  44. pion.__dict__[elt] = modele.__dict__[elt]
  45. #nouvel Id
  46. numero = self.nouvelId(modele.__class__.__name__)
  47. #creation du pion
  48. pion.numero = numero
  49. if modele.__class__.__name__ == "Combattant":
  50. pion.numComplementaire = self.numeroterNom(pion.nom())
  51. self._pions[numero] = pion
  52. pion.position = self.plateau.proj.coord()
  53. pion.nbRotations = self.plateau.proj.nbRotations()
  54. pion.ajouterAuPlateau(self.plateau)
  55. if pion.numero >= 10000 : self.plateau.majListePJ()
  56. self.plateau.gC.reinitialiser()
  57. return True
  58. def nouvelId(self, nomClasse):
  59. if nomClasse == "Combattant":
  60. if not len(self.pnjs()) > 0: return 1
  61. return max(self.pnjs()) + 1
  62. elif nomClasse == "PJ":
  63. if not len(self.pjs()) > 0: return 10001
  64. return max(self.pjs()) + 1
  65. else:
  66. if not len(self.decors()) > 0: return -1
  67. return min(self._pions) - 1
  68. def numeroterNom(self, nom):
  69. """renvoie le nom du pion avec un numero complementaire si necessaire """
  70. i = 1
  71. for num in self.combattants():
  72. if self._pions[num].nom() == nom: i += 1
  73. return str(i) if i > 1 else ""
  74. def supprimer(self, num):
  75. """supprime le pion entre en parametre"""
  76. pionSuppr = self._pions.pop(num)
  77. pionSuppr.retirerDuPlateau()
  78. self.plateau.gC.reinitialiser()
  79. if pionSuppr.__class__.__name__ == "PJ": self.plateau.majListePJ()
  80. def materialiser(self,actif):
  81. """active/desactive la reception par les pions des hover events"""
  82. for num in self._pions:
  83. self.decors[num].setAcceptsHoverEvents(actif)
  84. self.decors[num].polygoneGraphique.setAcceptsHoverEvents(actif)