So, remember that second hero contest? Well all of the judging finally was finished, please extend a hand of thanks to Vexorian, Captain Griffen, and erwtenpeller for (finally) finishing all of their parts in the contest. As I type this right now, I don't even know who won because I haven't added up the numbers, but by the time I reach the bottom of this post I sure hope I'll find out. The suspense is killing me, but let's go; the judgments are listed in order of their submission. All judgments will be scaled out of 1000 for purposes of adding them together as being all equal. The winners will be decided by the highest score. (Public poll only chose the top 5, the judges decide the order)
Design Judgment Theme-actic synergy, tactical synergy, originality/interest, fitting-ness, general awesomeness/style/tilt
~Captain Griffen
Bonecrusher
Theme-actic: 7 (all fits nicely, except the roaring business...)
Tactical: 8 (fits nicely together)
Origin/Inter: 7 (charge, knockback, and mount are all and interesting, if the first two aren't original)
Fitting: 5 (lost marks here due to the mass-spam-shout, and partially the knockback - interuption heaven)
Awesome: 7 (charge and upper cut work well together, and mount fits well; everything fits nicely, except that roar which looks crap when getting attacked)
Total: 34
Ogre Clan Shaman
Theme-actic: 8 (fits nicely, nothing feels out of place)
Tactical: 7 (almost fits together properly, but they just seem to not quite work full together; still good though)
Origin/Inter: 8 (an interesting hero to play, certainly, with some original ideas)
Fitting: 6 (not so good here; doesn't really fit as a melee hero; it's just too different, but still okay here despite that)
Awesome: 7 (you have sleep; how awesome is that? But seriously, I liked the hero, but it didn't feel as together as blizzard heroes do)
Total: 36
Tidal Lord
Theme-actic: 4 (none of this fits with the theme of a tidal lord except drown? Arcane, Water, Arcane, Magical (Arcane?); seems like the artist and coder were on different pages)
Tactical: 7 (abilities go nicely together, except the silencing after they cast a spell; since you can just steal all their mana anyway
Origin/Inter: 6 (interesting abilities enough abilities, with some originality)
Fitting: 4 (the ultimate is insane, it's far too focused vs. caster armies, and can shred whole armies in seconds)
Awesome: 6 (it fits together okay overall, and the feel is good)
Total: 27
Hakkari Overlord
Theme-actic: 7 (all fit nicely, except for the apparently totally random switch to air?)
Tactical: 5 (I might be missing something, but the abilities just don't seem to work nicely together)
Origin/Inter: 7 (has some interesting and original abilities there)
Fitting: 5 (killing oneself, and one's troops is meh; Crimson's Copy's slow animation less gives temporary invulnerability and puts the hero out of action needlessly; gale of winds harms micro)
Awesome: 5 (fits together not great, and the feel is a bit...meh)
Total: 29
Incubus
Theme-actic: 6 (why is it called arcane burst, when it's on a demon hero and looks demonic...? Fits nice enough though...the spell shield doesn't fit with the theme in the way it is done, though)
Tactical: 6 (synergy between the AoE/charge, but lacking apart from that (close and blast))
Origin/Inter: 8 (I liked the AoE ability particularly; the spell shield was nice too, but the ultimate is just blargh)
Fitting: 5 (okay, would have been better if you hadn't have gone and put in a one-target-insta-kill ability)
Awesome: 7 (feels nice, fits together pretty well)
Total: 32
Art Judgment I'm going to be paying attention to quality and intergration, with a priority for intergration. Intergration in this mainly means that everything fits well together on the hero itself, and more importantly, fits well into the envoiroment. As a sort of bonus/misq catagory i'll be using originality/awesome.
~erwtenpeller
Bonecrusher
The animations are smooth and properly timed. The spell effects that go with each move are chosen well and emphasise whats going on quite well. Especially the animation to call the wolf is just awesome, and fits really well into the whole orc vibe with the spirit-wolf-esque sommoning.
I cant actually find anything wrong with it, the execution is flawless.
I give this a 10 out of 10.
Ogre Clan Shaman
Texture came out quite good. Especially the colors fit in perfectly, and the tats. However when you look at the portrait and look at it up-close, its a little bit blurry and "soft" wich puts its slightly out of place. The whole feel of the hero came together quite good though, the spell effects make sense for it, wich makes for a smooth ride.
Well executed hero, texture is a tad too "Fuzzy".
I give this an 8.5 out of 10.
Tidal Lord
Wounderfull job, quite an original model. I quite like the shape of the head.
The particles on it move too fast, however. With a water themed dude you'd expect something a little more dosile. I understand that you had to work with the firelords animations, but you could have made the little blue globes at least stand out a little less, as they are now they're a little bit annoying. The texture choices look a little off as well, the colors of the body dont mix that well with the teal armor, allthough it does mix well with the rusty shoulderpads. The shoulderguards give it a little bit of a classy roman look with is quite cool. Two major turnoffs for me where the lack of jaw animation in the portrait and the choice to use revenats for the summons. Why are they not just water elementals? would have made a lot more sense and it would have looked better.
The model is nice, but the texture and intergration with the firelords animations could be better.
I give this a 7.5 out of 10.
Hakkari Overlord
The biggest plus i can give this is that it has a nerrative introduction. The texture doesnt really fit into the envoiroment and is of dissapointing quality. The model doesnt really help the idea either. The spell effects are extremely poorly chosen. The voice set doesnt make any sense for this hero either.
Not perticulairly well-crafted in any catagory.
I give this a 5 out of 10.
Incubus
The model looks quite cool, i like the burning bones with fleshy upper half idea, thats quite cool. The portrait is well-stretched as well, the used texture looks sufficiently diffrent, reminds me of hellboy. However the lack of a moving jaw in the portrait animations bothers me. (again.) I also dont really like the particles, theres not enough going on there and they look too dominant. The animations transferred a bit weird at times as well, beastmaster may have done a better job. Last but not least, i fail to see how this hero has anything to do whatsoever with incubusses...
The last big turnoff was the spells. The spellshield lacked an art alltogether, and the ultimate didnt use a casting animation. I cant help but feel this entry was rushed.
Cool model, but misses the point, and looks unfinished.
I give this a 6 out of 10.
Extra Comments
Honerable mentions to:
The Ancestral Guardian, a custom model where the jaw actually moves! In my personal opinion this would have gotten a 9.5, its a fantastic model.
The Divinder for the blessed hammer spell, i thought that was quite cool, reminded me of d2.
The Fel Shaman for having a pretty neat idea, but sadly it needed more Cubone.
Code Judgment (Per spell)
Reusability 10
Cleanness 10
Efficiency 20*
Robustness 20*
Quality 20
* Begin at 20.
(Per map)
Code reuse 20
~Vexorian
Bonecrusher
Code:
1. ConeBrusher (193/340)
--------------
a. Uppercut (47/80)
Cleanness: (4/10)
* Zero comments. (-2)
* Correctly scoped. (+7)
* direct GC usage makes it hard to understand, it actually uses a GC library, the library could just provide those functions, these things get inlined anyway so there would be no trade off in performance. (-1)
Reusability (2/10)
* Some config options, though the only thing you can make dependent on the level is damage. +7
* No way to know you need to copy that Cache library -2
* Won't let people change Medivh's crow form, should have been an option. -1
* No comments whatsoever on what the values mean. -1
* I think it is better to make the effect depend on the ability's effect fields (since it is possible to) , allows the user to browse for models and have a preview. -1
Efficiency (18/20)
* Gamecache usage in a 0.035 seconds periodic timer (critical), so far there are many alternatives to this, could have done better than that (-2)
Robustness (13/20)
* For example, you can use it to take units to locked places, there are holed forests all over the map, sounds a little odd to be able to use it on a melee game, you could doom the enemy's hero, that's however more of a balance issue, the real problem comes when you use it to throw a unit to water or other unpathable area, the unit will be teleported to land, looks quite bad, I think it was planned to be a parabola throw, so it doesn't look like something planned. (-2)
* "DestroyTimer" (-5)
* Ignores the fact the victim could die during the flight, however I was unable to create a glitch from this, all melee units either leave corpses or take too long to be removed.
Quality (10/20)
* It is the usual knockpack with parabola spell, done a lot of times, the code is simple, almost straightforward.
b. Charge (48/80)
Cleanness: (6/10)
* Some comments, looks like they mildly describe what each function does, quite few information for someone reading it though. (+1)
* Correctly scoped. (+7)
* It is a large mess (-1)
* direct GC usage makes it hard to understand, it actually uses a GC library, the library could just provide those functions, these things get inlined anyway so there would be no trade off in performance. (-1)
Reusability (2/10)
* Various config options, though the only thing you can make dependent on the level is damage. (+7)
* No way to know you need to copy that Cache library (-2)
* No comments whatsoever on what the values mean. Most of them can be understood from the name, but specially the Knockback inertia stuff should have had a comment explaining (-2)
* I think it is better to make the effect depend on the ability's effect fields (since it is possible to) , allows the user to browse for models and have a preview. -1
Efficiency (15/20)
* Conditions instead of actions (+1)
* Using GroupEnums on a temporary group, inside a periodic timer [leaks] (-4)
* Gamecache usage in a 0.035 seconds periodic timer (critical), so far there are many alternatives to this, could have done better than that (-2)
Robustness (8/20)
* "DestroyTimer" (-5)
* "DestroyTrigger" (-5)
* In all seriousness, this dynamic trigger + timer combination is volatility at its finest, there are better ways to do this, the dynamic trigger is there only for what? detecting when you stop channel? (-1) Not to mention the mission key stuff. (-1)
* If during the charge the hero gets stunned or something else that would stop him to continue casting the charge that isn't an order, the stun will get ignored, it needed a single EVENT_UNIT_SPELL_END event, not FINISH + ORDER events. (-1)
Quality (17/20)
* You don't get to see it while playing it, but this is a heck complex spell, very long and a lot of things to do. I'd say that's the cultprit for the low scores above.
c. Fury (45/80)
Cleanness: (6/10)
* Another one with zero comments. (-2)
* Correctly scoped. (+7)
* It is quite understandable though (+1)
Reusability (4/10)
* Some config options, though the only thing you can make dependent on the level is the chance. (+7)
* No way to know you need to copy that Cache library (-2)
* I think it is better to make the effect depend on the ability's effect fields (since it is possible to) , allows the user to browse for models and have a preview. (-1)
Efficiency (12/20)
* It is doing gamecache attaching for absolutely no reason, could just use GetTriggerUnit() instead of d.caster there. An unnecessary GC call per hit done to the hero, can't cope with that. (-5)
* One trigger per instance, no cleaning whatsoever, it works for the intended purpose though, a melee hero spell, heroes never get removed in a melee setting.
Robustness (10/20)
* Weak conditions, in melee you can unlearn spells by buying tomes of retraining, so try this: Learn level 1 Roar, buy a tome of retraining, unlearn fury and now learn something else, uppercut seems chessy enough. Even though there is no learned Fury, you will still have quite a big chance to do the roar+stun. (-10)
Quality (10/20)
* Register on learn, dynamic onDamage trigger, and mass AOE dummy caster, not very impressed, I think it could have been implemented better, even though since it was a hero spell for melee it kind of works since a player is going to have at most one instance + the unit is never removed, so leaks don't matter, but still.
d. BattleSteed (35/80)
Cleanness: (1/10)
* Huge unused function, and struct, seems like the spell is incomplete? (-5).
* Correctly scoped. (+7)
* No comments (-1)
Reusability (4/10)
* Config options allow up to three bonus abilities, there is an unused duration one. (+7)
* No way to know you need to copy that Cache library (-1, what's worse is that it is not really in use (-2)
Efficiency (10/20)
* Leaks a timer, gamecache entry, string and struct every time it is casted (-10)
Robustness (10/20)
* Another exploit bug, it trusts in spell effect to be triggered when the time runs off, so if the hero dies during the morph he will keep the bonus abilities... (-10)
Quality (10/20)
* Another simple spell, run an event twice and toggle added abilities.
e. Code reuse (18/20)
* Uppercut's jumpparabola thing may appear as an embedded function, but it is not used by the other spells, so no penalty here.
* Cache library could do more than that to make the rest of the spells cleaner, it is a little dual to have a library requirement yet still remain quite low level. (-1)
* Are pathing, Cache and utilities in the very same trigger? Ouch (-1)
Total: 193/340
Ogre Clan Shaman
Code:
2. Ogre (261/340)
--------------
a. Crushing Blow (58/80)
Cleanness: (4/10)
* Correctly scoped. (+7)
* 'bj_meleeNearestMine' this was cute back in the day you couldn't easily declare a global variable, now it is murder. (-1)
* Check function is quite some mix between configuration and actual code that it doesn't make sense, I guess this reduces points here instead of in reusability? Either way (-2)
* "boolexpr Boolexpr","group Group", "timer Timer", I think it could have been done better than that. (-1)
* Few comments, at least they explain what each function does, I guess (+1)
Reusability (8/10)
* Why not let people choose effects from the object editor, considering they would even have a browser and all? (-1)
* Some config options, two values might depend on level the dps and the final damage. (+7)
* Why have non-config variables just in the middle of the config block? (-1)
* There are comments explaining what the values do (+3)
Efficiency (14/20)
* Using GroupEnum** on a temporary group object (-4)
* Once CrushingBlow's timer is started, it will never stop, looks like a bug ((Counter < 0) shoulb be ==0 instead). (-2)
Robustness (20/20)
* I can't think of any source of issues but that bug that prevents it from stopping the timer, I decided that's better for a penalty in the efficiency section.
Quality (12/20)
* I like how easy it has become to make a self-recursive spell.
* A couple of details don't hurt like the different effect for water. (+2)
b. Enrage (63/80)
Cleanness: (4/10)
* Correctly scoped. (+7)
* 'bj_meleeNearestMine' this was cute back in the day you couldn't easily declare a global variable, now it is murder. (-1)
* "boolexpr Boolexpr","group Group", "timer Timer", I think it could have been done better than that. (-1)
* Check function is quite some mix between configuration and actual code that it doesn't make sense, I guess this reduces points here instead of in reusability? Either way (-2)
* Few comments, at least they explain what each function does, I guess (+1)
* This sounds like a modus operandi.
Reusability (8/10)
* Why not let people choose effects from the object editor, considering they would even have a browser and all? (-1)
* Some config options, two values might depend on level the dps and the final damage. (+7)
* Why have non-config variables just in the middle of the config block? (-1)
* There are comments explaining what the values do (+3)
Efficiency (18/20)
* Once again, the timer is never paused. (-2)
Robustness (18/20)
* It is using the variable i in the function Actions twice, let's imagine that the ogre casts it, and there are less than 3 units already affected with it, it will iterate through dead or uninitialized elements in the array, if instead there are more than 3 units currently affected by Enrage, it might fail to remove the ability if it was of a different level than the new instance. IF the aura ability is of the stacking kind, this will allow a small boost for some time, I'd say it is good that the expiration timer removes all the ability levels... (-2)
Quality (15/20)
* Well it is interesting to see a custom scroll like spell work MUI and without crazy attachments, etc.
c. Runes (60/80)
Cleanness: (4/10)
* Correctly scoped. (+7)
* 'bj_meleeNearestMine' this was cute back in the day you couldn't easily declare a global variable, now it is murder. (-1)
* "boolexpr Boolexpr","group Group", "timer Timer", I think it could have been done better than that. (-1)
* Check function is quite some mix between configuration and actual code that it doesn't make sense, I guess this reduces points here instead of in reusability? Either way (-2)
* Few comments, at least they explain what each function does, I guess (+1)
* This cleanness area is a CNP of the previous ones indeed I like the consistency... Well really, once you decrypt one of Dusk's spells in this map, the next become obvious.
* This one spell could have really taking the OOP to the extreme, the rune onDestroy could have done the damage then Callback could have been very short.
Reusability (8/10)
* Why not let people choose effects from the object editor, considering they would even have a browser and all? (-1)
* Some config options, two values might depend on level the dps and the final damage. (+7)
* Why have non-config variables just in the middle of the config block? (-1)
* There are comments explaining what the values do (+3)
Efficiency (18/20)
* Speaking of consistency, guess what? The timer never ends (-2)
Robustness (20/20)
* Yeah, it is hard to find an error condition in this one.
Quality (10/20)
* This is the sort of spell you could have made entirely on the object editor, at least there was some effort on making the effects look nice though.
d. Hybernation(60/80)
Cleanness: (4/10)
Reusability (8/10)
Efficiency (18/20)
Robustness (20/20)
(Imagine I did a CNP from the text in Runes, perhaps put more emphasis on the 'consistent' things, really.)
Quality (10/20):
It is *really* simple.
e. Code reuse (20/20)
* Well, nothing really that could count as embedded code, there are no libraries either, the spells are just made in a way that doesn't require things like casters or attachment.
Total: 261/340
Tidal Lord
Code:
2. Tidal (185/340)
--------------
a. Drown (31/80)
Cleanness: (-2/10) (considered as 0)
* There's a scope, but it NOT correctly scoped, functions with very generic names like DeathActions and DeathConditions are neither public nor private (+4).
* 'bj_meleeNearestMine' really, why do people do this? (-1)
* Zero comments, at least some are used to separate things. (-1)
* "WaterEssence_SFX","Drown" It should have been using SCOPE_PREFIX, gamecache labels need to be scoped (-1)
* Config_Filter mixes configuration with code (-2)
* onCreate???! (-1)
Reusability (-1/10) (considered 0)
* There are ways to configure everything, but no comments whatsoever explaining what each config field means. (+7)
* The effects, are all hardcoded (-3)
* No way to know you need to copy that Cache library (-2)
* If you change Config_SummonID, it does not help DeathConditions work correctly, will be very hard to implement this spell correctly (-2)
* Config_Duration is also ignored when drown is casted on a unit that was already affected by it. (-1)
Efficiency (8/20)
* DeathActions doesn't set the effect variable to null (-1)
* GroupEnum*** used on a temporary group (-2)
* How about instead of needing gamecache and doing risky/slow things, that effect was added to the summon through one of those abilities that can add effects? It would remove all the problems related to the Death trigger and gamecache and H2I. (-4)
* Shouldn't the timer be stopped once there are no active instances? (-1)
* It is leaking gamecache entries for that "Drown" key attached to every unit (-2)
* The same goes for "WaterEssence_SFX" (-2)
Robustness (16/20)
* "GetCachedEffect (-4)"
Quality (10/20)
* One wonders if AOE parasite wouldn't have the same effect but perhaps that one would have been vulnerable to spell speal.
b. Dampen (35/80)
Cleanness: (1/10)
* There's a scope, but it NOT correctly scoped, functions with very generic names like CastActions and CastConditions are neither public nor private (+4).
* Zero comments, at least some are used to separate things. (-1)
* "Dampen" It should have been using SCOPE_PREFIX, gamecache labels need to be scoped (-1)
* onCreate???! (-1)
Reusability (1/10)
* There are ways to configure everything, but no comments whatsoever explaining what each config field means. (+7)
* The effects, are all hardcoded (-3)
* No way to know you need to copy that Cache library (-2)
* Config_Duration will be ignored in a way similar to Drown's problem (-1)
Efficiency (17/20)
* It is leaking that "Dampen" key attached to every unit affected by the spell (-2)
* Another one that doesn't pause the timer once it is not needed to run anymore (-1)
Robustness (16/20)
* Let's say Dampen is casted at some unit, the owner casts some form of dispel magic (since drunken haze is dispellable), the result is that for some time, Dampen will not affect the unit, it will be able to cast freely, then after these 8 seconds end, Dampen's buff will 'come back mysterously' (-4)
Quality (10/20)
* Well, it's ok.
c. Surge (42/80)
Cleanness: (4/10)
* Correctly scoped, except for the InitTrig (+6)
* onCreate.... (-1)
* Again using things like bj_meleeNearestMine barely saves you a variable declaration, but it makes the code more confusing. (-1)
Reusability (1/10)
* There are ways to configure everything, but no comments whatsoever explaining what each config field means. (+7)
* The effects, are all hardcoded (-3)
* No way to know you need to copy that Cache library (-2)
* Config_Filter is a bunch of code, not configuration, (-1)
Efficiency (12/20)
* An AddSpecialEffectTarget in onCreate. (-2)
* I think it was easy not to make those timers use gamecache (-2)
* A dynamic group was used with the GroupEnum native (-1)
* Another effect leak in Actions, one per unit actually (-3)
Robustness (14/20)
* "GetCachedUnit" (I2H) (-4)
* DestroyTimer (-2)
Quality (11/20)
* Besides of the other issues, I like all the efforts and tricks that were involved just to get a nice effect.
d. Overpower (61/80)
Cleanness: (5/10)
* Only complaint would be the inittrig thing instead of a initializer, and the lack of comments (+5)
Reusability (7/10)
* There are ways to configure everything, but no comments whatsoever explaining what each config field means. (+7)
Efficiency (20/20)
* It cannot be more efficient, really.
Robustness (20/20)
* It is very simple, the order toggle trick just works.
Quality (9/20):
* Well, toggleable ability addition with immolation has been done many times.
e. Code reuse (16/20)
* The ObjectCache library, it got "gamecache LocalCache = InitGameCache('jass.w3c')", wrong for some reasons: I think it should be private, considering nothing uses it directly. That's just not the way to initialize a gamecache, you need to first initialize, then flush it, then initialize again, for the reason that the Save gamecache native will save every gamecache in memory, this could bring problems in single player -2.
* Speaking of ObjectCache, isn't it Handle Vars or AttachVars? Did we really need another pack of these functions with another name? (-1)
* Why is its H2I not private nor public? It will get very hard to use this library in maps where it already is in use. (-1)
Total: 185/340
Hakkari Overlord
Code:
2. Hakkari (172/340)
--------------
Ok, there's a problem, when I started reviewing stuff I designed the grading
guidelines thinking there would be four spells in the map and perhaps outer
library or something like that, but this one got all the spells in a single
scope, so grading each spell is not easy, instead of giving 80 to each spell,
I will give 320 to the big scope in which these things are included, and every
penalty/bonus like in the previous reviews will have 4x the value. Enjoy:
abcd. All (160/320 )
Cleanness: (7/40)
* It uses a scope but it is not correctly scoped, incredibly common names
like t,t1,t2,t3,t4 are not scoped (+15)
* GetLastCreatedUnit(), UnitAddAbilityBJ, ForGroupBJ (and no usage of
bj_wantDestroyGroup whatsoever), GroupAddUnitSimple, GroupRemoveUnitSimple,
DestroyEffectBJ, "CreateNUnitsAtLoc( 1", SetUnitAbilityLevelSwapped,
IssuePointOrderLocBJ, ShowUnitHide. (-10)
* Indentation in some areas is quite screwed up (-4)
* Comments that describe what each function does, and at least some that
may allow to know what spell a function belongs to, certain ones inside
functions describing a couple of confusing lines. (+12)
* Let me penalize it for having all of the four spells' code inside a single
scope, it has made it quite hard to follow, (-4)
* Some conditions are GUIish, if(condition) return true else return false.
A return (condition) is simpler (-2)
It's annoying actually, this is so far the best commented of the pack,
unless Anitarf's code (which I haven't looked at yet) is better commented,
if it was scoped well, and the spells split, and the BJs gone - things that
require much less effort than commenting - it would have gotten near 40.
Reusability (-4/40) (considered 0)
* All in one scope, this means that to effectively implement just one of the
spells a person will have to do a lot of tweaking or remove code herself, on
one hand, this makes it easier to implement all four spells, but it just
makes it easier in the sense that you paste one trigger instead of 4,
something that could be accomplished by simply copying the whole category,
in the other hand it makes things hard for those who only want one spell...
(-12)
* You can change the rawcodes. (+8)
Efficiency (40/80)
* FirstOfGroup loop + CountUnitsInGroup!=0 , this is something that requires
some thought, first of all, if the exitwhen condition was FirstOfGroup==null
the whole loop would take N steps, where N is the initial number of units
in the group. Now, think of calling CountUnitsInGroup in the exitwhen
instead, CountUnitsInGroup actually iterates the whole group using ForGroup,
there are N calls to CountUnitsInGroup and each of them requires N-i steps,
where i equals the number of times the main loop was iterated, this ends up
giving a total of ((N+1)*N)/2 visits to the group, in other words the loop
is much, much slower than it could have been. (-8)
* GetUnitsInRangeOfLocMatching: This function leaks and uses a dynamic group
on a call to an enum function, (-16)
* GetUnitsInRectMatching: ditto (-16)
Robustness (68/80)
* dynamic trigger in _Summon_ , it was quite avoidable, it is just a timer
event (-4).
* GetLastCreatedUnit() is actually a global variable, there are chances
casting crimson copy would sometimes make a random recently created unit
change in scale. (-8)
I didn't really go fishing for bugs on this one, by the time I got to this
section the score was already low enough.
Quality (45/80)
* The higher-than-40 comes from Crimson Copy, a little complex to accomplish
but the final effect is very nice, the rest were just ok spells.
e. Code reuse (12/20)
* It got a whole damage system embedded in the scope -8.
Total: 172/340
Incubus
Code:
2. Incubus (270.5/340)
--------------
a. Consume Soul (55/80)
Cleanness: (6/10)
* Lacks comments, though commenting it would have probably been too much.
* Correctly scope (+6), But I think it should use a initializer instead
of initTrig stuff.
Reusability (9/10)
* I appreciate that it sets to tweak the factor based on level.
Perhaps some comment was necessary but the three values are named
descriptively enough. +9
Efficiency (20/20)
* It's impossible to have an objection, the code is so short and no change
would probably make any impact.
Robustness (20/20)
* The same as robustness
Quality (0/20)
* Really, instant kill + increasing life/mana. Ok..., I think it should at
least put a special effect or something, either way, I think a modified
life steal ability would have done exactly what this does but even look
better. Accept it, the only reason it has got such big score in the above
areas was that this is ridiculously simple for a spell, so I better put a
cero here to balance stuff.
b. SpellShield (67/80)
Cleanness: (5/10)
* Lacks comments (-1)
* Correctly scope (+6), But I think it should use a initializer instead
of initTrig stuff.
Reusability (10/10)
* You know, with the code here everybody has a unit point - target ability
already.
Efficiency (20/20)
* Could have been a little better without creating a caster or anything,
but it doesn't really have a valid effect for me to complaint.
Robustness (20/20)
* Can't think of it breaking.
Quality (12/20)
* Could use some reasoning similar as the last one, but although the code
is very simple, the trick of using an almost-unknown rune AOE spell to do
the spell block for free is clever.
-- As if two different guys made the spells, the next two spells' codes are huge
and full of complication, at least it is funnier this way than reviewing dusk's
spells yeah all 1 of them.
c. ArcaneBurst (60/80)
Cleanness: (5/10)
* Correctly scoped. (+7)
* Everybody should take a look at this spell, every struct does more than
just storing data for attachment, the spellinstance creates eyecandy stuff
which independently do the movement stuff.
* Lacks comments. (-2)
Reusability (6/10)
* A bunch of config options, commented , the functions could use some
comments, but their names are descriptive enough. +7.
* Again it would be easier for people to change the effects if instead of
constants we used AddSpellEffectById, let them use the object editor to
change these things, they will have a model browser with viewer and all (-1)
Efficiency (16/20)
* .update is declared bellow .create, when you use "spellInstance.update" in
a TimerStart call inside create, it will create a timer that every
UPDATE_PERIOD will call TriggerEvaluate, this is a small detail that could
have been easily fixed by moving .update above .create . (-2)
* That .update things happens twice (-2)
* There's a O(n) search, but with a trick, notice that this is a melee spell
and in this case n is the number of simultaneous instances, for starters
this cannot go over 12, but I'd say it is quite hard to have 3 instances of
this short spell at the same time.
Robustness (18/20)
* That preloading method... It shows the effect. For example if there was
a player near (0,0) and the effect was something with a longer dead
animation the player would get to see that effect, I also can't help but
wonder what would happen if more than 3 spells used that method for
preloading, the game has performance issues with overlapping models. (-2)
* There's a glitch, it calls Animation from the CAST event. I am not sure
if this is intentional, you can make the incubus do a funny animation for
free by pressing 't' then 's' quickly.
* It is possible that it would call DestroyEffect on null or a dead effect
I don't think this has any consequence though.
Quality (15/20)
* The usage of structs here is very good, someone should notice at the dummy
recycling used in the eyecandy part. The spell itself is a generic
channeling spell, but the eye candy stuff can get complex, and I like the
implementation.
d. Uppercut (72.5/80)
Cleanness: (8/10)
* A couple of comments separating the parts of the HUGE update method. (+1)
* Correctly scoped. (+7)
Reusability (7/10)
* A bunch of config options, commented , the functions could use some
comments, but their names are descriptive enough. (+7).
Efficiency (19.5/20)
* Perhaps the math could improve, I have no idea. I just feel guilty I
cannot justify more reductions than that -0.5.
Robustness (20/20)
* Again with that SPELL_CAST stuff.
Quality (18/20)
* When you look at the spell in game it is quite cool, the code is better
in the sense on how it was implemented. It is also quite a complex spell in
which you move the caster and victim.
e. Code reuse (16/20)
* So many dummy stuff is inside the spells' code. (-4)
Total: 270.5/340
Extra Comments
They say numbers don't lie, I still don't get why Anitarf won, I blame it on the by-design broken grading rules I made.
The Verdict What the last five million words in this post actually mean to you...
Design score is out of 50, so it has a scale of x20, art is out of 10, so the scale is x100, and code is out of 340, so the scale is x2.94~.
~Rising_Dusk
Bonecrusher
Design: 34/50
Art: 10/10
Code: 193/340
Scaled: 680 (Design) + 1000 (Art) + 567 (Code)
Total Score: 2247
Ogre Clan Shaman
Design: 36/50
Art: 8.5/10
Code: 261/340
Scaled: 720 (Design) + 850 (Art) + 767 (Code)
Total Score: 2337
Tidal Lord
Design: 27/50
Art: 7.5/10
Code: 185/340
Scaled: 540 (Design) + 750 (Art) + 543 (Code)
Total Score: 1833
Hakkari Overlord
Design: 29/50
Art: 5/10
Code: 172/340
Scaled: 580 (Design) + 500 (Art) + 506 (Code)
Total Score: 1586
Incubus
Design: 32/50
Art: 6/10
Code: 270.5/340
Scaled: 680 (Design) + 600 (Art) + 795 (Code)
Total Score: 2075
Uh, wow. So I really wasn't expecting that result, to be totally honest. It was ridiculously close when I was calculating the numbers, so I had to quadruple check my numbers. This is what it is, though. I guess this places the ranks as follows:
FIRST PLACE: AnemicRoyalty / Rising_Dusk
2337/3000
SECOND PLACE: Chriz. / Here-b-Trollz
2247/3000
THIRD PLACE: TDR / Anitarf
2075/3000
Congratulations to all of the winners and all of the participants, you've shown me that this hero stuff is really popular and that WC3C still has some serious kick to its bite!
Hmm, some of those code comments seem like things people wouldn't have known to have fixed during the contest. Although not commenting code? Tisk tisk, especially config. functions.
BUT...not that I have an objection or anything, my god I'm not like that, but why does everyone seem to have a problem with our dude being called an incubus? You see succubus everywhere being impersonated as vicious demon chicks when in fact it's just like the incubus, but female...nothing more than a spirit that rapes you at night...yet no one seems to have a problem with that. Just checking.
Yes but you see, something with a skeletal underbody doesnt perticulairly strike me as something that seduces wimans at night. It strikes me as something that especially can't "seduce" wimans.
Originally posted by Rising_Dusk Your spells are mostly ignored because they are not very cool so we aren't very excited to review/approve them, but you are incredibly persistent and won't give us an excuse to graveyard it. That is generally what results in a resource being ignored for a long time.
Originally posted by Kyrbi0 Huh. Almost makes me wish I had a girlfriend, to take advantage of today (wait, no, that's not what I meant... I mean, take advantage of the fact that it is international women's day... gah, never mind).
Quote:
Originally posted by Pyrogasm Rome may not have been built in a day, but the Romans sure as hell didn't say "look at this great city we built guys!" when they had nothing more than a bit of stone and some cottages.
Yes but you see, something with a skeletal underbody doesnt perticulairly strike me as something that seduces wimans at night. It strikes me as something that especially can't "seduce" wimans.
TLDR: It needs a penus.
__________________
Halp: SKrumble '08! v1.8 Alpha BF2 "It's impossible, my trigger is perfect!"
Holy fuck Vex's coding section was brutal.... although so was the contest. To think, our entry almost didn't get in, and yet somehow we made 2nd.
YAY Chriz! 10/10 in art! If only the coding had been flawless -.-
__________________
By reading this signature, you agree that I cannot be held accountable for anything that I might say or do. Secret Project Spell Upload/Backups/Progress Tracking
Spell Struct Encapsulation
Too bad you lost points for the naming (or appear to have lost points for naming =\)
Averages and mean Deviations
Table:
Average score
(% of max score)
Mean Deviation
(% of max score)
Coding
63.6%
11.6%
Design
63.2%
5.8%
Art
74%
15.2%
It seems that the artists at WC3C are far better then then the coders (and the ability for the team to design). Either that or Erwt is far kinder then Griffo and Vex (not surprising actually ). Whatever the case, it was Art that was the make or break in this contest!