| 01-20-2009, 01:46 AM | #1 |
This thread is intended for posting final submissions for the 13th spell making session. Any posts not containing a spell submission will be deleted, so please post any such comments in the main contest thread instead. A spell submission post should contain the following to qualify:
The session has now ended, you can see the votes here. The winner is Zerzax with his Arcane Roulette spell. Congratulations! |
| 01-27-2009, 06:46 PM | #2 |
Mirror Image A GUI spell that can be used by multiple players but limited to one unit per player due to heavy balancing issues... Creates an image of the casting unit that will last up to 8 seconds. This image causes the attacking enemy (melee) to retarget to attacking the image and the image to attack the attacking unit causing a brief short period of confusion for the attacking unit caused by redirecting target (resetting attack animation). The image created takes 200% damage, deals 0% damage, stacks, a mana using passive ability, created on %tage, and has a cooldown for balancing issues. Also please excuse my english, not perfect at it. |
| 01-31-2009, 11:33 AM | #3 | |
Goblin Rocket Prototype (vJASS) Quote:
|
| 01-31-2009, 06:33 PM | #4 |
Lucky Wheel Picks up to {4+level} units within {256+64*level} range. The wheel spins up to {2+level} times, dealing {25+50*level} damage to the unlucky unit being choosen. Made in vJASS and should follow the JESP rules. NO GUARANTEE FOR BEING BUG FREE!!! Didn't made any real hard bug testing on this spell though. I'll make it when submiting the spell in the ressource section. |
| 01-31-2009, 10:28 PM | #5 |
Energy Spike Blindly taps into and combusts nearby energy signatures either damaging/restoring units Health, Mana or missing them entirely. Level 1: Damages/restores 75/35 Health, 65/25 Mana or misses entirely. Level 2: Damages/restores 125/60 Health, 115/50 Mana or misses entirely. Level 3: Damages/restores 175/85 Health, 165/75 Mana or misses entirely. Type: GUI |
| 02-01-2009, 05:01 AM | #6 |
| 02-01-2009, 03:49 PM | #7 |
Arcane Roulette By Zerzax Spins a magical wheel that will generate a unique effect for the caster. Uses vJASS EDIT: Download 1.1, I extended the use tooltip and fixed a revival bug. |
| 02-01-2009, 06:11 PM | #8 |
Autocast Allows the user to select one of three abilities (frost nova, chain lightning, fireball) to autocast on attack by a 13% chance. The user also has a 25% chance of summoning a fire, ice, or lightning element on attack. The level of the autocast spell is determined by how many elements you have that are related to that spell (frost nova -> ice; chain lightning -> lightning; fireball -> fire). Level 1 - Maximum of 4 elements. Level 2 - Maximum of 6 elements. Level 3 - Maximum of 8 elements. By increasing the level, you increase your chances of casting the higher level of the autocast spell. Notes: When testing, don't just level up right away before trying; level 1 and level 2 of the spell give you a better feel for how it works. The items are strictly for testing purposes. The main Autocast ability is based off of spellbook, so click on that to open a secondary menu to choose autocast spell (some people were confused by that). |
| 02-01-2009, 06:43 PM | #9 |
Vex Afflicts a target non-mechanical enemy with a random variety of malign effects. If the caster is killed, all Vexes cast by it are dispelled. Level 1 - 700 range, 12 second duration, 2 effects. Level 2 - 800 range, 15 second duration, 3 effects. Level 3 - 900 range, 18 second duration, 4 effects. |
| 02-01-2009, 06:50 PM | #10 |
I Make My Own Luck Grants a % chance to deal X times your normal attack damage on the next attack. Each succesive miss increases your propensity for a critical strike, and your attack speed along with it. This good fortune is lost without combat. Inner Workings Based off a non-hero ability. As you attack, you have a chance to crit. on the target. The more times in a row you don't get a crit, the greater the chance of getting one. You also gain an attack speed bonus in the same fashion. Upon netting a crit., your % chance reduces back to its original level. If you do not see combat (attack or take damage) for a few seconds, your bonuses are lost. The ability tooltip is updated to reflect the changes in proc. chance. However, when it does, the requirements for seeing that change are strange. I am not sure of the inner workings here, but sometimes you see your tooltip change, other times you have to go into the learn menu and back out again, etc. Even if its not reflected on the current viewed tooltip, the effects are active. A neat sfx can be created at the users discretion to signify the heroes bonus luck. I realize that this is a very simplistic spell, both in design and coding, however, I thought it really fit the theme nicely, and was an overall unique idea. |
| 02-01-2009, 09:02 PM | #11 | ||
Quote:
My ability is based off chain lightning. I entered this contest to challenge my knowledge and control of structs. This is my second time actually using them, and I knew I couldn't do anything this complicated in my map. If any more specifics are needed, just ask. Screenshot will be attached shortly. |
| 02-02-2009, 07:07 PM | #12 | |
HAHA, I could post my entry!!! :) Description: .:
JASS:// Death Carrier (hmm probably the name is not the best but meh...) // By moyack. 2009. // Made for the spell contest No 13 (for the bad luck maybe??) // Requires TimerUtils. library DeathCarrier initializer init requires TimerUtils // Configuration part... globals private constant integer SpellID = 'A000' private constant real dt = 0.5 // endglobals private constant function Damage takes integer lvl returns real return 100. + 70. * (lvl - 1) endfunction private constant function AOE takes integer lvl returns real return 500. // I left it in this way so it can be configurable to a variable area endfunction private constant function Jumps takes integer lvl returns integer return 5 // sets the number of times the maks jumps on units before explode endfunction // end configuration part... private function GetEnemies takes nothing returns boolean return GetWidgetLife(GetFilterUnit()) > 0.405 and IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(bj_groupRandomCurrentPick)) endfunction private struct data group g unit c integer counter = 0 private method onDestroy takes nothing returns nothing call GroupClear(.g) set .c = null endmethod private static method PickRandomUnit takes nothing returns nothing set bj_groupRandomConsidered = bj_groupRandomConsidered + 1 if GetWidgetLife(GetEnumUnit()) > 0.405 and GetRandomInt(1,bj_groupRandomConsidered) == 1 then set bj_groupRandomCurrentPick = GetEnumUnit() endif endmethod private static method DealDamage takes nothing returns nothing call UnitDamageTarget(GetEnumUnit(), GetEnumUnit(), Damage(GetUnitAbilityLevel(bj_groupRandomCurrentPick, SpellID)), true, true, ATTACK_TYPE_SIEGE, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_ROCK_HEAVY_BASH) call DestroyEffect(AddSpecialEffectTarget(GetAbilityEffectById(SpellID, EFFECT_TYPE_SPECIAL, 2), GetEnumUnit(), "chest")) endmethod static method effect takes nothing returns nothing local data d = data( GetTimerData(GetExpiredTimer()) ) local real x local real y set bj_groupRandomConsidered = 0 set bj_groupRandomCurrentPick = null call ForGroup(d.g, function data.PickRandomUnit) if bj_groupRandomCurrentPick == null then call d.destroy() call ReleaseTimer(GetExpiredTimer()) return endif call DestroyEffect(AddSpellEffectTargetById(SpellID, EFFECT_TYPE_SPECIAL, bj_groupRandomCurrentPick, "overhead")) set d.counter = d.counter + 1 if d.counter > Jumps(GetUnitAbilityLevel(d.c, SpellID)) then set x = GetUnitX(bj_groupRandomCurrentPick) set y = GetUnitY(bj_groupRandomCurrentPick) call GroupClear(d.g) call DestroyEffect(AddSpecialEffect(GetAbilityEffectById(SpellID, EFFECT_TYPE_SPECIAL, 1), x, y)) set bj_groupRandomCurrentPick = d.c call GroupEnumUnitsInRange(d.g, x, y, 0.5*AOE(GetUnitAbilityLevel(d.c, SpellID)), Condition(function GetEnemies)) call ForGroup(d.g, function data.DealDamage) call d.destroy() call ReleaseTimer(GetExpiredTimer()) endif endmethod static method Start takes unit c, location l returns nothing local data d = data.allocate() local timer t = NewTimer() if d.g == null then set d.g = CreateGroup() endif set d.c = c set bj_groupRandomCurrentPick = c call GroupEnumUnitsInRangeOfLoc(d.g, l, AOE(GetUnitAbilityLevel(c, SpellID)), Condition(function GetEnemies)) call SetTimerData(t, integer(d)) call TimerStart(t, dt, true, function data.effect) call RemoveLocation(l) set l = null set t = null endmethod endstruct private function Conditions takes nothing returns boolean return GetSpellAbilityId() == SpellID endfunction private function Actions takes nothing returns nothing call data.Start(GetTriggerUnit(), GetSpellTargetLoc()) endfunction //=========================================================================== private function init takes nothing returns nothing local trigger t = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT ) call TriggerAddCondition( t, Condition( function Conditions ) ) call TriggerAddAction( t, function Actions ) endfunction endlibrary |
| 02-03-2009, 12:28 PM | #13 | |
Code:library Chaos initializer init globals private constant integer SpellId = 'A000' private constant integer BuffId = 'B000' private constant real Period = .035 private constant real Duration = 20 private constant real CheckAoE = 400 //radius we are checking in for other buffed units private constant real DamageAoE = 200 private constant real DamagePeriod = 1 //how often we check to see if we lucked out and EXPLODED private constant boolean AutoKillTarget = false private constant real DamageBase = 120 private constant real DamageLevelFactor = 0 private constant real ChanceBase = 15 private constant real ChanceLevelFactor = 0 private constant real ChanceIncrementBase = 5 //chance gained for nearby units private constant real ChanceIncrementLevelFactor = 5 private constant attacktype AttackType = ATTACK_TYPE_MAGIC private constant damagetype DamageType = DAMAGE_TYPE_FIRE private string AoEFX = "OBJ: Art -> Special[1]" //if these remain at default, private string HitFX = "OBJ: Art -> Special[2]" //it grabs the values from the private string BuffFX = "OBJ: Art -> Special[3]" //corresponding object editor fields private constant string BuffAttach = "origin" //attach point for buff FX public trigger Trig = CreateTrigger() endglobals private function Conditions takes nothing returns boolean return GetSpellAbilityId()==SpellId endfunction //-\\ No touchy \\- private struct data static data temp static group G = CreateGroup() static timer T = CreateTimer() static data array stack static integer num = 0 static boolexpr filter static boolexpr enum integer index static real C static real X static real Y static player P unit c unit t real d real f real r real p real q group g effect e method onDestroy takes nothing returns nothing call DestroyEffect(.e) set .num=.num-1 set .stack[.index]=.stack[.num] set .stack[.index].index=.index if(.num==0)then call PauseTimer(.T) endif endmethod static method damage takes nothing returns boolean local data this=.temp local unit f=GetFilterUnit() if(IsUnitEnemy(f,.P) and IsUnitType(f,UNIT_TYPE_DEAD)==false)then call SetUnitExploded(f,true) if(f==.t)then if(AutoKillTarget)then call SetWidgetLife(f,.5) endif call UnitDamageTarget(.c,f,.f,true,false,AttackType,DamageType,null) call DestroyEffect(AddSpecialEffect(AoEFX,.X,.Y)) else call UnitDamageTarget(.c,f,.f,true,false,AttackType,DamageType,null) call DestroyEffect(AddSpecialEffect(HitFX,GetUnitX(f),GetUnitY(f))) endif call SetUnitExploded(f,false) endif set f=null return false endmethod static method check takes nothing returns boolean local data this=.temp local unit f=GetFilterUnit() if(f!=.t and GetUnitAbilityLevel(f,BuffId)>0)then set .C=.C+.p endif set f=null return false endmethod static method callback takes nothing returns nothing local integer i=0 local data this loop exitwhen i==.num set this=.stack[i] set .d=.d+Period if(.d>=Duration or IsUnitType(.t,UNIT_TYPE_DEAD)==true or GetUnitAbilityLevel(.t,BuffId)<1)then call .destroy() else set .r=.r+Period if(.r>=DamagePeriod)then set .r=0 set .C=.q set .temp=this set .X=GetUnitX(.t) set .Y=GetUnitY(.t) call GroupEnumUnitsInRange(.G,.X,.Y,CheckAoE,.filter) if(GetRandomReal(0,100)<=.C)then set .P=GetOwningPlayer(.c) call GroupEnumUnitsInRange(.G,GetUnitX(.t),GetUnitY(.t),DamageAoE,.enum) call .destroy() set i=i-1 endif endif set i=i+1 endif endloop endmethod static method create takes nothing returns data local data this=data.allocate() local integer l set .c=GetTriggerUnit() set .t=GetSpellTargetUnit() set .d=0 set .e=AddSpecialEffectTarget(BuffFX,.t,BuffAttach) set l=GetUnitAbilityLevel(.c,SpellId)-1 set .p=ChanceIncrementBase+ChanceIncrementLevelFactor*l set .q=ChanceBase+ChanceLevelFactor*l set .f=DamageBase+DamageLevelFactor*l if(.num==0)then call TimerStart(.T,Period,true,function data.callback) endif set .stack[.num]=this set .index=.num set .num=1+.num return this endmethod endstruct private function init takes nothing returns nothing call TriggerRegisterAnyUnitEventBJ(Trig,EVENT_PLAYER_UNIT_SPELL_EFFECT) call TriggerAddCondition(Trig,Condition(function Conditions)) call TriggerAddAction(Trig,function data.create) set data.filter=Filter(function data.check) set data.enum=Filter(function data.damage) if(AoEFX=="OBJ: Art -> Special[1]")then set AoEFX=GetAbilityEffectById(SpellId,EFFECT_TYPE_SPECIAL,0) endif if(HitFX=="OBJ: Art -> Special[2]")then set HitFX=GetAbilityEffectById(SpellId,EFFECT_TYPE_SPECIAL,1) endif if(BuffFX=="OBJ: Art -> Special[3]")then set BuffFX=GetAbilityEffectById(SpellId,EFFECT_TYPE_SPECIAL,2) endif endfunction endlibrary Table:
|
