Combattant.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #from __future__ import unicode_literals
  2. # -*- coding: utf-8 -*-
  3. from Pion import Pion
  4. import regles
  5. from mat import Materiel
  6. class Combattant(Pion, Materiel):
  7. """combattant sur un plateau de combat"""
  8. def __init__(self, parent=None):
  9. super(Combattant, self).__init__()
  10. self._type = "cb"
  11. self.taille = 2
  12. self.depMarche = regles.valeurDefaut("depMarche")
  13. self.depNage = regles.valeurDefaut("depNage")
  14. self.depEscalade = regles.valeurDefaut("depEscalade")
  15. self.depVol = regles.valeurDefaut("depVol")
  16. self.saut = regles.valeurDefaut("saut")
  17. self.enVol = False #mode vol active?
  18. self.attaques = [] #liste des attaques pre-parametrees du pion
  19. self.listeAttributs = regles.listeAttributs()
  20. self.inventaire = []
  21. self.details = {}
  22. self.notes = ""
  23. #caracs liees au combat:
  24. self.deplacementRestant = 0
  25. def ajouterAuPlateau(self, plateau):
  26. # self.plateau = plateau
  27. super(Combattant, self).ajouterAuPlateau(plateau)
  28. self.majEtiquette()
  29. def projectionValide(self, proj):
  30. if not super(Combattant, self).projectionValide(proj): return False
  31. #on ajoute des criteres de validite supplementaires lies aux combattants
  32. lst = proj.listeCases()
  33. lstH = []
  34. for case in lst:
  35. lstH.append(case.z1())
  36. #4- si le pion vole, c'est ok ici:
  37. if self.enVol: return True
  38. #5- sinon, selon possibilites de deplacement au sol du pion
  39. if not case.terrain.franchissable: return False
  40. if case.terrain.nage:
  41. if not self.depNage > 0: return False
  42. else:
  43. if not self.depMarche > 0: return False
  44. #fin: la difference de hauteur entre les cases n'excede pas la hauteur du pion -1
  45. if (max(lstH) - min(lstH)) > (self.h - 1): return False
  46. return True
  47. def pM(self):
  48. """les points de mouvement"""
  49. return max([self.depMarche, self.depNage, self.depEscalade, self.depVol])
  50. def coutDep(self, typeDep, dist = 1):
  51. """renvoie le cout en PM pour effectuer ce deplacement"""
  52. if not typeDep in self.__dict__: return 1
  53. dep = self.__dict__[typeDep] if typeDep in self.__dict__ else 0
  54. if dep > 0:
  55. cout = self.pM() / dep
  56. return dist * cout
  57. else:
  58. return -1
  59. def listeAttaques(self):
  60. return self.attaques
  61. def estCache(self):
  62. """met a jour le combattant selon qu'il soit cache ou non"""
  63. for x, y in self.coordOccupees():
  64. if not self.plateau.cases[(x, y)].estCachee(): return False
  65. return True
  66. def hoverEnterEvent(self, event):
  67. """evenement lors du survol de la souris (en entree)"""
  68. self.plateau.survol_combattant(self.numero)
  69. # event.ignore()
  70. def hoverLeaveEvent(self, event):
  71. """evenement lors du survol de la souris (en entree)"""
  72. self.plateau.finSurvol_combattant(self.numero)
  73. def mousePressEvent(self, event):
  74. """evenement lors du clic souris"""
  75. super(Pion, self).mousePressEvent(event)
  76. if event.button() == 1: #sur clic gauche
  77. accepte = self.plateau.clic_combattant(self.numero)
  78. if accepte: event.accept()
  79. else:
  80. event.ignore()
  81. def mouseDoubleClickEvent(self, event):
  82. """evenement lors du clic souris"""
  83. super(Pion, self).mouseDoubleClickEvent(event)
  84. if event.button() == 1: #sur clic gauche
  85. accepte = self.plateau.doubleClic_combattant(self.numero)
  86. if accepte: event.accept()
  87. else:
  88. event.ignore()
  89. class PJ(Combattant):
  90. def __init__(self):
  91. super(PJ, self).__init__()
  92. self._type = "pj"
  93. self.creePar = ""