|
|
@@ -1,38 +1,36 @@
|
|
|
#from __future__ import unicode_literals
|
|
|
# -*- coding: utf-8 -*-
|
|
|
+from PyQt4.QtCore import *
|
|
|
+from PyQt4.QtGui import *
|
|
|
import regles
|
|
|
import AEtoile
|
|
|
|
|
|
-class Action():
|
|
|
+class Action(object):
|
|
|
"""action effectuee par un combattant sur le plateau de jeu"""
|
|
|
def __init__(self):
|
|
|
self._num = None #no du pion actif
|
|
|
self._coordCible = None #coord de la case ciblee par le curseur
|
|
|
self._cible = None #cible (case ou pion)
|
|
|
|
|
|
-
|
|
|
- def activer(self, plateau):
|
|
|
+ def activer(self, plateau, numPion):
|
|
|
self.plateau = plateau
|
|
|
+ self._num = numPion
|
|
|
self.creerItemsGraphiques()
|
|
|
|
|
|
def majCoordCible(self, coord):
|
|
|
"""met a jour les coordonnees de la cible,
|
|
|
cad la case actuellement survolee par la souris"""
|
|
|
- if self.plateau.estCoordonneeValide(coord):
|
|
|
+ if self.plateau.coordonneesValides(coord):
|
|
|
self._coordCible = coord
|
|
|
self.maj()
|
|
|
|
|
|
-## def majCible(self, item):
|
|
|
-## """met a jour la cible,
|
|
|
-## (item actuellement actuellement survole par la souris)"""
|
|
|
-## self._cible = item
|
|
|
-## self.maj()
|
|
|
-
|
|
|
def desactiver(self):
|
|
|
+ self.afficherCibles(False)
|
|
|
self.detruireItemsGraphiques()
|
|
|
|
|
|
def valider(self):
|
|
|
#envoyer signal
|
|
|
+ self.envoiSignal()
|
|
|
self.desactiver()
|
|
|
|
|
|
def estValide(self):
|
|
|
@@ -64,26 +62,29 @@ class Action():
|
|
|
def afficherCibles(self, actif):
|
|
|
pass
|
|
|
|
|
|
+ #envoi du signal en cas de validation
|
|
|
+ def envoiSignal(self):
|
|
|
+ pass
|
|
|
|
|
|
class Deplacement(Action):
|
|
|
### a completer avec des icones de deplacement,
|
|
|
#la prise en compte de la nage et de l'escalade
|
|
|
#et le calcul du cout de deplacement
|
|
|
def __init__(self):
|
|
|
- super(Deplacement, self).__init__(self)
|
|
|
+ super(Deplacement, self).__init__()
|
|
|
self._chemin = [] #liste des coord des cases a traverser
|
|
|
self._cout = 0 #cout en points de dep
|
|
|
|
|
|
- def activer(self, plateau):
|
|
|
- super(Deplacement, self).activer(self, plateau)
|
|
|
+ def valider(self):
|
|
|
+ if self.estValide():
|
|
|
+ super(Deplacement, self).valider()
|
|
|
|
|
|
- def desactiver(self):
|
|
|
- self.afficherCibles(False)
|
|
|
- super(Deplacement, self).desactiver(self)
|
|
|
+ def estValide(self):
|
|
|
+ return len(self._chemin)>0
|
|
|
|
|
|
def majCoordCible(self, coord):
|
|
|
if coord != self.coordActeur():
|
|
|
- super(Deplacement, self).majCoordCible(self, coord)
|
|
|
+ super(Deplacement, self).majCoordCible(coord)
|
|
|
|
|
|
def maj(self):
|
|
|
self.afficherCibles(False)
|
|
|
@@ -100,12 +101,17 @@ class Deplacement(Action):
|
|
|
def afficherCibles(self, actif):
|
|
|
for coord in self._chemin:
|
|
|
self.plateau.cases[coord].majEstDansChampDeplacement(actif)
|
|
|
-
|
|
|
+
|
|
|
+ def envoiSignal(self):
|
|
|
+ coutDep = 0
|
|
|
+ for coord in self._chemin:
|
|
|
+ cout += self.plateau.cases[coord].coutDep()
|
|
|
+ print "{} s'est deplacé et a utilisé {} points de mouvement".format(self.acteur().txtId(), cout)
|
|
|
|
|
|
class Attaque(Action):
|
|
|
"""attaque pre-parametree affectee a un pion, un personnage ou une creature"""
|
|
|
def __init__(self):
|
|
|
- super(Attaque, self).__init__(self)
|
|
|
+ super(Attaque, self).__init__()
|
|
|
self.nom = "Attaque"
|
|
|
self.portee = 1 #portee max en cases
|
|
|
self.attributs = regles.listeAttributsAttaques()
|
|
|
@@ -116,20 +122,21 @@ class Attaque(Action):
|
|
|
class Cac(Attaque):
|
|
|
"""attaque au corps a corps"""
|
|
|
def __init__(self):
|
|
|
- super(Cac, self).__init__(self)
|
|
|
+ super(Cac, self).__init__()
|
|
|
self.nom = "Attaque au corps-à-corps"
|
|
|
self._pionCible = None
|
|
|
|
|
|
- def activer(self, plateau):
|
|
|
- super(Deplacement, self).activer(self, plateau)
|
|
|
-
|
|
|
def desactiver(self):
|
|
|
self.afficherCibles(False)
|
|
|
- super(Deplacement, self).desactiver(self)
|
|
|
+ super(Deplacement, self).desactiver()
|
|
|
+
|
|
|
+ def valider(self):
|
|
|
+ if self.estValide() and self._pionCible:
|
|
|
+ super(Cac, self).valider()
|
|
|
|
|
|
def maj(self):
|
|
|
self.afficherCibles(False)
|
|
|
- pionCible = self_plateau.cases[self._coordCible].pionOccupant()
|
|
|
+ pionCible = self.plateau.cases[self._coordCible].pionOccupant()
|
|
|
if pionCible != None and pionCible != self._plateau.pionSelectionne():
|
|
|
self._pionCible = pionCible
|
|
|
else:
|
|
|
@@ -143,34 +150,32 @@ class Cac(Attaque):
|
|
|
if self._pionCible:
|
|
|
self._pionCible.estCibleAttaque(actif, self.estValide())
|
|
|
|
|
|
+ def envoiSignal(self):
|
|
|
+ print "{} a attaqué {} au corps-à-corps".format(self.acteur().txtId(), self._pionCible.txtId())
|
|
|
|
|
|
class Distance(Attaque):
|
|
|
"""attaque a distance"""
|
|
|
def __init__(self):
|
|
|
- super(Distance, self).__init__(self)
|
|
|
+ super(Distance, self).__init__()
|
|
|
self.nom = "Attaque à distance"
|
|
|
self._itemLigne = None
|
|
|
self._pionCible = None
|
|
|
|
|
|
- def activer(self, plateau):
|
|
|
- #creation de la ligne de mire
|
|
|
- super(Distance, self).activer(self, plateau)
|
|
|
-
|
|
|
def majCoordCible(self, coord):
|
|
|
if self._pionCible:
|
|
|
self._pionCible.estCibleAttaque(False, self.estValide())
|
|
|
if self._coordCible in self.plateau.cases:
|
|
|
self.plateau.cases[self._coordCible].majEstCibleCurseur(False)
|
|
|
- super(Distance, self).majCoord(self, coord)
|
|
|
-
|
|
|
- def desactiver(self):
|
|
|
- super(Distance, self).desactiver(self)
|
|
|
+ super(Distance, self).majCoordCible(coord)
|
|
|
+
|
|
|
+ def valider(self):
|
|
|
+ if self.estValide() and self._pionCible:
|
|
|
+ super(Distance, self).valider()
|
|
|
|
|
|
-
|
|
|
def maj(self):
|
|
|
"""met a jour la ligne de mire representant l'attaque a distance"""
|
|
|
self.afficherCibles(False)
|
|
|
- pionCible = self_plateau.cases[self._coordCible].pionOccupant()
|
|
|
+ pionCible = self.plateau.cases[self._coordCible].pionOccupant()
|
|
|
|
|
|
self.majItemsGraphiques()
|
|
|
if pionCible != None and pionCible != self._plateau.pionSelectionne():
|
|
|
@@ -188,7 +193,7 @@ class Distance(Attaque):
|
|
|
self._pionCible.estCibleAttaque(actif, self.estValide())
|
|
|
else:
|
|
|
#si pas de pion vise, on affiche la case cible comme visee
|
|
|
- self.plateau.cases[self._coordCible].majEstCibleCurseur(True, self.estValide())
|
|
|
+ self.plateau.cases[self._coordCible].majEstCibleCurseur(actif, self.estValide())
|
|
|
|
|
|
def creerItemsGraphiques(self):
|
|
|
self._itemLigne = QGraphicsLineItem()
|
|
|
@@ -206,19 +211,30 @@ class Distance(Attaque):
|
|
|
def detruireItemsGraphiques(self):
|
|
|
if self._itemLigne != None:
|
|
|
self._itemLigne.prepareGeometryChange()
|
|
|
- self.removeItem(self._itemLigne)
|
|
|
+ self.plateau.removeItem(self._itemLigne)
|
|
|
self._itemLigne = None
|
|
|
|
|
|
+ def envoiSignal(self):
|
|
|
+ print "{} a attaqué {} a distance".format(self.acteur().txtId(), self._pionCible.txtId())
|
|
|
+
|
|
|
|
|
|
class Zone(Attaque):
|
|
|
"""attaque de zone de base"""
|
|
|
def __init__(self):
|
|
|
- super(Zone, self).__init__(self)
|
|
|
+ super(Zone, self).__init__()
|
|
|
self.nom = "Attaque de zone"
|
|
|
self._itemLigne = None
|
|
|
self._itemCible = None
|
|
|
self._casesCibles = []
|
|
|
|
|
|
+ def valider(self):
|
|
|
+ if self.estValide() and len(self._casesCibles) > 0:
|
|
|
+ super(Zone, self).valider()
|
|
|
+
|
|
|
+ def desactiver(self):
|
|
|
+ self.afficherCibles(False)
|
|
|
+ self.detruireItemsGraphiques()
|
|
|
+
|
|
|
def maj(self):
|
|
|
"""maj la forme de l'attaque de zone et les items cibles"""
|
|
|
self.afficherCibles(False)
|
|
|
@@ -257,20 +273,25 @@ class Zone(Attaque):
|
|
|
def detruireItemsGraphiques(self):
|
|
|
if self._itemCible != None:
|
|
|
self._itemCible.prepareGeometryChange()
|
|
|
- self.removeItem(self._itemCible)
|
|
|
+ self.plateau.removeItem(self._itemCible)
|
|
|
self._itemCible = None
|
|
|
|
|
|
if self._itemLigne != None:
|
|
|
self._itemLigne.prepareGeometryChange()
|
|
|
- self.removeItem(self._itemLigne)
|
|
|
+ self.plateau.removeItem(self._itemLigne)
|
|
|
self._itemLigne = None
|
|
|
|
|
|
-
|
|
|
+ def envoiSignal(self):
|
|
|
+ touches = ""
|
|
|
+ for pion in self.plateau.pionsSurListeCase(self._casesCibles):
|
|
|
+ touches += "{}, ".format(pion.txtId())
|
|
|
+ touches = touches[:-2]
|
|
|
+ print "{} a lancé une attaque de zone. Les pions suivants sont touches: \n {}".format(self.acteur().txtId(), touches)
|
|
|
|
|
|
class Ligne(Attaque):
|
|
|
"""attaque de zone de forme lineaire"""
|
|
|
def __init__(self):
|
|
|
- super(Ligne, self).__init__(self)
|
|
|
+ super(Ligne, self).__init__()
|
|
|
self.nom = "Attaque de zone: ligne"
|
|
|
|
|
|
def majItemsGraphiques(self):
|
|
|
@@ -281,7 +302,7 @@ class Ligne(Attaque):
|
|
|
class Disque(Attaque):
|
|
|
"""attaque de zone de forme circulaire"""
|
|
|
def __init__(self):
|
|
|
- super(Disque, self).__init__(self)
|
|
|
+ super(Disque, self).__init__()
|
|
|
self.nom = "Attaque de zone: disque"
|
|
|
self.rayon = 1
|
|
|
|
|
|
@@ -289,7 +310,7 @@ class Disque(Attaque):
|
|
|
self._casesCibles = self.plateau.zone(self._coordCible, self.rayon, 0)
|
|
|
|
|
|
def afficherCibles(self, actif):
|
|
|
- super(Disque, self).afficherCibles(self, actif)
|
|
|
+ super(Disque, self).afficherCibles(actif)
|
|
|
#si on affiche une attaque invalide
|
|
|
if actif and not self.estValide():
|
|
|
self.plateau.cases[self._coordCible].majEstCibleCurseur(True, False)
|
|
|
@@ -321,7 +342,7 @@ class Disque(Attaque):
|
|
|
class Cone(Attaque):
|
|
|
"""attaque de zone de forme conique"""
|
|
|
def __init__(self):
|
|
|
- super(Cone, self).__init__(self)
|
|
|
+ super(Cone, self).__init__()
|
|
|
self.nom = "Attaque de zone: cône"
|
|
|
|
|
|
def creerItemsGraphiques(self):
|