gC.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. # -*- coding: utf-8 -*-
  2. '''
  3. outils de gestion du combat sur le plateau
  4. '''
  5. from PyQt4.QtCore import QSize, QString, Qt, SIGNAL
  6. from PyQt4.QtGui import QTableWidgetItem, QIcon, QBrush, QColor
  7. from lib import regles
  8. class GestionCombat(object):
  9. '''reunit les outils de suivi du combat'''
  10. def __init__(self):
  11. self._tour = 0
  12. self._oJ = OrdreJeu()
  13. def __getstate__(self):
  14. state = {key:value for key, value in self.__dict__.items() if not key in ["plateau"]}
  15. return (state)
  16. def __setstate__(self, state):
  17. self.__dict__ = state
  18. def initialiser(self, plateau):
  19. self.plateau = plateau
  20. self.initTblOrdre()
  21. self.plateau.fenetre.connect(self.tblOrdre(), SIGNAL("cellClicked(int,int)"), self.clicTblOrdre, Qt.UniqueConnection)
  22. def tour(self):
  23. return self._tour
  24. def tourSuivant(self):
  25. self._tour += 1
  26. self.plateau.majBoutonEtape()
  27. def reinitialiser(self):
  28. """appellee apres ajout ou suppr de combattants, et apres modif de leurs attributs"""
  29. self._oJ.generer(self.plateau)
  30. self.majTblOrdre()
  31. def maj(self):
  32. pass
  33. def tblOrdre(self):
  34. return self.plateau.fenetre.ui.inf_listeOrdreJeu
  35. def initTblOrdre(self):
  36. """cree les colonnes et met en forme la table ordre jeu"""
  37. self.tblOrdre().setColumnWidth(0, 0)
  38. self.tblOrdre().setColumnWidth(1, 0)
  39. self.tblOrdre().hideColumn(0)
  40. self.tblOrdre().hideColumn(1)
  41. self.tblOrdre().setIconSize(QSize(30,20))
  42. def majTblOrdre(self):
  43. """met a jour la liste des pions infoOrdreJeu"""
  44. self.tblOrdre().setSortingEnabled(False)
  45. self.tblOrdre().vider()
  46. for num in self._oJ:
  47. ligne = self.tblOrdre().nouvelleLigneFin()
  48. self.tblOrdre().setRowHidden(ligne, False)
  49. self.tblOrdre().majData(ligne, 0, num)
  50. self.tblOrdre().majData(ligne, 1, self._oJ[num])
  51. self.tblOrdre().setItem(ligne, 2, QTableWidgetItem(QIcon(self.plateau.pions[num].icone().pix()), \
  52. QString.fromUtf8(self.plateau.pions[num].txtId())))
  53. self.tblOrdre().sizeHintForColumn(2)
  54. self.tblOrdre().setSortingEnabled(True)
  55. self.tblOrdre().sortItems(1, Qt.AscendingOrder)
  56. def clicTblOrdre(self, ligne, col):
  57. """on a clique dans la liste d'ordre de jeu, le pion correspondant est selectionne et centre sur la carte"""
  58. num = self.tblOrdre().entier(ligne, 0)
  59. self.plateau.centrerSur(num)
  60. self.plateau.modeActif.clic_combattant(num)
  61. def pionSuivant(self):
  62. """selection du pion suivant dans la liste d'ordre de jeu"""
  63. #securites en cas de suppression d'un pion
  64. if not len(self._oJ) > 0: return
  65. suivant = self._oJ.suivant()
  66. if self._oJ.position() == 0: self.tourSuivant()
  67. self.tblOrdre().selectionner(self._oJ.position(), 2)
  68. self.tblOrdre().scrollToItem(self.tblOrdre().item(self._oJ.position(), 2))
  69. self.plateau.centrerSur(suivant)
  70. self.plateau.modeActif.clic_combattant(suivant)
  71. class OrdreJeu():
  72. def __init__(self):
  73. self._eC = -1 #pion en cours
  74. self._ordre = [] #ordre (num: position)
  75. def __iter__(self):
  76. return self._ordre.__iter__()
  77. def __getitem__(self, num):
  78. if not num in self._ordre: return None
  79. return self._ordre.index(num)
  80. def __len__(self):
  81. return len(self._ordre)
  82. def generer(self, plateau):
  83. combattants = plateau.combattantsVisibles()
  84. lst = [value for value in combattants.values()]
  85. lst.sort(key=lambda x: x.listeAttributs[regles.attributOrdreJeu()], reverse=(regles.sensTriOrdreJeu() == 1))
  86. self._ordre = [value.numero for value in combattants.values()]
  87. def ordre(self):
  88. return self._ordre
  89. def actuel(self):
  90. return self._ordre[self._eC]
  91. def suivant(self):
  92. self._eC += 1
  93. if self._eC >= len(self._ordre): self._eC = 0
  94. return self._ordre[self._eC]
  95. def position(self):
  96. return self._eC