online faq recherche accueil
 

Il y a 204 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici

 Mot :   Pseudo :  
 
 Page :  1  2
Page Suivante 
Auteur
 Sujet :

Création d'un jeu d'échec

 
n°4589275
Lord Kumie​p
Kumiep Deathbringer
Posté le 14-04-2007 à 11:24:35  profilanswer
 

Reprise du message précédent :
Moi je trouve ce projet très interressant et te souhaite que de la réussite !


---------------
http://kumiep.miniville.fr/
n°4589279
Maximaxou
rejoignez les fidèles du JASS
Posté le 14-04-2007 à 12:16:05  profilanswer
 

Citation :

C'est simple au lieu de prendre les unités une par une et de vérifier si elles mettent le roi en echec, vérifie si le roi doit et peut bouger


Et comment tu fais sans prendre les unités une par une ? Tu vérifies toutes les cases qui sont suceptibles d'être la position d'une unité ennemie pouvant attaquer le roi ? ...........C'est pas con ça, c'est beaucoup plus rapide pour l'ordi. Mouais je vais faire ça.


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589280
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 14-04-2007 à 12:18:11  profilanswer
 

Bah tu vois quand tu veux  :D  


---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4589281
Maximaxou
rejoignez les fidèles du JASS
Posté le 14-04-2007 à 12:18:54  profilanswer
 

Citation :

Moi je trouve ce projet très interressant et te souhaite que de la réussite !  

Merci. Pour l'instant j'arrive très bien les trucs que je pensais dûr à faire, et je galère pour les trucs qui paraissent tout con :/


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589284
Maximaxou
rejoignez les fidèles du JASS
Posté le 14-04-2007 à 12:28:39  profilanswer
 

Citation :

Bah tu vois quand tu veux  :D  

Bon, j'avoue, t'es pas si bête si bête que ça.


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589293
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 14-04-2007 à 12:43:17  profilanswer
 

Un proverbe chinois dit : "donnez une rose à une vache elle vous produira une bouse"


---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4589295
Maximaxou
rejoignez les fidèles du JASS
Posté le 14-04-2007 à 12:47:09  profilanswer
 

LOL. Mortel. Bon revenons à nos moutons. J'ai encore un problème à la con. Avec ce déclo :

Citation :

function PauseOneOfGroup takes nothing returns nothing
    call PauseUnit( GetEnumUnit(), true )
endfunction
 
 
function Trig_player_ordering_a_move_Actions takes nothing returns nothing
 
    local unit piece = GetTriggerUnit()
    local integer ind  
    local integer pieceNum  
    local integer currentPosNum  
    local integer PN  
    local trigger trig  
 
    call PauseUnit( piece, true ) //when the move isn't allowed, to stop the unit the fastest as possible
 
    set ind = IndClickedCase()
    set pieceNum = CustVal( piece )
    set currentPosNum = udg_currentPosNum[ pieceNum ]  
    set PN = GetPlayerId( GetOwningPlayer(piece) )
    set trig = GetTriggeringTrigger()
 
    call DisplayTextToForce( GetPlayersAll(),"called" )
    if NumberOfUnitsSelected(PN) == 1 then
 
        call DisableTrigger( trig )
 
        if CanMoveTo( piece, ind ) then
            set udg_newPosNum[ pieceNum ] = ind
            call DisplayTextToForce( GetPlayersAll(), "ok move" )
            set udg_movingUnit = piece
            call MoveRectToLoc( udg_caseMovingToRegion, udg_caseCenter[ind] )
            call TriggerExecute( gg_trg_unit_ending_a_move_refreshing )
            set udg_caseMovingToInd = ind
            call GroupRemoveUnit( udg_alivePieces[PN], piece )
            call ForGroup( udg_alivePieces[PN], function PauseOneOfGroup )
            call GroupAddUnit( udg_alivePieces[PN], piece )
            call PauseUnit( piece, false )
            call IssuePointOrderLoc( piece, "move", udg_caseCenter[ind] )
            set udg_caseOwner[ currentPosNum ] = 2
            set udg_caseOwner[ ind ] = PN
            if GetPieceType( piece ) == "king" then
                set udg_kingPosNum[PN] = ind
            endif
            set udg_currentPosNum[ CustVal(piece) ] = ind
            call EnableTrigger( trig )
            return
        else
          call DisplayTextToPlayer(Player(0),0,0,"hein?" )
endif
 
    endif
 
    //else
        call IssueImmediateOrder( piece, "stop" )
        call TriggerSleepAction( 0.1 ) //wait here or the unit won't stop -_-
         
        call DisableTrigger( trig )
        call PauseUnit( piece, false )  //unpause unit
        call DisplayTextToForce( GetPlayersAll(), "wrong move" )
     
        call EnableTrigger( trig )
 
endfunction
 
 
 
 
//===========================================================================
function InitTrig_player_ordering_a_move takes nothing returns nothing
    set gg_trg_player_ordering_a_move = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_player_ordering_a_move, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER )
    call TriggerAddAction( gg_trg_player_ordering_a_move, function Trig_player_ordering_a_move_Actions )
endfunction


Quand je donne un ordre à une unité, il est exécuté deux fois au lieu d'une. Comprends po.


Message édité par Maximaxou le 14-04-2007 à 12:48:12

---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589296
Maximaxou
rejoignez les fidèles du JASS
Posté le 14-04-2007 à 12:49:45  profilanswer
 

Oups dsl.

Code :
  1. function PauseOneOfGroup takes nothing returns nothing
  2.     call PauseUnit( GetEnumUnit(), true )
  3. endfunction
  4. function Trig_player_ordering_a_move_Actions takes nothing returns nothing
  5.     local unit piece = GetTriggerUnit()
  6.     local integer ind
  7.     local integer pieceNum
  8.     local integer currentPosNum
  9.     local integer PN
  10.     local trigger trig
  11.     call PauseUnit( piece, true ) //when the move isn't allowed, to stop the unit the fastest as possible
  12.     set ind = IndClickedCase()
  13.     set pieceNum = CustVal( piece )
  14.     set currentPosNum = udg_currentPosNum[ pieceNum ]
  15.     set PN = GetPlayerId( GetOwningPlayer(piece) )
  16.     set trig = GetTriggeringTrigger()
  17.     call DisplayTextToForce( GetPlayersAll(),"called" )
  18.     if NumberOfUnitsSelected(PN) == 1 then
  19.        call DisableTrigger( trig )
  20.         if CanMoveTo( piece, ind ) then
  21.             set udg_newPosNum[ pieceNum ] = ind
  22.             call DisplayTextToForce( GetPlayersAll(), "ok move" )
  23.             set udg_movingUnit = piece
  24.             call MoveRectToLoc( udg_caseMovingToRegion, udg_caseCenter[ind] )
  25.             call TriggerExecute( gg_trg_unit_ending_a_move_refreshing )
  26.             set udg_caseMovingToInd = ind
  27.             call GroupRemoveUnit( udg_alivePieces[PN], piece )
  28.             call ForGroup( udg_alivePieces[PN], function PauseOneOfGroup )
  29.             call GroupAddUnit( udg_alivePieces[PN], piece )
  30.             call PauseUnit( piece, false )
  31.             call IssuePointOrderLoc( piece, "move", udg_caseCenter[ind] )
  32.             set udg_caseOwner[ currentPosNum ] = 2
  33.             set udg_caseOwner[ ind ] = PN
  34.             if GetPieceType( piece ) == "king" then
  35.                 set udg_kingPosNum[PN] = ind
  36.             endif
  37.             set udg_currentPosNum[ CustVal(piece) ] = ind
  38.             call EnableTrigger( trig )
  39.             return
  40.         else
  41.           call DisplayTextToPlayer(Player(0),0,0,"hein?" )
  42. endif
  43.     endif
  44.     //else
  45.         call IssueImmediateOrder( piece, "stop" )
  46.         call TriggerSleepAction( 0.1 ) //wait here or the unit won't stop -_-
  47.        
  48.         call DisableTrigger( trig )
  49.         call PauseUnit( piece, false//unpause unit
  50.         call DisplayTextToForce( GetPlayersAll(), "wrong move" )
  51.    
  52.         call EnableTrigger( trig )
  53. endfunction
  54. //===========================================================================
  55. function InitTrig_player_ordering_a_move takes nothing returns nothing
  56.     set gg_trg_player_ordering_a_move = CreateTrigger(  )
  57.     call TriggerRegisterAnyUnitEventBJ( gg_trg_player_ordering_a_move, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER )
  58.     call TriggerAddAction( gg_trg_player_ordering_a_move, function Trig_player_ordering_a_move_Actions )
  59. endfunction


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589297
Maximaxou
rejoignez les fidèles du JASS
Posté le 14-04-2007 à 12:54:05  profilanswer
 

Ah ben j'ai trouvé. Je galérais hier soir avec ça et en deux min je trouve today. Qqun peut-il m'expliquer pourquoi l'action pause unit déclenche sur putin de trigger des mes @#-/*$^ ????????????????


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589298
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 14-04-2007 à 13:06:57  profilanswer
 

Pause unit interrompt l'ordre mais quand tu unpause l'unité si l'ordre n'est pas fini elle le reprend.
Donc tu doit ordonner à l'unité se stopper avant de la mettre en pause


---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4589306
Sogara
What else ?
Posté le 14-04-2007 à 17:48:24  profilanswer
 

Ouais ya la commande issue order unit to Stop ou qqch comme ça...


---------------
"Prouver que j'ai raison reviendrait à accorder que je puisse avoir tort."
n°4589315
Maximaxou
rejoignez les fidèles du JASS
Posté le 15-04-2007 à 03:34:49  profilanswer
 

lol bin c'est celle la :  call IssueImmediateOrder( piece, "stop" ) (l.55)
 
Je suis kan meme obligé de mettre l'unité en pause

Message cité 1 fois
Message édité par Maximaxou le 15-04-2007 à 15:35:17

---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589318
Maximaxou
rejoignez les fidèles du JASS
Posté le 15-04-2007 à 03:42:57  profilanswer
 

Un autre problème s'était posé (j'ai trouvé la solution mais je pense que ça pourrait vous intéresser). Comment faire pour qu'un joueur déplace un pion, une fois que celui-ci a fini son déplacement (d'une durée très variable), on passe à la suite. (changement de l'orientation de l'unité et permettre à l'autre joueur de jouer)
Solution : une région qui bouge.

Code :
  1. init movingRegion
  2.     Evénements
  3.         Map initialization
  4.     Conditions
  5.     Actions
  6.         Set caseMovingToRegion = caseMovingToRegion <gen> //cette région peut être placée n'importe où sur la carte au départ


Code :
  1. //certaines actions du trigger 'player ordering a move'
  2. set udg_movingUnit = piece
  3. call MoveRectToLoc( udg_caseMovingToRegion, udg_caseCenter[ind] )
  4. call TriggerExecute( gg_trg_unit_ending_a_move_refreshing )


Code :
  1. unit ending a move refreshing //changement de l'évènement du déclencheur 'unit_ending_a_move'
  2.     Evénements
  3.     Conditions
  4.     Actions
  5.         Custom script:   call DestroyTrigger( gg_trg_unit_ending_a_move )
  6.         Custom script:   call InitTrig_unit_ending_a_move()
  7.         Déclencheur - Add to unit ending a move <gen> the event (Unité - A unit enters caseMovingToRegion)
  8.          //il ne suffit pas de changer la valeur de la variable caseMovingToRegion pour changer l'évènement, car l'évènement est en fait : 'une unité entre dans la région représentée par cette variable au moment de la création du déclo'. En d'autres termes, l'évènement reste constant. Ce qui est loin d'être évident.


Code :
  1. unit ending a move
  2.     Evénements
  3.     Conditions
  4.         (Triggering unit) Egal à movingUnit
  5.     Actions
  6.         Partie - Display to (All players) the text: region entree
  7.         Wait 0.50 seconds //pour laisser le temps à l'unité d'arriver autre centre de la case
  8.         Set movingUnit = Pas d'unité
  9.         Unité - Pause (Triggering unit)//la seule unité non en pause du joueur, était celle-ci (voir déclo 'player ordering a move')
  10.         Déclencheur - Turn on player ordering a move <gen>
  11.         If (All Conditions are True) then do (Then Actions) else do (Else Actions)
  12.             Si - Conditions
  13.                 (Owner of (Triggering unit)) Egal à Joueur 1 (Rouge)
  14.             Alors - Actions
  15.                 Custom script:   call SetUnitFacing( GetTriggerUnit(), 90 )//unité regarde vers le haut
  16.                 Groupe unité - Pick every unit in alivePieces[1] and do (Actions)//pour chaque unité du joueur bleu, faire
  17.                     Boucle - Actions
  18.                         Unité - Reprendre (Picked unit)
  19.             Sinon - Actions
  20.                 Custom script:   call SetUnitFacing( GetTriggerUnit(), 270 )//unité regarde vers le bas   
  21.                 Groupe unité - Pick every unit in alivePieces[0] and do (Actions)//pour chaque unité du joueur rouge, faire
  22.                     Boucle - Actions
  23.                         Unité - Reprendre (Picked unit)
  24. //c'est à un joueur de jouer lorsqu'il peut bouger ses unités. (lorsqu'elles ne sont pas en pause)


Message édité par Maximaxou le 15-04-2007 à 04:05:08

---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589413
Maximaxou
rejoignez les fidèles du JASS
Posté le 17-04-2007 à 01:04:35  profilanswer
 

Bon, on a vu que vérifier s'il le roi était en échec ou non, était assez facile à faire en fin de compte... maintenant, comment faire pour voir s'il y a échec et mat ou pat ?  
 
mat : un joueur gagne
pat : un joueur ne peut effectuer de déplacement sans mettre en échec le roi, alors que celui-ci n'est pas en échec --> pareil que pour mat sauf que le roi n'est pas en échec
 
Pour l'instant, la seule solution que je vois, est de tester toutes les combinaisons de déplacement possibles, jusqu'à ce que l'on trouve un déplacement possible, ou aucun. Ca ne me paraît pas insurmontable à faire, mais j'ai peur que ça fasse beaucoup souffrir le processeur. J'ai donc deux questions : est-ce qu'à votre avis ça fera effectivement souffrir le processeur ? Est-ce que vous voyez une meilleure solution ?
 
 
Pour éclaircir tout le monde :
 
A chaque tentative de déplacement on regarde :
1) s'il le déplacement est théoriquement possible. Si non on l'annule.
2) si cela met en échec le roi. Si oui on annule le déplacement.
 
A chaque fin de déplacement, on regarde si le roi ennemi est alors en échec. Qu'il le soit où non, on regarde si le joueur ennemi peut faire un déplacement sans mettre en échec le roi. Si c'est le cas, la partie continue, sinon : si le roi est en échec, échec et mat, sinon pat.
 
Le problème se situe là : "on regarde si le joueur ennemi peut faire un déplacement sans mettre en échec le roi".


Message édité par Maximaxou le 17-04-2007 à 01:07:20

---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589414
Maximaxou
rejoignez les fidèles du JASS
Posté le 17-04-2007 à 02:01:16  profilanswer
 

L'action pause unit donne un ordre avec le centre de la map pour cible. Plutôt casse-couille comme bug.


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589449
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 17-04-2007 à 17:26:06  profilanswer
 

Maximaxou a écrit :

L'action pause unit donne un ordre avec le centre de la map pour cible. Plutôt casse-couille comme bug.


et l'unité avait quel ordre avant d'être mise en pause ?
 


---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4589456
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 17-04-2007 à 19:33:05  profilanswer
 

Maximaxou a écrit :

lol bin c'est celle la :  call IssueImmediateOrder( piece, "stop" ) (l.55)
 
Je suis kan meme obligé de mettre l'unité en pause


Pourquoi ?
L'ordre stop n'est pas plutôt un ordre sans cible ?!


Message édité par Troll-Brain le 17-04-2007 à 19:33:52

---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4589491
Maximaxou
rejoignez les fidèles du JASS
Posté le 18-04-2007 à 09:27:11  profilanswer
 

stop est bien un ordre sans cible
Pause unit provoque un ordre avec le centre de la map pour cible.
Essai avec ce trigger :

Code :
  1. teleport red
  2.     Evénements
  3.         Unité - A unit Reçoit un ordre avec point pour cible
  4.     Conditions
  5.         (Owner of (Triggering unit)) Egal à Joueur 1 (Rouge)
  6.     Actions
  7.         Unité - Move (Triggering unit) instantly to (Target point of issued order)


Si je dois mettre l'unité en pause, c'est que l'ordre stop ne fonctionne pas s'il y a pas de temps d'attente entre le moment où l'unité reçoit l'ordre de bouger.

Citation :

et l'unité avait quel ordre avant d'être mise en pause ?


Ben l'ordre qui exécute le trigger.


Message édité par Maximaxou le 18-04-2007 à 09:27:49

---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589492
Maximaxou
rejoignez les fidèles du JASS
Posté le 18-04-2007 à 09:33:50  profilanswer
 

Voici ma dernière version du trigger le plus chiant que j'ai jamais eu à réaliser :

Code :
  1. function PauseOneOfGroup takes nothing returns nothing
  2.     call PauseUnit( GetEnumUnit(), true )
  3. endfunction
  4. function Trig_player_ordering_a_move_Actions takes nothing returns nothing
  5.     local unit piece = GetTriggerUnit()
  6.     local integer ind
  7.     local integer pieceNum
  8.     local integer currentPosNum
  9.     local integer PN
  10.     local trigger trig
  11.     call PauseUnit( piece, true ) //when the move isn't allowed, to stop the unit the fastest as possible
  12.     call TriggerSleepAction( 0.1 ) //wait here in case of multi order
  13.     set trig = GetTriggeringTrigger()
  14.     call DisableTrigger( GetTriggeringTrigger())
  15.     set ind = IndClickedCase()
  16.     set pieceNum = CustVal( piece )
  17.     set currentPosNum = udg_currentPosNum[ pieceNum ]
  18.     set PN = GetPlayerId( GetOwningPlayer(piece) )
  19.     call DisplayTextToForce( GetPlayersAll(),"called" )
  20. //NumberOfUnitsSelected est définie en dessous
  21.     if ( NumberOfUnitsSelected(PN) == 1 ) and ( CanMoveTo( piece, ind ) ) then
  22.         set udg_newPosNum[ pieceNum ] = ind
  23.         call DisplayTextToForce( GetPlayersAll(), "ok move" )
  24.         set udg_movingUnit = piece
  25.         call MoveRectToLoc( udg_caseMovingToRegion, udg_caseCenter[ind] )
  26.         call TriggerExecute( gg_trg_unit_ending_a_move_refreshing )
  27.         set udg_caseMovingToInd = ind
  28.         call GroupRemoveUnit( udg_alivePieces[PN], piece )
  29.         call ForGroup( udg_alivePieces[PN], function PauseOneOfGroup )
  30.         call GroupAddUnit( udg_alivePieces[PN], piece )
  31.         call PauseUnit( piece, false )
  32.         call IssuePointOrderLoc( piece, "move", udg_caseCenter[ind] )
  33.         set udg_caseOwner[ currentPosNum ] = 2
  34.         set udg_caseOwner[ ind ] = PN
  35.         if GetPieceType( piece ) == "king" then
  36.             set udg_kingPosNum[PN] = ind
  37.         endif
  38.         set udg_currentPosNum[ CustVal(piece) ] = ind
  39.         call EnableTrigger( trig )
  40.         return
  41.     endif
  42.     //else
  43.        
  44.         call IssueImmediateOrder( piece, "stop" )
  45.         call DisableTrigger( trig )
  46.         call PauseUnit( piece, false//unpause unit
  47.         call DisplayTextToForce( GetPlayersAll(), "wrong move" )
  48.    
  49.         call EnableTrigger( trig )
  50. endfunction
  51. //===========================================================================
  52. function InitTrig_player_ordering_a_move takes nothing returns nothing
  53.     set gg_trg_player_ordering_a_move = CreateTrigger(  )
  54.     call TriggerRegisterAnyUnitEventBJ( gg_trg_player_ordering_a_move, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER )
  55.     call TriggerAddAction( gg_trg_player_ordering_a_move, function Trig_player_ordering_a_move_Actions )
  56. endfunction


Code :
  1. function NumberOfUnitsSelected takes integer PN returns integer
  2.     local integer i = 0
  3.     local group UG = GetUnitsSelectedAll(Player(PN))   
  4.    
  5.     loop
  6.         exitwhen IsUnitGroupEmptyBJ( UG )
  7.         call GroupRemoveUnit( UG, GroupPickRandomUnit(UG) )
  8.         set i = i + 1
  9.     endloop 
  10.     call DisplayTextToForce( GetPlayersAll(), "nb selected units : " + I2S(i) )
  11.     return i
  12. endfunction


    Pour cette fonction, je n'ai pas utilisé la fonction ForGroup (cad le pick every unit) car cela impliquait d'utiliser une variable entière globale. Or, étant donné que quand plusieurs unités sélectionnées reçoivent un ordre en même temps, la valeur de cet entier prend des valeurs inatendues. Ceci du au fait que la fonction est appelée plusieurs fois en un très court laps de temps.
(si je vous ai dit que c'était le trigger le plus chiant que j'ai jamais eu à réaliser, c'est pas pour rien lol)
 
 
    Je suis obligé d'attendre 0,01 seconde avant de désactiver le déclo parce que sinon, quand plusieurs unités sont sélectionnées, et qu'on donne l'ordre au groupe de se déplacer, plusieurs unités ne vont pas exécuter le déclo, et bouger normalement. Le problème est qu'il faut mettre l'unité en pause avant l'attente, sinon elle bouge. Et le problème c'est que du coup, l'action PauseUnit réexécute le déclo.


Message édité par Maximaxou le 18-04-2007 à 09:40:42

---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589495
Maximaxou
rejoignez les fidèles du JASS
Posté le 18-04-2007 à 10:54:53  profilanswer
 

Bon, le problème du PauseUnit est résolu grâce à un rustinage (je ne sais pas comment faire autrement).  

Code :
  1. function IndClickedCase takes nothing returns integer
  2.     local location clic = GetOrderPointLoc()
  3.     local integer caseCount = 8
  4.     local integer indX
  5.     local integer indY
  6.     local real X = GetLocationX(clic)
  7.     local real Y = GetLocationY(clic)
  8.     call RemoveLocation( clic )
  9.     call DisplayTextToForce( GetPlayersAll(), "orderedPoint = ( " + R2S(X) + " , " + R2S(Y) + " )" )
  10.  
  11.     if X == 0 and Y == 0 then
  12.         return -2
  13.     endif
  14.     if Y > udg_maxY or Y < udg_minY or X > udg_maxX or X < udg_minX then
  15.         return -1
  16.     endif
  17.     set indX = R2I( ( X - udg_minX ) / udg_longCase )
  18.     set indY = R2I( ( Y - udg_minY ) / udg_longCase )
  19.     return ( caseCount*indY + indX )
  20.    
  21. endfunction


Code :
  1. function Trig_player_ordering_a_move_Actions takes nothing returns nothing
  2.     local unit piece = GetTriggerUnit()
  3.     local integer ind = IndClickedCase()
  4.     local integer pieceNum
  5.     local integer currentPosNum
  6.     local integer PN
  7.     local trigger trig
  8.     if ind == -2 then
  9.         return
  10.     endif
  11.     call PauseUnit( piece, true ) //when the move isn't allowed, to stop the unit the fastest as possible
  12.     call TriggerSleepAction( 0.01 ) //wait here in case of multi order
  13.     set trig = GetTriggeringTrigger()
  14.     call DisableTrigger( trig )
  15.     set pieceNum = CustVal( piece )
  16.     set currentPosNum = udg_currentPosNum[ pieceNum ]
  17.     set PN = GetPlayerId( GetOwningPlayer(piece) )
  18.     if ( NumberOfUnitsSelected(PN) == 1 ) and ( CanMoveTo( piece, ind ) ) then
  19.         set udg_newPosNum[ pieceNum ] = ind
  20.         call DisplayTextToForce( GetPlayersAll(), "ok move" )
  21.         call GroupRemoveUnit( udg_alivePieces[PN], piece )
  22.         call ForGroup( udg_alivePieces[PN], function PauseOneOfGroup )
  23.         call GroupAddUnit( udg_alivePieces[PN], piece )
  24.         call PauseUnit( piece, false )
  25.         call IssuePointOrderLoc( piece, "move", udg_caseCenter[ind] )
  26.         if GetPieceType( piece ) == "king" then
  27.             set udg_kingPosNum[PN] = ind
  28.         endif
  29.         set udg_currentPosNum[ CustVal(piece) ] = ind
  30. /////////////ça sera à vérifier plus tard
  31.         set udg_movingUnit = piece
  32.         call MoveRectToLoc( udg_caseMovingToRegion, udg_caseCenter[ind] )
  33.         call TriggerExecute( gg_trg_unit_ending_a_move_refreshing )
  34.         set udg_caseMovingToInd = ind
  35. ///////////////////////////////
  36.         set udg_caseOwner[ currentPosNum ] = 2
  37.         set udg_caseOwner[ ind ] = PN
  38.     else
  39.        
  40.         call IssueImmediateOrder( piece, "stop" )
  41.         call PauseUnit( piece, false//unpause unit
  42.         call DisplayTextToForce( GetPlayersAll(), "wrong move" )
  43.    
  44.     endif
  45.     call EnableTrigger( trig )
  46. endfunction


Un problème persiste : lorsque l'on donne une l'ordre à une pièce de bouger dans une case où elle a le droit, elle reçoit deux fois l'ordre de se déplacer dans cette même case, donc elle ne bouge pas. Or je ne comprends absolument pas pourquoi, puisque l'action "call IssuePointOrderLoc( piece, "move", udg_caseCenter[ind] )" ne provoque pas de réexécution du déclo.
 
Afin de tests, j'ai ajouté la ligne suivante à la fonction IndClickedCase : call DisplayTextToForce( GetPlayersAll(), "orderedPoint = ( " + R2S(X) + " , " + R2S(Y) + " )" ).
 
Voici ce qui s'affiche quand on donne un ordre correct à une pièce :

Code :
  1. ordered point = <coordonnées de là où on a cliqué>
  2. ordered point = ( 0.00 , 0.00 )
  3. ok move
  4. ordered point = <coordonnées du centre de là où on a cliqué>
  5. ordered point = ( 0.00 , 0.00 )
  6. wrong move //parce l'ordi croit que la case dans laquelle on a cliqué est occupée
  7. //( à cause de la ligne suivante : set udg_caseOwner[ ind ] = PN )


Si on enlève la ligne "call IssuePointOrderLoc( piece, "move", udg_caseCenter[ind] )", voici ce qui s'affiche :

Code :
  1. ordered point = <coordonnées de là où on a cliqué>
  2. ordered point = ( 0.00 , 0.00 )
  3. ok move
  4. ordered point = <coordonnées de là où on a cliqué>
  5. ordered point = ( 0.00 , 0.00 )
  6. wrong move


Je ne comprends vraiment pas pourquoi le trigger se réexécute.  
 
edit : Est-ce que par hasard, après qu'une unité soit enlevée de sa pause, elle ne recevrait pas à nouveau l'ordre de se déplacer ?


Message édité par Maximaxou le 18-04-2007 à 11:03:36

---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589496
Maximaxou
rejoignez les fidèles du JASS
Posté le 18-04-2007 à 11:12:09  profilanswer
 

   Bon, c'était bien ça le problème. J'ai ajouté un wait après le unpause. Quant à l'histoire du 'movingUnit' (si l'unité reçoit un ordre pendant son déplacement, il doit être annulé, soit redonner à l'unité l'ordre de se déplacer dans la case), ça ne marchait pas, mais j'ai réussi à le résoudre rapidement. Voici donc le trigger final, qui marche bien (enfin :o) :

Code :
  1. function Trig_player_ordering_a_move_Actions takes nothing returns nothing
  2.     local unit piece = GetTriggerUnit()
  3.     local integer ind = IndClickedCase()
  4.     local integer pieceNum
  5.     local integer currentPosNum
  6.     local integer PN
  7.     local trigger trig
  8.     if ind == -2 or piece == udg_movingUnit then
  9.         return
  10.     endif
  11.     call PauseUnit( piece, true ) //when the move isn't allowed, to stop the unit the fastest as possible
  12.     call TriggerSleepAction( 0.01 ) //wait here in case of multi order
  13.     set trig = GetTriggeringTrigger()
  14.     call DisableTrigger( trig )
  15.     set pieceNum = CustVal( piece )
  16.     set currentPosNum = udg_currentPosNum[ pieceNum ]
  17.     set PN = GetPlayerId( GetOwningPlayer(piece) )
  18.     if ( NumberOfUnitsSelected(PN) == 1 ) and ( CanMoveTo( piece, ind ) ) then
  19.         set udg_newPosNum[ pieceNum ] = ind
  20.         call DisplayTextToForce( GetPlayersAll(), "ok move" )
  21.         call GroupRemoveUnit( udg_alivePieces[PN], piece )
  22.         call ForGroup( udg_alivePieces[PN], function PauseOneOfGroup )
  23.         call GroupAddUnit( udg_alivePieces[PN], piece )
  24.         call PauseUnit( piece, false ) //unpause unit
  25.         call TriggerSleepAction( 0.01 ) //to avoid the trigger to be reexecuted
  26.         call IssuePointOrderLoc( piece, "move", udg_caseCenter[ind] )
  27.         if GetPieceType( piece ) == "king" then
  28.             set udg_kingPosNum[PN] = ind
  29.         endif
  30.         set udg_currentPosNum[ CustVal(piece) ] = ind
  31.         set udg_movingUnit = piece
  32.         call MoveRectToLoc( udg_caseMovingToRegion, udg_caseCenter[ind] )
  33.         call TriggerExecute( gg_trg_unit_ending_a_move_refreshing )
  34.         set udg_caseMovingToInd = ind
  35.         set udg_caseOwner[ currentPosNum ] = 2
  36.         set udg_caseOwner[ ind ] = PN
  37.     else
  38.        
  39.         call IssueImmediateOrder( piece, "stop" )
  40.         call PauseUnit( piece, false//unpause unit
  41.         call DisplayTextToForce( GetPlayersAll(), "wrong move" )
  42.    
  43.     endif
  44.     call EnableTrigger( trig )
  45. endfunction


J'ai également du modifier cet autre trigger :

Code :
  1. moving unit cant be ordered
  2.     Evénements
  3.         Unité - A unit Reçoit un ordre avec point pour cible
  4.     Conditions
  5.         (Triggering unit) Egal à movingUnit
  6.     Actions
  7.         Partie - Display to (All players) the text: pa encore !
  8.         Déclencheur - Turn off (This trigger)
  9.         Déclencheur - Turn off player ordering a move <gen>
  10.         Custom script:   call IssuePointOrderLoc( GetTriggerUnit(), "move", udg_caseCenter[ udg_caseMovingToInd ] )
  11.         Déclencheur - Turn on (This trigger)
  12.         Déclencheur - Turn on player ordering a move <gen>


Je ne crois pas que warcraft III ait été prévu à la base pour empêcher les unités de bouger selon les ordres du joueur ^^.


Message édité par Maximaxou le 18-04-2007 à 11:14:58

---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589507
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 18-04-2007 à 17:01:46  profilanswer
 

Des fois j'ai l'impression de parler dans le vent avec toi Maximaxou, lis les post précédents et tu verras que j'ai dit que lorsque tu unpause une unité elle reprend l'ordre exécuté.

 

sinon ca me semblait bizzare ton histoire de centre de la map et il semblerait que lorsque tu fais :
local location Point=GetOrderPointLoc(), ca se passe par référence, ca ne créé pas de point et donc que tu unpause l'unité ton point ne fait plus référence à rien, il a pour coordonnées X/Y (0,0)

 

Pour créer un point il faut utiliser la fonction Location :

 
Code :
  1. function Trig_D__clencheur_sans_titre_001_Actions takes nothing returns nothing
  2. local location P =Location(GetLocationX(GetOrderPointLoc()),GetLocationY(GetOrderPointLoc()))
  3.      call PauseUnitBJ( true, GetTriggerUnit() )
  4.     call PauseUnitBJ( false, GetTriggerUnit() )
  5.     call SetUnitPositionLoc( GetTriggerUnit(), P )
  6. endfunction
  7. //===========================================================================
  8. function InitTrig_D__clencheur_sans_titre_001 takes nothing returns nothing
  9.     set gg_trg_D__clencheur_sans_titre_001 = CreateTrigger(  )
  10.     call TriggerRegisterAnyUnitEventBJ( gg_trg_D__clencheur_sans_titre_001, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER )
  11.     call TriggerAddAction( gg_trg_D__clencheur_sans_titre_001, function Trig_D__clencheur_sans_titre_001_Actions )
  12. endfunction
 



Message édité par Troll-Brain le 18-04-2007 à 17:02:29

---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4589522
bunk2
Posté le 19-04-2007 à 09:54:33  profilanswer
 

Projet interessant :) j'espere que tu vas t'en sortir ^^ car sa n'a vraiment pas l'air evident ! Quand ton projet aboutira je testerai.

n°4589523
Maximaxou
rejoignez les fidèles du JASS
Posté le 19-04-2007 à 11:51:37  profilanswer
 

Citation :

Des fois j'ai l'impression de parler dans le vent avec toi Maximaxou, lis les post précédents et tu verras que j'ai dit que lorsque tu unpause une unité elle reprend l'ordre exécuté.


Non c'est faux puisque j'ai trouvé en relisant les posts précédents, et donc justement le tien. Je l'avais écrit d'ailleurs mais le site a pa voulu ke je post, parce que ça oré été mon 4ieme post en moins de 10 min. Et puis g eu la flemme.
 
Sinon je vois pas l'intérêt d'utiliser la fonction location alors que l'on a le point directement.
 
Et pour pause, jte di de faire ce trigger pour tester :

Code :
  1. teleport red
  2.     Evénements
  3.         Unité - A unit Reçoit un ordre avec point pour cible
  4.     Conditions
  5.         (Owner of (Triggering unit)) Egal à Joueur 1 (Rouge)
  6.     Actions
  7.         Unité - Move (Triggering unit) instantly to (Target point of issued order)


Message édité par Maximaxou le 19-04-2007 à 11:52:21

---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589534
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 19-04-2007 à 18:34:05  profilanswer
 

bah elle se téleporte à l'endroit de l'ordre.
 
Et si il faut utiliser Location, car lorsque tu pause une unité GetOrderPointLoc() ne correspond plus à aucun point


---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4589546
Maximaxou
rejoignez les fidèles du JASS
Posté le 20-04-2007 à 06:01:43  profilanswer
 

oui et quand tu pause l'unité, elle se télporte au centre de la map...........


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589568
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 20-04-2007 à 19:24:25  profilanswer
 

Mais lol je te dis que GetOrderPointLoc() ne fait plus référence à aucun point lorsque tu pause une unité, d'où l'utilité de créer un point avec

Code :
  1. Location

comme je l'ai expliqué plus haut


---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4589578
Maximaxou
rejoignez les fidèles du JASS
Posté le 20-04-2007 à 20:23:27  profilanswer
 

Mais ça n'empêchera pas le trigger de s'exécuter... ?


---------------
Dota c'est bien, le slide c'est encore mieux !
 Page :  1  2
Page Suivante 

Aller à :
Ajouter une réponse