Inscrit le: 09 Mar 2009 Messages: 1154 Sujets: 54 Spécialité en worldedit: Croâ ?
Posté le: 26/05/11 18:16 Sujet du message: Système de random
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.
Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
Posté le: 27/05/11 16:42 Sujet du message:
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. _________________
Inscrit le: 09 Mar 2009 Messages: 1154 Sujets: 54 Spécialité en worldedit: Croâ ?
Posté le: 27/05/11 18:06 Sujet du message:
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 ^^ _________________
Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
Posté le: 27/05/11 18:35 Sujet du message:
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])". _________________
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