|
@@ -1,14 +1,9 @@
|
|
|
#from __future__ import unicode_literals
|
|
#from __future__ import unicode_literals
|
|
|
# -*- coding: utf-8 -*-
|
|
# -*- coding: utf-8 -*-
|
|
|
from __future__ import division
|
|
from __future__ import division
|
|
|
-import os
|
|
|
|
|
-from sys import exit, argv, getsizeof, settrace
|
|
|
|
|
-from time import time, sleep, strftime, localtime
|
|
|
|
|
-from threading import Thread
|
|
|
|
|
|
|
|
|
|
from PyQt4.QtCore import *
|
|
from PyQt4.QtCore import *
|
|
|
from PyQt4.QtGui import *
|
|
from PyQt4.QtGui import *
|
|
|
-from PyQt4 import QtOpenGL
|
|
|
|
|
|
|
|
|
|
##from ui.ecran_editionAttaques import Ui_editionAttaques
|
|
##from ui.ecran_editionAttaques import Ui_editionAttaques
|
|
|
|
|
|
|
@@ -17,11 +12,9 @@ import Actions
|
|
|
from Case import Case
|
|
from Case import Case
|
|
|
from Combattant import Combattant
|
|
from Combattant import Combattant
|
|
|
from Decor import Decor
|
|
from Decor import Decor
|
|
|
-from Forme import Forme
|
|
|
|
|
from Pinceau import Pinceau
|
|
from Pinceau import Pinceau
|
|
|
from ProjectionDep import ProjectionDep
|
|
from ProjectionDep import ProjectionDep
|
|
|
from Cache import Cache
|
|
from Cache import Cache
|
|
|
-from EntreeSortie import EntreeSortie
|
|
|
|
|
from Terrain import Terrain
|
|
from Terrain import Terrain
|
|
|
|
|
|
|
|
from EcranEditionCombattant import EcranEditionCombattant
|
|
from EcranEditionCombattant import EcranEditionCombattant
|
|
@@ -34,11 +27,9 @@ from EcranVol import EcranVol
|
|
|
|
|
|
|
|
import regles as regles
|
|
import regles as regles
|
|
|
from outilsSvg import *
|
|
from outilsSvg import *
|
|
|
-from lancer import jet, estJetValide
|
|
|
|
|
import br
|
|
import br
|
|
|
|
|
|
|
|
-from operator import itemgetter, attrgetter
|
|
|
|
|
-from math import *
|
|
|
|
|
|
|
+from math import sqrt
|
|
|
|
|
|
|
|
m_couleursRapides = [(255,255,255), (200,200,200), (130,130,130), (90,90,90), (15,15,15), \
|
|
m_couleursRapides = [(255,255,255), (200,200,200), (130,130,130), (90,90,90), (15,15,15), \
|
|
|
(0,85,0), (170,255,0), (170,255,127), (85,85,0), (85,0,0), (170,85,0), (100,50,0), \
|
|
(0,85,0), (170,255,0), (170,255,127), (85,85,0), (85,0,0), (170,85,0), (100,50,0), \
|
|
@@ -177,7 +168,7 @@ class Plateau(QGraphicsScene):
|
|
|
img = QPixmap(1024, 768)
|
|
img = QPixmap(1024, 768)
|
|
|
img.fill(QColor("white"))
|
|
img.fill(QColor("white"))
|
|
|
peintre = QPainter(img)
|
|
peintre = QPainter(img)
|
|
|
- rendu = self.render(peintre)
|
|
|
|
|
|
|
+ self.render(peintre)
|
|
|
peintre.end()
|
|
peintre.end()
|
|
|
img.scaledToHeight(128, Qt.FastTransformation)
|
|
img.scaledToHeight(128, Qt.FastTransformation)
|
|
|
|
|
|
|
@@ -240,12 +231,13 @@ class Plateau(QGraphicsScene):
|
|
|
self.fenetre.connect(self.fenetre.ui.cp_formeRectPlein, SIGNAL("clicked()"), self.majModeForme, Qt.UniqueConnection)
|
|
self.fenetre.connect(self.fenetre.ui.cp_formeRectPlein, SIGNAL("clicked()"), self.majModeForme, Qt.UniqueConnection)
|
|
|
|
|
|
|
|
self.fenetre.connect(self.fenetre.ui.pi_deplacement, SIGNAL("clicked()"), self.majModeCombatDeplacement, Qt.UniqueConnection)
|
|
self.fenetre.connect(self.fenetre.ui.pi_deplacement, SIGNAL("clicked()"), self.majModeCombatDeplacement, Qt.UniqueConnection)
|
|
|
|
|
+ self.fenetre.connect(self.fenetre.ui.pi_vol, SIGNAL("clicked()"), self.majModeCombatVol, Qt.UniqueConnection)
|
|
|
self.fenetre.connect(self.fenetre.ui.pi_attaqueCac, SIGNAL("clicked()"), self.majModeCombatAttaqueCaC, Qt.UniqueConnection)
|
|
self.fenetre.connect(self.fenetre.ui.pi_attaqueCac, SIGNAL("clicked()"), self.majModeCombatAttaqueCaC, Qt.UniqueConnection)
|
|
|
self.fenetre.connect(self.fenetre.ui.pi_attaqueDist, SIGNAL("clicked()"), self.majModeCombatAttaqueDist, Qt.UniqueConnection)
|
|
self.fenetre.connect(self.fenetre.ui.pi_attaqueDist, SIGNAL("clicked()"), self.majModeCombatAttaqueDist, Qt.UniqueConnection)
|
|
|
self.fenetre.connect(self.fenetre.ui.pi_attaqueZone, SIGNAL("clicked()"), self.majModeCombatZone, Qt.UniqueConnection)
|
|
self.fenetre.connect(self.fenetre.ui.pi_attaqueZone, SIGNAL("clicked()"), self.majModeCombatZone, Qt.UniqueConnection)
|
|
|
self.fenetre.connect(self.fenetre.ui.pi_formeAttaqueZone, SIGNAL("activated (int)"), self.majModeCombatZone, Qt.UniqueConnection)
|
|
self.fenetre.connect(self.fenetre.ui.pi_formeAttaqueZone, SIGNAL("activated (int)"), self.majModeCombatZone, Qt.UniqueConnection)
|
|
|
self.fenetre.connect(self.fenetre.ui.pi_rayonAttaqueZone, SIGNAL("valueChanged(int)"), self.majRayonZone, Qt.UniqueConnection)
|
|
self.fenetre.connect(self.fenetre.ui.pi_rayonAttaqueZone, SIGNAL("valueChanged(int)"), self.majRayonZone, Qt.UniqueConnection)
|
|
|
-## self.fenetre.connect(self.fenetre.ui.pi_vol, SIGNAL("clicked()"), self.fenetre.barreCombatVol, Qt.UniqueConnection)
|
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
self.fenetre.connect(self.fenetre.ui.pi_finTour, SIGNAL("clicked()"), self.pionSuivant, Qt.UniqueConnection)
|
|
self.fenetre.connect(self.fenetre.ui.pi_finTour, SIGNAL("clicked()"), self.pionSuivant, Qt.UniqueConnection)
|
|
|
|
|
|
|
@@ -344,7 +336,7 @@ class Plateau(QGraphicsScene):
|
|
|
"""affiche les notes du plateau dans une QDialog, puis recupere les donnees qui y sont saisies"""
|
|
"""affiche les notes du plateau dans une QDialog, puis recupere les donnees qui y sont saisies"""
|
|
|
affichageTexte = EcranAffichageTexte(self.notes)
|
|
affichageTexte = EcranAffichageTexte(self.notes)
|
|
|
affichageTexte.setAttribute(Qt.WA_DeleteOnClose)
|
|
affichageTexte.setAttribute(Qt.WA_DeleteOnClose)
|
|
|
- r = affichageTexte.exec_()
|
|
|
|
|
|
|
+ affichageTexte.exec_()
|
|
|
self.notes = affichageTexte.recupererTexte()
|
|
self.notes = affichageTexte.recupererTexte()
|
|
|
|
|
|
|
|
##### affichage de la liste des terrains enregistres, et fonctions d'acces aux donnees""""
|
|
##### affichage de la liste des terrains enregistres, et fonctions d'acces aux donnees""""
|
|
@@ -656,6 +648,10 @@ class Plateau(QGraphicsScene):
|
|
|
"""active le mode de combat 'deplacement' (mode standard)"""
|
|
"""active le mode de combat 'deplacement' (mode standard)"""
|
|
|
self.modeActif.nouvelleAction(Actions.Deplacement)
|
|
self.modeActif.nouvelleAction(Actions.Deplacement)
|
|
|
|
|
|
|
|
|
|
+ def majModeCombatVol(self):
|
|
|
|
|
+ """active le mode de combat 'vol'"""
|
|
|
|
|
+ self.modeActif.nouvelleAction(Actions.Vol)
|
|
|
|
|
+
|
|
|
def majModeCombatAttaqueCaC(self):
|
|
def majModeCombatAttaqueCaC(self):
|
|
|
"""active le mode de combat 'corps-a-corps'"""
|
|
"""active le mode de combat 'corps-a-corps'"""
|
|
|
self.modeActif.nouvelleAction(Actions.Cac)
|
|
self.modeActif.nouvelleAction(Actions.Cac)
|
|
@@ -922,17 +918,6 @@ class Plateau(QGraphicsScene):
|
|
|
numAttaque = int(str(self.fenetre.ui.pi_listeAttaques.item(ligne, 0).text().toUtf8()))
|
|
numAttaque = int(str(self.fenetre.ui.pi_listeAttaques.item(ligne, 0).text().toUtf8()))
|
|
|
self.pionSelectionne().attaques[numAttaque].notes = str(self.fenetre.ui.pi_notesAttaqueEC.toPlainText().toUtf8())
|
|
self.pionSelectionne().attaques[numAttaque].notes = str(self.fenetre.ui.pi_notesAttaqueEC.toPlainText().toUtf8())
|
|
|
|
|
|
|
|
- def afficheEcranEditionAttaques(self):
|
|
|
|
|
- """affiche l'ecran d'edition/creation d'attaques"""
|
|
|
|
|
- if self.pionSelectionne() != None:
|
|
|
|
|
- self.editionAttaques = QDialog()
|
|
|
|
|
- frame = EcranEditionAttaques(self.pionSelectionne())
|
|
|
|
|
- frame.setParent(self.editionAttaques)
|
|
|
|
|
- self.editionAttaques.setAttribute(Qt.WA_DeleteOnClose)
|
|
|
|
|
- r = self.editionAttaques.exec_()
|
|
|
|
|
- del self.editionAttaques
|
|
|
|
|
- self.majListeAttaques()
|
|
|
|
|
-
|
|
|
|
|
def majNotesCombattant(self):
|
|
def majNotesCombattant(self):
|
|
|
"""les notes du pion ont ete mises a jour"""
|
|
"""les notes du pion ont ete mises a jour"""
|
|
|
if self.pionSelectionne() != None:
|
|
if self.pionSelectionne() != None:
|
|
@@ -966,40 +951,37 @@ class Plateau(QGraphicsScene):
|
|
|
else:
|
|
else:
|
|
|
voisins = [(x, y-1), (x+1, y-1), (x+1, y), (x, y+1), (x-1, y), (x-1, y-1)]
|
|
voisins = [(x, y-1), (x+1, y-1), (x+1, y), (x, y+1), (x-1, y), (x-1, y-1)]
|
|
|
else:
|
|
else:
|
|
|
-## voisins = [(x, y-1), (x+1, y-1), (x+1, y), (x+1, y+1), (x, y+1), (x-1, y+1), (x-1, y), (x-1, y-1)]
|
|
|
|
|
voisins = [(x, y-1), (x+1, y), (x, y+1), (x-1, y)]
|
|
voisins = [(x, y-1), (x+1, y), (x, y+1), (x-1, y)]
|
|
|
return voisins
|
|
return voisins
|
|
|
|
|
|
|
|
- def zone(self, origine, distance, z=0, conditionFranchissable = False, conditionVisible = False):
|
|
|
|
|
|
|
+ def zone(self, origine, rayon, z=0, conditionFranchissable = False, conditionVisible = False):
|
|
|
"""renvoie un dictionnaire representant la liste des coordonnees des cases comprises dans la zone
|
|
"""renvoie un dictionnaire representant la liste des coordonnees des cases comprises dans la zone
|
|
|
la zone en question est la liste des cases situees a une distance d des coordonnees d'origine
|
|
la zone en question est la liste des cases situees a une distance d des coordonnees d'origine
|
|
|
z = 0 -> hauteur z de l'origine par rapport a l'altitude de la case
|
|
z = 0 -> hauteur z de l'origine par rapport a l'altitude de la case
|
|
|
conditionFranchissable = Vrai -> les cases infranchissables ne sont pas prises en compte
|
|
conditionFranchissable = Vrai -> les cases infranchissables ne sont pas prises en compte
|
|
|
- conditionVisible = Vrai -> les cases bloquant la visibilite ne sont pas prises en compte
|
|
|
|
|
- [cf methode A* (A-star)]"""
|
|
|
|
|
-
|
|
|
|
|
|
|
+ conditionVisible = Vrai -> les cases bloquant la visibilite ne sont pas prises en compte"""
|
|
|
aVerifier = []
|
|
aVerifier = []
|
|
|
aVerifier2 = []
|
|
aVerifier2 = []
|
|
|
resultat = {}
|
|
resultat = {}
|
|
|
- k = 0
|
|
|
|
|
- #on part de la premiere case, puis on itere a partir de chaque nouveau depart
|
|
|
|
|
|
|
+ k = 0
|
|
|
|
|
+ #on part de la premiere case, puis on itere a partir de chaque nouveau depart sur les voisins
|
|
|
if origine in self.cases:
|
|
if origine in self.cases:
|
|
|
aVerifier.append(origine)
|
|
aVerifier.append(origine)
|
|
|
- while k <= distance:
|
|
|
|
|
|
|
+ while k <= rayon:
|
|
|
for depart in aVerifier:
|
|
for depart in aVerifier:
|
|
|
for coord in self.cases[depart].voisins:
|
|
for coord in self.cases[depart].voisins:
|
|
|
- if not coord in aVerifier and not coord in aVerifier2 and not coord in resultat:
|
|
|
|
|
- if conditionFranchissable and not conditionVisible:
|
|
|
|
|
- if self.cases[coord].estFranchissable(z):
|
|
|
|
|
- aVerifier2.append(coord)
|
|
|
|
|
- elif not conditionFranchissable and conditionVisible:
|
|
|
|
|
- if self.cases[coord].terrain.visibilite:
|
|
|
|
|
- aVerifier2.append(coord)
|
|
|
|
|
- elif conditionFranchissable and conditionVisible:
|
|
|
|
|
- if self.cases[coord].estFranchissable(z) and self.cases[coord].terrain.visibilite:
|
|
|
|
|
- aVerifier2.append(coord)
|
|
|
|
|
- else:
|
|
|
|
|
- aVerifier2.append(coord)
|
|
|
|
|
|
|
+ if not coord in aVerifier and not coord in aVerifier2 and not coord in resultat:
|
|
|
|
|
+ if conditionFranchissable and not conditionVisible:
|
|
|
|
|
+ if self.cases[coord].estFranchissable(z):
|
|
|
|
|
+ aVerifier2.append(coord)
|
|
|
|
|
+ elif not conditionFranchissable and conditionVisible:
|
|
|
|
|
+ if self.cases[coord].terrain.visibilite:
|
|
|
|
|
+ aVerifier2.append(coord)
|
|
|
|
|
+ elif conditionFranchissable and conditionVisible:
|
|
|
|
|
+ if self.cases[coord].estFranchissable(z) and self.cases[coord].terrain.visibilite:
|
|
|
|
|
+ aVerifier2.append(coord)
|
|
|
|
|
+ else:
|
|
|
|
|
+ aVerifier2.append(coord)
|
|
|
for elt in aVerifier:
|
|
for elt in aVerifier:
|
|
|
resultat[elt] = k
|
|
resultat[elt] = k
|
|
|
aVerifier = aVerifier2
|
|
aVerifier = aVerifier2
|
|
@@ -1008,39 +990,16 @@ class Plateau(QGraphicsScene):
|
|
|
|
|
|
|
|
return resultat
|
|
return resultat
|
|
|
|
|
|
|
|
-# def casesEntre(self, coord1, coord2):
|
|
|
|
|
-# """renvoie la liste des cases qui composent le chemin le plus direct
|
|
|
|
|
-# entre les 2 cases en parametre"""
|
|
|
|
|
-# #on determine le secteur et on calcule l'angle du chemin
|
|
|
|
|
-# if coord2[0] != coord1[0]:
|
|
|
|
|
-# if coord2[0] > coord1[0] and coord2[1] <= coord1[1] #0 a 3h
|
|
|
|
|
-# secteur = 1
|
|
|
|
|
-# elif coord2[0] > coord1[0] and coord2[1] > coord1[1] #3 a 6h
|
|
|
|
|
-# secteur = 2
|
|
|
|
|
-# elif coord2[0] < coord1[0] and coord2[1] >= coord1[1] #6 a 9h
|
|
|
|
|
-# secteur = 3
|
|
|
|
|
-# elif coord2[0] < coord1[0] and coord2[1] < coord1[1] #9 a 12h
|
|
|
|
|
-# secteur = 4
|
|
|
|
|
-# angle = (coord2[1] - coord1[1]) / (coord2[0] - coord1[0])
|
|
|
|
|
-# else:
|
|
|
|
|
-# s = 0
|
|
|
|
|
-# angle = 1
|
|
|
|
|
-#
|
|
|
|
|
-# #on preselectionne les cases concernees
|
|
|
|
|
-# preselect = []
|
|
|
|
|
-# xmin = mini(coord1[0], coord2[0]); xmax = maxi(coord1[0], coord2[0])
|
|
|
|
|
-# ymin = mini(coord1[1], coord2[1]); ymax = maxi(coord1[1], coord2[1])
|
|
|
|
|
-# for coord in self.cases:
|
|
|
|
|
-# if xmin <= coord[0] <= xmax and ymin <= coord[1] <= ymax:
|
|
|
|
|
-# preselect.append()
|
|
|
|
|
-#
|
|
|
|
|
-# #on progresse de case en case en avancant selon l'angle
|
|
|
|
|
-# coordTest = coord1
|
|
|
|
|
-# while coordTest != coord2:
|
|
|
|
|
-# for coord in preselect:
|
|
|
|
|
-# pass
|
|
|
|
|
-#
|
|
|
|
|
-
|
|
|
|
|
|
|
+ def zone3d(self, origine, rayon, zCible=0):
|
|
|
|
|
+ """renvoie les cases de la zone au format (x, y, z)"""
|
|
|
|
|
+ retour = []
|
|
|
|
|
+ zone = self.zone(origine, rayon)
|
|
|
|
|
+ for coord in zone:
|
|
|
|
|
+ x, y = coord
|
|
|
|
|
+ dz = rayon - zone[coord]
|
|
|
|
|
+ for z in range(-dz, dz + 1):
|
|
|
|
|
+ retour.append( (x, y, (zCible+z) ) )
|
|
|
|
|
+ return retour
|
|
|
|
|
|
|
|
def polygoneAgglo(self, listeCases):
|
|
def polygoneAgglo(self, listeCases):
|
|
|
"""renvoie un polygone contruit par agglomeration des polygones des cases de la liste
|
|
"""renvoie un polygone contruit par agglomeration des polygones des cases de la liste
|
|
@@ -1065,10 +1024,10 @@ class Plateau(QGraphicsScene):
|
|
|
|
|
|
|
|
for i in range(0, len(voisins)):
|
|
for i in range(0, len(voisins)):
|
|
|
if not voisins[i] in listeCases:
|
|
if not voisins[i] in listeCases:
|
|
|
- j = i+1
|
|
|
|
|
- if j > len(voisins) - 1:
|
|
|
|
|
- j = 0
|
|
|
|
|
- segments.append(QLineF(polygone[i], polygone[j]))
|
|
|
|
|
|
|
+ j = i+1
|
|
|
|
|
+ if j > len(voisins) - 1:
|
|
|
|
|
+ j = 0
|
|
|
|
|
+ segments.append(QLineF(polygone[i], polygone[j]))
|
|
|
|
|
|
|
|
#on 'accroche' les segments les uns aux autres, dans l'ordre
|
|
#on 'accroche' les segments les uns aux autres, dans l'ordre
|
|
|
segments2 = [segments[0]]
|
|
segments2 = [segments[0]]
|
|
@@ -1086,7 +1045,7 @@ class Plateau(QGraphicsScene):
|
|
|
for segment in segments2:
|
|
for segment in segments2:
|
|
|
pointSuivant = segment.p2()
|
|
pointSuivant = segment.p2()
|
|
|
if pointSuivant != premierPoint:
|
|
if pointSuivant != premierPoint:
|
|
|
- pointsPolygone.append(pointSuivant)
|
|
|
|
|
|
|
+ pointsPolygone.append(pointSuivant)
|
|
|
|
|
|
|
|
#creation du polygone
|
|
#creation du polygone
|
|
|
polygone = QPolygonF()
|
|
polygone = QPolygonF()
|
|
@@ -1157,7 +1116,7 @@ class Plateau(QGraphicsScene):
|
|
|
contenu = False
|
|
contenu = False
|
|
|
break
|
|
break
|
|
|
if contenu == False:
|
|
if contenu == False:
|
|
|
- tmp.append(coord)
|
|
|
|
|
|
|
+ tmp.append(coord)
|
|
|
#on applique l'epaisseur du pinceau (lignes ou formes vides seulement) si necessaire
|
|
#on applique l'epaisseur du pinceau (lignes ou formes vides seulement) si necessaire
|
|
|
if not plein and epaisseur > 0:
|
|
if not plein and epaisseur > 0:
|
|
|
for coord in tmp:
|
|
for coord in tmp:
|
|
@@ -1190,22 +1149,46 @@ class Plateau(QGraphicsScene):
|
|
|
preSelection = self.cases
|
|
preSelection = self.cases
|
|
|
return preSelection
|
|
return preSelection
|
|
|
|
|
|
|
|
|
|
+ def listeZCible(self, coord):
|
|
|
|
|
+ """retourne l'altitude absolue a prendre en compte en fonction de la case ciblee
|
|
|
|
|
+ c'est l'altitude la case si aucun pion n'occupe la case
|
|
|
|
|
+ c'est la liste des cases occupees en hauteur par le pion sinon
|
|
|
|
|
+ 'coord' est de la forme (x, y)"""
|
|
|
|
|
+ if self.cases[coord].estOccupee():
|
|
|
|
|
+ retour = range(self.cases[coord].occupant().zAbs(), \
|
|
|
|
|
+ self.cases[coord].occupant().zAbs() + self.cases[coord].occupant().hauteur)
|
|
|
|
|
+ else:
|
|
|
|
|
+ retour = [self.cases[coord].altitude]
|
|
|
|
|
+ return retour
|
|
|
|
|
|
|
|
- def estCibleAttaqueDistValide(self, coordOrigine, coordCible):
|
|
|
|
|
- """la case cible est elle valide pour une attaque a distance depuis la position et hauteur
|
|
|
|
|
|
|
+ def estCibleAttaqueDistValide(self, coordCible):
|
|
|
|
|
+ """la case cible est elle valide pour une attaque a distance depuis la position et hauteur
|
|
|
du pion selectionne
|
|
du pion selectionne
|
|
|
- les coord sont de la forme (x, y, z)"""
|
|
|
|
|
- valide = True
|
|
|
|
|
- if coordOrigine[0] != coordCible[0] and coordOrigine[1] != coordCible[1]:
|
|
|
|
|
- casesLigneMire = br.ligne(coordOrigine, coordCible, self.formeCases)
|
|
|
|
|
- casesLigneMire.remove(coordOrigine)
|
|
|
|
|
- casesLigneMire.remove(coordCible)
|
|
|
|
|
- for coord in casesLigneMire:
|
|
|
|
|
- x, y, z = coord
|
|
|
|
|
- if self.cases[(x,y)].estOccupee(z):
|
|
|
|
|
- valide = False
|
|
|
|
|
|
|
+ les coord sont de la forme (x, y)"""
|
|
|
|
|
+ valide = False
|
|
|
|
|
+ x1, y1 = self.pionSelectionne().position
|
|
|
|
|
+ coordOrigine = (x1, y1, (self.pionSelectionne().zAbs() + self.pionSelectionne().hauteur))
|
|
|
|
|
+
|
|
|
|
|
+ x2, y2 = coordCible
|
|
|
|
|
+ cible = self.cases[coordCible].occupant()
|
|
|
|
|
+ listeZ2 = self.listeZCible(coordCible)
|
|
|
|
|
+ if coordOrigine[0] != coordCible[0] or coordOrigine[1] != coordCible[1]:
|
|
|
|
|
+ for z2 in listeZ2:
|
|
|
|
|
+ zValide = True
|
|
|
|
|
+ casesLigneMire = br.ligne(coordOrigine, (x2, y2, z2), self.formeCases)
|
|
|
|
|
+ casesLigneMire.remove(coordOrigine)
|
|
|
|
|
+ casesLigneMire.remove((x2, y2, z2))
|
|
|
|
|
+ for coord in casesLigneMire:
|
|
|
|
|
+ if zValide:
|
|
|
|
|
+ x, y, z = coord
|
|
|
|
|
+ if self.cases[(x,y)].estOccupee(z):
|
|
|
|
|
+ if self.cases[(x,y)].occupant(z) not in [self.pionSelectionne(), cible]:
|
|
|
|
|
+ zValide = False
|
|
|
|
|
+ if zValide:
|
|
|
|
|
+ valide = True #si au moins un des z cibles est valide, la ligne de mire est valide
|
|
|
break
|
|
break
|
|
|
- return valide
|
|
|
|
|
|
|
+
|
|
|
|
|
+ return valide
|
|
|
|
|
|
|
|
def pionSurCase(self, coord):
|
|
def pionSurCase(self, coord):
|
|
|
"""renvoie le pion present sur la case, none sinon"""
|
|
"""renvoie le pion present sur la case, none sinon"""
|
|
@@ -1219,7 +1202,7 @@ class Plateau(QGraphicsScene):
|
|
|
"""renvoie la liste des num des pions presents sur la liste de cases"""
|
|
"""renvoie la liste des num des pions presents sur la liste de cases"""
|
|
|
retour = []
|
|
retour = []
|
|
|
for coord in listeCases:
|
|
for coord in listeCases:
|
|
|
- pion = self.cases[coord].pionOccupant()
|
|
|
|
|
|
|
+ pion = self.cases[coord].occupant()
|
|
|
if pion != None and not pion.numero in retour:
|
|
if pion != None and not pion.numero in retour:
|
|
|
retour.append(pion.numero)
|
|
retour.append(pion.numero)
|
|
|
return retour
|
|
return retour
|
|
@@ -1287,7 +1270,6 @@ class Plateau(QGraphicsScene):
|
|
|
|
|
|
|
|
def pionClique(self, num):
|
|
def pionClique(self, num):
|
|
|
"""on a clique sur ce pion"""
|
|
"""on a clique sur ce pion"""
|
|
|
- accepte = False
|
|
|
|
|
if num < 10000:
|
|
if num < 10000:
|
|
|
self.modeActif.clic_combattant(num)
|
|
self.modeActif.clic_combattant(num)
|
|
|
else:
|
|
else:
|
|
@@ -1375,8 +1357,8 @@ class Plateau(QGraphicsScene):
|
|
|
pion = self.pionSelectionne()
|
|
pion = self.pionSelectionne()
|
|
|
|
|
|
|
|
if pion != None:
|
|
if pion != None:
|
|
|
- if self.proj.projectionValide():
|
|
|
|
|
- pion.majPosition(self.proj.coord(), self.proj.nbRotations())
|
|
|
|
|
|
|
+ if self.proj.projectionValide():
|
|
|
|
|
+ pion.majPosition(self.proj.coord(), self.proj.nbRotations())
|
|
|
|
|
|
|
|
def majZPion(self, valeur):
|
|
def majZPion(self, valeur):
|
|
|
"""met a jour l'altitude du pion selectionne"""
|
|
"""met a jour l'altitude du pion selectionne"""
|
|
@@ -1384,7 +1366,6 @@ class Plateau(QGraphicsScene):
|
|
|
self.pionSelectionne().majZ(valeur)
|
|
self.pionSelectionne().majZ(valeur)
|
|
|
|
|
|
|
|
def dialogueVol(self, actuelle):
|
|
def dialogueVol(self, actuelle):
|
|
|
- nouvelle = actuelle
|
|
|
|
|
ecran = EcranVol(actuelle)
|
|
ecran = EcranVol(actuelle)
|
|
|
ecran.exec_()
|
|
ecran.exec_()
|
|
|
nouvelle = ecran.resultat()
|
|
nouvelle = ecran.resultat()
|
|
@@ -1395,20 +1376,12 @@ class Plateau(QGraphicsScene):
|
|
|
"""supprime le pion entre en parametre"""
|
|
"""supprime le pion entre en parametre"""
|
|
|
#settrace(trace_calls)
|
|
#settrace(trace_calls)
|
|
|
if num in self.combattants:
|
|
if num in self.combattants:
|
|
|
- for coord in self.combattants[num].forme.listeCases(self.combattants[num].position, self.combattants[num].nbRotations):
|
|
|
|
|
- self.cases[coord].majOccupation(self.combattants[num])
|
|
|
|
|
self.pionDeplacerDansOrdreJeu(num, 0)
|
|
self.pionDeplacerDansOrdreJeu(num, 0)
|
|
|
pionSuppr = self.combattants.pop(num)
|
|
pionSuppr = self.combattants.pop(num)
|
|
|
- pionSuppr.retirerDuPlateau()
|
|
|
|
|
-
|
|
|
|
|
elif num in self.decors:
|
|
elif num in self.decors:
|
|
|
- for coord in self.decors[num].forme.listeCases(self.decors[num].position, self.decors[num].nbRotations):
|
|
|
|
|
- self.cases[coord].majOccupation(self.decors[num])
|
|
|
|
|
pionSuppr = self.decors.pop(num)
|
|
pionSuppr = self.decors.pop(num)
|
|
|
- pionSuppr.retirerDuPlateau()
|
|
|
|
|
|
|
|
|
|
- else:
|
|
|
|
|
- print("erreur: ce pion n'est pas dans la liste des pions")
|
|
|
|
|
|
|
+ pionSuppr.retirerDuPlateau()
|
|
|
|
|
|
|
|
###############
|
|
###############
|
|
|
|
|
|
|
@@ -1470,7 +1443,6 @@ class Plateau(QGraphicsScene):
|
|
|
def supprimerCache(self):
|
|
def supprimerCache(self):
|
|
|
ligne = self.fenetre.ui.cp_listeCaches.currentRow()
|
|
ligne = self.fenetre.ui.cp_listeCaches.currentRow()
|
|
|
idCache = int(self.fenetre.ui.cp_listeCaches.texte(ligne, 0))
|
|
idCache = int(self.fenetre.ui.cp_listeCaches.texte(ligne, 0))
|
|
|
- nouveauNom = self.fenetre.ui.cp_listeCaches.texte(ligne, 1)
|
|
|
|
|
for coord in self.cases:
|
|
for coord in self.cases:
|
|
|
self.cases[coord].supprimerCache(idCache)
|
|
self.cases[coord].supprimerCache(idCache)
|
|
|
self.fenetre.ui.cp_listeCaches.removeRow(idCache)
|
|
self.fenetre.ui.cp_listeCaches.removeRow(idCache)
|
|
@@ -1530,7 +1502,6 @@ class Plateau(QGraphicsScene):
|
|
|
|
|
|
|
|
def keyPressEvent(self, event):
|
|
def keyPressEvent(self, event):
|
|
|
"""gestion des evenements clavier"""
|
|
"""gestion des evenements clavier"""
|
|
|
- toucheClavier = event.key()
|
|
|
|
|
self.modeActif.toucheClavier(event)
|
|
self.modeActif.toucheClavier(event)
|
|
|
|
|
|
|
|
################
|
|
################
|