Worldedit
  Worldedit
Le site sur l'éditeur de warcraft 3 !
 
  FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres    Groupes d'utilisateursGroupes d'utilisateurs   medals.php?sid=9ee182b6a70b117b51b8daacdceaff3fMédailles   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 
  FAQFAQ World Editor   UploadUploader une map ou une image    UploadAjouter sa map à l'annuaire   UploadConsulter l'annuaire

Système de random

 
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Aide sur les déclencheurs
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
 rgf
Membre reconnu


Inscrit le: 09 Mar 2009
Messages: 1154
Sujets: 54
Spécialité en worldedit: Croâ ?


MessagePosté le: 26/05/11 18:16    Sujet du message: Système de random Citer

Yo ^^
Dans l'objectif de la carte pour le concours, j'essaye de faire un système qui donne trois compétences différentes aléatoirement sur les X compétences possibles (pour l'instant il y en a 13).
Les 3 compétences que l'unité qui utilise une des 13 compétences de métamorphose doit recevoir devront être différentes entre elles, et différentes de la compétence dernièrement utilisée.
J'ai donc essayé 3 méthodes différentes, la première en GUI en me basant sur un truc foireux mais qui à priori marchait, mais en fait non x)
La seconde également en GUI, mais pareil que pour la première, malheureusement je n'ai conservé aucune des deux méthodes, donc pas moyen de les corriger.
J'ai donc essayé en JASS en me disant que ça srait peut-être plus facile avec les exitwhen, du coup bah j'me suis lancé et j'ai fait ça :
Jass:
function Trig_D__clencheur_sans_titre_001_Actions takes nothing returns nothing
    local integer i = 1
    loop
        exitwhen i > 13
        if ( GetSpellAbilityId() == udg_Comptence[i] ) then
            call ReplaceUnitBJ( GetTriggerUnit(), udg_Unit_Type[i], bj_UNIT_STATE_METHOD_RELATIVE )
            call SelectUnitForPlayerSingle( GetLastReplacedUnitBJ(), GetOwningPlayer(GetLastReplacedUnitBJ()) )
            set udg_Int_Comp[0] = GetRandomInt(1, 13)
            call UnitAddAbilityBJ( udg_Comptence[udg_Int_Comp[0]], GetLastReplacedUnitBJ() )
            loop
                exitwhen udg_Int_Comp[0] != udg_Int_Comp[1] and udg_Int_Comp[0] != udg_Comptence[i]
                set udg_Int_Comp[1] = GetRandomInt(1, 13)
            endloop
            call UnitAddAbilityBJ( udg_Comptence[udg_Int_Comp[1]], GetLastReplacedUnitBJ() )
            loop
                exitwhen udg_Int_Comp[0] != udg_Int_Comp[2] and udg_Int_Comp[1] != udg_Int_Comp[2] and udg_Int_Comp[0] != udg_Comptence[i]
                set udg_Int_Comp[2] = GetRandomInt(1, 13)
            endloop
            call UnitAddAbilityBJ( udg_Comptence[udg_Int_Comp[2]], GetLastReplacedUnitBJ() )
        else
        endif
        set i = i + 1
    endloop
endfunction

//===========================================================================
function InitTrig_D__clencheur_sans_titre_001 takes nothing returns nothing
    set gg_trg_D__clencheur_sans_titre_001 = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_D__clencheur_sans_titre_001, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddAction( gg_trg_D__clencheur_sans_titre_001, function Trig_D__clencheur_sans_titre_001_Actions )
endfunction

Mais naturellement, des bugs persistent ><
Déjà, l'unité peut recevoir la compétence qu'elle vient d'utiliser, et de plus j'ai remarqué que je tombe presque tout le temps sur les mêmes compétences (Int_Comp[1], Int_Comp[2] et Int_Comp[3] reviennent assez souvent, au contraire de certaines qu'on ne voit jamais), mais je ne vois pas d'où provient le bug.

Merci d'avance ^^
_________________
Croâh ?
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 kungfu-sheep
Anomalie floodiforme


Inscrit le: 14 Avr 2011
Messages: 1846
Sujets: 119
Spécialité en worldedit: fonctions paramétriques, équation de mouvement.


MessagePosté le: 26/05/11 21:09    Sujet du message: Citer

essaye ça :
tu commences par dire que i = 13
et à la fin tu mets i = i - 1
tu changes le exit et tu fais exitwhen i < 1

si ça met la comp 11 12 et 13 le plus souvent, tu auras un indice ? (ça peut aider peut être)

si ça laisse le 1, 2, et 3 c'est qu'il y a un autre problème et ça te donnera un autre indice ?

après encore une fois j'ai pas trop compris le déclos ^^" (j'ai du mal avec le jass mais ça arrive =)) mais moi j'ferais ça pour voir juste ^^"

(si éventuellement ça marche, tant mieux Very Happy)
_________________
22:27:43<Seiraw> Bah y a deux genre de personnes
22:27:57<Seiraw> les soumis et les soumises
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
 Tirlititi



Inscrit le: 21 Fév 2010
Messages: 1785
Sujets: 22
Spécialité en worldedit: La modestie
Médailles: 1 (En savoir plus...)
Grand mage créateur de sort (Quantité : 1)

MessagePosté le: 27/05/11 16:42    Sujet du message: Citer

Il faut remplacer "udg_Int_Comp[0] != udg_Comptence[i]" par "udg_Int_Comp[0] != i".
Pour les compétences 1, 2 et 3, je dirais que c'est de la malchance. Mais je te conseille de changer de stratégie :
Jass:
function AdjustRandomNumber takes integer randomNum, integer adjustCount returns integer
    local integer i=0
    loop
        exitwhen i>=adjustCount
        if (randomNum>=udg_Int_Comp[i]) then
            set randomNum=randomNum+1
        endif
        set i=i+1
    endloop
    return randomNum
endfunction

function Trig_D__clencheur_sans_titre_001_Actions takes nothing returns nothing
    local integer i = 1
    local integer tmp
    loop
        exitwhen i > 13
        if ( GetSpellAbilityId() == udg_Comptence[i] ) then
            call ReplaceUnitBJ( GetTriggerUnit(), udg_Unit_Type[i], bj_UNIT_STATE_METHOD_RELATIVE )
            call SelectUnitForPlayerSingle( GetLastReplacedUnitBJ(), GetOwningPlayer(GetLastReplacedUnitBJ()) )
            set udg_Int_Comp[0] = i
            set tmp=AdjustRandomNumber(GetRandomInt(1, 12), 1)
            if (tmp>i) then
                set udg_Int_Comp[1] = tmp
            else
                set udg_Int_Comp[1] = i
                set udg_Int_Comp[0] = tmp
            endif
            set tmp=AdjustRandomNumber(GetRandomInt(1, 11), 2)
            if (tmp>udg_Int_Comp[1]) then
                set udg_Int_Comp[2] = tmp
            elseif (tmp>udg_Int_Comp[0]) then
                set udg_Int_Comp[2] = udg_Int_Comp[1]
                set udg_Int_Comp[1] = tmp
            else
                set udg_Int_Comp[2] = udg_Int_Comp[1]
                set udg_Int_Comp[1] = udg_Int_Comp[0]
                set udg_Int_Comp[0] = tmp
            endif
            set udg_Int_Comp[3] = AdjustRandomNumber(GetRandomInt(1, 10), 3)
            call UnitAddAbility( GetLastReplacedUnitBJ(), udg_Comptence[udg_Int_Comp[0]] )
            call UnitAddAbility( GetLastReplacedUnitBJ(), udg_Comptence[udg_Int_Comp[1]] )
            call UnitAddAbility( GetLastReplacedUnitBJ(), udg_Comptence[udg_Int_Comp[2]] )
            call UnitAddAbility( GetLastReplacedUnitBJ(), udg_Comptence[udg_Int_Comp[3]] )
            call UnitRemoveAbility( GetLastReplacedUnitBJ(), udg_Comptence[i] )
        endif
        set i = i + 1
    endloop
endfunction

//===========================================================================
function InitTrig_D__clencheur_sans_titre_001 takes nothing returns nothing
    set gg_trg_D__clencheur_sans_titre_001 = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_D__clencheur_sans_titre_001, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddAction( gg_trg_D__clencheur_sans_titre_001, function Trig_D__clencheur_sans_titre_001_Actions )
endfunction


J'ai aussi souvent dit que ReplaceUnitBJ y'en a être le mal absolu et que tu devrais le remplacer par un "call UnitAddAbility(GetTriggerUnit(), udg_Comp_Type[i])" avec les udg_Comp_Type basées sur Chaos.

J'ai pas testé le code mais, sauf si j'ai bourdé quelque part, il devrait fonctionner (le mieux étant que tu comprennes le schmilblik). EDIT : Je me suis rendu compte qu'il fallait ranger les udg_Int_Comp dans l'ordre croissant, ce qui complique un peu le code, mais c'est toujours mieux que de faire des boucles potentiellement longues.
_________________
Warcraft III, c'était mieux avant. Y'avait des purs chefs-d'oeuvres du mapping !
Road Of Glory (par moi)
Casse-briques (par moi)
Temple de Glace (par moi)
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 rgf
Membre reconnu


Inscrit le: 09 Mar 2009
Messages: 1154
Sujets: 54
Spécialité en worldedit: Croâ ?


MessagePosté le: 27/05/11 18:06    Sujet du message: Citer

J'comprends pas tout bien ^^ (J'suis pas très avancé en Jass)

Jass:
set tmp=AdjustRandomNumber(GetRandomInt(1, 11), 2)

Comment fonctionne l'appel de cette fonction ? A quoi sert le 2 ?

Jass:
Jass:
function AdjustRandomNumber takes integer randomNum, integer adjustCount returns integer
    local integer i=0
    loop
        exitwhen i>=adjustCount
        if (randomNum>=udg_Int_Comp[i]) then
            set randomNum=randomNum+1
        endif
        set i=i+1
    endloop
    return randomNum
endfunction

Ici aussi je comprends pas tout, à quel moment se termine la boucle, exitwhen i>=adjustCount je ne vois pas où est attribué la valeur de adjustCount ^^
_________________
Croâh ?
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Tirlititi



Inscrit le: 21 Fév 2010
Messages: 1785
Sujets: 22
Spécialité en worldedit: La modestie
Médailles: 1 (En savoir plus...)
Grand mage créateur de sort (Quantité : 1)

MessagePosté le: 27/05/11 18:35    Sujet du message: Citer

Les 2 questions ont la même réponse... adjustCount est le 2 passé en argument.

En gros :
tu veux choisir une compétence parmi 13 qui soit différente de celle utilisée = tu veux choisir une compétence parmi 12.
Malheureusement, l'ensemble des n° des compétences ne va pas de 1 à 12 mais est [1, 13] privé de i (ça correspond si i=13 mais pas dans le cas général). La fonction AdjustRandomNumber permet de remédier à ce problème.

Le 2 passé en argument signifie donc "Il y a 2 nombres sur lesquels je ne veux pas tomber (et qui sont stockés dans les variables udg_Int_Comp[0] et udg_Int_Comp[1])".
_________________
Warcraft III, c'était mieux avant. Y'avait des purs chefs-d'oeuvres du mapping !
Road Of Glory (par moi)
Casse-briques (par moi)
Temple de Glace (par moi)
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 rgf
Membre reconnu


Inscrit le: 09 Mar 2009
Messages: 1154
Sujets: 54
Spécialité en worldedit: Croâ ?


MessagePosté le: 28/05/11 17:02    Sujet du message: Citer

Ah ok ^^
_________________
Croâh ?
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Aide sur les déclencheurs Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com