|
|
@@ -29,10 +29,12 @@ from ProjectionDep import ProjectionDep
|
|
|
from Terrain import Terrain
|
|
|
import br
|
|
|
from lib.commun import rep, charger
|
|
|
+from lib.gC import GestionCombat
|
|
|
from lib.gM import GestionMateriel
|
|
|
from lib.mat import Materiel, chargerMat
|
|
|
from outilsSvg import chargerUnique
|
|
|
import regles as regles
|
|
|
+from lib.ListePions import ListePions
|
|
|
|
|
|
|
|
|
m_couleursRapides = [(255,255,255), (200,200,200), (130,130,130), (90,90,90), (15,15,15), \
|
|
|
@@ -49,7 +51,7 @@ class Plateau(QGraphicsScene, Materiel):
|
|
|
|
|
|
##partie et infos plateau
|
|
|
self.chapitre = 0
|
|
|
- self.tour = 0
|
|
|
+ self.creePar = ""
|
|
|
|
|
|
self.enCours = False
|
|
|
self.public = False
|
|
|
@@ -69,9 +71,9 @@ class Plateau(QGraphicsScene, Materiel):
|
|
|
#objets
|
|
|
self.pinceau = Pinceau(self)
|
|
|
self.gM = GestionMateriel()
|
|
|
+ self.gC = GestionCombat()
|
|
|
self.cases = {} #dict des cases du plateau (coordonnées: case)
|
|
|
- self.combattants = {} #liste de combattants positionnes sur le plateau
|
|
|
- self.decors = {} #liste des decors places sur le plateau
|
|
|
+ self.pions = ListePions()
|
|
|
self.caches = {}
|
|
|
self.listeCasesZonePlacement = []
|
|
|
self.polygoneZonePlacement = None
|
|
|
@@ -80,7 +82,11 @@ class Plateau(QGraphicsScene, Materiel):
|
|
|
#infos combat
|
|
|
self.numCombattantEnCours = 0
|
|
|
self.ordreJeu = {} #numero du pion: ordre de jeu
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+ def estCreateur(self):
|
|
|
+ """retourne vrai si l'utilisateur en cours est le createur du plateau"""
|
|
|
+ return (self.fenetre.util == self.creePar)
|
|
|
|
|
|
def __getstate__(self):
|
|
|
self.dateSvg = time()
|
|
|
@@ -96,9 +102,19 @@ class Plateau(QGraphicsScene, Materiel):
|
|
|
def vue(self):
|
|
|
return self.fenetre.ui.cbt_vue
|
|
|
|
|
|
+ def combattants(self):
|
|
|
+ return self.pions.combattants()
|
|
|
+
|
|
|
+ def combattantsVisibles(self):
|
|
|
+ return self.pions.combattantsVisibles()
|
|
|
+
|
|
|
+ def decors(self):
|
|
|
+ return self.pions.combattants()
|
|
|
+
|
|
|
def creer(self):
|
|
|
"""cree le plateau"""
|
|
|
self.dateCreation = time()
|
|
|
+ self.creePar = self.fenetre.util
|
|
|
self.hCase = 120 #hauteur d'une case
|
|
|
self.modeActif = Modes.ModeBase(self)
|
|
|
self.gestionCombat = None
|
|
|
@@ -131,14 +147,10 @@ class Plateau(QGraphicsScene, Materiel):
|
|
|
self.caches[idCache].ajouter(self)
|
|
|
self.majCaches()
|
|
|
|
|
|
- #recreation des pions
|
|
|
- for numCombattant in self.combattants:
|
|
|
- self.combattants[numCombattant].ajouterAuPlateau(self)
|
|
|
- self.majOrdreJeu()
|
|
|
-
|
|
|
- #recreation des decors
|
|
|
- for num in self.decors:
|
|
|
- self.decors[num].ajouterAuPlateau(self)
|
|
|
+ #recreation des pions
|
|
|
+ for num in self.pions:
|
|
|
+ self.pions[num].ajouterAuPlateau(self)
|
|
|
+ self.gC.maj()
|
|
|
|
|
|
#recreation des marqueurs entree/sortie
|
|
|
for entreeSortie in self.entreesSorties:
|
|
|
@@ -180,35 +192,22 @@ class Plateau(QGraphicsScene, Materiel):
|
|
|
#modes d'interaction
|
|
|
self.fenetre.connect(self.fenetre.ui.cbt_modeCreation, SIGNAL("clicked()"), self.plateauModeCreation, Qt.UniqueConnection)
|
|
|
self.fenetre.connect(self.fenetre.ui.cbt_modeCombat, SIGNAL("clicked()"), self.plateauModeCombat, Qt.UniqueConnection)
|
|
|
-## self.fenetre.connect(self.fenetre.ui.modeAffichagePlateau, SIGNAL("currentIndexChanged(int)"), self.majModeAffichage, Qt.UniqueConnection)
|
|
|
|
|
|
#etapes du combat
|
|
|
self.fenetre.connect(self.fenetre.ui.cbt_etapeSuivante, SIGNAL("clicked()"), self.etapeSuivante, Qt.UniqueConnection)
|
|
|
-
|
|
|
+ self.connect(self.fenetre.ui.pc_listePJ, SIGNAL("cellClicked(int, int)"), self.ajouterPj)
|
|
|
+
|
|
|
#affichage de fenetres
|
|
|
self.fenetre.connect(self.fenetre.ui.cbt_nom, SIGNAL("clicked()"), self.afficherEcranPlateau, Qt.UniqueConnection)
|
|
|
self.fenetre.connect(self.fenetre.ui.cbt_afficherGestion, SIGNAL("clicked()"), self.afficheEcranGestionCombat, Qt.UniqueConnection)
|
|
|
self.fenetre.connect(self.fenetre.ui.pi_listeAttributs, SIGNAL("cellChanged(int,int)"), self.listeAttributCelluleModifiee, Qt.UniqueConnection)
|
|
|
-
|
|
|
self.fenetre.connect(self.fenetre.ui.cp_dialogueCouleurs, SIGNAL("clicked()"), self.modePeintureCase, Qt.UniqueConnection)
|
|
|
-
|
|
|
self.fenetre.connect(self.fenetre.ui.cp_afficherNotes, SIGNAL("clicked()"), self.agrandirNotesMjPlateau, Qt.UniqueConnection)
|
|
|
|
|
|
#listes
|
|
|
- self.fenetre.connect(self.fenetre.ui.inf_listeOrdreJeu, SIGNAL("cellClicked(int,int)"), self.clicListOrdreJeu, Qt.UniqueConnection)
|
|
|
-
|
|
|
self.fenetre.connect(self.fenetre.ui.cp_listeTerrains, SIGNAL("cellClicked(int,int)"), self.modeMajTerrainCase, Qt.UniqueConnection)
|
|
|
self.fenetre.connect(self.fenetre.ui.cp_listeCreatures, SIGNAL("cellClicked(int,int)"), self.modeCreationCombattant, Qt.UniqueConnection)
|
|
|
self.fenetre.connect(self.fenetre.ui.cp_listeDecors, SIGNAL("cellClicked(int,int)"), self.modeCreationDecor, Qt.UniqueConnection)
|
|
|
-
|
|
|
-# self.fenetre.connect(self.fenetre.ui.cp_editerTerrain, SIGNAL("clicked()"), self.terrainEdit, Qt.UniqueConnection)
|
|
|
-# self.fenetre.connect(self.fenetre.ui.cp_nouveauTerrain, SIGNAL("clicked()"), self.terrainNouveau, Qt.UniqueConnection)
|
|
|
-# self.fenetre.connect(self.fenetre.ui.cp_editerCombattant, SIGNAL("clicked()"), self.creatureEdit, Qt.UniqueConnection)
|
|
|
-# self.fenetre.connect(self.fenetre.ui.cp_nouveauCombattant, SIGNAL("clicked()"), self.creatureNouveau, Qt.UniqueConnection)
|
|
|
-# self.fenetre.connect(self.fenetre.ui.cp_gommeCombattant, SIGNAL("clicked()"), self.majModeSupprimerCombattant, Qt.UniqueConnection)
|
|
|
-# self.fenetre.connect(self.fenetre.ui.cp_editerDecor, SIGNAL("clicked()"), self.decorEdit, Qt.UniqueConnection)
|
|
|
-# self.fenetre.connect(self.fenetre.ui.cp_nouveauDecor, SIGNAL("clicked()"), self.decorNouveau, Qt.UniqueConnection)
|
|
|
-# self.fenetre.connect(self.fenetre.ui.cp_gommeDecor, SIGNAL("clicked()"), self.majModeSupprimerDecor, Qt.UniqueConnection)
|
|
|
|
|
|
#creation
|
|
|
self.fenetre.connect(self.fenetre.ui.cp_epaisseurPinceau, SIGNAL("valueChanged(int)"), self.majEpaisseurPinceau, Qt.UniqueConnection)
|
|
|
@@ -216,6 +215,7 @@ class Plateau(QGraphicsScene, Materiel):
|
|
|
self.fenetre.connect(self.fenetre.ui.cp_effets, SIGNAL("activated(int)"), self.modeCaseEffet, Qt.UniqueConnection)
|
|
|
|
|
|
#autres:
|
|
|
+ self.fenetre.connect(self.fenetre.ui.cp_gomme, SIGNAL("clicked()"), self.majModeSupprimerPions, Qt.UniqueConnection)
|
|
|
self.fenetre.connect(self.fenetre.ui.cp_placerEntree, SIGNAL("clicked()"), self.majModeDefinirEntree, Qt.UniqueConnection)
|
|
|
self.fenetre.connect(self.fenetre.ui.cp_placerCache, SIGNAL("clicked()"), self.majModePlacerCache, Qt.UniqueConnection)
|
|
|
self.fenetre.connect(self.fenetre.ui.cp_placerSortie, SIGNAL("clicked()"), self.majModeDefinirSortie, Qt.UniqueConnection)
|
|
|
@@ -238,9 +238,6 @@ class Plateau(QGraphicsScene, Materiel):
|
|
|
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_finTour, SIGNAL("clicked()"), self.pionSuivant, Qt.UniqueConnection)
|
|
|
-
|
|
|
def initialisationGraphique(self):
|
|
|
"""cree la scene graphique et les parametres necessaires a son fonctionnement, et met a jour l'interface"""
|
|
|
#on cree la scene graphique
|
|
|
@@ -258,7 +255,7 @@ class Plateau(QGraphicsScene, Materiel):
|
|
|
self.polygoneZonePlacement = None
|
|
|
|
|
|
#gestion du mode d'interaction avec le plateau
|
|
|
-
|
|
|
+ self.pions.initialiser(self)
|
|
|
self.pinceau = Pinceau(self)
|
|
|
self.proj = ProjectionDep(self)
|
|
|
|
|
|
@@ -267,8 +264,8 @@ class Plateau(QGraphicsScene, Materiel):
|
|
|
self.majNomPlateau()
|
|
|
self.majBoutonsCouleursPerso()
|
|
|
self.gM.initialiser(self.fenetre)
|
|
|
+ self.gC.initialiser(self)
|
|
|
|
|
|
- self.initListeOrdreJeu()
|
|
|
self.initListeAttaques()
|
|
|
self.majBoutonEtape()
|
|
|
|
|
|
@@ -310,64 +307,46 @@ class Plateau(QGraphicsScene, Materiel):
|
|
|
self.fenetre.ui.cbt_etapeSuivante.setText(QString().fromUtf8("Publier le plateau"))
|
|
|
return
|
|
|
|
|
|
- if not self.tour > 0:
|
|
|
+ if not self.gC.tour() > 0:
|
|
|
self.fenetre.ui.cbt_etapeSuivante.setText(QString().fromUtf8("Démarrer le combat"))
|
|
|
return
|
|
|
|
|
|
- self.fenetre.ui.cbt_etapeSuivante.setText(QString().fromUtf8("Tour {}\nFinir son tour".format(self.tour)))
|
|
|
+ self.fenetre.ui.cbt_etapeSuivante.setText(QString().fromUtf8("Tour {}\nFinir son tour".format(self.gC.tour())))
|
|
|
|
|
|
def etapeSuivante(self):
|
|
|
"""apres clic sur le bouton d'etape, on passe a l'etape suivante (publication, demarrage du combat...)"""
|
|
|
if not self.public:
|
|
|
self.publier()
|
|
|
return
|
|
|
-
|
|
|
- if not self.tour > 0:
|
|
|
- self.demarrer()
|
|
|
- return
|
|
|
-
|
|
|
- self.pionSuivant()
|
|
|
+ self.gC.pionSuivant()
|
|
|
|
|
|
def publier(self):
|
|
|
self.public = True
|
|
|
self.majListePJ()
|
|
|
self.majBoutonEtape()
|
|
|
-
|
|
|
- def demarrer(self):
|
|
|
- self.tour = 1
|
|
|
- self.majBoutonEtape()
|
|
|
-
|
|
|
+
|
|
|
def majListePJ(self):
|
|
|
"""met a jour la liste des pj qui peuvent etre ajoutes au plateau"""
|
|
|
self.fenetre.ui.pc_listePJ.setColumnWidth(0,0)
|
|
|
- self.fenetre.ui.pc_listePJ.setColumnWidth(1,40)
|
|
|
- self.connect(self.fenetre.ui.pc_listePJ, SIGNAL("cellClicked(int, int)"), self.ajouterPj)
|
|
|
- listePj = chargerUnique("parties\\{}\\groupe".format(self.fenetre.partie))
|
|
|
- idPj = 0
|
|
|
- for pj in listePj:
|
|
|
- self.fenetre.ui.pc_listePJ.nouvelleLigneFin()
|
|
|
- self.fenetre.ui.pc_listePJ.majTexte("j{}".format(idPj), 0, idPj)
|
|
|
-
|
|
|
- if pj.logo:
|
|
|
- icone = QIcon(pj.logo.chemin())
|
|
|
- item = QTableWidgetItem(QString(""))
|
|
|
- item.setIcon(icone)
|
|
|
- self.fenetre.ui.pc_listePJ.setItem(idPj, 1, item)
|
|
|
-
|
|
|
- item = QTableWidgetItem()
|
|
|
- item.setText(QString().fromUtf8(pj.nom))
|
|
|
- police = QFont(QString("Verdana"))
|
|
|
- police.setBold(True)
|
|
|
- item.setFont(police)
|
|
|
- self.fenetre.ui.pc_listePJ.setItem(idPj, 2, item)
|
|
|
- idPj += 1
|
|
|
-
|
|
|
+ self.fenetre.ui.pc_listePJ.vider()
|
|
|
+
|
|
|
+ dejaCrees = []
|
|
|
+ for numPj in self.pions.pjs():
|
|
|
+ dejaCrees.append(self.pions[numPj].idM())
|
|
|
+
|
|
|
+ for idM in self.fenetre.pjs:
|
|
|
+ if not idM in dejaCrees:
|
|
|
+ pj = chargerMat(idM, "grp")
|
|
|
+ ligne = self.fenetre.ui.pc_listePJ.nouvelleLigneFin()
|
|
|
+ self.fenetre.ui.pc_listePJ.majTexte(ligne, 0, idM)
|
|
|
+ self.fenetre.ui.pc_listePJ.setItem(ligne, 1, QTableWidgetItem(QIcon(pj.icone().pix()), \
|
|
|
+ QString(pj.nom())))
|
|
|
+ self.fenetre.ui.pc_listePJ.setVisible((self.fenetre.ui.pc_listePJ.rowCount() > 0))
|
|
|
+
|
|
|
def ajouterPj(self, ligne, col):
|
|
|
- listePj = chargerUnique("parties\\{}\\groupe".format(self.fenetre.partie))
|
|
|
- idPj = int(self.fenetre.ui.pc_listePJ.texte(ligne, 0))
|
|
|
- if idPj != None:
|
|
|
- pj = listePj[idPj]
|
|
|
- self.activerMode(Modes.CreationPJ, pj)
|
|
|
+ idM = self.fenetre.ui.pc_listePJ.texte(ligne, 0)
|
|
|
+ pj = chargerMat(idM, "grp")
|
|
|
+ if pj: self.activerMode(Modes.CreationPion, pj)
|
|
|
|
|
|
def majBoutonsCouleursPerso(self):
|
|
|
"""met a jour l'affichage des couleurs customisees dans la boite de dialogue de selection de couleur"""
|
|
|
@@ -427,8 +406,6 @@ class Plateau(QGraphicsScene, Materiel):
|
|
|
self.cases[coord].majCache()
|
|
|
traite.append(coord)
|
|
|
|
|
|
-
|
|
|
-
|
|
|
############### maj des infos du panneau Pi a la selection/deselection d'un pion
|
|
|
#voir a balancer tout ca dans une classe a part
|
|
|
|
|
|
@@ -541,25 +518,6 @@ class Plateau(QGraphicsScene, Materiel):
|
|
|
self.modeActif.desactiver()
|
|
|
self.modeActif = mode(self)
|
|
|
self.modeActif.activer(param)
|
|
|
-
|
|
|
-## def majModeAffichage(self, index):
|
|
|
-## """met a jour le mode d'affichage"""
|
|
|
-## nouveauMode = ""
|
|
|
-## if index == 0:
|
|
|
-## #passe a l'affichage standard
|
|
|
-## pass
|
|
|
-## elif index == 1:
|
|
|
-## #passe en mode affichage de l'altitude
|
|
|
-## nouveauMode = "altitude"
|
|
|
-## elif index == 2:
|
|
|
-## #affichage des terrains slt
|
|
|
-## nouveauMode = "terrain"
|
|
|
-## elif index == 3:
|
|
|
-## #affichage tactique
|
|
|
-## nouveauMode = "tactique"
|
|
|
-##
|
|
|
-## for coord in self.cases:
|
|
|
-## self.cases[coord].majAffichageSpecial(nouveauMode)
|
|
|
|
|
|
def modePeintureCase(self):
|
|
|
"""enclenche le mode peinture de case a partir de la couleur selectionnee"""
|
|
|
@@ -597,13 +555,9 @@ class Plateau(QGraphicsScene, Materiel):
|
|
|
"""enclenche le mode de creation de pions simples"""
|
|
|
self.majMode("pionCreation")
|
|
|
|
|
|
- def majModeSupprimerDecor(self):
|
|
|
- """enclenche le mode suppression de pions sur clic gauche (creatures ou decors)"""
|
|
|
- self.activerMode(Modes.SuppressionPion, Decor)
|
|
|
-
|
|
|
- def majModeSupprimerCombattant(self):
|
|
|
+ def majModeSupprimerPions(self):
|
|
|
"""enclenche le mode suppression de pions sur clic gauche (creatures ou decors)"""
|
|
|
- self.activerMode(Modes.SuppressionPion, Combattant)
|
|
|
+ self.activerMode(Modes.SuppressionPion)
|
|
|
|
|
|
def modeCreationDecor(self, ligne, col):
|
|
|
"""enclenche le mode de creation de decors depuis la liste des decors"""
|
|
|
@@ -692,66 +646,6 @@ class Plateau(QGraphicsScene, Materiel):
|
|
|
###############
|
|
|
|
|
|
########## Gestion du combat ##############
|
|
|
- def majAffichageTour(self):
|
|
|
- """met a jour l'affichage du tour en cours"""
|
|
|
- self.fenetre.ui.cbt_tour.majTexte("Tour: {}".format(self.tour))
|
|
|
-
|
|
|
- def initListeOrdreJeu(self):
|
|
|
- """cree les colonnes et met en forme la table ordre jeu"""
|
|
|
- self.fenetre.ui.inf_listeOrdreJeu.setColumnWidth(2, 30)
|
|
|
- self.fenetre.ui.inf_listeOrdreJeu.hideColumn(0)
|
|
|
- self.fenetre.ui.inf_listeOrdreJeu.hideColumn(2)
|
|
|
- self.fenetre.ui.inf_listeOrdreJeu.setIconSize(QSize(30,20))
|
|
|
-
|
|
|
- def majListeOrdreJeu(self):
|
|
|
- """met a jour la liste des pions infoOrdreJeu"""
|
|
|
- while self.fenetre.ui.inf_listeOrdreJeu.rowCount() > 0:
|
|
|
- self.fenetre.ui.inf_listeOrdreJeu.removeRow(0)
|
|
|
- index = 0
|
|
|
- for num in self.ordreJeu:
|
|
|
- self.fenetre.ui.inf_listeOrdreJeu.insertRow(int(index))
|
|
|
- self.fenetre.ui.inf_listeOrdreJeu.setItem(int(index), 0, QTableWidgetItem(QString.fromUtf8(str(num))))
|
|
|
- icon = QIcon(self.combattants[num].icone().fichier())
|
|
|
- item = QTableWidgetItem(icon, QString.fromUtf8(self.combattants[num].txtId()))
|
|
|
- self.fenetre.ui.inf_listeOrdreJeu.setItem(int(index), 1, item)
|
|
|
- self.fenetre.ui.inf_listeOrdreJeu.setItem(int(index), 2, QTableWidgetItem(QString.fromUtf8(str(self.ordreJeu[num]))))
|
|
|
- index += 1
|
|
|
-
|
|
|
- self.fenetre.ui.inf_listeOrdreJeu.sizeHintForColumn(1)
|
|
|
-## trierTable(self.fenetre.ui.infoOrdreJeu, 2, 0)
|
|
|
-
|
|
|
- def clicListOrdreJeu(self, ligne, col):
|
|
|
- """on a clique dans la liste d'ordre de jeu, le pion correspondant est selectionne et centre sur la carte"""
|
|
|
- numCombattant = int(self.fenetre.ui.inf_listeOrdreJeu.item(ligne, 0).text().toUtf8())
|
|
|
- self.vue().centerOn(self.cases[self.combattants[numCombattant].position].centreGraphique)
|
|
|
- self.modeActif.clic_combattant(numCombattant)
|
|
|
-
|
|
|
- def pionSuivant(self):
|
|
|
- """selection du pion suivant dans la liste d'ordre de jeu"""
|
|
|
- if not len(self.combattants) > 0: return
|
|
|
-
|
|
|
- if self.numPionEnCours in self.combattants:
|
|
|
- suivant = self.ordreJeu[self.numPionEnCours] + 1
|
|
|
- else:
|
|
|
- suivant = 1
|
|
|
- if suivant > len(self.ordreJeu):
|
|
|
- self.tour += 1
|
|
|
- self.majAffichageTour()
|
|
|
- suivant = 1
|
|
|
- for num in self.ordreJeu:
|
|
|
- if self.ordreJeu[num] == suivant:
|
|
|
- numCombattant = num
|
|
|
- break
|
|
|
-
|
|
|
- for ligne in range(0, self.fenetre.ui.inf_listeOrdreJeu.rowCount()):
|
|
|
- item = self.fenetre.ui.inf_listeOrdreJeu.item(ligne, 0)
|
|
|
- item.setSelected(int(self.fenetre.ui.inf_listeOrdreJeu.item(ligne, 0).text().toUtf8()) == numCombattant)
|
|
|
- if int(item.text().toUtf8()) == numCombattant:
|
|
|
- self.fenetre.ui.inf_listeOrdreJeu.scrollToItem(item)
|
|
|
-
|
|
|
- self.vue().centerOn(self.cases[self.combattants[numCombattant].position].centreGraphique)
|
|
|
- self.pionSaisir(numCombattant)
|
|
|
-
|
|
|
def afficheEcranGestionCombat(self):
|
|
|
"""affiche l'ecran de gestion du combat"""
|
|
|
self.gestionCombat = EcranGestionCombat(self)
|
|
|
@@ -759,45 +653,107 @@ class Plateau(QGraphicsScene, Materiel):
|
|
|
self.connect(self.fenetre, SIGNAL("majListesPions"), self.majListesPions)
|
|
|
self.connect(self.gestionCombat, SIGNAL("majListesPions"), self.majListesPions)
|
|
|
QApplication.processEvents()
|
|
|
-## r = self.gestionCombat.exec_()
|
|
|
-
|
|
|
- def majOrdreJeu(self):
|
|
|
- """met a jour l'ordre de jeu des pions en fonction de l'attribut prevu par les regles s'il existe,
|
|
|
- ou en fonction de l'ordre de jeu parametre sinon"""
|
|
|
- if len(self.ordreJeu) > 0:
|
|
|
- attribut = regles.attributOrdreJeu()
|
|
|
- if attribut != None:
|
|
|
- dico = {}
|
|
|
- for numCombattant in self.combattants:
|
|
|
- dico[numCombattant] = int(self.combattants[numCombattant].listeAttributs[attribut])
|
|
|
- ordre = sorted(dico, key = dico.get, reverse=(regles.sensTriOrdreJeu() == 1))
|
|
|
- self.ordreJeu = {}
|
|
|
- for numCombattant in self.combattants:
|
|
|
- self.ordreJeu[numCombattant] = ordre.index(numCombattant) + 1
|
|
|
- self.majListeOrdreJeu()
|
|
|
-
|
|
|
- def pionDeplacerDansOrdreJeu(self, numCombattant, nouvellePosition):
|
|
|
- """deplace un pion dans le dictionnaire gerant l'ordre de jeu de maniere a assurer sa coherence
|
|
|
- nouvellePosition = 0 supprime le pion de la liste"""
|
|
|
- if numCombattant in self.ordreJeu:
|
|
|
- if nouvellePosition == 0:
|
|
|
- del self.ordreJeu[numCombattant]
|
|
|
- if len(self.ordreJeu) > 0:
|
|
|
- i = 0
|
|
|
- tmp = sorted(self.ordreJeu, key=self.ordreJeu.get)
|
|
|
- if numCombattant in tmp:
|
|
|
- tmp.remove(numCombattant)
|
|
|
- for num in tmp:
|
|
|
- i += 1
|
|
|
- if i == nouvellePosition:
|
|
|
- self.ordreJeu[numCombattant] = i
|
|
|
- i += 1
|
|
|
- self.ordreJeu[num] = i
|
|
|
- if i < nouvellePosition:
|
|
|
- self.ordreJeu[numCombattant] = i + 1
|
|
|
- elif nouvellePosition > 0:
|
|
|
- self.ordreJeu[numCombattant] = 1
|
|
|
- self.majOrdreJeu()
|
|
|
+## r = self.gestionCombat.exec_()
|
|
|
+
|
|
|
+# def majAffichageTour(self):
|
|
|
+# """met a jour l'affichage du tour en cours"""
|
|
|
+# self.fenetre.ui.cbt_tour.majTexte("Tour: {}".format(self.tour))
|
|
|
+#
|
|
|
+# def initListeOrdreJeu(self):
|
|
|
+# """cree les colonnes et met en forme la table ordre jeu"""
|
|
|
+# self.fenetre.ui.inf_listeOrdreJeu.setColumnWidth(2, 30)
|
|
|
+# self.fenetre.ui.inf_listeOrdreJeu.hideColumn(0)
|
|
|
+# self.fenetre.ui.inf_listeOrdreJeu.hideColumn(2)
|
|
|
+# self.fenetre.ui.inf_listeOrdreJeu.setIconSize(QSize(30,20))
|
|
|
+#
|
|
|
+# def majListeOrdreJeu(self):
|
|
|
+# """met a jour la liste des pions infoOrdreJeu"""
|
|
|
+# while self.fenetre.ui.inf_listeOrdreJeu.rowCount() > 0:
|
|
|
+# self.fenetre.ui.inf_listeOrdreJeu.removeRow(0)
|
|
|
+# index = 0
|
|
|
+# for num in self.ordreJeu:
|
|
|
+# self.fenetre.ui.inf_listeOrdreJeu.insertRow(int(index))
|
|
|
+# self.fenetre.ui.inf_listeOrdreJeu.setItem(int(index), 0, QTableWidgetItem(QString.fromUtf8(str(num))))
|
|
|
+# icon = QIcon(self.combattants[num].icone().fichier())
|
|
|
+# item = QTableWidgetItem(icon, QString.fromUtf8(self.combattants[num].txtId()))
|
|
|
+# self.fenetre.ui.inf_listeOrdreJeu.setItem(int(index), 1, item)
|
|
|
+# self.fenetre.ui.inf_listeOrdreJeu.setItem(int(index), 2, QTableWidgetItem(QString.fromUtf8(str(self.ordreJeu[num]))))
|
|
|
+# index += 1
|
|
|
+#
|
|
|
+# self.fenetre.ui.inf_listeOrdreJeu.sizeHintForColumn(1)
|
|
|
+# ## trierTable(self.fenetre.ui.infoOrdreJeu, 2, 0)
|
|
|
+#
|
|
|
+# def clicListOrdreJeu(self, ligne, col):
|
|
|
+# """on a clique dans la liste d'ordre de jeu, le pion correspondant est selectionne et centre sur la carte"""
|
|
|
+# numCombattant = int(self.fenetre.ui.inf_listeOrdreJeu.item(ligne, 0).text().toUtf8())
|
|
|
+# self.vue().centerOn(self.cases[self.combattants[numCombattant].position].centreGraphique)
|
|
|
+# self.modeActif.clic_combattant(numCombattant)
|
|
|
+#
|
|
|
+# def pionSuivant(self):
|
|
|
+# """selection du pion suivant dans la liste d'ordre de jeu"""
|
|
|
+# if not len(self.combattants) > 0: return
|
|
|
+#
|
|
|
+# if self.numPionEnCours in self.combattants:
|
|
|
+# suivant = self.ordreJeu[self.numPionEnCours] + 1
|
|
|
+# else:
|
|
|
+# suivant = 1
|
|
|
+# if suivant > len(self.ordreJeu):
|
|
|
+# self.tour += 1
|
|
|
+# self.majAffichageTour()
|
|
|
+# suivant = 1
|
|
|
+# for num in self.ordreJeu:
|
|
|
+# if self.ordreJeu[num] == suivant:
|
|
|
+# numCombattant = num
|
|
|
+# break
|
|
|
+#
|
|
|
+# for ligne in range(0, self.fenetre.ui.inf_listeOrdreJeu.rowCount()):
|
|
|
+# item = self.fenetre.ui.inf_listeOrdreJeu.item(ligne, 0)
|
|
|
+# item.setSelected(int(self.fenetre.ui.inf_listeOrdreJeu.item(ligne, 0).text().toUtf8()) == numCombattant)
|
|
|
+# if int(item.text().toUtf8()) == numCombattant:
|
|
|
+# self.fenetre.ui.inf_listeOrdreJeu.scrollToItem(item)
|
|
|
+#
|
|
|
+# self.vue().centerOn(self.cases[self.combattants[numCombattant].position].centreGraphique)
|
|
|
+# self.pionSaisir(numCombattant)
|
|
|
+#
|
|
|
+
|
|
|
+#
|
|
|
+# def majOrdreJeu(self):
|
|
|
+# """met a jour l'ordre de jeu des pions en fonction de l'attribut prevu par les regles s'il existe,
|
|
|
+# ou en fonction de l'ordre de jeu parametre sinon"""
|
|
|
+# if len(self.ordreJeu) > 0:
|
|
|
+# attribut = regles.attributOrdreJeu()
|
|
|
+# if attribut != None:
|
|
|
+# dico = {}
|
|
|
+# for numCombattant in self.combattants:
|
|
|
+# dico[numCombattant] = int(self.combattants[numCombattant].listeAttributs[attribut])
|
|
|
+# ordre = sorted(dico, key = dico.get, reverse=(regles.sensTriOrdreJeu() == 1))
|
|
|
+# self.ordreJeu = {}
|
|
|
+# for numCombattant in self.combattants:
|
|
|
+# self.ordreJeu[numCombattant] = ordre.index(numCombattant) + 1
|
|
|
+# self.majListeOrdreJeu()
|
|
|
+#
|
|
|
+# def pionDeplacerDansOrdreJeu(self, numCombattant, nouvellePosition):
|
|
|
+# """deplace un pion dans le dictionnaire gerant l'ordre de jeu de maniere a assurer sa coherence
|
|
|
+# nouvellePosition = 0 supprime le pion de la liste"""
|
|
|
+# if numCombattant in self.ordreJeu:
|
|
|
+# if nouvellePosition == 0:
|
|
|
+# del self.ordreJeu[numCombattant]
|
|
|
+# if len(self.ordreJeu) > 0:
|
|
|
+# i = 0
|
|
|
+# tmp = sorted(self.ordreJeu, key=self.ordreJeu.get)
|
|
|
+# if numCombattant in tmp:
|
|
|
+# tmp.remove(numCombattant)
|
|
|
+# for num in tmp:
|
|
|
+# i += 1
|
|
|
+# if i == nouvellePosition:
|
|
|
+# self.ordreJeu[numCombattant] = i
|
|
|
+# i += 1
|
|
|
+# self.ordreJeu[num] = i
|
|
|
+# if i < nouvellePosition:
|
|
|
+# self.ordreJeu[numCombattant] = i + 1
|
|
|
+# elif nouvellePosition > 0:
|
|
|
+# self.ordreJeu[numCombattant] = 1
|
|
|
+# self.majOrdreJeu()
|
|
|
|
|
|
def listeAttributCelluleModifiee(self, ligne, colonne):
|
|
|
"""une cellule de la liste des attributs a ete modifiee"""
|
|
|
@@ -935,6 +891,7 @@ class Plateau(QGraphicsScene, Materiel):
|
|
|
###############
|
|
|
|
|
|
### panneau d'info
|
|
|
+
|
|
|
def majInfosCombattant(self, combattant=None):
|
|
|
self.fenetre.ui.inf_boitePion.maj(combattant)
|
|
|
|
|
|
@@ -944,7 +901,243 @@ class Plateau(QGraphicsScene, Materiel):
|
|
|
def majInfosCase(self, case=None):
|
|
|
self.fenetre.ui.inf_boiteCase.maj(case)
|
|
|
|
|
|
- ############### fonctions de calcul ################
|
|
|
+ ###
|
|
|
+
|
|
|
+
|
|
|
+ def pionSurCase(self, coord):
|
|
|
+ """renvoie le pion present sur la case, none sinon"""
|
|
|
+ for num in self.combattants():
|
|
|
+ if self.pions[num].position == coord: return num
|
|
|
+ return None
|
|
|
+
|
|
|
+ def pionsSurListeCase(self, listeCases):
|
|
|
+ """renvoie la liste des num des pions presents sur la liste de cases"""
|
|
|
+ retour = []
|
|
|
+ for coord in listeCases:
|
|
|
+ pion = self.cases[coord].occupant()
|
|
|
+ if pion != None and not pion.numero in retour:
|
|
|
+ retour.append(pion.numero)
|
|
|
+ return retour
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+# def materialiserPions(self,actif):
|
|
|
+# """avtive/desactive la reception par les pions (autres que le pion selectionne) des hover events"""
|
|
|
+# for numCombattant in self.combattants:
|
|
|
+# if numCombattant != self.modeParam["numPionSelectionne"]:
|
|
|
+# self.combattants[numCombattant].setAcceptsHoverEvents(actif)
|
|
|
+# self.combattants[numCombattant].polygoneGraphique.setAcceptsHoverEvents(actif)
|
|
|
+# for numCombattant in self.decors:
|
|
|
+# self.decors[numCombattant].setAcceptsHoverEvents(actif)
|
|
|
+# self.decors[numCombattant].polygoneGraphique.setAcceptsHoverEvents(actif)
|
|
|
+
|
|
|
+ #######################
|
|
|
+
|
|
|
+ ######## interaction avec les cases, decors et pions #############
|
|
|
+ def pionSelectionne(self):
|
|
|
+ """renvoie le pion actuellement selectionne"""
|
|
|
+ if self.modeActif.__class__.__name__ == "PionSelectionne": return self.modeActif.pion()
|
|
|
+ return None
|
|
|
+
|
|
|
+ def caseCliquee(self, x, y):
|
|
|
+ """on a clique sur la case (clic gauche)"""
|
|
|
+ return self.modeActif.clic_case((x, y))
|
|
|
+
|
|
|
+ def caseSurvolClicEnfonce(self, coord):
|
|
|
+ """une case est survolee par le curseur (le clic gauche est enfonce)"""
|
|
|
+ return self.modeActif.survolClic_case(coord)
|
|
|
+
|
|
|
+ def caseSurvol(self, x, y):
|
|
|
+ """une case est survole par le curseur, on affiche ses informations dans la zone prevue"""
|
|
|
+ self.majInfosCase(self.cases[(x,y)])
|
|
|
+ return self.modeActif.survol_case((x,y))
|
|
|
+
|
|
|
+ def afficherListeCases(self, listeCases, actif):
|
|
|
+ """met ou non en evidence les cases selectionnees"""
|
|
|
+ for coord in listeCases:
|
|
|
+ self.cases[coord].majEstCibleCurseur(actif)
|
|
|
+
|
|
|
+ def pionClique(self, num):
|
|
|
+ """on a clique sur ce pion"""
|
|
|
+ if num > 0:
|
|
|
+ accepte = self.modeActif.clic_combattant(num)
|
|
|
+ else:
|
|
|
+ accepte = self.modeActif.clic_decor(num)
|
|
|
+ return accepte
|
|
|
+
|
|
|
+ def combattantSurvol(self, num):
|
|
|
+ """le pion est survole par le curseur, on affiche ses informations dans la zone prevue"""
|
|
|
+ accepte = self.modeActif.survol_combattant(num)
|
|
|
+ pion = self.pions[num]
|
|
|
+ self.majInfosCombattant(pion)
|
|
|
+ if not accepte:
|
|
|
+ accepte = self.caseSurvol(pion.position[0], pion.position[1])
|
|
|
+ return accepte
|
|
|
+
|
|
|
+ def combattantFinSurvol(self, num):
|
|
|
+ """le pion est survole par le curseur, on affiche ses informations dans la zone prevue"""
|
|
|
+ accepte = self.modeActif.finSurvol_combattant(num)
|
|
|
+ self.majInfosCombattant(None)
|
|
|
+ return accepte
|
|
|
+
|
|
|
+ def decorSurvol(self, num):
|
|
|
+ """le pion est survole par le curseur, on affiche ses informations dans la zone prevue"""
|
|
|
+ accepte = self.modeActif.survol_decor(num)
|
|
|
+ pion = self.pions[num]
|
|
|
+ self.majInfosDecor(pion)
|
|
|
+ if not accepte:
|
|
|
+ accepte = self.caseSurvol(pion.position[0], pion.position[1])
|
|
|
+ return accepte
|
|
|
+
|
|
|
+ def decorFinSurvol(self, num):
|
|
|
+ """le pion est survole par le curseur, on affiche ses informations dans la zone prevue"""
|
|
|
+ accepte = self.modeActif.finSurvol_decor(num)
|
|
|
+ self.majInfosDecor(None)
|
|
|
+ return accepte
|
|
|
+
|
|
|
+ def pionDoubleClic(self, numCombattant):
|
|
|
+ """on a double-clique sur le pion"""
|
|
|
+ accepte = self.modeActif.doubleClic_combattant(numCombattant)
|
|
|
+ return accepte
|
|
|
+
|
|
|
+# def creerPion(self, pionModele):
|
|
|
+# """creer un pion (combattant ou decor) aux coordonnees indiquees"""
|
|
|
+# cree = False
|
|
|
+# if self.proj.projectionValide():
|
|
|
+#
|
|
|
+# if pionModele.__class__.__name__ == "Combattant":
|
|
|
+# pion = Combattant()
|
|
|
+# elif pionModele.__class__.__name__ == "Decor":
|
|
|
+# pion = Decor()
|
|
|
+#
|
|
|
+# for elt in pionModele.__dict__:
|
|
|
+# pion.__dict__[elt] = pionModele.__dict__[elt]
|
|
|
+#
|
|
|
+# if pionModele.__class__.__name__ == "Combattant":
|
|
|
+# numero = 1
|
|
|
+# if len(self.combattants) > 0:
|
|
|
+# numero = max(self.combattants) + 1
|
|
|
+# pion.numero = numero
|
|
|
+# pion.numComplementaire = self.numeroterNom(pion.nom())
|
|
|
+# self.combattants[numero] = pion
|
|
|
+# self.pionDeplacerDansOrdreJeu(numero, len(self.ordreJeu) + 2)
|
|
|
+#
|
|
|
+# elif pionModele.__class__.__name__ == "Decor":
|
|
|
+# numero = 10001
|
|
|
+# if len(self.decors) > 0:
|
|
|
+# numero = max(self.decors) + 10001
|
|
|
+# pion.numero = numero
|
|
|
+# self.decors[numero] = pion
|
|
|
+#
|
|
|
+# pion.position = self.proj.coord()
|
|
|
+# pion.nbRotations = self.proj.nbRotations()
|
|
|
+# pion.ajouterAuPlateau(self)
|
|
|
+#
|
|
|
+# cree = True
|
|
|
+# return cree
|
|
|
+
|
|
|
+# def numeroterNom(self, nom):
|
|
|
+# """renvoie le nom du pion avec un numero complementaire si necessaire """
|
|
|
+# i = 1
|
|
|
+# for numCombattant in self.combattants:
|
|
|
+# if self.combattants[numCombattant].nom() == nom: i += 1
|
|
|
+# retour = str(i) if i > 1 else ""
|
|
|
+# return retour
|
|
|
+
|
|
|
+ def pionDeposer(self, coordCase):
|
|
|
+ """on depose le pion sur la case voulue"""
|
|
|
+ if self.pionSelectionne() != None:
|
|
|
+ pion = self.pionSelectionne()
|
|
|
+ if pion != None:
|
|
|
+ if self.proj.projectionValide():
|
|
|
+ pion.majPosition(self.proj.coord(), self.proj.nbRotations())
|
|
|
+
|
|
|
+ def majZPion(self, valeur):
|
|
|
+ """met a jour l'altitude du pion selectionne"""
|
|
|
+ if self.pionSelectionne() != None:
|
|
|
+ self.pionSelectionne().majZ(valeur)
|
|
|
+
|
|
|
+ def dialogueVol(self, actuelle):
|
|
|
+ ecran = EcranVol(actuelle)
|
|
|
+ ecran.exec_()
|
|
|
+ nouvelle = ecran.resultat()
|
|
|
+ del ecran
|
|
|
+ return nouvelle
|
|
|
+
|
|
|
+# def pionSupprimer(self, num):
|
|
|
+# """supprime le pion entre en parametre"""
|
|
|
+# #settrace(trace_calls)
|
|
|
+# if num in self.combattants:
|
|
|
+# self.pionDeplacerDansOrdreJeu(num, 0)
|
|
|
+# pionSuppr = self.combattants.pop(num)
|
|
|
+# elif num in self.decors:
|
|
|
+# pionSuppr = self.decors.pop(num)
|
|
|
+#
|
|
|
+# pionSuppr.retirerDuPlateau()
|
|
|
+
|
|
|
+ ###############
|
|
|
+
|
|
|
+ ######### caches ###############
|
|
|
+
|
|
|
+ def nouveauCache(self, listeCases):
|
|
|
+ nouvelId = 0
|
|
|
+ if len(self.caches) > 0:
|
|
|
+ nouvelId = max(self.caches) + 1
|
|
|
+ cache = Cache(nouvelId)
|
|
|
+ cache.activer(True)
|
|
|
+ cache.nom = "Cache {}".format(nouvelId + 1)
|
|
|
+ self.caches[nouvelId] = cache
|
|
|
+ self.ajouterCacheATable(cache)
|
|
|
+ for coord in listeCases:
|
|
|
+ self.cases[coord].ajouterCache(nouvelId)
|
|
|
+
|
|
|
+ def supprimerCache(self):
|
|
|
+ ligne = self.fenetre.ui.cp_listeCaches.currentRow()
|
|
|
+ idCache = int(self.fenetre.ui.cp_listeCaches.texte(ligne, 0))
|
|
|
+ for coord in self.cases:
|
|
|
+ self.cases[coord].supprimerCache(idCache)
|
|
|
+ self.fenetre.ui.cp_listeCaches.removeRow(idCache)
|
|
|
+ del self.caches[idCache]
|
|
|
+
|
|
|
+
|
|
|
+ ###############"
|
|
|
+
|
|
|
+ ######### gestion des evenements souris et clavier ###############
|
|
|
+
|
|
|
+ def mouseMoveEvent(self, event):
|
|
|
+ super(Plateau, self).mouseMoveEvent(event)
|
|
|
+ if event.buttons() == Qt.LeftButton and self.vue().dragMode() != QGraphicsView.ScrollHandDrag:
|
|
|
+ coord = self.coordonneesAuPoint(event.scenePos())
|
|
|
+ if coord != None:
|
|
|
+ self.caseSurvolClicEnfonce(coord)
|
|
|
+ else:
|
|
|
+ self.modeActif.mouvementSouris(event)
|
|
|
+ event.ignore()
|
|
|
+
|
|
|
+ def mousePressEvent(self, event):
|
|
|
+ super(Plateau, self).mousePressEvent(event)
|
|
|
+ if event.button() == 1:
|
|
|
+ self.modeActif.clicGauche(event)
|
|
|
+ elif event.button() == 2:
|
|
|
+ self.modeActif.clicDroit(event)
|
|
|
+ event.accept()
|
|
|
+
|
|
|
+ def mouseReleaseEvent(self, event):
|
|
|
+ super(Plateau, self).mouseReleaseEvent(event)
|
|
|
+ self.modeActif.finClicGauche(event)
|
|
|
+
|
|
|
+ def keyPressEvent(self, event):
|
|
|
+ """gestion des evenements clavier"""
|
|
|
+ self.modeActif.toucheClavier(event)
|
|
|
+
|
|
|
+ ################
|
|
|
+
|
|
|
+ ############### Fonctions diverses
|
|
|
+
|
|
|
+ def centrerSur(self, num):
|
|
|
+ """centre la vue sur le pion"""
|
|
|
+ self.vue().centerOn(self.cases[self.pions[num].position].centreGraphique)
|
|
|
+
|
|
|
def coordonneesValides(self, coord):
|
|
|
"""les coordonnees entrees en parametre sont elles celles d'une case du plateau"""
|
|
|
return (coord[0] >= 0 and coord[1] >= 0 and coord[0] < self.nbCasesX and coord[1] < self.nbCasesY)
|
|
|
@@ -1272,23 +1465,6 @@ class Plateau(QGraphicsScene, Materiel):
|
|
|
retour += self.pionSelectionne().coutDep("depVol", dist)
|
|
|
|
|
|
return retour
|
|
|
-
|
|
|
- def pionSurCase(self, coord):
|
|
|
- """renvoie le pion present sur la case, none sinon"""
|
|
|
- retour = None
|
|
|
- for num in self.combattants:
|
|
|
- if self.combattants[num].position == coord:
|
|
|
- retour = num
|
|
|
- return retour
|
|
|
-
|
|
|
- def pionsSurListeCase(self, listeCases):
|
|
|
- """renvoie la liste des num des pions presents sur la liste de cases"""
|
|
|
- retour = []
|
|
|
- for coord in listeCases:
|
|
|
- pion = self.cases[coord].occupant()
|
|
|
- if pion != None and not pion.numero in retour:
|
|
|
- retour.append(pion.numero)
|
|
|
- return retour
|
|
|
|
|
|
def majZonePlacement(self, listeCases):
|
|
|
"""met a jour la forme et l'affichage de la zone de placement initale des joueurs"""
|
|
|
@@ -1317,227 +1493,6 @@ class Plateau(QGraphicsScene, Materiel):
|
|
|
self.polygoneZonePlacement.setPolygon(polygone)
|
|
|
self.listeCasesZonePlacement = listeCases
|
|
|
|
|
|
- def materialiserPions(self,actif):
|
|
|
- """avtive/desactive la reception par les pions (autres que le pion selectionne) des hover events"""
|
|
|
- for numCombattant in self.combattants:
|
|
|
- if numCombattant != self.modeParam["numPionSelectionne"]:
|
|
|
- self.combattants[numCombattant].setAcceptsHoverEvents(actif)
|
|
|
- self.combattants[numCombattant].polygoneGraphique.setAcceptsHoverEvents(actif)
|
|
|
- for numCombattant in self.decors:
|
|
|
- self.decors[numCombattant].setAcceptsHoverEvents(actif)
|
|
|
- self.decors[numCombattant].polygoneGraphique.setAcceptsHoverEvents(actif)
|
|
|
-
|
|
|
- #######################
|
|
|
-
|
|
|
- ######## interaction avec les cases, decors et pions #############
|
|
|
- def pionSelectionne(self):
|
|
|
- """renvoie le pion actuellement selectionne"""
|
|
|
- retour = None
|
|
|
- if self.modeActif.__class__.__name__ == "PionSelectionne":
|
|
|
- retour = self.modeActif.pion()
|
|
|
- return retour
|
|
|
-
|
|
|
- def caseCliquee(self, x, y):
|
|
|
- """on a clique sur la case (clic gauche)"""
|
|
|
- coord = (x, y)
|
|
|
- accepte = self.modeActif.clic_case(coord)
|
|
|
- return accepte
|
|
|
-
|
|
|
- def caseSurvolClicEnfonce(self, coord):
|
|
|
- """une case est survolee par le curseur (le clic gauche est enfonce)"""
|
|
|
- accepte = self.modeActif.survolClic_case(coord)
|
|
|
- return accepte
|
|
|
-
|
|
|
- def caseSurvol(self, x, y):
|
|
|
- """une case est survole par le curseur, on affiche ses informations dans la zone prevue"""
|
|
|
- self.majInfosCase(self.cases[(x,y)])
|
|
|
- accepte = self.modeActif.survol_case((x,y))
|
|
|
- return accepte
|
|
|
-
|
|
|
- def afficherListeCases(self, listeCases, actif):
|
|
|
- """met ou non en evidence les cases selectionnees"""
|
|
|
- for coord in listeCases:
|
|
|
- self.cases[coord].majEstCibleCurseur(actif)
|
|
|
-
|
|
|
- def pionClique(self, num):
|
|
|
- """on a clique sur ce pion"""
|
|
|
- if num < 10000:
|
|
|
- accepte = self.modeActif.clic_combattant(num)
|
|
|
- else:
|
|
|
- accepte = self.modeActif.clic_decor(num)
|
|
|
- return accepte
|
|
|
-
|
|
|
- def combattantSurvol(self, num):
|
|
|
- """le pion est survole par le curseur, on affiche ses informations dans la zone prevue"""
|
|
|
- accepte = self.modeActif.survol_combattant(num)
|
|
|
- pion = self.combattants[num]
|
|
|
- self.majInfosCombattant(pion)
|
|
|
- if not accepte:
|
|
|
- accepte = self.caseSurvol(pion.position[0], pion.position[1])
|
|
|
- return accepte
|
|
|
-
|
|
|
- def combattantFinSurvol(self, num):
|
|
|
- """le pion est survole par le curseur, on affiche ses informations dans la zone prevue"""
|
|
|
- accepte = self.modeActif.finSurvol_combattant(num)
|
|
|
- self.majInfosCombattant(None)
|
|
|
- return accepte
|
|
|
-
|
|
|
- def decorSurvol(self, num):
|
|
|
- """le pion est survole par le curseur, on affiche ses informations dans la zone prevue"""
|
|
|
- accepte = self.modeActif.survol_decor(num)
|
|
|
- pion = self.decors[num]
|
|
|
- self.majInfosDecor(pion)
|
|
|
- if not accepte:
|
|
|
- accepte = self.caseSurvol(pion.position[0], pion.position[1])
|
|
|
- return accepte
|
|
|
-
|
|
|
- def decorFinSurvol(self, num):
|
|
|
- """le pion est survole par le curseur, on affiche ses informations dans la zone prevue"""
|
|
|
- accepte = self.modeActif.finSurvol_decor(num)
|
|
|
- self.majInfosDecor(None)
|
|
|
- return accepte
|
|
|
-
|
|
|
- def pionDoubleClic(self, numCombattant):
|
|
|
- """on a double-clique sur le pion"""
|
|
|
- accepte = self.modeActif.doubleClic_combattant(numCombattant)
|
|
|
- return accepte
|
|
|
-
|
|
|
- def creerPion(self, pionModele):
|
|
|
- """creer un pion (combattant ou decor) aux coordonnees indiquees"""
|
|
|
- cree = False
|
|
|
- if self.proj.projectionValide():
|
|
|
-
|
|
|
- if pionModele.__class__.__name__ == "Combattant":
|
|
|
- pion = Combattant()
|
|
|
- elif pionModele.__class__.__name__ == "Decor":
|
|
|
- pion = Decor()
|
|
|
-
|
|
|
- for elt in pionModele.__dict__:
|
|
|
- pion.__dict__[elt] = pionModele.__dict__[elt]
|
|
|
-
|
|
|
- if pionModele.__class__.__name__ == "Combattant":
|
|
|
- numero = 1
|
|
|
- if len(self.combattants) > 0:
|
|
|
- numero = max(self.combattants) + 1
|
|
|
- pion.numero = numero
|
|
|
- pion.numComplementaire = self.numeroterNom(pion.nom())
|
|
|
- self.combattants[numero] = pion
|
|
|
- self.pionDeplacerDansOrdreJeu(numero, len(self.ordreJeu) + 2)
|
|
|
-
|
|
|
- elif pionModele.__class__.__name__ == "Decor":
|
|
|
- numero = 10001
|
|
|
- if len(self.decors) > 0:
|
|
|
- numero = max(self.decors) + 10001
|
|
|
- pion.numero = numero
|
|
|
- self.decors[numero] = pion
|
|
|
-
|
|
|
- pion.position = self.proj.coord()
|
|
|
- pion.nbRotations = self.proj.nbRotations()
|
|
|
- pion.ajouterAuPlateau(self)
|
|
|
-
|
|
|
- cree = True
|
|
|
- return cree
|
|
|
-
|
|
|
- def numeroterNom(self, nom):
|
|
|
- """renvoie le nom du pion avec un numero complementaire si necessaire """
|
|
|
- i = 1
|
|
|
- for numCombattant in self.combattants:
|
|
|
- if self.combattants[numCombattant].nom() == nom: i += 1
|
|
|
- retour = str(i) if i > 1 else ""
|
|
|
- return retour
|
|
|
-
|
|
|
- def pionDeposer(self, coordCase):
|
|
|
- """on depose le pion sur la case voulue"""
|
|
|
- if self.pionSelectionne() != None:
|
|
|
- pion = self.pionSelectionne()
|
|
|
-
|
|
|
- if pion != None:
|
|
|
- if self.proj.projectionValide():
|
|
|
- pion.majPosition(self.proj.coord(), self.proj.nbRotations())
|
|
|
-
|
|
|
- def majZPion(self, valeur):
|
|
|
- """met a jour l'altitude du pion selectionne"""
|
|
|
- if self.pionSelectionne() != None:
|
|
|
- self.pionSelectionne().majZ(valeur)
|
|
|
-
|
|
|
- def dialogueVol(self, actuelle):
|
|
|
- ecran = EcranVol(actuelle)
|
|
|
- ecran.exec_()
|
|
|
- nouvelle = ecran.resultat()
|
|
|
- del ecran
|
|
|
- return nouvelle
|
|
|
-
|
|
|
- def pionSupprimer(self, num):
|
|
|
- """supprime le pion entre en parametre"""
|
|
|
- #settrace(trace_calls)
|
|
|
- if num in self.combattants:
|
|
|
- self.pionDeplacerDansOrdreJeu(num, 0)
|
|
|
- pionSuppr = self.combattants.pop(num)
|
|
|
- elif num in self.decors:
|
|
|
- pionSuppr = self.decors.pop(num)
|
|
|
-
|
|
|
- pionSuppr.retirerDuPlateau()
|
|
|
-
|
|
|
- ###############
|
|
|
-
|
|
|
- ######### caches ###############
|
|
|
-
|
|
|
- def nouveauCache(self, listeCases):
|
|
|
- nouvelId = 0
|
|
|
- if len(self.caches) > 0:
|
|
|
- nouvelId = max(self.caches) + 1
|
|
|
- cache = Cache(nouvelId)
|
|
|
- cache.activer(True)
|
|
|
- cache.nom = "Cache {}".format(nouvelId + 1)
|
|
|
- self.caches[nouvelId] = cache
|
|
|
- self.ajouterCacheATable(cache)
|
|
|
- for coord in listeCases:
|
|
|
- self.cases[coord].ajouterCache(nouvelId)
|
|
|
-
|
|
|
- def supprimerCache(self):
|
|
|
- ligne = self.fenetre.ui.cp_listeCaches.currentRow()
|
|
|
- idCache = int(self.fenetre.ui.cp_listeCaches.texte(ligne, 0))
|
|
|
- for coord in self.cases:
|
|
|
- self.cases[coord].supprimerCache(idCache)
|
|
|
- self.fenetre.ui.cp_listeCaches.removeRow(idCache)
|
|
|
- del self.caches[idCache]
|
|
|
-
|
|
|
-
|
|
|
- ###############"
|
|
|
-
|
|
|
- ######### gestion des evenements souris et clavier ###############
|
|
|
-
|
|
|
- def mouseMoveEvent(self, event):
|
|
|
- super(Plateau, self).mouseMoveEvent(event)
|
|
|
- if event.buttons() == Qt.LeftButton and self.vue().dragMode() != QGraphicsView.ScrollHandDrag:
|
|
|
- coord = self.coordonneesAuPoint(event.scenePos())
|
|
|
- if coord != None:
|
|
|
- self.caseSurvolClicEnfonce(coord)
|
|
|
- else:
|
|
|
- self.modeActif.mouvementSouris(event)
|
|
|
- event.ignore()
|
|
|
-
|
|
|
- def mousePressEvent(self, event):
|
|
|
- super(Plateau, self).mousePressEvent(event)
|
|
|
- if event.button() == 1:
|
|
|
- self.modeActif.clicGauche(event)
|
|
|
- elif event.button() == 2:
|
|
|
- self.modeActif.clicDroit(event)
|
|
|
- event.accept()
|
|
|
-
|
|
|
- def mouseReleaseEvent(self, event):
|
|
|
- super(Plateau, self).mouseReleaseEvent(event)
|
|
|
- self.modeActif.finClicGauche(event)
|
|
|
-
|
|
|
- def keyPressEvent(self, event):
|
|
|
- """gestion des evenements clavier"""
|
|
|
- self.modeActif.toucheClavier(event)
|
|
|
-
|
|
|
- ################
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
|
|
|
|
|
|
|