Inscrit le: 11 Fév 2011 Messages: 2151 Sujets: 114 Spécialité en worldedit: Chasser le Dragon, puis l'exterminer proprement avec une petite cuillère et une poêle.
Posté le: 30/10/11 17:23 Sujet du message: Concours de Création de Sort F2J #1
Secret:
Je sais que les derniers concours n'ont pas été des succès, ce pourquoi je propose un type de concours qui demandent moins de travail et ce avec un nouveau style de notation nommé F2J (Free To Judge).
But du Concours :
Lors de ce concours, vous devrez créer un ou plusieurs sorts respectant le thème (ci-dessous).
Chacun des sorts présentés lors de ce concours seront notés et la meilleure production remportera le concours.
Thème :
Le thème de ce concours est "Offensif"
En gros, vous devrez faire un (ou plusieurs) sort offensif
Ce thème est large et permet ainsi de laisser une grande part à la créativité.
Des sorts ayant des effets défensifs ou supportifs, mais qui restent offensifs en général sont acceptés.
Règlement :
N'importe qui peut présenter un sort.
On peut présenter autant de sorts que l'on veut (sans en poster trois cent) tant qu'ils respectent le thème.
Tout sort présenté doit être une création de la personne l'ayant présenté.
Tout sort présenté devra avoir un nom. (en anglais ou en français)
Tout sort présenté devra être posté avec un lien valide pour accéder à la TestMap et des triggers.
Tout sort présenté devra être posté avec une description du sort.
Tout sort présenté peut être accompagné de screenshots du sort
.
N'importe qui peut juger n'importe quel sort tant que le sort jugé n'est pas une de ses créations.
Tout jugement d'une création présentée doit respecter le barème.
Tout jugement doit être neutre.
Tout jugement doit être accompagné d'explications. (pas assez de ci, trop de ça, etc...)
Tout sort présenté après la fin de la partie I du concours ne sera pas pris en compte pour le concours.
Toute note présentée après la fin du concours ne sera pas prise en compte pour le concours.
Déroulement du Concours :
Le concours se déroule en deux parties :
Partie I : Présentation des sorts[30/10 - 20/11]
Partie II : Notation des sorts[21/11 - 31/11]
Barème :
Respect du Thème : /2 Si le sort est bien un sort offensif.
Originalité du Sort : /5 Si le sort est très original, pas très original ou vu et revu.
Effets Spéciaux : /3 Si le sort est beau graphiquement ou complètement moche.
Complexité du sort : /3 Si le sort est complexe ou pas. (sans pousser à l'extrême) En gros, si le sort n'utilise aucun déclencheur, vous aurez un gros 0 dans cette ligne.
Icône : /2 L'icône choisie doit correspondre au sort.
Descriptions du Sort : /3 Le sort doit être accompagné d'une description potable qui explique bien ce que fait le sort.
Instanciabilité : /2 0 : Rien / 1 : MPI / 2 : MUI
Rigueur du codage / Autres remarques : -2 / -1 / 0 / +1 / +2 (justification obligée) Des leaks ou des bugs peuvent être comptées comme malus. Un très bon codage peut être compté comme bonus.
Sorts présentés :
Charge par Vladadamm[GUI/MUI]
Secret:
Juste un simple sort de charge MUI et GUI.
Description du sort : Le héros charge vers la cible, l’assommant pendant 3/4/5 secondes et lui infligeant 80/160/240 dommages sur le choc de la collision.
Infos supp :
Lors de la charge, le héros peut traverser les autres unités.
La charge s'arrête si :
Le héros meurt.
La cible du sort meurt.
La cible du sort devient invisible. (et que le joueur controllant le héros n'a pas de détection d'invisible)
La cible du sort devient invulnérable/invulnérable à la magie.
La cible du sort passe dans le brouillard de guerre.
Déclencheurs :
Secret:
Gui:
Trigger:
Charge init
Evénements
Map initialization
Conditions
Actions
Table de hachage - Create a hashtable Set Charge_Hash = (Last created hashtable)
Gui:
Trigger:
Charge cast
Evénements
Unité - A unit Initie l'effet d'une compétence
Conditions
(Ability being cast) Egal à Charge
Actions
Groupe unité - Add (Triggering unit) to Charge_Casters Table de hachage - Save Handle Of(Target unit of ability being cast) as 0 of (Key (Triggering unit)) in Charge_Hash Unité - Turn collision for (Triggering unit) Off Déclencheur - Turn on Charge loop <gen> Déclencheur - Turn on Charge follow remove <gen>
Gui:
Trigger:
Charge loop
Evénements
Temps - Every 0.04 seconds of game time
Conditions
Actions
Groupe unité - Pick every unit in Charge_Casters and do (Actions)
Boucle - Actions
Set Charge_Point = (Position of (Picked unit)) Set Charge_Point2 = (Position of (Load 0 of (Key (Picked unit)) in Charge_Hash))
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
(Distance between Charge_Point and Charge_Point2) Supérieur à 75.00
Alors - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
((Load 0 of (Key (Picked unit)) in Charge_Hash) is Insensible à la magie) Egal à FALSE ((Load 0 of (Key (Picked unit)) in Charge_Hash) has buff Invulnérable) Egal à FALSE ((Load 0 of (Key (Picked unit)) in Charge_Hash) is dead) Egal à FALSE ((Picked unit) is dead) Egal à FALSE ((Load 0 of (Key (Picked unit)) in Charge_Hash) is hidden) Egal à FALSE ((Load 0 of (Key (Picked unit)) in Charge_Hash) is visible to (Owner of (Picked unit))) Egal à TRUE ((Load 0 of (Key (Picked unit)) in Charge_Hash) is fogged to (Owner of (Picked unit))) Egal à FALSE ((Load 0 of (Key (Picked unit)) in Charge_Hash) is masked to (Owner of (Picked unit))) Egal à FALSE
Alors - Actions
Set Charge_Point3 = (Charge_Point offset by 18.00 towards (Angle from Charge_Point to Charge_Point2) degrees) Unité - Move (Picked unit) instantly to Charge_Point3, facing Charge_Point2 Unité - Create 1 Charge Following for (Owner of (Picked unit)) at Charge_Point facing (Facing of (Picked unit)) degrees Groupe unité - Add (Last created unit) to Charge_Following Animation - Change (Last created unit) flying height to 0.00 at 1000.00 Unité - Add a 0.24 second Générique expiration timer to (Last created unit) Custom script: call RemoveLocation( udg_Charge_Point3 )
Sinon - Actions
Unité - Turn collision for (Picked unit) On Groupe unité - Remove (Picked unit) from Charge_Casters Table de hachage - Clear all child hashtables of child (Key (Picked unit)) in Charge_Hash
Sinon - Actions
Unité - Turn collision for (Picked unit) On Groupe unité - Remove (Picked unit) from Charge_Casters Unité - Create 1 Charge Dummy for (Owner of (Picked unit)) at Charge_Point2 facing Charge_Point2 Unité - Set level of Charge Stun + Damages for (Last created unit) to (Level of Charge for (Picked unit)) Unité - Order (Last created unit) to Roi de la montagne humain - Boule de foudre (Load 0 of (Key (Picked unit)) in Charge_Hash) Unité - Add a 1.00 second Générique expiration timer to (Last created unit) Unité - Order (Picked unit) to Attaquer (Load 0 of (Key (Picked unit)) in Charge_Hash) Table de hachage - Clear all child hashtables of child (Key (Picked unit)) in Charge_Hash
Groupe unité - Pick every unit in Charge_Following and do (Actions)
Boucle - Actions
Unité - Set the custom value of (Picked unit) to ((Custom value of (Picked unit)) + 1) Animation - Change (Picked unit)'s vertex coloring to (100.00%, 100.00%, 100.00%) with ((Real((Custom value of (Picked unit)))) x 16.66)% transparency
Gui:
Trigger:
Charge follow remove
Evénements
Unité - A unit Meurt
Conditions
(Unit-type of (Triggering unit)) Egal à Charge Following
Actions
Groupe unité - Remove (Triggering unit) from Charge_Following Unité - Remove (Triggering unit) from the game
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
(Charge_Following is empty) Egal à TRUE
Alors - Actions
Déclencheur - Turn off (This trigger) Déclencheur - Turn off Charge loop <gen>
Quelque chose de plus original que sa précedente création, et ce toujours en GUI et en MUI.
Description du sort : L'Illusionniste crée une illusion de lui-même qui reproduit son attaque. Cette illusion infliger 100% des dégâts du héros. Fonctionne tout les 8/6/4 attaques.
Infos supp :
Le héros-mirroir possède les mêmes caractéristiques et orbs effects que le héros normal.
Le héros-mirroir est crée à l'opposé du héros par rapport à la cible de l'attaque.
Déclencheurs :
Secret:
Gui:
Trigger:
Mirror Attack init
Evénements
Map initialization
Conditions
Actions
Table de hachage - Create a hashtable Set MA_Hash = (Last created hashtable)
Gui:
Trigger:
Mirror Attack learn
Evénements
Unité - A unit Apprend une compétence
Conditions
(Learned Hero Skill) Egal à Attaque Mirroir
Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
(Learned skill level) Egal à 1
Alors - Actions
Table de hachage - Save 0 as 0 of (Key (Triggering unit)) in MA_Hash Groupe unité - Add (Triggering unit) to MA_UGroup
Sinon - Actions
Gui:
Trigger:
Mirror Attack loop
Evénements
Unité - A unit Est attaqué
Conditions
((Attacking unit) is in MA_UGroup) Egal à TRUE
Actions
Table de hachage - Save ((Load 0 of (Key (Attacking unit)) from MA_Hash) + 1) as 0 of (Key (Attacking unit)) in MA_Hash
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
(Load 0 of (Key (Attacking unit)) from MA_Hash) Supérieur ou égal à (10 - (2 x (Level of Attaque Mirroir for (Attacking unit))))
Alors - Actions
Table de hachage - Save 0 as 0 of (Key (Attacking unit)) in MA_Hash Set MA_Point = (Position of (Attacking unit)) Set MA_Point2 = (Position of (Triggering unit)) Set MA_Point3 = (MA_Point2 offset by (Distance between MA_Point and MA_Point2) towards (Angle from MA_Point to MA_Point2) degrees) Unité - Create 1 Estinnoisulli ( MA Dummy ) for (Owner of (Attacking unit)) at MA_Point3 facing MA_Point2 Set MA_Dummy = (Last created unit) Table de hachage - Save (Key (Attacking unit)) as 0 of (Key (Last created unit)) in MA_Hash Unité - Move MA_Dummy instantly to MA_Point3, facing MA_Point2 Animation - Change MA_Dummy flying height to 0.00 at 1000.00 Animation - Change MA_Dummy's vertex coloring to (100.00%, 100.00%, 100.00%) with 30.00% transparency Héros - Set MA_Dummy Hero-level to (Hero level of (Attacking unit)), Masquer level-up graphics Unité - Set the custom value of MA_Dummy to 0
For each (Integer A) from 1 to 6, do (Actions)
Boucle - Actions
Héros - Create (Item-type of (Item carried by (Attacking unit) in slot (Integer A))) and give it to MA_Dummy
Unité - Order MA_Dummy to Attaque une fois (Triggering unit) Unité - Add a 3.00 second Générique expiration timer to MA_Dummy
Sinon - Actions
Gui:
Trigger:
Mirror Attack dummy remove
Evénements
Unité - A unit Est attaqué
Conditions
(Unit-type of (Attacking unit)) Egal à Estinnoisulli ( MA Dummy )
Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
(Custom value of (Attacking unit)) Egal à 0
Alors - Actions
Unité - Set the custom value of (Attacking unit) to 1
Sinon - Actions
Héros - Add (Hero experience of (Attacking unit)) experience to (Load 0 of (Key (Attacking unit)) in MA_Hash), Montrer level-up graphics Table de hachage - Clear all child hashtables of child (Key (Attacking unit)) in MA_Hash Unité - Remove (Attacking unit) from the game
Gui:
Trigger:
Mirror Attack dummy remove 2
Evénements
Unité - A unit Meurt
Conditions
(Unit-type of (Triggering unit)) Egal à Estinnoisulli ( MA Dummy )
Actions
Héros - Add (Hero experience of (Triggering unit)) experience to (Load 0 of (Key (Triggering unit)) in MA_Hash), Montrer level-up graphics Table de hachage - Clear all child hashtables of child (Key (Triggering unit)) in MA_Hash Unité - Remove (Triggering unit) from the game
Description du sort : Invoque un Temple de Glace qui gèle les unités ennemies devant le héros et leur inflige des dommages. À la fin du sort, le héros relâche une nova de glace qui détruit le temple tout en infligeant d'autres dégâts. Les unités affectées restent ralenties pendant quelques secondes. La zone d'effet augmente avec les niveaux. |n|n|cffffcc00niveau 1|r - 20 dommages par secondes pendant 1.5 seconde maximum et 80 dommages finaux. |n|cffffcc00niveau 2|r - 25 dommages par secondes pendant 2.5 secondes maximum et 120 dommages finaux.|n|cffffcc00niveau 3|r - 30 dommages par secondes pendant 3 secondes maximum et 180 dommages finaux.
Infos supp : Le lanceur est invulnérable et incontrôlable pendant toute la durée du sort.
Le sort prend en compte le dénivelé du terrain et possède une hauteur maximale au-dessus de laquelle les unités ne sont pas affectées (certaines unités volantes, par exemple).
À la fin du sort, le lanceur se retrouve au milieu du temple et des ennemis touchés.
Script :
Secret:
Jass:
scope IceTemple initializer Init
// This spell assume that the spell "Raven form" ('Amrf') and the destructable "Large pathing blocker both" ('YTfc')
// are not modified too much.
// It may be asynchronous as far as GetLocationZ is. However, a slight difference will unlikely trigger a real problem.
globals
private constant integer SPELL_ID = 'A000' // The castable spell
private constant integer NOVA_ID = 'A001' // A Frost Nova for dummy, dealing the ending damages ; it should have as many levels as the main spell
private constant integer DUMMY_TEMPLE_ID = 'n000' // The Id of the Temple dummy
private constant integer DUMMY_ID = 'n001' // A dummy Id for casting Frost Novas
private constant integer DUMMY_DROP_ID = 'n002' // The Id of the Drop dummy
private constant real TIMEOUT = 0.04
private constant real MAXHEIGHT = 175 // The height doesn't depend on the model's scale
private constant real MODELSCALEFACTOR = 1.18 // ModelScale = SpellRadius * MODELSCALEFACTOR / 450
private constant real NOVARADIUSFACTOR = 1.3 // NovaRadius = SpellRadius * NOVARADIUSFACTOR
private location LOCZ = Location ( 0, 0 )
private hashtable THEHASH
sound SubmergeSound
private real array FrozenDamages // Over-time damages when frozen
private real array ExtraDuration // Time spent to freeze units
private real array FreezeTimeout // Delay between 2 freezing
private real array SpellRadius // Freeze radius ; the spell looks bad if this value is too far from 380
endglobals
function GetPointZ takes real x, real y returns real
call MoveLocation(LOCZ,x,y)
return GetLocationZ(LOCZ)
endfunction
function RemoveUnitAfterWaitCallback takes nothing returns nothing
local timer t=GetExpiredTimer()
call RemoveUnit(LoadUnitHandle(THEHASH,GetHandleId(t),0))
call FlushChildHashtable(THEHASH,GetHandleId(t))
call DestroyTimer(t)
set t=null
endfunction
function RemoveUnitAfterWait takes unit whichUnit, real wait returns nothing
local timer t=CreateTimer()
call SaveUnitHandle(THEHASH,GetHandleId(t),0,whichUnit)
call TimerStart(t,wait,false,function RemoveUnitAfterWaitCallback)
set t=null
endfunction
private function PauseUnitSafeCallback takes nothing returns nothing
local timer t=GetExpiredTimer()
local unit u=LoadUnitHandle(THEHASH,GetHandleId(t),0)
call PauseUnit(u,true)
call SetUnitX(u,LoadReal(THEHASH,GetHandleId(t),1))
call SetUnitY(u,LoadReal(THEHASH,GetHandleId(t),2))
call SetUnitAnimation(u,"stand victory")
call QueueUnitAnimation(u,"stand victory")
call FlushChildHashtable(THEHASH,GetHandleId(t))
call DestroyTimer(t)
set t=null
set u=null
endfunction
private function PauseUnitSafe takes unit whichUnit returns nothing
local timer t=CreateTimer()
call SaveUnitHandle(THEHASH,GetHandleId(t),0,whichUnit)
call SaveReal(THEHASH,GetHandleId(t),1,GetUnitX(whichUnit))
call SaveReal(THEHASH,GetHandleId(t),2,GetUnitY(whichUnit))
call TimerStart(t,0,false,function PauseUnitSafeCallback)
set t=null
endfunction
private function TrapFilter takes nothing returns boolean
local unit u=GetFilterUnit()
local boolean b=IsUnitEnemy(bj_lastCreatedUnit,GetOwningPlayer(u)) /*
*/ and GetUnitState(u,UNIT_STATE_LIFE)>0.405 /*
*/ and GetPointZ(GetUnitX(u),GetUnitY(u))+GetUnitFlyHeight(u)<=bj_lastTransmissionDuration /*
*/ and not(IsUnitInGroup(u,bj_lastCreatedGroup)) /*
*/ and not(IsUnitType(u,UNIT_TYPE_STRUCTURE)) /*
*/ and not(IsUnitType(u,UNIT_TYPE_MAGIC_IMMUNE))
set u=null
return b
endfunction
private function FinalDamagesFilter takes nothing returns boolean
local unit u=GetFilterUnit()
local boolean b=IsUnitEnemy(bj_lastCreatedUnit,GetOwningPlayer(u)) /*
*/ and GetUnitState(u,UNIT_STATE_LIFE)>0.405 /*
*/ and GetPointZ(GetUnitX(u),GetUnitY(u))+GetUnitFlyHeight(u)<=bj_lastTransmissionDuration /*
*/ and not(IsUnitInGroup(u,bj_randomSubGroupGroup)) /*
*/ and not(IsUnitType(u,UNIT_TYPE_STRUCTURE)) /*
*/ and not(IsUnitType(u,UNIT_TYPE_MAGIC_IMMUNE))
set u=null
return b
endfunction
private function ClearMainDatas takes timer t returns nothing
local integer Id=GetHandleId(t)
call RemoveUnitAfterWait(LoadUnitHandle(THEHASH,Id,2),2)
call DestroyGroup(LoadGroupHandle(THEHASH,Id,5))
call DestroyGroup(LoadGroupHandle(THEHASH,Id,6))
call RemoveDestructable(LoadDestructableHandle(THEHASH,Id,10))
call RemoveDestructable(LoadDestructableHandle(THEHASH,Id,11))
call RemoveDestructable(LoadDestructableHandle(THEHASH,Id,12))
call RemoveDestructable(LoadDestructableHandle(THEHASH,Id,13))
call FlushChildHashtable(THEHASH,Id)
call DestroyTimer(t)
endfunction
private function FinalDamagesEnum takes nothing returns nothing
local unit target=GetEnumUnit()
local unit dummy=CreateUnit(GetOwningPlayer(LoadUnitHandle(THEHASH,GetHandleId(GetExpiredTimer()),0)),DUMMY_ID,GetUnitX(target),GetUnitY(target),0)
local timer t
if (IsUnitInGroup(target,bj_lastCreatedGroup)) then
set t=LoadTimerHandle(THEHASH,GetHandleId(GetExpiredTimer()),GetHandleId(target))
call PauseUnit(target,false)
call SetUnitTimeScale(target,1)
call GroupRemoveUnit(bj_lastCreatedGroup,target)
call RemoveUnit(LoadUnitHandle(THEHASH,GetHandleId(t),2))
call DestroyEffect(LoadEffectHandle(THEHASH,GetHandleId(t),4))
call FlushChildHashtable(THEHASH,GetHandleId(t))
call DestroyTimer(t)
set t=null
endif
call UnitAddAbility(dummy,NOVA_ID)
call IssueTargetOrder(dummy,"frostnova",target)
call RemoveUnitAfterWait(dummy,1)
call GroupAddUnit(bj_randomSubGroupGroup,target)
set target=null
set dummy=null
endfunction
private function FinalDamages takes nothing returns nothing
local integer Id=GetHandleId(GetExpiredTimer())
local real timeleft=LoadReal(THEHASH,Id,4)-TIMEOUT
local group g=CreateGroup()
call SaveReal(THEHASH,Id,4,timeleft)
set bj_randomSubGroupGroup=LoadGroupHandle(THEHASH,Id,6)
set bj_lastCreatedGroup=LoadGroupHandle(THEHASH,Id,5)
set bj_lastTransmissionDuration=LoadReal(THEHASH,Id,3)+MAXHEIGHT
set bj_lastCreatedUnit=LoadUnitHandle(THEHASH,Id,0)
call GroupEnumUnitsInRange(g,GetUnitX(LoadUnitHandle(THEHASH,Id,2)),GetUnitY(LoadUnitHandle(THEHASH,Id,2)),(1-timeleft/1.4)*SpellRadius[LoadInteger(THEHASH,Id,1)]*NOVARADIUSFACTOR,Filter(function FinalDamagesFilter))
call ForGroup(g,function FinalDamagesEnum)
call DestroyGroup(g)
set g=null
if (timeleft<=0) then
call ForGroup(bj_lastCreatedGroup,function FinalDamagesEnum)
call ClearMainDatas(GetExpiredTimer())
endif
endfunction
private function FinalMove takes nothing returns nothing
local integer Id=GetHandleId(GetExpiredTimer())
local unit caster=LoadUnitHandle(THEHASH,Id,0)
local real x=GetUnitX(caster)
local real y=GetUnitY(caster)
local real facing=GetUnitFacing(caster)
local real speedfactor=SpellRadius[LoadInteger(THEHASH,Id,1)]*MODELSCALEFACTOR/450
local real timeleft=LoadReal(THEHASH,Id,4)-TIMEOUT
call SaveReal(THEHASH,Id,4,timeleft)
if (timeleft>=0.78) then
if (timeleft>=2) then
call SaveReal(THEHASH,Id,4,1.04)
call TimerStart(GetExpiredTimer(),TIMEOUT,true,function FinalMove)
return
endif
call SetUnitX(caster,x+770*speedfactor*TIMEOUT*CosBJ(facing))
call SetUnitY(caster,y+770*speedfactor*TIMEOUT*SinBJ(facing))
call SetUnitFlyHeight(caster,280+LoadReal(THEHASH,Id,3)-GetPointZ(x,y)+(1.04-timeleft)*231*speedfactor,0)
elseif (timeleft>=0.52) then
call SetUnitTimeScale(caster,1)
call SetUnitX(caster,x+461*speedfactor*TIMEOUT*CosBJ(facing))
call SetUnitY(caster,y+461*speedfactor*TIMEOUT*SinBJ(facing))
call SetUnitFlyHeight(caster,280+LoadReal(THEHASH,Id,3)-GetPointZ(x,y)+(240-timeleft*231)*speedfactor,0)
elseif (timeleft>=0.26) then
call SetUnitX(caster,x+309*speedfactor*TIMEOUT*CosBJ(facing))
call SetUnitY(caster,y+309*speedfactor*TIMEOUT*SinBJ(facing))
call SetUnitFlyHeight(caster,280+LoadReal(THEHASH,Id,3)-GetPointZ(x,y)+(timeleft*77+80)*speedfactor,0)
elseif (timeleft>=0) then
call SetUnitX(caster,x+193*speedfactor*TIMEOUT*CosBJ(facing))
call SetUnitY(caster,y+193*speedfactor*TIMEOUT*SinBJ(facing))
call SetUnitFlyHeight(caster,280+LoadReal(THEHASH,Id,3)-GetPointZ(x,y)+(timeleft*461-20)*speedfactor,0)
elseif (timeleft>-0.4) then
call SetUnitFlyHeight(caster,280+LoadReal(THEHASH,Id,3)-GetPointZ(x,y)+timeleft*650,0)
else
call SetUnitFlyHeight(caster,0,0)
call PauseUnit(caster,false)
call SetUnitInvulnerable(caster,false)
call SetUnitPosition(caster,x,y)
call SaveReal(THEHASH,Id,4,1.4)
call SaveGroupHandle(THEHASH,Id,6,CreateGroup())
call TimerStart(GetExpiredTimer(),TIMEOUT,true,function FinalDamages)
endif
set caster=null
endfunction
private function StartFinal takes nothing returns nothing
local integer Id=GetHandleId(GetExpiredTimer())
local unit caster=LoadUnitHandle(THEHASH,Id,0)
call SetUnitAnimation(caster,"attack")
call QueueUnitAnimation(caster,"stand")
call SetUnitTimeScale(caster,0.5)
call SetUnitAnimation(LoadUnitHandle(THEHASH,Id,2),"death")
call FlushChildHashtable(THEHASH,GetHandleId(LoadTimerHandle(THEHASH,Id,6)))
call DestroyTimer(LoadTimerHandle(THEHASH,Id,6))
call SaveReal(THEHASH,Id,4,3)
call TimerStart(GetExpiredTimer(),1.26,false,function FinalMove)
endfunction
private function TrapUnitLoop takes nothing returns nothing
local integer Id=GetHandleId(GetExpiredTimer())
local integer Idm=LoadInteger(THEHASH,Id,0)
local unit target=LoadUnitHandle(THEHASH,Id,1)
local real x
local real y
if (LoadBoolean(THEHASH,Id,3)) then
set x=GetUnitX(LoadUnitHandle(THEHASH,Id,2))-GetUnitX(target)
set y=GetUnitY(LoadUnitHandle(THEHASH,Id,2))-GetUnitY(target)
if (x*x+y*y<=90000) then
call SaveBoolean(THEHASH,Id,3,false)
call PauseUnit(target,true)
call SetUnitTimeScale(target,0)
call TimerStart(GetExpiredTimer(),TIMEOUT,true,function TrapUnitLoop)
else
call DestroyEffect(LoadEffectHandle(THEHASH,Id,4))
call RemoveUnit(LoadUnitHandle(THEHASH,Id,2))
call GroupRemoveUnit(LoadGroupHandle(THEHASH,Idm,5),target)
call FlushChildHashtable(THEHASH,Id)
call DestroyTimer(GetExpiredTimer())
endif
elseif (GetUnitState(target,UNIT_STATE_LIFE)>FrozenDamages[LoadInteger(THEHASH,Idm,1)]*2) then
call UnitDamageTarget(LoadUnitHandle(THEHASH,Idm,0),target,FrozenDamages[LoadInteger(THEHASH,Idm,1)],true,false,ATTACK_TYPE_MAGIC,DAMAGE_TYPE_UNIVERSAL,WEAPON_TYPE_WHOKNOWS)
endif
set target=null
endfunction
private function TrapUnit takes nothing returns nothing
local integer Id=LoadInteger(THEHASH,GetHandleId(GetExpiredTimer()),0)
local group g=CreateGroup()
local unit target
local real x
local real y
local unit drop
local timer t
set bj_lastCreatedGroup=LoadGroupHandle(THEHASH,Id,5)
set bj_lastTransmissionDuration=LoadReal(THEHASH,Id,3)+MAXHEIGHT
set bj_lastCreatedUnit=LoadUnitHandle(THEHASH,Id,0)
call GroupEnumUnitsInRange(g,GetUnitX(LoadUnitHandle(THEHASH,Id,2)),GetUnitY(LoadUnitHandle(THEHASH,Id,2)),SpellRadius[LoadInteger(THEHASH,Id,1)],Filter(function TrapFilter))
set target=FirstOfGroup(g)
if (target!=null) then
set x=GetUnitX(target)
set y=GetUnitY(target)
call GroupAddUnit(bj_lastCreatedGroup,target)
call SetSoundPosition(SubmergeSound,x,y,200)
call StartSound(SubmergeSound)
set drop=CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE),DUMMY_DROP_ID,x,y,0)
call UnitAddAbility(drop,'Amrf')
call UnitRemoveAbility(drop,'Amrf')
call SetUnitX(drop,x)
call SetUnitY(drop,y)
call SetUnitFlyHeight(drop,bj_lastTransmissionDuration-MAXHEIGHT-GetPointZ(x,y),0)
call SetUnitAnimation(drop,"death")
set t=CreateTimer()
call SaveInteger(THEHASH,GetHandleId(t),0,Id)
call SaveUnitHandle(THEHASH,GetHandleId(t),1,target)
call SaveUnitHandle(THEHASH,GetHandleId(t),2,drop)
call SaveBoolean(THEHASH,GetHandleId(t),3,true)
call SaveTimerHandle(THEHASH,Id,GetHandleId(target),t)
call TimerStart(t,0.4,false,function TrapUnit2)
set t=null
set drop=null
set target=null
endif
call DestroyGroup(g)
set g=null
endfunction
private function StartFreezing takes nothing returns nothing
local timer t=CreateTimer()
local integer Id=GetHandleId(GetExpiredTimer())
local integer level=LoadInteger(THEHASH,Id,1)
call SaveGroupHandle(THEHASH,Id,5,CreateGroup())
call SaveTimerHandle(THEHASH,Id,6,t)
call SaveInteger(THEHASH,GetHandleId(t),0,Id)
call TimerStart(t,FreezeTimeout[level],true,function TrapUnit)
call TimerStart(GetExpiredTimer(),ExtraDuration[level],false,function StartFinal)
set t=null
endfunction
private function MoveHeroTop takes nothing returns nothing
local integer Id=GetHandleId(GetExpiredTimer())
local unit caster=LoadUnitHandle(THEHASH,Id,0)
local real factor=SpellRadius[LoadInteger(THEHASH,Id,1)]*MODELSCALEFACTOR/450
local real timeleft=LoadReal(THEHASH,Id,4)-TIMEOUT
call SetUnitFlyHeight(caster,RMaxBJ(0,280+LoadReal(THEHASH,Id,3)-GetPointZ(GetUnitX(caster),GetUnitY(caster))-timeleft*200*factor),0)
if (timeleft>0) then
call SaveReal(THEHASH,Id,4,timeleft)
else
call SetUnitAnimation(caster,"spell")
call QueueUnitAnimation(caster,"spell")
call QueueUnitAnimation(caster,"spell")
call TimerStart(GetExpiredTimer(),1.8,false,function StartFreezing)
endif
set caster=null
endfunction
private function CreateTemple takes unit caster, integer level returns nothing
local timer t=CreateTimer()
local integer Id=GetHandleId(t)
local real angle=GetUnitFacing(caster)
local real ux=GetUnitX(caster)
local real uy=GetUnitY(caster)
local real radius=SpellRadius[level]*MODELSCALEFACTOR
local real x=ux+radius*CosBJ(angle)
local real y=uy+radius*SinBJ(angle)
local unit temple=CreateUnit(GetOwningPlayer(caster),DUMMY_TEMPLE_ID,x,y,angle+180)
call UnitAddAbility(temple,'Amrf')
call UnitRemoveAbility(temple,'Amrf')
call SetUnitX(temple,x)
call SetUnitY(temple,y)
call SetUnitFlyHeight(temple,260,0)
call SetUnitScale(temple,radius/450,1,1)
call SetUnitAnimation(temple,"birth")
call SetUnitInvulnerable(caster,true)
call PauseUnitSafe(caster)
call UnitAddAbility(caster,'Amrf')
call UnitRemoveAbility(caster,'Amrf')
call SaveUnitHandle(THEHASH,Id,0,caster)
call SaveInteger(THEHASH,Id,1,level)
call SaveUnitHandle(THEHASH,Id,2,temple)
call SaveReal(THEHASH,Id,3,GetPointZ(x,y))
call SaveReal(THEHASH,Id,4,2)
call SaveDestructableHandle(THEHASH,Id,10,CreateDestructable('YTfc',ux,uy,0,1,0))
call SaveDestructableHandle(THEHASH,Id,11,CreateDestructable('YTfc',x+radius*CosBJ(angle),y+radius*SinBJ(angle),0,1,0))
call SaveDestructableHandle(THEHASH,Id,12,CreateDestructable('YTfc',x+radius*CosBJ(angle+90),y+radius*SinBJ(angle+90),0,1,0))
call SaveDestructableHandle(THEHASH,Id,13,CreateDestructable('YTfc',x+radius*CosBJ(angle-90),y+radius*SinBJ(angle-90),0,1,0))
call TimerStart(t,TIMEOUT,true,function MoveHeroTop)
set temple=null
set t=null
endfunction
private function CastingFilter takes nothing returns boolean
if GetSpellAbilityId()==SPELL_ID then
call CreateTemple(GetTriggerUnit(),GetUnitAbilityLevel(GetTriggerUnit(),SPELL_ID))
endif
return false
endfunction
// You can use a custom hashtable here instead of creating a new one. The spell doesn't use unit's Ids.
set THEHASH = InitHashtable()
// Set the datas. Final damages and slow are supposed to be in the "NOVA_ID" spell.
set FrozenDamages[1] = TIMEOUT * 20
set ExtraDuration[1] = 1.5
set FreezeTimeout[1] = 0.25
set SpellRadius[1] = 300
set FrozenDamages[2] = TIMEOUT * 25
set ExtraDuration[2] = 2.5
set FreezeTimeout[2] = 0.25
set SpellRadius[2] = 380
set FrozenDamages[3] = TIMEOUT * 30
set ExtraDuration[3] = 3
set FreezeTimeout[3] = 0.25
set SpellRadius[3] = 460
endfunction
Inscrit le: 11 Fév 2011 Messages: 2151 Sujets: 114 Spécialité en worldedit: Chasser le Dragon, puis l'exterminer proprement avec une petite cuillère et une poêle.
Posté le: 30/10/11 20:59 Sujet du message:
Pour ma part, je suis déjà parti sur une chaîne de poison. Me manque plus qu'à faire quelques améliorations sur l'utilisation des hashtables, et ça sera fini avec ma première création ^^
Je pense que j'en ferai plusieurs. _________________
Inscrit le: 11 Fév 2011 Messages: 2151 Sujets: 114 Spécialité en worldedit: Chasser le Dragon, puis l'exterminer proprement avec une petite cuillère et une poêle.
Posté le: 01/11/11 21:43 Sujet du message:
Bon, j'ai fini mon premier sort : Charge.
Un simple sort de charge en GUI et MUI.
J'ai renoncé à ma chaîne de poison car j'ai dû la recommencer 2/3fois suite à des crashs PC et/ou WE. (et donc flemme de tout refaire)
Aussi, je tiens à dire pour les membres récents qui hésitent à participer que ce concours n'est pas vraiment un concours qui favorise le niveau dans l'éditeur, mais plutôt les idées et la persévérance pour mettre en œuvre cette idée. _________________
Inscrit le: 11 Mar 2011 Messages: 245 Sujets: 9 Spécialité en worldedit: rien... j'apprends
Posté le: 02/11/11 17:27 Sujet du message:
Je ne vais pas participer a ce concours sauf cas exceptionnelle ... Car j'attends le concours héros ( pour moi identique mais avec des ajouts donc mieux ). _________________
Inscrit le: 11 Fév 2011 Messages: 2151 Sujets: 114 Spécialité en worldedit: Chasser le Dragon, puis l'exterminer proprement avec une petite cuillère et une poêle.
Posté le: 02/11/11 21:20 Sujet du message:
Brainlessbob a écrit:
Je ne vais pas participer a ce concours sauf cas exceptionnelle ... Car j'attends le concours héros ( pour moi identique mais avec des ajouts donc mieux ).
Je pense pas qu'il y en aura. Ce concours sera sûrement le dernier. War3 meurt et le forum en même-temps. _________________
Non, Warcraft sera toujours la...
On est toujours 50 milles sur Northrend ( ou sur tout le B.Net ? )
Je sais que sa peut paraitre un peu con de dire ca après tant de temps mais moi j'aime ce jeu et je ne vais pas l'oublier si vite même si defois je prend des pauses.
Et c'est pas en parlant comme ca que les choses s'amélioront :/
La preuve : les anciens disaient que le fofo serait mort en 2010
Warcraft a encore des choses a nous offrir, ne le laissons pas tomber _________________
Inscrit le: 11 Fév 2011 Messages: 2151 Sujets: 114 Spécialité en worldedit: Chasser le Dragon, puis l'exterminer proprement avec une petite cuillère et une poêle.
Posté le: 03/11/11 13:03 Sujet du message:
Wareditor a écrit:
Non, Warcraft sera toujours la...
On est toujours 50 milles sur Northrend ( ou sur tout le B.Net ? )
Je sais que sa peut paraitre un peu con de dire ca après tant de temps mais moi j'aime ce jeu et je ne vais pas l'oublier si vite même si defois je prend des pauses.
Et c'est pas en parlant comme ca que les choses s'amélioront :/
La preuve : les anciens disaient que le fofo serait mort en 2010
Warcraft a encore des choses a nous offrir, ne le laissons pas tomber
Et 250 000sur les plateformes passant par réseau local ^^
Mais déjà, regarde comment se sont passés le dernier concours, 2participants dont un n'a pas fini sa carte.
Je suis d'accord que war3 va rester, mais le forum est quand même bien moins actif qu'avant. Ce pour quoi je favoriserai les concours qui ne nécessiteront pas beaucoup de travail (contrairement au concours de mini-map).
War3 a déjà tenu 8ans et peut bien tenir 2ans de plus ^^
Sinon, revenons sur le sujet du concours. _________________
Inscrit le: 11 Fév 2011 Messages: 2151 Sujets: 114 Spécialité en worldedit: Chasser le Dragon, puis l'exterminer proprement avec une petite cuillère et une poêle.
Posté le: 05/11/11 15:26 Sujet du message:
5jours que le concours a commencé et toujours aucun autre sort que ma charge. _________________
Posté le: 05/11/11 17:16 Sujet du message: Concours
Bah moi je vais m'inscrire au concours mais j'aimerais savoir si on peut mettre les sorts sur des unités simples (pas des heros) ? Pck la je viens d'avoir quelques idées mais des idées pour des unités non-héros...
Ah oui et Vlad tu penses ca vaut le coup que je mettes le sort que je t'ai dja montré ? _________________
Inscrit le: 11 Fév 2011 Messages: 2151 Sujets: 114 Spécialité en worldedit: Chasser le Dragon, puis l'exterminer proprement avec une petite cuillère et une poêle.
Posté le: 05/11/11 19:22 Sujet du message: Re: Concours
Ashtabatakete a écrit:
Bah moi je vais m'inscrire au concours mais j'aimerais savoir si on peut mettre les sorts sur des unités simples (pas des heros) ? Pck la je viens d'avoir quelques idées mais des idées pour des unités non-héros...
Ah oui et Vlad tu penses ca vaut le coup que je mettes le sort que je t'ai dja montré ?
Hmm, oui.
Âprès, que ce soit sur un héros ou une unité normale, c'est pareil. Aussi, ton sort était bien et ça peut valoir la peine de le poster ici.
Pas sûr que je perde, vu que c'est non le codage qui compte, mais l'idée et tout ce qui est visuel.
Au mieux, Tir prendra les 2points de rigueur du codage que j'aurais pas forcément comme on fait du MUI tout les deux.
Et c'est bien que ashta participe, ça fait un adversaire d'un niveau correct supp ^^
Edit : Sinon, j'ai amélioré mon sort de charge au niveau graphique. _________________
Toutes les heures sont au format GMT + 1 Heure Aller à la page 1, 2, 3Suivante
Page 1 sur 3
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