ListePions.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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 nouvelId(self, nomClasse):
  37. if nomClasse == "Combattant":
  38. if not len(self.pnjs()) > 0: return 1
  39. num = max(self.pnjs()) + 1
  40. elif nomClasse == "PJ":
  41. if not len(self.pjs()) > 0: return 10001
  42. num = max(self.pjs()) + 1
  43. else:
  44. if not len(self.decors()) > 0: return -1
  45. num = min(self._pions) - 1
  46. return num
  47. def numeroterNom(self, nom):
  48. """renvoie le nom du pion avec un numero complementaire si necessaire """
  49. i = 1
  50. for num in self.combattants():
  51. if self._pions[num].nom() == nom: i += 1
  52. return str(i) if i > 1 else ""
  53. def nouveau(self, modele):
  54. """creer un pion (combattant ou decor) aux coordonnees indiquees"""
  55. if self.plateau.proj.projectionValide():
  56. #instanciation du nouveau pion
  57. instance = modele.__class__
  58. pion = instance()
  59. #recup de ses attributs
  60. for elt in modele.__dict__:
  61. pion.__dict__[elt] = modele.__dict__[elt]
  62. #nouvel Id
  63. numero = self.nouvelId(modele.__class__.__name__)
  64. #creation du pion
  65. pion.numero = numero
  66. if modele.__class__.__name__ == "Combattant":
  67. pion.numComplementaire = self.numeroterNom(pion.nom())
  68. self._pions[numero] = pion
  69. pion.position = self.plateau.proj.coord()
  70. pion.nbRotations = self.plateau.proj.nbRotations()
  71. pion.ajouterAuPlateau(self.plateau)
  72. if pion.__class__.__name__ == "PJ": self.plateau.majListePJ()
  73. self.plateau.gC.reinitialiser()
  74. return True
  75. def supprimer(self, num):
  76. """supprime le pion entre en parametre"""
  77. pionSuppr = self._pions.pop(num)
  78. pionSuppr.retirerDuPlateau()
  79. self.plateau.gC.reinitialiser()
  80. if pionSuppr.__class__.__name__ == "PJ": self.plateau.majListePJ()
  81. def materialiser(self,actif):
  82. """active/desactive la reception par les pions des hover events"""
  83. for num in self._pions:
  84. self.decors[num].setAcceptsHoverEvents(actif)
  85. self.decors[num].polygoneGraphique.setAcceptsHoverEvents(actif)