EcranGestionCombat.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. #from __future__ import unicode_literals
  2. # -*- coding: utf-8 -*-
  3. from __future__ import division
  4. from PyQt4.QtCore import *
  5. from PyQt4.QtGui import *
  6. from ui.ecran_gestionCombat import Ui_gestionCombat
  7. import regles
  8. from lancer import jet, estJetValide
  9. class EcranGestionCombat(QFrame):
  10. #*EGC
  11. """interface de gestion du combat (MJ)"""
  12. def __init__(self, plateau, parent=None):
  13. """initialisation de la fenetre"""
  14. super (EcranGestionCombat, self).__init__()
  15. self.plateau = plateau
  16. self.colonnesBase = {}
  17. self.createWidgets()
  18. self.positionDansHistoJets = 0
  19. self.histoJets = [QString.fromUtf8("")]
  20. self.majEnCours = False
  21. def createWidgets(self):
  22. """construction de l'interface"""
  23. #construction de l'interface
  24. self.ui = Ui_gestionCombat()
  25. self.ui.setupUi(self)
  26. self.majListesDeroulantes()
  27. self.ui.jetDes.installEventFilter(self)
  28. #selection
  29. self.connect(self.ui.selectionPionEnCours, SIGNAL("clicked()"), self.selection)
  30. self.connect(self.ui.selectionAttaquant, SIGNAL("clicked()"), self.selection)
  31. self.connect(self.ui.selectionDefenseur, SIGNAL("clicked()"), self.selection)
  32. #jet de des
  33. self.connect(self.ui.jetDes, SIGNAL("returnPressed()"), self.jetDes)
  34. ## self.connect(self.ui.jetDes, SIGNAL("keyPressEvent()"), self.jetDesToucheEnfoncee)
  35. self.connect(self.ui.validerJetDes, SIGNAL("clicked()"), self.jetDes)
  36. self.connect(self.ui.majChamp, SIGNAL("clicked()"), self.majChamp)
  37. self.connect(self.ui.afficherDetailDes, SIGNAL("stateChanged(int)"), self.majAffichageDetailDes)
  38. #autre
  39. self.connect(self.ui.listePions.horizontalHeader(), SIGNAL("sectionClicked(int)"), self.enTeteCliquee)
  40. self.connect(self.ui.gestionCombatAide, SIGNAL("clicked()"), self.afficherAide)
  41. self.connect(self.ui.masquerHorsCombat, SIGNAL("stateChanged(int)"), self.majFiltreHorsCombat)
  42. self.initListe()
  43. self.majListe()
  44. self.connect(self.ui.listePions, SIGNAL("cellChanged(int, int)"), self.celluleModifiee)
  45. def majListesDeroulantes(self):
  46. """remplit les listes deroulantes des champs a mettre a jour"""
  47. self.ui.nomChampMaj.addItem(QString.fromUtf8("Jet(s) de des"), "D")
  48. self.ui.nomChampSourceMaj.addItem(QString.fromUtf8("Jet(s) de des"), "D")
  49. for elt in regles.ordreAttributs():
  50. if regles.listeControle()[elt].typ == "entier":
  51. self.ui.nomChampMaj.addItem(QString.fromUtf8(regles.listeControle()[elt].nom), regles.ordreAttributs().index(elt))
  52. self.ui.nomChampSourceMaj.addItem(QString.fromUtf8(regles.listeControle()[elt].nom), regles.ordreAttributs().index(elt))
  53. self.ui.nomChampMaj.setCurrentIndex(1)
  54. def enTeteCliquee(self, colonne):
  55. """clic sur l'en-tete de la colonne"""
  56. if colonne >= 20: #ne s'applique pas aux colonnes de base (a part Des)
  57. attribut = regles.ordreAttributs()[(colonne-20)]
  58. index = self.ui.nomChampMaj.findData((colonne-20))
  59. if index >= 0:
  60. self.ui.nomChampMaj.setCurrentIndex(index)
  61. elif colonne == self.colonnesBase.index("Des"):
  62. self.ui.nomChampMaj.setCurrentIndex(0)
  63. def initListe(self):
  64. """formate la table des donnees"""
  65. #mise en forme des colonnes
  66. #le dico des colonnes de base (celles qui ne dependent pas des regles utilisees) contient:
  67. #nom, largeur, (est modifiable?)
  68. self.ui.listePions.setEditTriggers(QAbstractItemView.DoubleClicked)
  69. self.ui.listePions.setIconSize(QSize(20,20))
  70. self.colonnesBase = ["num","I","Des","DetailDes","Pion","Ordre","Etat","Alt.","Notes"]
  71. largeurColonnesBase = {"num": 0, "I": 20, "Des": 40, "DetailDes": 60, "Pion": 80,"Ordre": 40, "Etat": 60,"Alt.": 30,"Notes": 80}
  72. for i in range(0, 20):
  73. self.ui.listePions.insertColumn(i)
  74. self.ui.listePions.setColumnHidden(i, (i >= len(self.colonnesBase)))
  75. if i < len(self.colonnesBase):
  76. self.ui.listePions.setHorizontalHeaderItem(i, QTableWidgetItem(self.colonnesBase[i]))
  77. if self.colonnesBase[i] in largeurColonnesBase:
  78. largeur = largeurColonnesBase[self.colonnesBase[i]]
  79. else:
  80. largeur = 60
  81. if largeur > 0:
  82. self.ui.listePions.setColumnWidth(i, largeur)
  83. else:
  84. self.ui.listePions.setColumnHidden(i, True)
  85. self.majAffichageDetailDes()
  86. ordre = regles.ordreAttributs()
  87. for elt in ordre:
  88. numCol = 20 + ordre.index(elt)
  89. self.ui.listePions.insertColumn(numCol)
  90. self.ui.listePions.setHorizontalHeaderItem(numCol, QTableWidgetItem(QString.fromUtf8(elt)))
  91. self.ui.listePions.setColumnWidth(numCol, 45)
  92. self.ui.listePions.setColumnHidden(numCol, False)
  93. if elt == regles.attributOrdreJeu():
  94. self.ui.listePions.setColumnHidden(self.colonnesBase.index("Ordre"), True) #si un attribut sert a definir l'ordre, on cache la colonne ordre de jeu
  95. def majListe(self):
  96. """met a jour le contenu de la table des donnees"""
  97. self.majEnCours = True
  98. while self.ui.listePions.rowCount() > 0:
  99. self.ui.listePions.removeRow(0)
  100. index = 0
  101. for num in self.plateau.pions:
  102. self.ui.listePions.insertRow(int(index))
  103. #num du pion (0):
  104. self.ui.listePions.setItem(int(index),0,QTableWidgetItem(QString.fromUtf8(str(num))))
  105. self.majDonneesPion(num)
  106. index += 1
  107. for elt in regles.ordreAttributs():
  108. if elt == regles.attributOrdreJeu():
  109. self.plateau.majOrdreJeu()
  110. self.majTri()
  111. self.majEnCours = False
  112. def majDonneesPion(self, numPion):
  113. """met a jour les donnees du pion"""
  114. index = None
  115. for i in range(0, self.ui.listePions.rowCount()):
  116. if int(self.ui.listePions.item(i, 0).text().toUtf8()) == numPion:
  117. index = i
  118. break
  119. if index != None:
  120. ### parametres de base
  121. #I - Indication sur le pion (attaquant, defenseur, selectionne sur la plateau...etc)
  122. item = QTableWidgetItem()
  123. item.setFlags(Qt.NoItemFlags)
  124. item.setFlags(Qt.ItemIsSelectable)
  125. if numPion == self.plateau.numPionEnCours:
  126. item.setIcon(QIcon("img\\flecheDroite2.png"))
  127. if item != None:
  128. self.ui.listePions.setItem(index, self.colonnesBase.index("I"), item)
  129. #Des et DetailDes - jets de des, on laisse tel quel
  130. self.ui.listePions.setItem(index, self.colonnesBase.index("Des"), QTableWidgetItem(QString.fromUtf8("")))
  131. self.ui.listePions.setItem(index, self.colonnesBase.index("DetailDes"), QTableWidgetItem(QString.fromUtf8("")))
  132. #Icone et nom
  133. item = QTableWidgetItem(QIcon("img\\"+self.plateau.pions[numPion].creature.logo), \
  134. QString.fromUtf8(self.plateau.pions[numPion].txtId()))
  135. self.ui.listePions.setItem(index, self.colonnesBase.index("Pion"), item)
  136. #Ordre
  137. self.ui.listePions.setItem(index, self.colonnesBase.index("Ordre"), QTableWidgetItem(QString.fromUtf8(str(self.plateau.ordreJeu[numPion]))))
  138. #Etat
  139. #...
  140. #altitude
  141. self.ui.listePions.setItem(index, self.colonnesBase.index("Alt."), QTableWidgetItem(QString.fromUtf8(str(self.plateau.pions[numPion].z))))
  142. ### parametres supplementaires (issus des regles)
  143. for elt in self.plateau.pions[numPion].lstCarac:
  144. col = 20 + regles.ordreAttributs().index(elt)
  145. self.ui.listePions.setItem(index, col , QTableWidgetItem(QString.fromUtf8(str(self.plateau.pions[numPion].lstCarac[elt]))))
  146. else:
  147. print ("Pion {} introuvable, impossible de maj".format(numPion))
  148. def celluleModifiee(self, ligne, colonne):
  149. """une cellule de la table a ete modifiee"""
  150. if not self.majEnCours:
  151. numPion = int(self.ui.listePions.item(ligne, 0).text().toUtf8())
  152. if colonne < len(self.colonnesBase):
  153. if colonne == self.colonnesBase.index("Ordre"):
  154. #ordre de jeu
  155. nouvellePosition = int(self.ui.listePions.item(ligne, colonne).text().toUtf8())
  156. if nouvellePosition < 1: nouvellePosition = 1
  157. self.plateau.pionDeplacerDansOrdreJeu(numPion, nouvellePosition)
  158. self.majListe()
  159. elif colonne == self.colonnesBase.index("Des"):
  160. #jet de de
  161. self.majEnCours = True
  162. if len(str(self.ui.listePions.item(ligne, colonne).text().toUtf8())) > 0:
  163. resultat = jet(str(self.ui.listePions.item(ligne, colonne).text().toUtf8()))[0]
  164. self.ui.listePions.item(ligne, colonne).setText(QString.fromUtf8(str(resultat)))
  165. else:
  166. self.ui.listePions.item(ligne, colonne).setText(QString.fromUtf8(""))
  167. self.majEnCours = False
  168. elif colonne >= 20:
  169. self.majEnCours = True
  170. index = colonne - 20
  171. attribut = regles.ordreAttributs()[index]
  172. valeurAttribut = regles.listeControle()[attribut].controler(str(self.ui.listePions.item(ligne, colonne).text().toUtf8()))
  173. if valeurAttribut != None:
  174. self.plateau.pions[numPion].lstCarac[attribut] = valeurAttribut
  175. if attribut == regles.attributOrdreJeu():
  176. self.plateau.majOrdreJeu()
  177. self.majTri()
  178. else:
  179. self.ui.listePions.item(ligne, colonne).setText(QString.fromUtf8(str(self.plateau.pions[numPion].lstCarac[attribut])))
  180. self.majEnCours = False
  181. self.emit(SIGNAL("majListesPions"), numPion)
  182. def majTri(self):
  183. """met a jour le tri en fonction de la colonne ordreJeu """
  184. for i in range(0,self.ui.listePions.rowCount()):
  185. self.ui.listePions.setItem(i, self.colonnesBase.index("Ordre"), \
  186. QTableWidgetItem(str(self.plateau.ordreJeu[int(str(self.ui.listePions.item(i,0).text().toUtf8()))])))
  187. ## trierTable(self.ui.listePions, self.colonnesBase.index("Ordre"))
  188. def jetDes(self):
  189. """jette les des en fonction de ce qui est tape dans jetDes, et affecte les resultats a la colonne D des lignes selectionnees"""
  190. jetCommun = None
  191. for i in range(0, self.ui.listePions.rowCount()):
  192. self.ui.listePions.item(i, self.colonnesBase.index("Des")).setText(QString.fromUtf8(""))
  193. if estJetValide(str(self.ui.jetDes.text().toUtf8())):
  194. if not self.ui.jetDesIndependants.isChecked() and len(str(self.ui.jetDes.text().toUtf8())) > 0:
  195. jetCommun = jet(str(self.ui.jetDes.text().toUtf8()))
  196. for i in range(0, self.ui.listePions.rowCount()):
  197. self.ui.listePions.item(i, self.colonnesBase.index("Des")).setText(QString.fromUtf8(""))
  198. if len(str(self.ui.jetDes.text().toUtf8())) > 0:
  199. if self.ui.listePions.isItemSelected(self.ui.listePions.item(i, 0)):
  200. if not jetCommun == None:
  201. resultat = jetCommun
  202. else:
  203. resultat = jet(str(self.ui.jetDes.text().toUtf8()))
  204. if resultat[0] != None:
  205. self.ui.listePions.item(i, self.colonnesBase.index("Des")).setText(QString.fromUtf8(str(resultat[0])))
  206. self.ui.listePions.item(i, self.colonnesBase.index("DetailDes")).setText(QString.fromUtf8(str(resultat[1])))
  207. self.histoJets.insert(1, self.ui.jetDes.text().toUtf8())
  208. else:
  209. print "Jet de des invalide"
  210. self.positionDansHistoJets = 0
  211. self.ui.jetDes.setText(QString.fromUtf8(""))
  212. def afficherJetHisto(self):
  213. """affiche le jet depuis l'historique dans la qlineedit dediee"""
  214. if len(self.histoJets) > 0:
  215. if self.positionDansHistoJets < 0:
  216. self.positionDansHistoJets = 0
  217. elif self.positionDansHistoJets >= len(self.histoJets):
  218. self.positionDansHistoJets = len(self.histoJets) - 1
  219. self.ui.jetDes.setText(QString.fromUtf8(self.histoJets[self.positionDansHistoJets]))
  220. def selection(self):
  221. """selectionne les lignes demandees"""
  222. origine = str(self.sender().objectName())
  223. for i in range(0, self.ui.listePions.rowCount()):
  224. if origine == "selectionPionEnCours":
  225. self.ui.listePions.item(i, 0).setSelected((int(self.ui.listePions.item(i, 0).text().toUtf8()) == self.plateau.numPionEnCours))
  226. elif origine == "selectionAttaquant":
  227. pass
  228. elif origine == "selectionDefenseur":
  229. pass
  230. if self.ui.listePions.item(i, 0).isSelected():
  231. self.ui.listePions.setCurrentCell(i, 0)
  232. def majChamp(self):
  233. """met a jour le champ demande avec les resultats de des ou avec les valeurs du champ specifie"""
  234. self.majEnCours = True
  235. aMaj = [] #liste des numPions a mettre a jour
  236. cible = str(self.ui.nomChampMaj.itemData(self.ui.nomChampMaj.currentIndex()).toString())
  237. if cible == "D":
  238. colonne = self.colonnesBase.index("Des")
  239. else:
  240. colonne = 20 + int(cible)
  241. source = str(self.ui.nomChampSourceMaj.itemData(self.ui.nomChampSourceMaj.currentIndex()).toString())
  242. if source != "D" and not len(self.ui.listePions.selectedItems()) > 0:
  243. msgBox = QMessageBox()
  244. msgBox.setWindowTitle(QString.fromUtf8("Avertissement"))
  245. msgBox.setText(QString.fromUtf8("Aucune ligne n'est sélectionnée"))
  246. msgBox.exec_()
  247. else:
  248. for i in range(0, self.ui.listePions.rowCount()):
  249. if len(str(self.ui.listePions.item(i, self.colonnesBase.index("Des")).text().toUtf8())) > 0:
  250. valeur = int(self.ui.listePions.item(i, colonne).text().toUtf8())
  251. jet = None
  252. try:
  253. if source == "D" and cible != "D":
  254. jet = int(str(self.ui.listePions.item(i, self.colonnesBase.index("Des")).text().toUtf8()))
  255. elif source != cible:
  256. if self.ui.listePions.item(i, 0).isSelected():
  257. jet = int(str(self.ui.listePions.item(i, (20 + int(source))).text().toUtf8()))
  258. except:
  259. print("jet invalide")
  260. if jet != None:
  261. if self.ui.majValeurAjouter.isChecked():
  262. valeur += jet
  263. elif self.ui.majValeurRetirer.isChecked():
  264. valeur -= jet
  265. elif self.ui.majValeurRemplacer.isChecked():
  266. valeur = jet
  267. aMaj.append(i)
  268. self.ui.listePions.item(i, colonne).setText(QString.fromUtf8(str(valeur)))
  269. self.majEnCours = False
  270. for ligne in aMaj:
  271. self.celluleModifiee(ligne, colonne)
  272. self.ui.nomChampSourceMaj.setCurrentIndex(0)
  273. def afficherAide(self):
  274. pass
  275. def majFiltreHorsCombat(self):
  276. pass
  277. def majAffichageDetailDes(self):
  278. """affiche ou cache la colonne de detail des jets de des en fonction de l'etat de la case correspondante"""
  279. self.ui.listePions.setColumnHidden(self.colonnesBase.index("DetailDes"), (not self.ui.afficherDetailDes.isChecked()))
  280. def eventFilter(self, item, event):
  281. """filtre les evenements sur les widgets"""
  282. retour = False
  283. if item == self.ui.jetDes:
  284. if event.type() == QEvent.KeyPress:
  285. if event.key() == Qt.Key_Up:
  286. self.positionDansHistoJets += 1
  287. self.afficherJetHisto()
  288. retour = True
  289. elif event.key() == Qt.Key_Down:
  290. self.positionDansHistoJets -= 1
  291. self.afficherJetHisto()
  292. retour = True
  293. return retour