EcranGestionCombat.py 17 KB

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