I'm pretty sure that scope can't be private...? It shouldn't be too much of a problem though since everything that should be (like global variables and functions) are private.
Ops .. I don't know what I was thinking xD
I'll see what I can do with ABuffAura.
Last time I checked ABuffAura I found it quite simple to deal with. I am not sure if it has changed since then however. I will give it a look once I install wc3 again.
Heroic Offer
As for the simple spell, it can be improved in some ways:
1 - you should define a clear SETUP section according to the JESP standard. Do NOT mix SETUP globals with system globals. Instead, create another globals block. Check my tutorial to see how I organized globals, it will take you 5 seconds.
I really dislike the use of arrays for the SETUP, it makes no sense and it is hard for the user to change IMO. You should instead do something like:
JASS:
private function SetSacrificedLife takes integer level returns real
return 0.05 * level
endfunction
And the same should apply for SetHealedLife. This approach has many advantages such as:
1 - requires less code
2 - it is easier to understand
3 - it is faster (nothing is faster than arrays, I give you that, but there is no need in using them here, it's not like this is a critical application)
4 - it works for ANY number of levels
Therefore I would really like you to change it.
Finally, you are not preloading the ability, thus there will be first cast lag. We want to avoid that. Please use AbilityPreload.
You should also add a version number to your spells. Per example, this would be version 1.0. It is just to keep track of the different versions a spell can have. When I was coding my project it helped me organize things, so I would like to do it here as well.
Other than that, I would say that code is pretty simple and pretty perfect. Good job. I would give you rep++ but THW fag rep system won't allow me ...
Obliterate Mind
Well, you should preload the ability. Other than that, it is perfect.
Suggestions for spells: Those spells are in deed simple .... so why not make them better? Players love eye candy above all things. I strongly suggest you add some effect to the caster and to the target. It can be a death coil effect, or you can search an imported effect because Xarwin allows for imported effects. If you don't have the time, I can do it.
I can also PM the creators of the hero concepts in order to ask them for effects they would like to see.
Soul Harvest
In method learnSkill you are making multiple accesses to GetTriggerUnit(). I suggest you save that unit into a variable so it it faster (accessing variables is faster than accessing functions).
In your onTimedLoop you are evaluating all dead units every period, which means, you evaluate the dead units around the hero every 0.025 seconds. I don't think it is necessary to do count down of all dead units every 0.025 seconds, perhaps you should make the count down every 0.5 seconds? You only need to add a counter to that method, and it will release the CPU of a significant amount of work.
Other than that, the code is not that bad. I admit it is quite confusing because you use a style of programming that is not my own, but if you say it works, I believe you
Though iirc, there is a native called "corpse" (or something like this) that represents corpses (thus you don't need to check if a unit is alive). This could significantly improve the efficiency of your spell.
One last thing, you should definitely add an effect to the hero when he is bolstered, like an orb arround his weapon or something. It makes him look cooler
EDIT
Bliazzard account is down for maintenence so I can't install wc3 yet :S
As for UP, you forgot to post the link xD
Since you limit the array size to 6 members, thus you spend less memory for it.
Just wondering if it's better since I ain't sure, thus i am asking.
Afaik when you declare a array in WC3 it has a default size of 8191, not all your arrays need that size
If, the default size of an array when declared is 8191, then making" real array[6]" or "real array" gives you no efficiency improvements in time, but allows you to have a significant efficiency improvement in memory. If however, the default size of an array is < 6, (lets say, if it is 1) then each time you add an element, you have to expand the array. Expanding an array is extremely costly because you have to create an array with more memory, and copy the content of the old array to the new one.
The answer lies on the default size of an array when created.