Note: Consider this a public beta. I'm too lazy to do extensive testing.
Summary
Bonus Mod is a system for easily applying a reversible bonus to a specific unit. With a single function call, you can increase a single units damage / armor / sight range / etc. by any chosen amount. Bonuses like damage, armor, intelligence and agility will show up next to the units base stat, in green or red depending on if the bonus is negative or positive.
SetUnitMaxState is a function originally written by Blade.dk which abuses a bug introduced in some patch. It allows you to easily change the maximum life / mana of a single unit. It works by the fact that life / mana bonus abilities with more than one level will only ever add the bonus for level 1. However, when you remove the ability, it will remove the amount of life it is set up to add for that level. By removing a negative life bonus, a unit would gain life.
Implementation Instructions
These two systems can be added to a map independently of each other. (They are presented together due to their complimentary natures)
To add one of these systems to your map, simply copy and paste each library in to its own empty custom-script trigger. You will also need to create a large number of abilities for Bonus Mod, and two for SetUnitMaxState. However, you can use the following Object Merger macros to do the hard work for you. Simply copy them in to empty triggers, save your map, close it and re-open it in the editor, and disable the triggers you copied them in to. All the abilities these systems use will then be present in your map:
Bonus Mod Implementation Macros
// About these macros: // // The first paramiter is the rawcode for the ability. The convention used here by default is: // Zx followed by an uppercase letter, unique to the bonus, followed by a 0-9-a-z representing // the base of two the ability applys. // // The second paramiter is the display value of the ability. This is so that they all line up // neatly in the object editor. // // The third paramiter is the actual value the bonus ability applys. // // Note that you should copy this in to its own trigger, save once, close the map and re-open // it in the World Editor, then disable the trigger you copied this in to. If you do not // disable the trigger, saving will take an insane ammount of time every time you save. If you // make any changes below, you can simply enable the trigger again, save again, then disable // the trigger again.
// Don't let a //! external command be the last line in a trigger!
SetUnitMaxState Implementation Macros
// The Mana ability: //! external ObjectMerger w3a AImz Zx00 alev 19 aite 0 Iman 1 0 Iman 2 1 Iman 3 2 Iman 4 4 Iman 5 8 Iman 6 16 Iman 7 32 Iman 8 64 Iman 9 128 Iman 10 256 Iman 11 -1 Iman 12 -2 Iman 13 -4 Iman 14 -8 Iman 15 -16 Iman 16 -32 Iman 17 -64 Iman 18 -128 Iman 19 -256 anam "SetUnitMaxState - Mana" ansf "" aart ReplaceableTextures\CommandButtons\BTNManaStone.blp
// Don't let a //! external command be the last line in a trigger!
Note that if your map contains abilities which have rawcodes containing Zx followed by an upper-case letter, you will have some trouble with implementing this system. To easy implementation, use the Find and Replace function included in the JASS NewGen trigger editor to replace all occurrences of Zx in the above macros, as well as in each systems library.
The Libraries
Bonus Mod Library
////////////////////////////////////////////////////////////////////////////////////////// //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@ Bonus Mod //@======================================================================================= //@ Credits: //@--------------------------------------------------------------------------------------- //@ Written by: //@ Earth-Fury //@ Based on the work of: //@ weaaddar //@ //@ If you use this system, please credit all of the people mentioned above in your map. //@======================================================================================= //@ Bonus Mod Readme //@--------------------------------------------------------------------------------------- //@ //@ BonusMod is a system for adding bonuses to a single unit. For example, you may wish //@ to add a +40 damage bonus, or a -3 armor 'bonus'. Bonus mod works by adding abilitys //@ to a unit which effect the particular stat by a power of two. By combining diffrent //@ powers of two, you can reach any number between 0 and 2^(n+1) - 1, where n is the //@ largest power of 2 used. Bonus mod can also apply negative bonuses, by adding an //@ ability which has a 'bonus' of -2^(n+1), where again, n is the maximum power of 2. //@ With the negative bonus, you can add anywhere between 1 and 2^(n+1)-1 of a bonus. This //@ gives bonus mod a range of bonuses between -2^(n+1) and 2^(n+1)-1. By default, n is //@ set at 11, giving us a range of bonuses between -4096 and +4095. //@ //@--------------------------------------------------------------------------------------- //@ Adding Bonus Mod to your map: //@ //@ Copy this library in to a trigger named "BonusMod" in your map. //@ //@ After the script is copied, the hard part begins. You will have to transfer all of the //@ bonus abilitys found in this map to yours. However, this is really easy to do if you //@ are using the JASS NewGen editor. (Which you will have to be anyway, considering this //@ system is written in vJASS.) Included with this library are macros for the Object //@ Merger included in NewGen. Simply copy the Object Merger script included with this //@ system in to your map in its own trigger. Save your map. (Saving will take a while. //@ Up to 5 min if you have a slow computer.) Close your map, and reopen it. Disable the //@ trigger you copied the ObjectMerger script in to. //@ Your map now has all the abilitys it needs! //@ //@--------------------------------------------------------------------------------------- //@ Functions: //@ //@ boolean UnitSetBonus(unit <target unit>, integer <bonus type>, integer <bonus ammount>) //@ //@ This function clears any previously applied bonus on <target unit>, setting the //@ unit's bonus for <bonus type> to <bonus ammount>. <bonus type> should be one of the //@ integer type constants below. This function will return false if the desired bonus is //@ not a valid bonus type, or out of the range of bonuses that can be applied. //@ //@ integer UnitGetBonus(unit <target unit>, integer <bonus type>) //@ //@ Returns the bonus ammount of <bonus type> currently applied to <target unit>. //@ //@ boolean UnitAddBonus(unit <target unit>, integer <bonus type>, integer <bonus ammount>) //@ //@ This function will add <bonus ammount> to the bonus of type <bonus type> on the //@ unit <target unit>. <bonus ammount> can be a negative value. This function will return //@ false if the new bonus will be out of the range which bonus mod can apply. //@ //@ nothing UnitClearBonus(unit <target unit>, integer <bonus type>) //@ //@ This function will effectively set the bonus of type <bonus type> for the unit //@ <target unit> to 0. It is advised you use this function over UnitSetBonus(..., ..., 0) //@ //@--------------------------------------------------------------------------------------- //@ Variables: //@ //@ BonusMod_MaxBonus //@ The maximum bonus that Bonus Mod can apply //@ BonusMod_MinBonus //@ The minimum bonus that Bonus Mod can apply //@--------------------------------------------------------------------------------------- //@ Increasing the Range of Bonuses: //@ //@ By default, bonus mod uses 13 abilitys per bonus type. This gives each bonus type a //@ range of -4096 to +4095. To increase this range, you will have to create one new //@ ability for each ability, for each power of two you increase bonus mod by. You will //@ also have to edit the negative bonus ability to apply a bonus of -2^(n+1), where n is //@ the largest power of two you will be using for positive bonuses. You will need to edit //@ the ABILITY_COUNT constant found below to reflect the new total number of abilitys //@ each individual bonus will use. You will also have to add the abilitys to the function //@ InitializeAbilitys. Note that the number in the array index indicates which power of //@ 2 is held there. So, for instance, set BonusAbilitys[i + 15] would hold an ability //@ which changes the relivent stat by 32768. (2^15 = 32768) The last ability in the array //@ must apply a negative bonus. //@ //@ Here is an example of the bonus BONUS_ARMOR using 15 abilitys instead of 12: //@ //@ set i = BONUS_ARMOR * ABILITY_COUNT //@ set BonusAbilitys[i + 0] = 'ZxA0' // +1 //@ set BonusAbilitys[i + 1] = 'ZxA1' // +2 //@ set BonusAbilitys[i + 2] = 'ZxA2' // +4 //@ set BonusAbilitys[i + 3] = 'ZxA3' // +8 //@ set BonusAbilitys[i + 4] = 'ZxA4' // +16 //@ set BonusAbilitys[i + 5] = 'ZxA5' // +32 //@ set BonusAbilitys[i + 6] = 'ZxA6' // +64 //@ set BonusAbilitys[i + 7] = 'ZxA7' // +128 //@ set BonusAbilitys[i + 8] = 'ZxA8' // +256 //@ set BonusAbilitys[i + 9] = 'ZxA9' // +512 //@ set BonusAbilitys[i + 10] = 'ZxAa' // +1024 //@ set BonusAbilitys[i + 11] = 'ZxAb' // +2048 //@ set BonusAbilitys[i + 12] = 'ZxAc' // +4096 //@ set BonusAbilitys[i + 13] = 'ZxAd' // +8192 //@ set BonusAbilitys[i + 14] = 'ZxAe' // +16384 //@ set BonusAbilitys[i + 15] = 'ZxAf' // -32768 //@ //@--------------------------------------------------------------------------------------- //@ Adding and Removing Bonus Types: //@ //@ Removing a bonus type is simple. First, delete it from the list of constants found //@ below. Make sure the constants are numberd 0, 1, 2, 3, etc. without any gaps. Change //@ the BONUS_TYPES constant to reflect the new number of bonuses. You must then remove //@ the lines of array initialization for the bonus you removed from the //@ InitializeAbilitys function. You can then delete the abilitys for that bonus type, and //@ you are then done removing a bonus type. //@ //@ Adding a bonus type is done in much the same way. Add a constant for it to the list of //@ constants below, ensuring they are numberd 0, 1, 2, 3 etc. withour any gaps. Change //@ the BONUS_TYPES constant to reflect the new number of bonuses. You must then create //@ all the needed abilitys for the new bonus type. Ensure the bonus they each apply is a //@ power of 2, as with the already included bonuses. See the section Increasing the Range //@ of Bonuses for more information. After all the abilitys are added, you must add the //@ needed lines to the InitializeAbilitys function. The existing lines should be a clear //@ enogh example. //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ////////////////////////////////////////////////////////////////////////////////////////// library BonusMod initializer Initialize
globals //======================================================================================== // Bonus Type Constants //========================================================================================
// The number of bonus type constants above: constantinteger BONUS_TYPES = 8
//======================================================================================== // Other Configuration //========================================================================================
// The number of abilitys used per bonus type: privateconstantinteger ABILITY_COUNT = 13
// Note: Setting the following to false will decrease loading time, but will cause a // small ammount of lag when a bonus is first applied. (Especially a negative bonus) // If set to true, all BonusMod abilitys will be preloaded: privateconstantboolean PRELOAD_ABILITYS = true
// Only applies if PRELOAD_ABILITYS is set to true. // The unit type used to preload abilitys on: privateconstantinteger PRELOAD_DUMMY_UNIT = 'hpea' endglobals
//======================================================================================== // Ability Initialization //---------------------------------------------------------------------------------------- // The following function is used to define the rawcodes for all the abilitys bonus mod // uses. If you use the text macros included with BonusMod, and if you do not wish to add, // remove, or change the range of bonuses, you will not have to edit the following. // // Note that if your map already has abilitys with rawcodes that begin with Zx followed by // an upper-case letter, the ObjectMerger macros included with this library will not work // and you will have to edit the lines below. However, you could use the find and replace // feature in JASS NewGen's Trigger Editor Syntax Highlighter to replace all occurances of // Zx both here and in the ObjectMerger macros to ease configuration. //======================================================================================== privatekeyword BonusAbilitys privatefunction InitializeAbilitys takesnothingreturnsnothing localinteger i
// Bonus Mod - Armor abilitys set i = BONUS_ARMOR * ABILITY_COUNT set BonusAbilitys[i + 0] = 'ZxA0'// +1 set BonusAbilitys[i + 1] = 'ZxA1'// +2 set BonusAbilitys[i + 2] = 'ZxA2'// +4 set BonusAbilitys[i + 3] = 'ZxA3'// +8 set BonusAbilitys[i + 4] = 'ZxA4'// +16 set BonusAbilitys[i + 5] = 'ZxA5'// +32 set BonusAbilitys[i + 6] = 'ZxA6'// +64 set BonusAbilitys[i + 7] = 'ZxA7'// +128 set BonusAbilitys[i + 8] = 'ZxA8'// +256 set BonusAbilitys[i + 9] = 'ZxA9'// +512 set BonusAbilitys[i + 10] = 'ZxAa'// +1024 set BonusAbilitys[i + 11] = 'ZxAb'// +2048 set BonusAbilitys[i + 12] = 'ZxAc'// -4096
// Bonus Mod - Damage abilitys set i = BONUS_DAMAGE * ABILITY_COUNT set BonusAbilitys[i + 0] = 'ZxB0'// +1 set BonusAbilitys[i + 1] = 'ZxB1'// +2 set BonusAbilitys[i + 2] = 'ZxB2'// +4 set BonusAbilitys[i + 3] = 'ZxB3'// +8 set BonusAbilitys[i + 4] = 'ZxB4'// +16 set BonusAbilitys[i + 5] = 'ZxB5'// +32 set BonusAbilitys[i + 6] = 'ZxB6'// +64 set BonusAbilitys[i + 7] = 'ZxB7'// +128 set BonusAbilitys[i + 8] = 'ZxB8'// +256 set BonusAbilitys[i + 9] = 'ZxB9'// +512 set BonusAbilitys[i + 10] = 'ZxBa'// +1024 set BonusAbilitys[i + 11] = 'ZxBb'// +2048 set BonusAbilitys[i + 12] = 'ZxBc'// -4096
// Bonus Mod - Sight Range abilitys set i = BONUS_SIGHT_RANGE * ABILITY_COUNT set BonusAbilitys[i + 0] = 'ZxC0'// +1 set BonusAbilitys[i + 1] = 'ZxC1'// +2 set BonusAbilitys[i + 2] = 'ZxC2'// +4 set BonusAbilitys[i + 3] = 'ZxC3'// +8 set BonusAbilitys[i + 4] = 'ZxC4'// +16 set BonusAbilitys[i + 5] = 'ZxC5'// +32 set BonusAbilitys[i + 6] = 'ZxC6'// +64 set BonusAbilitys[i + 7] = 'ZxC7'// +128 set BonusAbilitys[i + 8] = 'ZxC8'// +256 set BonusAbilitys[i + 9] = 'ZxC9'// +512 set BonusAbilitys[i + 10] = 'ZxCa'// +1024 set BonusAbilitys[i + 11] = 'ZxCb'// +2048 set BonusAbilitys[i + 12] = 'ZxCc'// -4096
// Bonus Mod - Mana Regen abilitys set i = BONUS_MANA_REGEN * ABILITY_COUNT set BonusAbilitys[i + 0] = 'ZxD0'// +1 set BonusAbilitys[i + 1] = 'ZxD1'// +2 set BonusAbilitys[i + 2] = 'ZxD2'// +4 set BonusAbilitys[i + 3] = 'ZxD3'// +8 set BonusAbilitys[i + 4] = 'ZxD4'// +16 set BonusAbilitys[i + 5] = 'ZxD5'// +32 set BonusAbilitys[i + 6] = 'ZxD6'// +64 set BonusAbilitys[i + 7] = 'ZxD7'// +128 set BonusAbilitys[i + 8] = 'ZxD8'// +256 set BonusAbilitys[i + 9] = 'ZxD9'// +512 set BonusAbilitys[i + 10] = 'ZxDa'// +1024 set BonusAbilitys[i + 11] = 'ZxDb'// +2048 set BonusAbilitys[i + 12] = 'ZxDc'// -4096
// Bonus Mod - Life Regen abilitys set i = BONUS_LIFE_REGEN * ABILITY_COUNT set BonusAbilitys[i + 0] = 'ZxE0'// +1 set BonusAbilitys[i + 1] = 'ZxE1'// +2 set BonusAbilitys[i + 2] = 'ZxE2'// +4 set BonusAbilitys[i + 3] = 'ZxE3'// +8 set BonusAbilitys[i + 4] = 'ZxE4'// +16 set BonusAbilitys[i + 5] = 'ZxE5'// +32 set BonusAbilitys[i + 6] = 'ZxE6'// +64 set BonusAbilitys[i + 7] = 'ZxE7'// +128 set BonusAbilitys[i + 8] = 'ZxE8'// +256 set BonusAbilitys[i + 9] = 'ZxE9'// +512 set BonusAbilitys[i + 10] = 'ZxEa'// +1024 set BonusAbilitys[i + 11] = 'ZxEb'// +2048 set BonusAbilitys[i + 12] = 'ZxEc'// -4096
// Bonus Mod - Hero STR abilitys set i = BONUS_HERO_STR * ABILITY_COUNT set BonusAbilitys[i + 0] = 'ZxF0'// +1 set BonusAbilitys[i + 1] = 'ZxF1'// +2 set BonusAbilitys[i + 2] = 'ZxF2'// +4 set BonusAbilitys[i + 3] = 'ZxF3'// +8 set BonusAbilitys[i + 4] = 'ZxF4'// +16 set BonusAbilitys[i + 5] = 'ZxF5'// +32 set BonusAbilitys[i + 6] = 'ZxF6'// +64 set BonusAbilitys[i + 7] = 'ZxF7'// +128 set BonusAbilitys[i + 8] = 'ZxF8'// +256 set BonusAbilitys[i + 9] = 'ZxF9'// +512 set BonusAbilitys[i + 10] = 'ZxFa'// +1024 set BonusAbilitys[i + 11] = 'ZxFb'// +2048 set BonusAbilitys[i + 12] = 'ZxFc'// -4096
// Bonus Mod - Hero AGI abilitys set i = BONUS_HERO_AGI * ABILITY_COUNT set BonusAbilitys[i + 0] = 'ZxG0'// +1 set BonusAbilitys[i + 1] = 'ZxG1'// +2 set BonusAbilitys[i + 2] = 'ZxG2'// +4 set BonusAbilitys[i + 3] = 'ZxG3'// +8 set BonusAbilitys[i + 4] = 'ZxG4'// +16 set BonusAbilitys[i + 5] = 'ZxG5'// +32 set BonusAbilitys[i + 6] = 'ZxG6'// +64 set BonusAbilitys[i + 7] = 'ZxG7'// +128 set BonusAbilitys[i + 8] = 'ZxG8'// +256 set BonusAbilitys[i + 9] = 'ZxG9'// +512 set BonusAbilitys[i + 10] = 'ZxGa'// +1024 set BonusAbilitys[i + 11] = 'ZxGb'// +2048 set BonusAbilitys[i + 12] = 'ZxGc'// -4096
// Bonus Mod - Hero INT abilitys set i = BONUS_HERO_INT * ABILITY_COUNT set BonusAbilitys[i + 0] = 'ZxH0'// +1 set BonusAbilitys[i + 1] = 'ZxH1'// +2 set BonusAbilitys[i + 2] = 'ZxH2'// +4 set BonusAbilitys[i + 3] = 'ZxH3'// +8 set BonusAbilitys[i + 4] = 'ZxH4'// +16 set BonusAbilitys[i + 5] = 'ZxH5'// +32 set BonusAbilitys[i + 6] = 'ZxH6'// +64 set BonusAbilitys[i + 7] = 'ZxH7'// +128 set BonusAbilitys[i + 8] = 'ZxH8'// +256 set BonusAbilitys[i + 9] = 'ZxH9'// +512 set BonusAbilitys[i + 10] = 'ZxHa'// +1024 set BonusAbilitys[i + 11] = 'ZxHb'// +2048 set BonusAbilitys[i + 12] = 'ZxHc'// -4096 endfunction
//======================================================================================== // System Code //---------------------------------------------------------------------------------------- // Do not edit below this line unless you wish to change the way the system works. //========================================================================================
globals // Contains all abilitys in a two-dimensional structure: privateintegerarray BonusAbilitys
// Precomputed powers of two to avoid speed and rounding issues with Pow(): privateintegerarray PowersOf2
// Range constants (Read only please): publicinteger MaxBonus publicinteger MinBonus endglobals function UnitClearBonus takesunit u, integer bonusType returnsnothing localinteger i = 0
set i = i + 1 exitwhen i == ABILITY_COUNT - 2 endloop endfunction
function UnitSetBonus takesunit u, integer bonusType, integer ammount returnsboolean localinteger i = ABILITY_COUNT - 2
if ammount < MinBonus or ammount > MaxBonus then debugcall BJDebugMsg("BonusSystem Error: Bonus too high or low (" + I2S(ammount) + ")") returnfalse elseif bonusType < 0 or bonusType >= BONUS_TYPES then debugcall BJDebugMsg("BonusSystem Error: Invalid bonus type (" + I2S(bonusType) + ")") returnfalse endif
function UnitGetBonus takesunit u, integer bonusType returnsinteger localinteger i = 0 localinteger ammount = 0
if GetUnitAbilityLevel(u, BonusAbilitys[bonusType * ABILITY_COUNT + ABILITY_COUNT - 1]) > 0 then set ammount = MinBonus endif
loop if GetUnitAbilityLevel(u, BonusAbilitys[bonusType * ABILITY_COUNT + i]) > 0 then set ammount = ammount + PowersOf2[i] endif
set i = i + 1 exitwhen i == ABILITY_COUNT - 2 endloop
return ammount endfunction
function UnitAddBonus takesunit u, integer bonusType, integer ammount returnsboolean return UnitSetBonus(u, bonusType, UnitGetBonus(u, bonusType) + ammount) endfunction
privatefunction Initialize takesnothingreturnsnothing localinteger i = 1 localunit u
set PowersOf2[0] = 1 loop set PowersOf2[i] = PowersOf2[i - 1] * 2 set i = i + 1 exitwhen i == ABILITY_COUNT endloop
set MaxBonus = PowersOf2[ABILITY_COUNT - 1] - 1 set MinBonus = -PowersOf2[ABILITY_COUNT - 1]
call InitializeAbilitys()
if PRELOAD_ABILITYS then set u = CreateUnit(Player(15), PRELOAD_DUMMY_UNIT, 0, 0, 0) set i = 0 loop exitwhen i == BONUS_TYPES * ABILITY_COUNT call UnitAddAbility(u, BonusAbilitys[i]) set i = i + 1 endloop call RemoveUnit(u) endif endfunction endlibrary
SetUnitMaxState Library
////////////////////////////////////////////////////////////////////////////////////////// //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@ SetUnitMaxState //@======================================================================================= //@ Credits: //@--------------------------------------------------------------------------------------- //@ Written by: //@ Earth-Fury //@ Based on the work of: //@ Blade.dk //@ //@ If you use this system, please credit all of the people mentioned above in your map. //@======================================================================================= //@ SetUnitMaxState Readme //@--------------------------------------------------------------------------------------- //@ //@ SetUnitMaxState() is a function origionally written by Blade.dk. It takes advantage of //@ a bug which was introduced in one of the patches: Bonus life and mana abilitys will //@ only ever add the bonus ammount for level 1. However, when removed, they will remove //@ the ammount they should have added at their current level. This allows you to change a //@ units maximum life and mana, without adding a perminent ability to the unit. //@ //@--------------------------------------------------------------------------------------- //@ Adding SetUnitMaxState to your map: //@ //@ Simply copy this library in to a trigger which has been converted to custom text. //@ After that, you must copy over the abilitys. This is made easy by the ObjectMerger in //@ JASS NewGen. Distributed with this system are //! external calls to the ObjectMerger. //@ Simply copy both of them in to your map, save your map, close and reopen your map in //@ the editor, and remove the external calls. (Or otherwise disable them. Removing the ! //@ after the // works.) //@ //@--------------------------------------------------------------------------------------- //@ Using SetUnitMaxState: //@ //@ nothing SetUnitMaxState(unit <target>, unitstate <state>, real <new value>) //@ //@ This function changes <target>'s unitstate <state> to be eqal to <new value>. Note //@ that the only valid unitstates this function will use are UNIT_STATE_MAX_MAN and //@ UNIT_STATE_MAX_LIFE. Use SetUnitState() to change other unitstates. //@ //@ nothing AddUnitMaxState(unit <target>, unitstate <state>, real <add value>) //@ //@ This function adds <add value> to <target>'s <state> unitstate. <add value> can be //@ less than 0, making this function reduce the specified unitstate. This function will //@ only work with the unitstates UNIT_STATE_MAX_LIFE and UNIT_STATE_MAX_MANA. //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ////////////////////////////////////////////////////////////////////////////////////////// library SetUnitMaxState initializer Initialize globals //======================================================================================== // Configuration //========================================================================================
// The rawcode of the life ability: privateconstantinteger MAX_STATE_LIFE_ABILITY = 'Zx01'
// The rawcode of the mana ability: privateconstantinteger MAX_STATE_MANA_ABILITY = 'Zx00'
// The maximum power of two the abilitys use: privateconstantinteger MAX_STATE_MAX_POWER = 8 endglobals
//======================================================================================== // System Code //---------------------------------------------------------------------------------------- // Do not edit below this line unless you wish to change the way the system works. //========================================================================================
globals privateintegerarray PowersOf2 endglobals
function SetUnitMaxState takesunit u, unitstate state, real newValue returnsnothing localinteger stateAbility localinteger newVal = R2I(newValue) localinteger i = MAX_STATE_MAX_POWER localinteger offset
if state == UNIT_STATE_MAX_LIFE then set stateAbility = MAX_STATE_LIFE_ABILITY elseif state == UNIT_STATE_MAX_MANA then set stateAbility = MAX_STATE_MANA_ABILITY else debugcall BJDebugMsg("SetUnitMaxState Error: Invalid unitstate") return endif
set newVal = newVal - R2I(GetUnitState(u, state))
if newVal > 0 then set offset = MAX_STATE_MAX_POWER + 3 elseif newVal < 0 then set offset = 2 set newVal = -newVal else return endif
loop exitwhen newVal == 0 or i < 0 if newVal >= PowersOf2[i]then call UnitAddAbility(u, stateAbility) call SetUnitAbilityLevel(u, stateAbility, offset + i) call UnitRemoveAbility(u, stateAbility) set newVal = newVal - PowersOf2[i] else set i = i - 1 endif endloop endfunction
function AddUnitMaxState takesunit u, unitstate state, real addValue returnsnothing call SetUnitMaxState(u, state, GetUnitState(u, state) + addValue) endfunction
privatefunction Initialize takesnothingreturnsnothing localinteger i = 1
set PowersOf2[0] = 1 loop set PowersOf2[i] = PowersOf2[i - 1] * 2 set i = i + 1 exitwhen i == MAX_STATE_MAX_POWER + 3 endloop endfunction endlibrary
Credit Where Credit is Due
Bonus Mod is a system originally written by weaaddar.
Because of the nature of these systems, I thought it prudent to include a small demo map. If anyone wants to make a less-sucky demo map, feel free and I'll include it in this post with credit to you. Else I will some day make a decent demo map.
Any suggestions? Criticism? Anyone willing to write better documentation?
I haven't so extensively bug-tested these systems, but they seem stable enough for a general release. If you find any bugs or have any gripes, please do speak up now.
And finally, don't criticize my crappy wrapper functions too much. I'm just too tired of staring at 500 lines of code to properly implement those two functions.
__________________
Giving reputation is a nice way to say thank you to someone that helps you!
Unprotecting maps is not right its like crime and YOU GO MAKE YOUR OWN MAP AND BE HAPPY! Don't be gay n00b!
1. You can if it is yours but you should not if it is not. It is like stealing information and using it as if it is your own. It si gay stuff and people who unprotect maps are gay themselves.