• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

Spells & Systems Mini-Contest #20

Status
Not open for further replies.

Bribe

Code Moderator
Level 50
Joined
Sep 26, 2009
Messages
9,464
Results!

Many of the results were seriously close. Most of the results received a positive review.

Sound Effects I've defaulted to a 5/5 for everyone. I didn't make it clear enough that this was something I was looking for an as a consequence only a few entries put any consideration on the audio.





1000 Needles (from Final Fantasy) by emjlr3
Congratulations! Nice work on this very charming spell.

Second place was tied for Maker & Moyack.



Link: http://www.hiveworkshop.com/forums/1939362-post430.html
Overall Aspect: 4.5/5
Visual Effects: 9.5/10 -> Caused some really heavy lag for me at points but the effects were bold - good work
Sound Effects: 5/5
Triggering: 8.5/10 -> -1 for UnitUserData which makes your spell difficult to import for people who use that for other things. A hashtable or use of a unit indexer would have been better here. Destroying boolexprs is no longer needed since patch 1.24 or so. Using a real array for the temp values is a lot slower than using scalar variables. These lines didn't need an if-statement as you make it do the same action either way:
JASS:
if IsUnitInGroup(u2,Tossed.Affected) then
    call Tossed.Change(u2,R[2],R[1],R[3],R[4],SETargetAttachEffect,SETargetEffect)
else
    call Tossed.Create(u2,R[2],R[1],R[3],R[4],SETargetAttachEffect,SETargetEffect)
endif
Total: 27.5/30



Link: http://www.hiveworkshop.com/forums/1920222-post71.html
Overall Aspect: 4.5/5
Visual Effects: 9/10 -> Would have been perfect if you made the dummy units a bit larger to show them off a little more. This is probably why it was lacking the "wow" factor for me.
Sound Effects: 5/5
Triggering: 9.5/10 -> To be fair this was awesome work. When I saw the spell, it had vJass quality and I was surprised to see GUI when I opened the map. Very little room for improvement and coded pretty efficiently.
Total: 28/30



Link: http://www.hiveworkshop.com/forums/1926074-post250.html
Overall Aspect: 5/5
Visual Effects: 10/10 -> Nicely done. It's a cute spell and the damage texttags are creative.
Sound Effects: 5/5 -> Some good audio effects would have been spectacular to couple with the great visuals.
Triggering: 10/10 -> Excellent, tight code, the only problem is that you could accidentally destroy bridges if you have that boolean set to true. Since it's just a configurable I don't count it with the score.
Total: 30/30



Link: http://www.hiveworkshop.com/forums/1929856-post310.html
Overall Aspect: 4.5/5
Visual Effects: 8.5/10 -> The first cast had some problems displaying the visual effects (strings need to be preloaded). The effect would have been better if you made them larger and/or last longer. It was over with a blink.
Sound Effects: 5/5
Triggering: 8.5/10 -> It's arguable that setting constants from within the spell trigger make it easier to import & customize according to the spell level, but to my dismay setting the constant "effect duration" to a higher value does not keep the effects from disappearing right away. Every cast has a bit of a lag at the beginning due to high unit creation count, so if you had implemented some form of dummy recycling this problem would have gone away. There are other smaller areas that could have been pruned for efficiency, like custom integer loops vs (integer A) or setting some things to variables before repeat-reference, but I really don't care enough about those improvements because that's not where the bottleneck is.
Total: 26.5/30



Link: http://www.hiveworkshop.com/forums/1925371-post233.html
Overall Aspect: 5/5 -> Fantastic ability - subtle yet very cool.
Visual Effects: 9.5/10 -> The only real flaw was that the Firelord would maintain a "walk" animation even when the Blademaster is still, which is really distracting. If there was a bigger "kick-off" to begin the summon that would have made this more of a "wow" experience than what it already is.
Sound Effects: 5/5 -> Only problem I had here was the Firelord played his death sound when he expired the first time, which didn't seem to fit.
Triggering: 10/10 -> You may say the triggering is rusty but it still shows a lot of refinement. The code is relatively short for how many good mechanics you added to the spell.
Total: 29.5/30



Link: http://www.hiveworkshop.com/forums/1922218-post150.html
Overall Aspect: 5/5
Visual Effects: 9.5/10 -> Very smooth and fun to watch. The test map doesn't really get to show off all of the features of the spell like unit slowdown (because they are all stationary). The only thing keeping this from a full score is that it doesn't have too big of a "wow" moment. Comparing to the video you posted, the effects could have been amazing.
Sound Effects: 5/5
Triggering: 10/10 -> The only real changes would be in compressing some code a little better/preloading the special effects to prevent the slight glitch on first cast.
Total: 29.5/30



Link: http://www.hiveworkshop.com/forums/1925882-post244.html
Overall Aspect: 4/5
Visual Effects: 9/10 -> Had some EXTREME lag every time it was cast, but the effects were very good. I feel it shouldn't be lower than 9/10.
Sound Effects: 5/5
Triggering: 4/10 -> Yikes, I found out why this thing was lagging so badly - creating a unit every 0.06 seconds, each of which enumerate an area every 0.02 seconds. That's a hazardous combination.
Total: 22/30



Link: http://www.hiveworkshop.com/forums/1919325-post53.html
Overall Aspect: 1.5/5 -> It's a howl of terror effect coupled with instant damage. This is almost an exact duplicate of one of the spells in the Spells section, both of which apparently are also DotA copies.
Visual Effects: 1.5/10
Sound Effects: 5/5
Triggering: 1/10 -> Leaks two locations per cast. Has no real complexity. You could have skipped triggers and done this all in the object editor.
Total: 9/30



Link: http://www.hiveworkshop.com/forums/1933342-post363.html
Overall Aspect: 5/5
Visual Effects: 9.5/10 -> The effects were quite nice but it could have used a really epic bang at the end to give this a perfect score. It kind of just hits a unit and goes "meh".
Sound Effects: 5/5
Triggering: 6.5/10 -> In your "Soul Blast Halt" trigger you iterate through all instances to find out the index of the unit that cast the ability. This is overkill - if you used a unit indexer or hashtables you could get that number without searching for it. This line leaks in your Loop trigger:
  • Unit Group - Pick every unit in (Units within 250.00 of SBTempPoint matching ((((Matching unit) is A structure) Equal to False) and ((((Matching unit) is Magic Immune) Equal to False) and ((((Matching unit) is alive) Equal to True) and (((Matching unit) belongs to an enemy of (Owner of SBCa and do (Actions)
The reason why it leaks is because you set the bj_wantDestroyGroup variable above a different "pick all units" loop. To fix the leak, you could change this:
  • Custom script: set bj_wantDestroyGroup = true
  • Unit Group - Pick every unit in SBDummyGroup[SBInteger] and do (Unit - Kill (Picked unit))
  • Unit Group - Pick every unit in SBChannelGroup[SBInteger] and do (Unit - Remove (Picked unit) from the game)
  • Custom script: call DestroyGroup (udg_SBDummyGroup[udg_SBInteger])
  • Custom script: call DestroyGroup (udg_SBChannelGroup[udg_SBInteger])
To this:
  • Custom script: set bj_wantDestroyGroup = true
  • Unit Group - Pick every unit in SBDummyGroup[SBInteger] and do (Unit - Kill (Picked unit))
  • Custom script: set bj_wantDestroyGroup = true
  • Unit Group - Pick every unit in SBChannelGroup[SBInteger] and do (Unit - Remove (Picked unit) from the game)
  • Custom script: set bj_wantDestroyGroup = true
There is also the issue with all the indexes leaking but we've already talked about that.
Total: 26/30



Link: http://www.hiveworkshop.com/forums/1925527-post236.html
Overall Aspect: 5/5 -> Instead of higher duration, I think more meteors should have been the way to go.
Visual Effects: 9/10 -> For the duration of the spell at higher levels the shaky camera gets a bit extreme. It would have been a lot cooler if the meteor effects didn't always follow the same pattern (randomizing it better).
Sound Effects: 5/5
Triggering: 8/10 -> This is a nicely done script, however this may cause problems in the long-term as Terrain Deformation indices always leak (Blizzard bug). Check this out to test it (the handle ids don't decrease):
  • Melee Initialization
    • Events
      • Map initialization
    • Conditions
    • Actions
      • Set loc = (Center of (Playable map area))
      • Environment - Create a 2.00 second Temporary crater deformation at loc with radius 512.00 and depth 64.00
      • Game - Display to (All players) the text: (String((Key (Last created terrain deformation))))
      • For each (Integer A) from 1 to 1000, do (Actions)
        • Loop - Actions
          • Environment - Create a 2.00 second Temporary crater deformation at loc with radius 512.00 and depth 64.00
      • Game - Display to (All players) the text: (String((Key (Last created terrain deformation))))
      • Wait 4.00 seconds
      • For each (Integer A) from 1 to 1000, do (Actions)
        • Loop - Actions
          • Environment - Create a 2.00 second Temporary crater deformation at loc with radius 512.00 and depth 64.00
      • Game - Display to (All players) the text: (String((Key (Last created terrain deformation))))
      • Wait 4.00 seconds
      • For each (Integer A) from 1 to 1000, do (Actions)
        • Loop - Actions
          • Environment - Create a 2.00 second Temporary crater deformation at loc with radius 512.00 and depth 64.00
      • Game - Display to (All players) the text: (String((Key (Last created terrain deformation))))
      • Wait 4.00 seconds
      • For each (Integer A) from 1 to 1000, do (Actions)
        • Loop - Actions
          • Environment - Create a 2.00 second Temporary crater deformation at loc with radius 512.00 and depth 64.00
      • Game - Display to (All players) the text: (String((Key (Last created terrain deformation))))
      • Wait 4.00 seconds
      • Environment - Create a 2.00 second Temporary crater deformation at loc with radius 512.00 and depth 64.00
      • Game - Display to (All players) the text: (String((Key (Last created terrain deformation))))
Total: 28/30



Link: http://www.hiveworkshop.com/forums/1923245-post192.html
Overall Aspect: 5/5 -> Really powerful execution of the bad breath spell. Nice work on this.
Visual Effects: 10/10 -> Perfect idea to choose that model for the hero. I don't know how I would have liked the visual effects if you chose something else, but this left me with an overall 10/10 impression.
Sound Effects: 5/5 -> You chose the perfect sound effect for this, had some good lulz! Would have been a great idea for the last contest :p
Triggering: 8/10 -> Your triggers could have been shortened quite a lot. Setting an array from a "map init" trigger would allow you to use a simple loop instead of that huge chain of if's. Say you had 10 buffs, instead of making 10 if's (one for each buff) just make one array with 10 slots (each pointing to a different buff) and loop from 0 through 9. This would also make your spell more configurable so it's easy for people to use.
Total: 28/30



Link: http://www.hiveworkshop.com/forums/1938984-post426.html
Overall Aspect: 5/5 -> If the sheep flew in just a bit faster they could actually hit the enemy in time, but this spell was fun to play around with so it retains a positive overall score.
Visual Effects: 10/10 -> Sheep flying, catching fire, falling and finally exploding all over the place in random directions - it does its job really well.
Sound Effects: 5/5 -> Adding a funny sound effect like a gyrocopter scream would have got bonus points, the explosions sounded good.
Triggering: 8/10 -> You leak indices - in the "Data" struct you override the destroy method but don't call ".deallocate()" from it. Or the user-friendly "onDestroy" method. This effects the creation of a new index every cast instead of recycling it. There are some other things to note - vJass does not top-sort your struct methods, so make sure you don't call methods from above the methods. You do this twice for both of your "onLoop" functions so if you review the compiled map you will see a nightmare mix of trigger evaluates & duplicate "eval/exec" functions instead of a simple function call. Some things like "== true" or "== false" could be pruned out (something that can't be done in GUI). The end-result was still good and maintained framerate on multiple casts, probably won't be cast more than 8190 times to break it, but this could have been engineered "under the hood" a bit better.
Total: 28/30



Link: http://www.hiveworkshop.com/forums/1931829-post333.html
Overall Aspect: 3/5 -> Lots and lots and lots of lag
Visual Effects: 5/10 -> It was very difficult to tell what was going on because of the lag. Whatever special effects you invested in here were for the most part lost.
Sound Effects: 5/5 -> The slam sound effect from this thing was pretty good.
Triggering: 6/10 -> You destroy the "KnockedbackGroup" every iteration of the loop - when I removed this line some of the lag was reduced, but the units didn't get knocked back any more. I was able to get this thing within FPS by cutting the effects down to about 15-20 so at least you left that configurable.
Total: 19/30



Link: http://www.hiveworkshop.com/forums/1922518-post164.html
Overall Aspect: 4.25/5 -> It was rare that units were damaged and it didn't look too noticeable when they did get lucky enough to be damaged.
Visual Effects: 8/10 -> No preparation before the effect, it just instantly snaps to a grid of five heroes, then instantly goes away right after which scatters the units about in a strange way. The pentagram effect that you make looks cool enough to hold the score in a decent place.
Sound Effects: 5/5 -> A whooshing collapse would have been cooler here than a simple howl of terror.
Triggering: 9.25/10 -> Please in the future use readable constants like bj_PI, bj_DEGTORAD, bj_RADTODEG instead of trying to inline them. There are better areas you could use to improve on efficiency. "this.circles[CIRCLES]" is something you reference a lot, meaning it would be faster & more importantly more readable to set it to a variable before spam-referencing it. Some smaller areas that could be improved: "(360.0/I2R(IMAGES))*0.017453292", for example, could be "bj_PI * 2 / IMAGES". You could avoid using onDestroy which spawns three copies of the method + a trigger evaluation when it's compiled. "SetUnitScale(this.circles, SCALE, SCALE, SCALE)" could also be "SetUnitScale(this.circles, SCALE, 0, 0)" because JASS ignores the second two parameters.
Total: 26.5/30



Link: http://www.hiveworkshop.com/forums/1935695-post397.html
Overall Aspect: 1.5/5 -> This didn't actually damage any of the enemy units I cast it on. It lags massively!
Visual Effects: 9/10 -> The only thing reserving this from getting a full score is it gives a massive lag whenever cast. From what I can see the visuals are supposed to be breathtaking.
Sound Effects: 5/5
Triggering: 7.5/10 -> The configurables should be set from "map init" not from a 0.01 timer event. The eye candy should be configurable because that seems to be what's causing the lag. You're also using Custom value of units hence a slightly lower score than what I would have given.
Total: 23/30



Link: http://www.hiveworkshop.com/forums/1924210-post216.html
Overall Aspect: 4/5 -> The spell and its buffs don't seem to have good synergy with each other. The themes of each special effect you used don't really blend well visually.
Visual Effects: 8.5/10 -> The combination of starfall and curse makes a nice debuff effect, it is quite overpowering and loses its appeal when cast on a group of units. It would fit better with just one unit. The central explosion looks like it was thrown together, the myriad of effects you use don't blend well with each other (doesn't really seem to fit a theme)
Sound Effects: 5/5 -> Awesome sound effects really stood out.
Triggering: 8/10 -> You seperate some spell-critical components like hashtable init and buff assignment from the rest of the spell (not included in the "spell" category). This can make it confusing when trying to import it into a map. There are some general areas that could be improved like preloading the special effects & storing things like (Owner of (Triggering unit)) to variables before repeat-referencing them to reduce load on the CPU.
Total: 25.5



Link: http://www.hiveworkshop.com/forums/1936781-post411.html
Overall Aspect: 4.5/5
Visual Effects: 8/10 -> This could have been much better if you made more than three spirits and make them darker/more evil. Hades army looks more like "Dryads' night out on the town". If the orbs were more agressive and challenged the enemies a lot harder this could have been epic.
Sound Effects: 5/5 -> Could have had some darker sound effects to go with the spell.
Comments: The Tauren impaled to the wall was totally reminiscent of the original scene. Great work capturing the look & feel of that scene!
Triggering: 5.5/10 -> Leaks three special effects when cast (bottom of the trigger actions). Leaks 3 regions (rect in JASS) per loop:
  • Set GlobalPoint[5] = (Random point in (Region centered at GlobalPoint[4] with size (1200.00, 1200.00)))
  • Set GlobalPoint[6] = (Random point in (Region centered at GlobalPoint[4] with size (1200.00, 1200.00)))
  • Set GlobalPoint[7] = (Random point in (Region centered at GlobalPoint[4] with size (1200.00, 1200.00)))
You overkilled some things like use arrays where you could have used just a few normal variables instead. For example, you could take advantage of the "set bj_wantDestroyGroup = true" one-liner instead of the cumbersome mess that is "set variable, pick units, destroy group with custom script".
Total: 23/30



Link: http://www.hiveworkshop.com/forums/1936518-post407.html
Overall Aspect: 5/5 -> It really looks more like something that belongs in a mini-game than a single spell. Some things could have been better:
  • Items could have knocked each other back when they hit each other
  • Issuing a "smart order" (right click) should auto-impel the item.
  • A functionality to hold more than one item would be cool.
  • Having the item spin around like a Mario Kart shell would have been much cooler than just having it sit there. Then you could even launch the item from whatever angle it currently is in relation to the wielder, making it easier and more fun to aim/shoot.
Visual Effects: 8.5/10 -> When you "Impel" an item it just instantly snaps to the hero, right in front of the hero, and it looks awkward. Expelling it is a bit fun, but would have been better if the item knocked back the enemy units it hits.
Sound Effects: 5/5
Triggering: 8.5/10 -> While I appreciate the amount of time you spent building this (length of code is evidence of that), the quality over quantity rule must apply here. This is difficult to port into a map because it has tons of little libraries that should have just been merged into one because they all depend on each other. You could use some good variable prefixing/privatization as well, because this can conflict with other systemsthat might also want to use those variable names. I also don't see (in-game) where/if you applied those neat lightning effects that you wrote the code for.
Total: 27/30


Garfield1337 and The_Reborn_Devil's submissions are not included.
 
Last edited:
Level 16
Joined
Jun 24, 2009
Messages
1,409
Congrats guise.
Sadly my submission was sent before I modified the system and learned little tricks with mod function. But at least the spell looked kick-ass :) and that's fine enough for now.

Also: Adiktuz's Space Collapse is from Cabal Online ~.~
 
Last edited by a moderator:
Level 22
Joined
Dec 31, 2006
Messages
2,216
Oh fuck. I got back a day too late..
I forgot to submit the spell on Friday when I left :/

Anyway, the spell is attached at the bottom for those who want to look at it (Doesn't have tooltips, but it has a nice loading screen that I had lying around). I will release it in the spells section after I've worked more on the physics engine and all that.

Well, now I have to go again. Damn summer vacation.

Grats to emjlr3!
 

Attachments

  • Meteor Storm.w3x
    168.2 KB · Views: 42

Bribe

Code Moderator
Level 50
Joined
Sep 26, 2009
Messages
9,464
If you actually download the spells you'll see why so many scored highly - most of the submissions were incredibly good. I felt like an asshole jerk judging this thing because I had to pick a favorite and also had to judge fairly. Some of the entries below 27 points might have an error margin in judging by +/- 1 point, while things that scored that or higher I had to pay more attention to because those required more scrutiny.
 
Level 10
Joined
Jun 1, 2008
Messages
485
hm, got rank 8 from 18 contestant. not bad.... seeing that I only have about 3 days or so to create it.

Congrats to emjlr3!
Ive already know that you'll get high place from that smooth movement missile. but it's a bit weird seeing that the caster can move while this spell active.

and, TRD, that's a very good spell. Too bad you're late... :/. it's cause heavy lag for me though.

so, the next spell contest is on august? is there anything like brainstorming for the theme?

-1 for UnitUserData which makes your spell difficult to import for people who use that for other things. A hashtable or use of a unit indexer would have been better here.
er... it only used the UnitUserData for dummy for the 'first explosion' effect, and if i make a separate unit indexer or struct for it, it can easily surpass the 8192 limit.
but whatever. just got an idea for different approach
Destroying boolexprs is no longer needed since patch 1.24 or so.
it is? dang. I'm so outdated.
Using a real array for the temp values is a lot slower than using scalar variables.
well, i just dislike it to see many temp real variable hangin' in declaration line. The temp real itself is optional though. But done to make reading it easier. Maybe I should just use that many temp real variable...
 
Level 9
Joined
May 14, 2011
Messages
524
Btw after casting 1000 needles awhile my war3 crashed and the spell stops awhile after i casted it again while the caster is shooting (Cast it on yourself or your portrait)
 

Bribe

Code Moderator
Level 50
Joined
Sep 26, 2009
Messages
9,464
Btw after casting 1000 needles awhile my war3 crashed and the spell stops awhile after i casted it again while the caster is shooting (Cast it on yourself or your portrait)

I think for the next contest we should have multiple judges or perhaps a poll (and an award icon).

It's obscure bugs like this that suggest to me that there should be more than one person reviewing for errors and quality testing.
 

Cokemonkey11

Spell Reviewer
Level 29
Joined
May 9, 2006
Messages
3,534
I think for the next contest we should have multiple judges or perhaps a poll (and an award icon).

It's obscure bugs like this that suggest to me that there should be more than one person reviewing for errors and quality testing.

I agree. These 1 month contests are basically full contests.

On a side note, I used to do "speed mapping" contests where my friends and I would make a whole map from a theme in 1 hour.

That timing might be a little too quick for the hive, but I think a 3-5 day mini-contest could turn out really well.
 
woohoo 26+... ^_^

yeah, I realized that SetUnitScale was working weird, but based on my experience it only uses the smallest value that you put there... which means SCALE,0,0 will make the effect have a scale of 0... never thought about a preparation part, but maybe I could add that when I upload a public resource version of this...

and thanks for the info about onDestroy... ^_^

and Congrats to the winners! and yeah, maybe more judges will be good... I'm not sure about having a poll though...
 
Level 12
Joined
Mar 28, 2005
Messages
160
hey I won, neato

The cast on yourself bug I thought had been remedied with my distance check....

JASS:
set .dist=SquareRoot(Pow(GetUnitX(.cast)-GetSpellTargetX(),2)+Pow(GetUnitY(.cast)-GetSpellTargetY(),2))
                if .dist<=0. then
                    set .dist=100.
                endif

originally it would spit needles all over the place, then crash of the distance was 0.

Should really update this thread topic with the winners. It took me like 10 minutes to find the right post, only to then realize there is a sticky ;X
 
Status
Not open for further replies.
Top