Name | Type | is_array | initial_value |
AbilityLevels | integer | Yes | |
ALL_Items | itemcode | Yes | |
Arena_Training_Spawn_Points | location | Yes | |
B | real | Yes | |
BookOfSummoning | unit | No | |
BookOfSummoning_Timer | timer | No | |
Boss_aura | effect | Yes | |
BossAbilityGiveCounter | integer | No | |
Bosses | unit | Yes | |
BossesGroup | group | No | |
BountyCalcL | integer | No | |
BountyCalcXP | integer | No | |
BountyFT | string | No | |
BountyGroup | group | No | |
BountyIncreaseBasedOnDifficult | real | No | |
BountyPoint | location | No | |
BR | string | No | |n |
CamMaxDistance | integer | No | |
Checked2NoMatch | boolean | No | |
CinematicMoveLocs | location | Yes | |
CinematicStartLoc | location | No | |
Command_AutoIncrAfterQ | boolean | No | |
CONTINUE | boolean | No | |
Couer_Aura_Ability | abilcode | Yes | |
Count_GivenItems | integer | No | |
Courier | unit | Yes | |
CrystalsBonusIncreaseP | real | No | |
Current_Quest_Ability | abilcode | No | |
Current_Quest_AbilityID | integer | No | |
Current_QuestGiver | unit | No | |
CurrentQuestName | string | No | |
CutAt | integer | No | |
CutStringPartOf3 | string | Yes | |
DecryptedCharID | integer | No | |
DetectedEndOfString | integer | No | |
Dialog_Defeat | dialog | No | |
Dialog_Victory | dialog | No | |
Dick_phrases | string | Yes | |
Difficulty_Current | integer | No | 1 |
Difficulty_TimeGap | integer | No | 10 |
Difficulty_Timer | timer | No | |
Duel_Arena_Points | location | Yes | |
Duel_Arena_Points_Contenders | location | Yes | |
Duel_Attachment | effect | Yes | |
Duel_Challeng_Pending | boolean | No | |
Duel_Challenge_In_Arena | boolean | No | |
Duel_Challenged | player | No | |
Duel_Challenged_Hero | unit | No | |
Duel_ChallengeID | integer | No | |
Duel_Challenger | player | No | |
Duel_Challenger_Hero | unit | No | |
Duel_Dialog | dialog | No | |
Duel_DialogB_Accept | button | No | |
Duels_Won | integer | Yes | |
Dummy_Dead | unit | Yes | |
Dummy_Dead_Requirement | unitcode | Yes | |
Dummy_HRS_Ress | unit | Yes | |
Dummy_RAMC_Face | unit | No | |
EmotionalShopCreepsGr | group | No | |
Empty_Slots | integer | No | |
FacingOfHealerM180 | real | No | |
Floatinf_Text_AFK | texttag | Yes | |
Found | boolean | No | |
FoundItem | boolean | No | |
FoundMatch | boolean | No | |
FoundSeparatorIndex1 | integer | No | |
FoundSeparatorIndex2 | integer | No | |
FreeSlots_Courier | integer | No | |
FreeSlots_Hero | integer | No | |
G | real | Yes | |
GiveControlAfterLeaave | integer | Yes | |
Graveyarrd_Points | location | Yes | |
Group_HeroicRS_Dummies | group | No | |
HandicapCustomSize | integer | No | |
Hero | unit | Yes | |
HeroCourier | unit | No | |
HeroPos | location | Yes | |
HeroType | unitcode | Yes | |
HomePoint | location | No | |
HRS_CurrentUser | player | No | |
IsBoss | boolean | No | |
ItemAbility_Destruction_P | integer | Yes | |
ItemCheck | item | No | |
Items_Of_Courier | item | Yes | |
LastItem | item | No | |
LastItemID | integer | No | |
Legend_DoubleZero | string | No | |
Legend_ReplaceStrings_NoItem | string | No | |
Legend_ReplaceStrings_NoItems | string | No | |
Legend_String_2Quests | string | No | |
Legend_String_2QuestsI | string | No | |
Legend_String_3Quests | string | No | |
Legend_String_3QuestsI | string | No | |
Legend_String_AliveBoss | string | No | |
Legend_String_AliveBossAll | string | No | |
Legend_String_DeadBoss | string | No | |
Legend_String_DeadBossAll | string | No | |
Legend_String_NoCrystals | string | No | |
Legend_String_NoCrystalsAll | string | No | |
Legend_String_QuestCompleted | string | No | |
Legend_String_QuestCp | string | No | |
Legend_String_QuestCpI | string | No | |
Legend_String_QuestIncomplete | string | No | |
Legend_String_QuestsCompleted | string | No | |
Legend_String_QuestsIncomplete | string | No | |
LOAD_ConcatenatedSum | string | No | |
LOAD_CurrentPlayer | integer | No | |
LOAD_CutItems | string | No | |
LOAD_CutQuests | string | No | |
LOAD_ItemNumber | integer | No | |
LOAD_ItemSeparatorID | integer | No | |
Load_LoadedCrystals | string | Yes | |
Load_LoadedRawString | string | No | |
Load_LoadedStrings | string | Yes | |
LOAD_TakenItemLoopID | integer | No | |
LOADCODE_Crystals | string | No | |
LOADCODE_Items | string | No | |
LOADCODE_Levels | string | No | |
LOADCODE_Quests | string | No | |
LoadCodes | string | Yes | |
LP_Crystals | integer | No | |
LP_PlayersHere | integer | No | |
LP_Split | integer | No | |
MAIN_MULT | multiboard | No | |
Multiboard_Icons | string | Yes | |
Multiboard_Stats_D | string | Yes | 0 |
Multiboard_Stats_Data | string | Yes | 0 |
Multiboard_Stats_DD | string | Yes | 0 |
Multiboard_Stats_K | string | Yes | 0 |
NextPlayerIndex | integer | No | |
Oderu | unit | No | |
OptionalBosses | unit | No | |
OptionalBossLocs | location | No | |
OptionalBossTypes | unitcode | No | |
overheadTextHP | texttag | Yes | |
OzeruDefeated | boolean | No | |
PDD_allocatedAttacks | integer | No | |
PDD_allocCounter | integer | No | |
PDD_amount | real | No | |
PDD_ATTACK_TYPE_UNIVERSAL | attacktype | No | |
PDD_BRACERS_SPELL_DMG_RED | real | No | |
PDD_CODE | integer | No | |
PDD_DAMAGE_TYPE_DETECTOR | integer | No | |
PDD_damageEvent | trigger | No | |
PDD_damageEventTrigger | real | No | |
PDD_damageHandler | trigger | No | |
PDD_damageType | integer | No | |
PDD_ETHEREAL_DAMAGE_FACTOR | real | No | |
PDD_h | hashtable | No | |
PDD_PHYSICAL | integer | No | |
PDD_pureAmount | real | No | |
PDD_runAllocatedAttacks | trigger | No | |
PDD_SET_MAX_LIFE | integer | No | |
PDD_source | unit | No | |
PDD_SPELL | integer | No | |
PDD_SPELL_DMG_REDUCTION_ITEM | integer | No | |
PDD_SPELL_RESIST_AUTO_DETECT | boolean | No | |
PDD_target | unit | No | |
PDD_totalAllocs | integer | No | |
PDD_TRIGGER_CLEANUP_PERIOD | real | No | |
PDD_UNIT_MIN_LIFE | real | No | |
PHA_SecondWind_Level | integer | Yes | |
Player_Color | string | Yes | |
PlayerHere | boolean | Yes | |
PlayerIsAFK | boolean | Yes | |
Priests_Freed | integer | No | |
ProvokeT | timer | No | |
ProvokeUG | group | No | |
QiestTimeH | integer | Yes | |
QiestTimeM | integer | Yes | |
QiestTimeS | integer | Yes | |
Quest_Abilities | abilcode | Yes | |
Quest_Counter | integer | Yes | |
Quest_Front_Points | location | Yes | |
Quest_Group | group | Yes | |
Quest_Lower_Gates_Trg | trigger | Yes | |
Quest_Ping_Pos | location | Yes | |
Quest_Quest | quest | Yes | |
Quest_Up_Gates | trigger | Yes | |
Quest_Zones | rect | Yes | |
QuestForceTeam | group | No | |
QuestGiver | unit | Yes | |
QuestIsCompleted | boolean | Yes | |
QuestNamesList | string | Yes | |
QuestsAvailable_Counter | integer | No | |
QuestsCompletedCount | integer | No | |
QuestTimings | string | Yes | |
R | real | Yes | |
R_Copy_2 | real | Yes | |
RAMCinematic_HeroLocs | location | Yes | |
Recipe_Base_IsRepeating | boolean | No | |
Recipe_ConfirmAll | integer | No | |
Recipe_Full | boolean | No | |
Recipe_Name | string | No | |
Recipe_Parts_Count | integer | Yes | |
Recipe_RefundAmount | integer | No | |
Recipe_Req_Positions | integer | Yes | |
Recipe_RequiredItems | integer | No | |
Recipe_RequiredType | itemcode | Yes | |
Recipe_ResultItem | itemcode | No | |
Recipe_SameItemTimes | integer | No | |
Recipe_Successfull | boolean | No | |
RecipeParts_RequiredQuantity | integer | Yes | |
RecipeRepeatCounter | integer | No | |
RecipeRepeatedItemType | itemcode | No | |
ResurrectedPlayer | integer | No | |
ResurrectingUnitIsHealer | boolean | No | |
Resurrection_Spells | abilcode | Yes | |
ResurrectionStopped | boolean | No | |
Root_Dummy3 | unit | No | |
RootCount | integer | No | |
Roots_Dummy | unit | No | |
Roots_Dummy2 | unit | No | |
Roots_Dummy4 | unit | No | |
Roots_Dummy5 | unit | No | |
Roots_Dummy6 | unit | No | |
Roots_Unit | unit | Yes | |
Roots_Units_Count | integer | No | |
SAVE_String | string | Yes | |
SAVELOAD_AllSame | boolean | No | |
SAVELOAD_EncryptedNumbers | string | Yes | |
SAVELOAD_GENERATED | string | No | |
SAVELOAD_GroupQuestChars | string | Yes | |
SAVELOAD_Hero_HPp | string | Yes | |
SAVELOAD_Hero_Level | string | Yes | |
SAVELOAD_Hero_MPp | string | Yes | |
SAVELOAD_HeroItems | string | Yes | |
SAVELOAD_HeroPosX | string | Yes | |
SAVELOAD_HeroPosY | string | Yes | |
SAVELOAD_HPSigns | string | Yes | |
SAVELOAD_INPUT | string | No | |
SAVELOAD_LOADED | boolean | No | |
SAVELOAD_OderuStatus | string | No | |
SAVELOAD_PlayerCrystals | string | Yes | |
SAVELOAD_PlayerGold | string | Yes | |
SAVELOAD_QuestCombEncr | string | Yes | |
SAVELOAD_QuestsString | string | No | |
SAVELOAD_QuestsVary | boolean | No | |
SAVELOAD_Timer | timer | No | |
SelectedCraftedItemID | integer | No | |
ShopAbility_SecondWind_CD | timer | Yes | |
ShopAbility_SecondWind_HPB | real | Yes | |
ShowAbilityLevel | integer | Yes | |
SOD_Quote | texttag | No | |
SOP_A | real | Yes | |
SOP_D | real | Yes | |
StoneTeleport_ID | integer | No | |
StoneTeleport_Unit | unit | No | |
StopSearching | boolean | No | |
string_MarkedCrystals | string | No | |
Summon_Dialog | dialog | Yes | |
Summon_Dialog_No | button | Yes | |
Summon_Dialog_Yes | button | Yes | |
Summon_Offer | integer | Yes | |
Summon_Offer_Pending | boolean | Yes | |
Summon_Point | location | Yes | |
Summon_Stone | unit | Yes | |
Summoning_Ability | abilcode | Yes | |
Taken_Slot | integer | No | |
TargetResurrectionPoint | location | No | |
TeleportToQuest_TUnit | unit | No | |
TempAbility | abilcode | No | |
TempAbilityLevel | integer | No | |
TempChar | string | No | |
TempCutString | string | No | |
TempHPPercent | integer | No | |
TempInt | integer | No | |
TempIntChecker | integer | No | |
tempItemType | itemcode | No | |
TempLoc | location | No | |
TempReal | real | No | |
TempRefund | integer | No | |
TempString | string | No | |
TempStringofID | string | No | |
TempSubID | integer | No | |
TempUnit | unit | No | |
TempUnitGr | group | No | |
test_recipe | location | No | |
Time | integer | Yes | |
Time_S | string | Yes | |
Timer_AFK | timer | Yes | |
Timer_Resurrect | timer | No | |
Training_Abilities | abilcode | Yes | |
Training_Current_Level | integer | No | 1 |
Training_Group | group | No | |
Training_IsInGroup | boolean | No | |
Training_Waves_Killed | integer | Yes | |
UnReturnedOptionalQuests | integer | No | |
Witchcraft_Gr | group | No | |
Zord | unit | Yes | |
ZordSpawnLoc | location | Yes | |
ZordType | unitcode | Yes |
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_trainer_vars_Actions takes nothing returns nothing
set udg_Training_Abilities[1] = 'er01'
set udg_Training_Abilities[2] = 'er02'
set udg_Training_Abilities[3] = 'er03'
set udg_Training_Abilities[4] = 'er04'
set udg_Training_Abilities[5] = 'er05'
set udg_Training_Abilities[6] = 'er06'
set udg_Training_Abilities[7] = 'er07'
set udg_Training_Abilities[8] = 'er08'
set udg_Training_Abilities[9] = 'er09'
set udg_Training_Abilities[10] = 'er10'
set udg_Training_Abilities[11] = 'er11'
endfunction
//===========================================================================
function InitTrig_trainer_vars takes nothing returns nothing
set gg_trg_trainer_vars = CreateTrigger( )
call TriggerAddAction( gg_trg_trainer_vars, function Trig_trainer_vars_Actions )
endfunction
//TESH.scrollpos=118
//TESH.alwaysfold=0
////////////////////////////////////////////////////////////////////////////////////
//
// Physical Damage Detection Engine GUI v 1.3.0.0
// ----------------------------------------------
// By looking_for_help aka eey
//
// This system is able to detect, modify and deal damage. It can differentiate
// between physical and spell damage, as well as block, reduce or increase the
// applied damage to a desired value. You can also allocate damage events from
// running damage events.
//
// This is the GUI version of the system, meaning that you can use this with the
// standard editor and basically without any knowledge of JASS.
//
////////////////////////////////////////////////////////////////////////////////////
//
// Implementation
// --------------
// 1. Create all variables that this system uses (compare the variable editor).
// You don't have to set them to specific values, they get initialized
// automatically by the system so just create them.
// 2. Copy this trigger to your map. You can then add damage handlers by using
// the event "value of real variable becomes equal to 1" with the variable
// udg_PDD_damageEventTrigger. Compare the OnDamage trigger for an example usage.
// 3. Copy the two custom abilities to your map and make sure they have the
// correct ID. You can specify the ID in the function InitGlobalVariables
// above.
// 4. Go to the locust swarm ability and invert its damage return portion
// from (default) 0.75 to -0.75.
// 5. Remove the spell damage reduction ability from the spell damage reduction
// items you use (runed bracers). You can configure the resistance of this
// item in the InitGlobalVariables function, modifying the global variable
// udg_PDD_BRACERS_SPELL_DMG_RED.
//
////////////////////////////////////////////////////////////////////////////////////
//
// Important Notes
// ---------------
// 1. Life Drain does not work with this system, so you should use a triggered
// version of this spell if you want to use it.
// 2. Same for Finger of Death, if you want to use this spell bug free with this
// system, you should use a triggered version of it.
// 3. If you use damage modifiers by setting the damage amount variable, you have
// to use GetUnitLife, GetUnitMaxLife and SetUnitLife instead of GetWidgetLife,
// GetUnitState for UNIT_STATE_MAX_LIFE and SetWidgetLife in your whole map to
// ensure there occure no bugs.
// 4. The boolean udg_PDD_SPELL_RESIST_AUTO_DETECT is only neccessary set to true
// if you want to use a customized damage table with spell damage resistance
// above 100%. If this is not the case, it should be set to false, as the
// system is faster then and still works correct.
// 5. As already mentioned you can't use the spell reduction ability when using this
// system (runed bracers and elunes grace). If you want to use them, you can
// trigger them by using the damage modifiers. Runed bracers is already considered
// in this system, so you don't have to code it.
//
////////////////////////////////////////////////////////////////////////////////////
//
// System API
// ----------
// real damageEventTrigger
// - Use the event "value of real variable becomes equal to 1" to detect a damage
// event. In this event you can use the following API. Compare the OnDamage
// trigger for an example usage.
//
// unit target
// - In this global unit variable, the damaged unit is saved. Don't write any-
// thing into this variable, use it as readonly.
//
// unit source
// - In this global unit variable, the damage source is saved. Don't write any-
// thing into this variable, use it as readonly.
//
// real amount
// - In this global real variable, the amount of damage is saved. This amount
// can be modified by simply setting it to the desired amount that should be
// applied to the target. Set the amount to 0.0 to block the damage completly.
// Negative values will result in heal.
//
// integer damageType
// - In this global integer variable, the damage type of the current damage is
// saved. Use it to differentiate between physical, spell and code damage. The
// variable can takes the values PHYSICAL == 0, SPELL == 1 and CODE == 2. Don't
// write anything into this variable, use it as readonly.
//
// function GetUnitLife takes unit u returns real
// - Use this function instead of the GetWidgetLife native. It ensures that you
// get the correct health value, even when damage modifiers are applied. If
// you don't use damage modifiers at all, you don't need this function.
//
// function GetUnitMaxLife takes unit u returns real
// - Use this function instead of the GetUnitState(u, UNIT_STATE_MAX_LIFE) native.
// It will return the correct value, even when damage modifiers are applied. If
// you don't use damage modifiers at all, you don't need this function.
//
// function SetUnitLife takes unit u, real newLife returns nothing
// - Use this function instead of the SetWidgetLife(u, newLife) native if you use
// damage modifiers in your map. Same rules as for the GetUnitMaxLife and the
// GetUnitMaxLife functions.
//
// function UnitDamageTargetEx takes unit localSource, unit localTarget, real localAmount, boolean attack, boolean ranged, attacktype localAttackType, damagetype localDamageType, weapontype localWeaponType returns boolean
// - Use this function to deal damage from a running damage event. It works exactly
// the same as the native UnitDamageTarget but is recursion safe so that you can
// realize damage reflection for example with this. Don't ever use this function
// outside of an onDamage event.
//
// function AddDamageHandler takes code damageHandler returns nothing
// - Allows you to add a damage handler function to the system. This is not
// required for GUI users, only for vanilla JASS users. GUI users should
// use the real variable damageEventTrigger to add damage handlers to this
// system as explained above.
//
// function RemoveDamageHandler takes code damageHandler returns nothing
// - Allows you to remove a damage handler function from the system dynamic-
// ally. If you added the same handler function multiple times to the sys-
// tem, this function will remove all of these equal functions. This is not
// required for GUI users, only for vanilla JASS users.
//
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
// Configurable globals
//////////////////////////////////////////////////////////////////////////////////
function InitGlobalVariables takes nothing returns nothing
// Put here the correct ability IDs
set udg_PDD_DAMAGE_TYPE_DETECTOR = 'DTDC'
set udg_PDD_SET_MAX_LIFE = 'SMXL'
// Here you can configure some stuff, read the documentation for further info
set udg_PDD_SPELL_DMG_REDUCTION_ITEM = 'brac'
set udg_PDD_SPELL_RESIST_AUTO_DETECT = false
set udg_PDD_ETHEREAL_DAMAGE_FACTOR = 1.66
set udg_PDD_BRACERS_SPELL_DMG_RED = 0.33
set udg_PDD_TRIGGER_CLEANUP_PERIOD = 60.0
endfunction
//////////////////////////////////////////////////////////////////////////////////
// End of configurable globals
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
// User functions
//////////////////////////////////////////////////////////////////////////////////
function AddDamageHandler takes code func returns nothing
local integer id = GetHandleId(Condition(func))
local integer index = 0
// Loop to manage equal damage handlers
loop
exitwhen ( LoadTriggerConditionHandle(udg_PDD_h, id, index) == null )
set index = index + 1
endloop
// Store the desired damage handler function
call SaveTriggerConditionHandle(udg_PDD_h, id, index, TriggerAddCondition(udg_PDD_damageHandler, Filter(func)))
endfunction
function RemoveDamageHandler takes code func returns nothing
local integer id = GetHandleId(Condition(func))
local integer index = 0
// Loop through all equal damage handlers
loop
exitwhen ( LoadTriggerConditionHandle(udg_PDD_h, id, index) == null )
call TriggerRemoveCondition(udg_PDD_damageHandler, LoadTriggerConditionHandle(udg_PDD_h, id, index))
set index = index + 1
endloop
// Clean things up
call FlushChildHashtable(udg_PDD_h, id)
endfunction
function GetUnitLife takes unit u returns real
local boolean duringModification
local integer uId = GetHandleId(u)
local real health
local real storedHealth = LoadReal(udg_PDD_h, uId, 2)
local real storedDamage = LoadReal(udg_PDD_h, uId, 1)
// Check if the unit is being rescued from damage
set duringModification = GetUnitAbilityLevel(u, udg_PDD_SET_MAX_LIFE) > 0
if duringModification then
call UnitRemoveAbility(u, udg_PDD_SET_MAX_LIFE)
endif
// Get the correct health value of the unit
if storedHealth != 0.0 then
set health = storedHealth - storedDamage
else
set health = GetWidgetLife(u) - storedDamage
endif
// Restore the rescue ability and return
if duringModification then
call UnitAddAbility(u, udg_PDD_SET_MAX_LIFE)
endif
return health
endfunction
function GetUnitMaxLife takes unit u returns real
local real maxHealth
// Check if the unit is being rescued from damage
if GetUnitAbilityLevel(u, udg_PDD_SET_MAX_LIFE) > 0 then
call UnitRemoveAbility(u, udg_PDD_SET_MAX_LIFE)
set maxHealth = GetUnitState(u, UNIT_STATE_MAX_LIFE)
call UnitAddAbility(u, udg_PDD_SET_MAX_LIFE)
return maxHealth
endif
// If the unit isn't being rescued, use the standard native
return GetUnitState(u, UNIT_STATE_MAX_LIFE)
endfunction
function SetUnitLife takes unit u, real newLife returns nothing
local integer targetId
local integer oldTimerId
local real oldHealth
// Check if the unit is being rescued from damage
if GetUnitAbilityLevel(u, udg_PDD_SET_MAX_LIFE) > 0 then
call UnitRemoveAbility(u, udg_PDD_SET_MAX_LIFE)
call SetWidgetLife(u, newLife)
call UnitAddAbility(u, udg_PDD_SET_MAX_LIFE)
// Get the unit specific timer information
set targetId = GetHandleId(u)
set oldHealth = LoadReal(udg_PDD_h, targetId, 0)
// Update the unit specific timer information
if oldHealth != 0.0 then
set oldTimerId = LoadInteger(udg_PDD_h, targetId, 3)
call SaveReal(udg_PDD_h, targetId, 2, newLife)
call SaveReal(udg_PDD_h, targetId, 0, newLife)
call SaveReal(udg_PDD_h, oldTimerId, 4, newLife)
endif
return
endif
// If the unit isn't being rescued, use the standard native
call SetWidgetLife(u, newLife)
endfunction
function UnitDamageTargetEx takes unit localSource, unit localTarget, real localAmount, boolean attack, boolean ranged, attacktype localAttackType, damagetype localDamageType, weapontype localWeaponType returns boolean
// Avoid infinite loop due to recursion
if udg_PDD_damageType == udg_PDD_CODE then
return false
endif
// Avoid allocating attacks on units that are about to be killed
if ( localTarget == udg_PDD_target and GetUnitLife(localTarget) - udg_PDD_amount < udg_PDD_UNIT_MIN_LIFE ) then
return false
endif
// Store all damage parameters determined by the user
set udg_PDD_allocatedAttacks = udg_PDD_allocatedAttacks + 1
call SaveUnitHandle(udg_PDD_h, udg_PDD_allocatedAttacks, 0, localSource)
call SaveUnitHandle(udg_PDD_h, udg_PDD_allocatedAttacks, 1, localTarget)
call SaveReal(udg_PDD_h, udg_PDD_allocatedAttacks, 2, localAmount)
call SaveBoolean(udg_PDD_h, udg_PDD_allocatedAttacks, 3, attack)
call SaveBoolean(udg_PDD_h, udg_PDD_allocatedAttacks, 4, ranged)
call SaveInteger(udg_PDD_h, udg_PDD_allocatedAttacks, 5, GetHandleId(localAttackType))
call SaveInteger(udg_PDD_h, udg_PDD_allocatedAttacks, 6, GetHandleId(localDamageType))
call SaveInteger(udg_PDD_h, udg_PDD_allocatedAttacks, 7, GetHandleId(localWeaponType))
// Return true if the damage was allocated
return true
endfunction
////////////////////////////////////////////////////////////////////////////////////
// Sub functions
////////////////////////////////////////////////////////////////////////////////////
function DealFixDamage takes unit source, unit target, real pureAmount returns nothing
local real MAX_DAMAGE = 1000000.0
local real beforeHitpoints
local real newHitpoints
// Ensure the amount is positive
if pureAmount < 0 then
set pureAmount = -pureAmount
endif
// Save the targets hitpoints
set beforeHitpoints = GetWidgetLife(target)
set newHitpoints = beforeHitpoints - pureAmount
// Apply the desired, fixed amount
if newHitpoints >= udg_PDD_UNIT_MIN_LIFE then
call SetUnitState(target, UNIT_STATE_LIFE, newHitpoints)
else
if ( IsUnitType(target, UNIT_TYPE_ETHEREAL) == false ) then
call SetWidgetLife(target, 1.0)
call UnitDamageTarget(source, target, MAX_DAMAGE, true, false, udg_PDD_ATTACK_TYPE_UNIVERSAL, DAMAGE_TYPE_UNIVERSAL, null)
call SetWidgetLife(target, 0.0)
else
call UnitRemoveAbility(target, udg_PDD_DAMAGE_TYPE_DETECTOR)
call SetWidgetLife(target, 1.0)
call UnitDamageTarget(source, target, MAX_DAMAGE, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL, null)
call SetWidgetLife(target, 0.0)
endif
endif
endfunction
function GetUnitSpellResistance takes unit u returns real
local real originalHP
local real beforeHP
local real afterHP
local real resistance
local real DUMMY_DAMAGE = 100
local real DUMMY_FACTOR = 0.01
// Deal spell damage in order to get the units resistance
call UnitRemoveAbility(udg_PDD_target, udg_PDD_DAMAGE_TYPE_DETECTOR)
set originalHP = GetWidgetLife(udg_PDD_target)
call UnitAddAbility(udg_PDD_target, udg_PDD_SET_MAX_LIFE)
call SetWidgetLife(udg_PDD_target, 20000.0)
set beforeHP = GetWidgetLife(udg_PDD_target)
call DisableTrigger(udg_PDD_damageEvent)
call UnitDamageTarget(udg_PDD_source, udg_PDD_target, DUMMY_DAMAGE, true, false, null, DAMAGE_TYPE_UNIVERSAL, null)
call EnableTrigger(udg_PDD_damageEvent)
set afterHP = GetWidgetLife(udg_PDD_target)
call UnitRemoveAbility(udg_PDD_target, udg_PDD_SET_MAX_LIFE)
call SetWidgetLife(udg_PDD_target, originalHP)
call UnitAddAbility(udg_PDD_target, udg_PDD_DAMAGE_TYPE_DETECTOR)
call UnitMakeAbilityPermanent(udg_PDD_target, true, udg_PDD_DAMAGE_TYPE_DETECTOR)
// Calculate this resistance
set resistance = DUMMY_FACTOR*(beforeHP - afterHP)
// If the resistance was greater than 100%, return it
if resistance > 1.0 then
return resistance
else
return 1.0
endif
endfunction
function UnitHasItemOfType takes unit u, integer itemId returns integer
local integer index = 0
local item indexItem
// Check if the target has a spell damage reducing item
loop
set indexItem = UnitItemInSlot(u, index)
if ( indexItem != null ) and ( GetItemTypeId(indexItem) == itemId ) then
set indexItem = null
return index + 1
endif
set index = index + 1
exitwhen index >= bj_MAX_INVENTORY
endloop
set indexItem = null
return 0
endfunction
////////////////////////////////////////////////////////////////////////////////////
// Damage Engine
////////////////////////////////////////////////////////////////////////////////////
function AfterDamage takes nothing returns nothing
local timer time = GetExpiredTimer()
local integer id = GetHandleId(time)
local unit localSource = LoadUnitHandle(udg_PDD_h, id, 0)
local unit localTarget = LoadUnitHandle(udg_PDD_h, id, 1)
local real pureAmount = LoadReal(udg_PDD_h, id, 2)
local real amount = LoadReal(udg_PDD_h, id, 3)
local real originalHealth = LoadReal(udg_PDD_h, id, 4)
// If the damage was modified, restore units health
if originalHealth != 0.0 then
call UnitRemoveAbility(localTarget, udg_PDD_SET_MAX_LIFE)
call SetWidgetLife(localTarget, originalHealth)
endif
// Apply the desired amount of damage
if amount > 0.0 then
call DisableTrigger(udg_PDD_damageEvent)
call DealFixDamage(localSource, localTarget, amount)
call EnableTrigger(udg_PDD_damageEvent)
else
call SetWidgetLife(localTarget, originalHealth - amount)
endif
// Clean things up
call FlushChildHashtable(udg_PDD_h, id)
call FlushChildHashtable(udg_PDD_h, GetHandleId(localTarget))
call DestroyTimer(time)
set time = null
set localSource = null
set localTarget = null
endfunction
function DamageEngine takes nothing returns nothing
local timer time
local integer id
local real health
local real rawAmount
local real originalHealth
local integer targetId
local integer oldTimerId
local real oldHealth
local real oldOriginalHealth
local real oldAmount
set rawAmount = GetEventDamage()
if rawAmount == 0.0 then
return
endif
set udg_PDD_source = GetEventDamageSource()
set udg_PDD_target = GetTriggerUnit()
// Determine the damage type
if rawAmount > 0.0 then
if udg_PDD_damageType != udg_PDD_CODE then
set udg_PDD_damageType = udg_PDD_PHYSICAL
endif
set udg_PDD_amount = rawAmount
else
if udg_PDD_damageType != udg_PDD_CODE then
set udg_PDD_damageType = udg_PDD_SPELL
endif
set udg_PDD_amount = -rawAmount
endif
// Register spell reduction above 100%
if udg_PDD_SPELL_RESIST_AUTO_DETECT then
set udg_PDD_amount = GetUnitSpellResistance(udg_PDD_target)*udg_PDD_amount
else
if ( IsUnitType(udg_PDD_target, UNIT_TYPE_ETHEREAL) and IsUnitEnemy(udg_PDD_target, GetOwningPlayer(udg_PDD_source)) and rawAmount < 0.0 ) then
set udg_PDD_amount = udg_PDD_ETHEREAL_DAMAGE_FACTOR*udg_PDD_amount
endif
endif
// Register spell damage reducing items like runed bracers
if ( IsUnitType(udg_PDD_target, UNIT_TYPE_HERO) and UnitHasItemOfType(udg_PDD_target, udg_PDD_SPELL_DMG_REDUCTION_ITEM) > 0 ) and rawAmount < 0.0 then
set udg_PDD_amount = (1 - udg_PDD_BRACERS_SPELL_DMG_RED)*udg_PDD_amount
endif
// Save health and damage variables
if udg_PDD_damageType != udg_PDD_CODE then
call UnitRemoveAbility(udg_PDD_target, udg_PDD_SET_MAX_LIFE)
endif
set udg_PDD_pureAmount = udg_PDD_amount
set originalHealth = GetWidgetLife(udg_PDD_target)
set oldTimerId = 0
// Call damage handlers
set udg_PDD_damageEventTrigger = 0.0
set udg_PDD_damageEventTrigger = 1.0
set udg_PDD_damageEventTrigger = 0.0
// If the damage was modified, apply the rescue ability
if udg_PDD_amount != udg_PDD_pureAmount then
call UnitAddAbility(udg_PDD_target, udg_PDD_SET_MAX_LIFE)
call SetWidgetLife(udg_PDD_target, GetWidgetLife(udg_PDD_target) + udg_PDD_pureAmount)
endif
// Check if a previous timer didn't yet expire
set targetId = GetHandleId(udg_PDD_target)
set oldHealth = LoadReal(udg_PDD_h, targetId, 0)
// If this is the case, update the timer information
if oldHealth != 0.0 then
set oldTimerId = LoadInteger(udg_PDD_h, targetId, 3)
set oldOriginalHealth = LoadReal(udg_PDD_h, targetId, 2)
set oldAmount = LoadReal(udg_PDD_h, targetId, 1)
set originalHealth = oldOriginalHealth - oldAmount
call SaveReal(udg_PDD_h, oldTimerId, 4, oldOriginalHealth)
endif
// Call after damage event if damage was spell, modified, code or parallel
if ( rawAmount < 0.0 or udg_PDD_pureAmount != udg_PDD_amount or oldTimerId != 0 or udg_PDD_allocatedAttacks > 0 ) then
set time = CreateTimer()
set id = GetHandleId(time)
// Save handles for after damage event
call SaveUnitHandle(udg_PDD_h, id, 0, udg_PDD_source)
call SaveUnitHandle(udg_PDD_h, id, 1, udg_PDD_target)
call SaveReal(udg_PDD_h, id, 2, udg_PDD_pureAmount)
call SaveReal(udg_PDD_h, id, 3, udg_PDD_amount)
call SaveReal(udg_PDD_h, id, 4, originalHealth)
// Save this extra to manage parallel damage instances
call SaveReal(udg_PDD_h, targetId, 0, GetWidgetLife(udg_PDD_target))
call SaveReal(udg_PDD_h, targetId, 1, udg_PDD_amount)
call SaveReal(udg_PDD_h, targetId, 2, originalHealth)
call SaveInteger(udg_PDD_h, targetId, 3, id)
// Avoid healing of negative spell damage
if rawAmount < 0.0 then
call DisableTrigger(udg_PDD_damageEvent)
call DealFixDamage(udg_PDD_source, udg_PDD_target, -rawAmount)
if ( originalHealth - udg_PDD_amount < udg_PDD_UNIT_MIN_LIFE ) then
call UnitRemoveAbility(udg_PDD_target, udg_PDD_SET_MAX_LIFE)
call DealFixDamage(udg_PDD_source, udg_PDD_target, udg_PDD_amount)
endif
call EnableTrigger(udg_PDD_damageEvent)
endif
// Guarantee unit exploding
if originalHealth - udg_PDD_amount < udg_PDD_UNIT_MIN_LIFE then
if rawAmount > 0.0 then
call UnitRemoveAbility(udg_PDD_target, udg_PDD_SET_MAX_LIFE)
call SetWidgetLife(udg_PDD_target, udg_PDD_UNIT_MIN_LIFE)
endif
endif
// Start the after damage event
call TimerStart(time, 0.0, false, function AfterDamage)
endif
// Handle allocated attacks from UnitDamageTargetEx
if udg_PDD_totalAllocs == 0 then
set udg_PDD_totalAllocs = udg_PDD_allocatedAttacks
endif
if udg_PDD_allocatedAttacks > 0 then
set udg_PDD_allocatedAttacks = udg_PDD_allocatedAttacks - 1
set udg_PDD_allocCounter = udg_PDD_allocCounter + 1
call TriggerEvaluate(udg_PDD_runAllocatedAttacks)
endif
// Reset all required variables
set udg_PDD_damageType = -1
set udg_PDD_totalAllocs = 0
set udg_PDD_allocCounter = -1
endfunction
////////////////////////////////////////////////////////////////////////////////////
// Initialization
////////////////////////////////////////////////////////////////////////////////////
function RestoreTriggers takes nothing returns nothing
local unit enumUnit = GetEnumUnit()
// Re-register units that are alive
if GetUnitTypeId(enumUnit) != 0 then
call TriggerRegisterUnitEvent(udg_PDD_damageEvent, enumUnit, EVENT_UNIT_DAMAGED)
endif
set enumUnit = null
endfunction
function ClearMemory_Actions takes nothing returns nothing
local group g = CreateGroup()
local code c = function DamageEngine
// Reset the damage event
call GroupEnumUnitsInRect(g, GetWorldBounds(), null)
call ResetTrigger(udg_PDD_damageEvent)
call DestroyTrigger(udg_PDD_damageEvent)
set udg_PDD_damageEvent = null
// Rebuild it then
set udg_PDD_damageEvent = CreateTrigger()
call TriggerAddCondition(udg_PDD_damageEvent, Filter(c))
call ForGroup(g, function RestoreTriggers)
// Clean things up
call DestroyGroup(g)
set g = null
set c = null
endfunction
function MapInit takes nothing returns nothing
local unit enumUnit = GetEnumUnit()
// Register units on map initialization
call UnitAddAbility(enumUnit, udg_PDD_DAMAGE_TYPE_DETECTOR)
call UnitMakeAbilityPermanent(enumUnit, true, udg_PDD_DAMAGE_TYPE_DETECTOR)
call TriggerRegisterUnitEvent(udg_PDD_damageEvent, enumUnit, EVENT_UNIT_DAMAGED)
set enumUnit = null
endfunction
function UnitEntersMap takes nothing returns nothing
local unit triggerUnit = GetTriggerUnit()
// Register units that enter the map
if ( GetUnitAbilityLevel(triggerUnit, udg_PDD_DAMAGE_TYPE_DETECTOR) < 1 ) then
call UnitAddAbility(triggerUnit, udg_PDD_DAMAGE_TYPE_DETECTOR)
call UnitMakeAbilityPermanent(triggerUnit, true, udg_PDD_DAMAGE_TYPE_DETECTOR)
call TriggerRegisterUnitEvent(udg_PDD_damageEvent, triggerUnit, EVENT_UNIT_DAMAGED)
endif
set triggerUnit = null
endfunction
function RunAllocatedAttacks takes nothing returns nothing
local integer localAllocAttacks = udg_PDD_allocatedAttacks + 1
// Calculate the correct sequence of allocated attacks
set localAllocAttacks = localAllocAttacks - udg_PDD_totalAllocs + 1 + 2*udg_PDD_allocCounter
// Deal code damage if the unit isn't exploding
set udg_PDD_damageType = udg_PDD_CODE
if GetUnitLife(LoadUnitHandle(udg_PDD_h, localAllocAttacks, 1)) >= udg_PDD_UNIT_MIN_LIFE then
call UnitDamageTarget(LoadUnitHandle(udg_PDD_h, localAllocAttacks, 0), LoadUnitHandle(udg_PDD_h, localAllocAttacks, 1), LoadReal(udg_PDD_h, localAllocAttacks, 2), LoadBoolean(udg_PDD_h, localAllocAttacks, 3), LoadBoolean(udg_PDD_h, localAllocAttacks, 4), ConvertAttackType(LoadInteger(udg_PDD_h, localAllocAttacks, 5)), ConvertDamageType(LoadInteger(udg_PDD_h, localAllocAttacks, 6)), ConvertWeaponType(LoadInteger(udg_PDD_h, localAllocAttacks, 7)))
else
call FlushChildHashtable(udg_PDD_h, localAllocAttacks - 1)
endif
// Clean things up
call FlushChildHashtable(udg_PDD_h, localAllocAttacks)
endfunction
function InitTrig_DamageEvent takes nothing returns nothing
local group g = CreateGroup()
local region r = CreateRegion()
local trigger UnitEnters = CreateTrigger()
local trigger ClearMemory = CreateTrigger()
local code cDamageEngine = function DamageEngine
local code cUnitEnters = function UnitEntersMap
local code cClearMemory = function ClearMemory_Actions
local code cRunAllocatedAttacks = function RunAllocatedAttacks
// Initialize global variables
set udg_PDD_h = InitHashtable()
set udg_PDD_damageEvent = CreateTrigger()
set udg_PDD_damageHandler = CreateTrigger()
set udg_PDD_damageType = -1
set udg_PDD_allocatedAttacks = 0
set udg_PDD_runAllocatedAttacks = CreateTrigger()
// Initialize global configurable constants
call InitGlobalVariables()
// Initialize global fixed constants
set udg_PDD_PHYSICAL = 0
set udg_PDD_SPELL = 1
set udg_PDD_CODE = 2
set udg_PDD_UNIT_MIN_LIFE = 0.406
set udg_PDD_ATTACK_TYPE_UNIVERSAL = ConvertAttackType(7)
set udg_PDD_totalAllocs = 0
set udg_PDD_allocCounter = -1
set udg_PDD_damageEventTrigger = 0.0
// Register units on map initialization
call TriggerRegisterVariableEvent(udg_PDD_damageHandler, "udg_PDD_damageEventTrigger", EQUAL, 1.0)
call TriggerAddCondition(udg_PDD_damageEvent, Filter(cDamageEngine))
call GroupEnumUnitsInRect(g, GetWorldBounds(), null)
call ForGroup(g, function MapInit)
// Register units that enter the map
call RegionAddRect(r, GetWorldBounds())
call TriggerRegisterEnterRegion(UnitEnters, r, null)
call TriggerAddCondition(UnitEnters, Filter(cUnitEnters))
// Register trigger for allocated attacks
call TriggerAddCondition(udg_PDD_runAllocatedAttacks, Filter(cRunAllocatedAttacks))
// Clear memory leaks
call TriggerRegisterTimerEvent(ClearMemory, udg_PDD_TRIGGER_CLEANUP_PERIOD, true)
call TriggerAddCondition(ClearMemory, Filter(cClearMemory))
// Clean things up
call DestroyGroup(g)
set UnitEnters = null
set ClearMemory = null
set cDamageEngine = null
set cUnitEnters = null
set cClearMemory = null
set cRunAllocatedAttacks = null
set g = null
set r = null
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_U_Offer_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'uoia' ) ) then
return false
endif
return true
endfunction
function Trig_U_Offer_Actions takes nothing returns nothing
// the variables that will be used in the recipe
// ------------------------------------------
// ------------------------------------------
set udg_TempUnit = GetTriggerUnit()
set udg_Recipe_RequiredItems = 2
set udg_Recipe_RequiredType[1] = 'qq90'
set udg_Recipe_RequiredType[2] = 'qq73'
set udg_Recipe_ResultItem = 'unof'
set udg_Recipe_RefundAmount = 0
// ------------------------------------------
// ------------------------------------------
set udg_Recipe_Base_IsRepeating = false
call TriggerExecute( gg_trg_recipe_base )
set udg_Recipe_Successfull = false
endfunction
//===========================================================================
function InitTrig_U_Offer takes nothing returns nothing
set gg_trg_U_Offer = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_U_Offer, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_U_Offer, Condition( function Trig_U_Offer_Conditions ) )
call TriggerAddAction( gg_trg_U_Offer, function Trig_U_Offer_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_LOST_KANSAS_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'ikaa' ) ) then
return false
endif
return true
endfunction
function Trig_LOST_KANSAS_Actions takes nothing returns nothing
// the variables that will be used in the recipe
// ------------------------------------------
// ------------------------------------------
set udg_TempUnit = GetTriggerUnit()
set udg_Recipe_RequiredItems = 2
set udg_Recipe_RequiredType[1] = 'qq18'
set udg_Recipe_RequiredType[2] = 'im06'
set udg_Recipe_ResultItem = 'loka'
set udg_Recipe_RefundAmount = 0
// ------------------------------------------
// ------------------------------------------
set udg_Recipe_Base_IsRepeating = false
call TriggerExecute( gg_trg_recipe_base )
set udg_Recipe_Successfull = false
endfunction
//===========================================================================
function InitTrig_LOST_KANSAS takes nothing returns nothing
set gg_trg_LOST_KANSAS = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_LOST_KANSAS, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_LOST_KANSAS, Condition( function Trig_LOST_KANSAS_Conditions ) )
call TriggerAddAction( gg_trg_LOST_KANSAS, function Trig_LOST_KANSAS_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_EMTS_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'emsa' ) ) then
return false
endif
return true
endfunction
function Trig_EMTS_Actions takes nothing returns nothing
// the variables that will be used in the recipe
// ------------------------------------------
// ------------------------------------------
set udg_TempUnit = GetTriggerUnit()
set udg_Recipe_RequiredItems = 4
set udg_Recipe_RequiredType[1] = 'im01'
set udg_Recipe_RequiredType[2] = 'im11'
set udg_Recipe_RequiredType[3] = 'im02'
set udg_Recipe_RequiredType[4] = 'im12'
set udg_Recipe_ResultItem = 'gcoe'
set udg_Recipe_RefundAmount = 0
// ------------------------------------------
// ------------------------------------------
set udg_Recipe_Base_IsRepeating = false
call TriggerExecute( gg_trg_recipe_base )
set udg_Recipe_Successfull = false
endfunction
//===========================================================================
function InitTrig_EMTS takes nothing returns nothing
set gg_trg_EMTS = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_EMTS, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_EMTS, Condition( function Trig_EMTS_Conditions ) )
call TriggerAddAction( gg_trg_EMTS, function Trig_EMTS_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_Optimal_Primality_Copy_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'iabg' ) ) then
return false
endif
return true
endfunction
function Trig_Optimal_Primality_Copy_Actions takes nothing returns nothing
// the variables that will be used in the recipe
// ------------------------------------------
// ------------------------------------------
set udg_TempUnit = GetTriggerUnit()
set udg_Recipe_RequiredItems = 2
set udg_Recipe_RequiredType[1] = 'bats'
set udg_Recipe_RequiredType[2] = 'qq11'
set udg_Recipe_ResultItem = 'bugo'
set udg_Recipe_RefundAmount = 0
// ------------------------------------------
// ------------------------------------------
set udg_Recipe_Base_IsRepeating = false
call TriggerExecute( gg_trg_recipe_base )
set udg_Recipe_Successfull = false
endfunction
//===========================================================================
function InitTrig_BUSTED takes nothing returns nothing
set gg_trg_BUSTED = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_BUSTED, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_BUSTED, Condition( function Trig_Optimal_Primality_Copy_Conditions ) )
call TriggerAddAction( gg_trg_BUSTED, function Trig_Optimal_Primality_Copy_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_DILEMMA_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'clme' ) ) then
return false
endif
return true
endfunction
function Trig_DILEMMA_Actions takes nothing returns nothing
// the variables that will be used in the recipe
// ------------------------------------------
// ------------------------------------------
set udg_TempUnit = GetTriggerUnit()
set udg_Recipe_RequiredItems = 2
set udg_Recipe_RequiredType[1] = 'qq08'
set udg_Recipe_RequiredType[2] = 'qq11'
set udg_Recipe_ResultItem = 'crdi'
set udg_Recipe_RefundAmount = 0
// ------------------------------------------
// ------------------------------------------
set udg_Recipe_Base_IsRepeating = false
call TriggerExecute( gg_trg_recipe_base )
set udg_Recipe_Successfull = false
endfunction
//===========================================================================
function InitTrig_DILEMMA takes nothing returns nothing
set gg_trg_DILEMMA = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_DILEMMA, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_DILEMMA, Condition( function Trig_DILEMMA_Conditions ) )
call TriggerAddAction( gg_trg_DILEMMA, function Trig_DILEMMA_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_HUSTONP_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'hupb' ) ) then
return false
endif
return true
endfunction
function Trig_HUSTONP_Actions takes nothing returns nothing
// the variables that will be used in the recipe
// ------------------------------------------
// ------------------------------------------
set udg_TempUnit = GetTriggerUnit()
set udg_Recipe_RequiredItems = 2
set udg_Recipe_RequiredType[1] = 'qq90'
set udg_Recipe_RequiredType[2] = 'qq21'
set udg_Recipe_ResultItem = 'hupr'
set udg_Recipe_RefundAmount = 0
// ------------------------------------------
// ------------------------------------------
set udg_Recipe_Base_IsRepeating = false
call TriggerExecute( gg_trg_recipe_base )
set udg_Recipe_Successfull = false
endfunction
//===========================================================================
function InitTrig_HUSTONP takes nothing returns nothing
set gg_trg_HUSTONP = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_HUSTONP, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_HUSTONP, Condition( function Trig_HUSTONP_Conditions ) )
call TriggerAddAction( gg_trg_HUSTONP, function Trig_HUSTONP_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_QS_ITEM_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'qsia' ) ) then
return false
endif
return true
endfunction
function Trig_QS_ITEM_Actions takes nothing returns nothing
// the variables that will be used in the recipe
// ------------------------------------------
// ------------------------------------------
set udg_TempUnit = GetTriggerUnit()
set udg_Recipe_RequiredItems = 2
set udg_Recipe_RequiredType[1] = 'qq74'
set udg_Recipe_RequiredType[2] = 'qq06'
set udg_Recipe_ResultItem = 'qus1'
set udg_Recipe_RefundAmount = 0
// ------------------------------------------
// ------------------------------------------
set udg_Recipe_Base_IsRepeating = false
call TriggerExecute( gg_trg_recipe_base )
set udg_Recipe_Successfull = false
endfunction
//===========================================================================
function InitTrig_QS_ITEM takes nothing returns nothing
set gg_trg_QS_ITEM = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_QS_ITEM, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_QS_ITEM, Condition( function Trig_QS_ITEM_Conditions ) )
call TriggerAddAction( gg_trg_QS_ITEM, function Trig_QS_ITEM_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_SUPERIORITY_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'spri' ) ) then
return false
endif
return true
endfunction
function Trig_SUPERIORITY_Actions takes nothing returns nothing
// the variables that will be used in the recipe
// ------------------------------------------
// ------------------------------------------
set udg_TempUnit = GetTriggerUnit()
set udg_Recipe_RequiredItems = 4
set udg_Recipe_RequiredType[1] = 'qq03'
set udg_Recipe_RequiredType[2] = 'qq04'
set udg_Recipe_RequiredType[3] = 'qq05'
set udg_Recipe_RequiredType[4] = 'qq06'
set udg_Recipe_ResultItem = 'irha'
set udg_Recipe_RefundAmount = 0
// ------------------------------------------
// ------------------------------------------
set udg_Recipe_Base_IsRepeating = false
call TriggerExecute( gg_trg_recipe_base )
set udg_Recipe_Successfull = false
endfunction
//===========================================================================
function InitTrig_SUPERIORITY takes nothing returns nothing
set gg_trg_SUPERIORITY = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_SUPERIORITY, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_SUPERIORITY, Condition( function Trig_SUPERIORITY_Conditions ) )
call TriggerAddAction( gg_trg_SUPERIORITY, function Trig_SUPERIORITY_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_POWER_OVERWHELMING_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'rapz' ) ) then
return false
endif
return true
endfunction
function Trig_POWER_OVERWHELMING_Actions takes nothing returns nothing
// the variables that will be used in the recipe
// ------------------------------------------
// ------------------------------------------
set udg_TempUnit = GetTriggerUnit()
set udg_Recipe_RequiredItems = 4
set udg_Recipe_RequiredType[1] = 'ulpw'
set udg_Recipe_ResultItem = 'pove'
set udg_Recipe_SameItemTimes = 4
set udg_Recipe_RefundAmount = 20000
// ------------------------------------------
// ------------------------------------------
set udg_Recipe_Base_IsRepeating = true
call TriggerExecute( gg_trg_recipe_base )
set udg_Recipe_Successfull = false
endfunction
//===========================================================================
function InitTrig_POWER_OVERWHELMING takes nothing returns nothing
set gg_trg_POWER_OVERWHELMING = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_POWER_OVERWHELMING, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_POWER_OVERWHELMING, Condition( function Trig_POWER_OVERWHELMING_Conditions ) )
call TriggerAddAction( gg_trg_POWER_OVERWHELMING, function Trig_POWER_OVERWHELMING_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_MARS_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'imas' ) ) then
return false
endif
return true
endfunction
function Trig_MARS_Actions takes nothing returns nothing
// the variables that will be used in the recipe
// ------------------------------------------
// ------------------------------------------
set udg_TempUnit = GetTriggerUnit()
set udg_Recipe_RequiredItems = 2
set udg_Recipe_RequiredType[1] = 'warr'
set udg_Recipe_RequiredType[2] = 'qq74'
set udg_Recipe_ResultItem = 'mars'
set udg_Recipe_RefundAmount = 0
// ------------------------------------------
// ------------------------------------------
set udg_Recipe_Base_IsRepeating = false
call TriggerExecute( gg_trg_recipe_base )
set udg_Recipe_Successfull = false
endfunction
//===========================================================================
function InitTrig_MARS takes nothing returns nothing
set gg_trg_MARS = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_MARS, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_MARS, Condition( function Trig_MARS_Conditions ) )
call TriggerAddAction( gg_trg_MARS, function Trig_MARS_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_GOOD_VS_EVIL_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'gvea' ) ) then
return false
endif
return true
endfunction
function Trig_GOOD_VS_EVIL_Actions takes nothing returns nothing
// the variables that will be used in the recipe
// ------------------------------------------
// ------------------------------------------
set udg_TempUnit = GetTriggerUnit()
set udg_Recipe_RequiredItems = 2
set udg_Recipe_RequiredType[1] = 'qq74'
set udg_Recipe_RequiredType[2] = 'im01'
set udg_Recipe_ResultItem = 'gvey' //stats not added
set udg_Recipe_RefundAmount = 0
// ------------------------------------------
// ------------------------------------------
set udg_Recipe_Base_IsRepeating = false
call TriggerExecute( gg_trg_recipe_base )
set udg_Recipe_Successfull = false
endfunction
//===========================================================================
function InitTrig_GOOD_VS_EVIL takes nothing returns nothing
set gg_trg_GOOD_VS_EVIL = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_GOOD_VS_EVIL, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_GOOD_VS_EVIL, Condition( function Trig_GOOD_VS_EVIL_Conditions ) )
call TriggerAddAction( gg_trg_GOOD_VS_EVIL, function Trig_GOOD_VS_EVIL_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_PHOENIX_FORCE_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'IAPP' ) ) then
return false
endif
return true
endfunction
function Trig_PHOENIX_FORCE_Actions takes nothing returns nothing
// the variables that will be used in the recipe
// ------------------------------------------
// ------------------------------------------
set udg_TempUnit = GetTriggerUnit()
set udg_Recipe_RequiredItems = 4
set udg_Recipe_RequiredType[1] = 'thfo'
set udg_Recipe_RequiredType[2] = 'qq11'
set udg_Recipe_RequiredType[3] = 'qq05'
set udg_Recipe_RequiredType[4] = 'qq95'
set udg_Recipe_ResultItem = 'pfci' //STats not added
set udg_Recipe_RefundAmount = 0
// ------------------------------------------
// ------------------------------------------
set udg_Recipe_Base_IsRepeating = false
call TriggerExecute( gg_trg_recipe_base )
set udg_Recipe_Successfull = false
endfunction
//===========================================================================
function InitTrig_PHOENIX_FORCE takes nothing returns nothing
set gg_trg_PHOENIX_FORCE = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_PHOENIX_FORCE, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_PHOENIX_FORCE, Condition( function Trig_PHOENIX_FORCE_Conditions ) )
call TriggerAddAction( gg_trg_PHOENIX_FORCE, function Trig_PHOENIX_FORCE_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_Duelist_Pride_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'radp' ) ) then
return false
endif
return true
endfunction
function Trig_Duelist_Pride_Actions takes nothing returns nothing
// the variables that will be used in the recipe
// ------------------------------------------
// ------------------------------------------
set udg_TempUnit = GetTriggerUnit()
set udg_Recipe_RequiredItems = 3
set udg_Recipe_RequiredType[1] = 'im07'
set udg_Recipe_RequiredType[2] = 'pwrr'
set udg_Recipe_RequiredType[3] = 'im02'
set udg_Recipe_ResultItem = 'dprd'
set udg_Recipe_RefundAmount = 0
// ------------------------------------------
// ------------------------------------------
set udg_Recipe_Base_IsRepeating = false
call TriggerExecute( gg_trg_recipe_base )
set udg_Recipe_Successfull = false
endfunction
//===========================================================================
function InitTrig_Duelist_Pride takes nothing returns nothing
set gg_trg_Duelist_Pride = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Duelist_Pride, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Duelist_Pride, Condition( function Trig_Duelist_Pride_Conditions ) )
call TriggerAddAction( gg_trg_Duelist_Pride, function Trig_Duelist_Pride_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_Resillence_Recipe_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'rarl' ) ) then
return false
endif
return true
endfunction
function Trig_Resillence_Recipe_Actions takes nothing returns nothing
// the variables that will be used in the recipe
// ------------------------------------------
// ------------------------------------------
set udg_TempUnit = GetTriggerUnit()
set udg_Recipe_RequiredItems = 3
set udg_Recipe_RequiredType[1] = 'qq09'
set udg_Recipe_RequiredType[2] = 'pwrr'
set udg_Recipe_RequiredType[3] = 'qq02'
set udg_Recipe_ResultItem = 'rsil'
set udg_Recipe_RefundAmount = 0
// ------------------------------------------
// ------------------------------------------
set udg_Recipe_Base_IsRepeating = false
call TriggerExecute( gg_trg_recipe_base )
set udg_Recipe_Successfull = false
endfunction
//===========================================================================
function InitTrig_Resillence_Recipe takes nothing returns nothing
set gg_trg_Resillence_Recipe = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Resillence_Recipe, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Resillence_Recipe, Condition( function Trig_Resillence_Recipe_Conditions ) )
call TriggerAddAction( gg_trg_Resillence_Recipe, function Trig_Resillence_Recipe_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_Tanking_Sponge_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'rasq' ) ) then
return false
endif
return true
endfunction
function Trig_Tanking_Sponge_Actions takes nothing returns nothing
// the variables that will be used in the recipe
// ------------------------------------------
// ------------------------------------------
set udg_TempUnit = GetTriggerUnit()
set udg_Recipe_RequiredItems = 3
set udg_Recipe_RequiredType[1] = 'qq09'
set udg_Recipe_RequiredType[2] = 'pwrr'
set udg_Recipe_RequiredType[2] = 'im12'
set udg_Recipe_ResultItem = 'tksz'
set udg_Recipe_RefundAmount = 0
// ------------------------------------------
// ------------------------------------------
set udg_Recipe_Base_IsRepeating = false
call TriggerExecute( gg_trg_recipe_base )
set udg_Recipe_Successfull = false
endfunction
//===========================================================================
function InitTrig_Tanking_Sponge takes nothing returns nothing
set gg_trg_Tanking_Sponge = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Tanking_Sponge, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Tanking_Sponge, Condition( function Trig_Tanking_Sponge_Conditions ) )
call TriggerAddAction( gg_trg_Tanking_Sponge, function Trig_Tanking_Sponge_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_Damage_Amplifier_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'raDA' ) ) then
return false
endif
return true
endfunction
function Trig_Damage_Amplifier_Actions takes nothing returns nothing
// the variables that will be used in the recipe
// ------------------------------------------
// ------------------------------------------
set udg_TempUnit = GetTriggerUnit()
set udg_Recipe_RequiredItems = 3
set udg_Recipe_RequiredType[1] = 'pwrr'
set udg_Recipe_RequiredType[2] = 'im02'
set udg_Recipe_RequiredType[3] = 'bttl'
set udg_Recipe_ResultItem = 'damp'
set udg_Recipe_RefundAmount = 0
// ------------------------------------------
// ------------------------------------------
set udg_Recipe_Base_IsRepeating = false
call TriggerExecute( gg_trg_recipe_base )
set udg_Recipe_Successfull = false
endfunction
//===========================================================================
function InitTrig_Damage_Amplifier takes nothing returns nothing
set gg_trg_Damage_Amplifier = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Damage_Amplifier, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Damage_Amplifier, Condition( function Trig_Damage_Amplifier_Conditions ) )
call TriggerAddAction( gg_trg_Damage_Amplifier, function Trig_Damage_Amplifier_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_Supporter_Spellbreaker_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == '810o' ) ) then
return false
endif
return true
endfunction
function Trig_Supporter_Spellbreaker_Actions takes nothing returns nothing
// the variables that will be used in the recipe
// ------------------------------------------
// ------------------------------------------
set udg_TempUnit = GetTriggerUnit()
set udg_Recipe_RequiredItems = 3
set udg_Recipe_RequiredType[1] = 'pwrr'
set udg_Recipe_RequiredType[2] = 'qq02'
set udg_Recipe_RequiredType[2] = 'im01'
set udg_Recipe_ResultItem = 'spb6'
set udg_Recipe_RefundAmount = 0
// ------------------------------------------
// ------------------------------------------
set udg_Recipe_Base_IsRepeating = false
call TriggerExecute( gg_trg_recipe_base )
set udg_Recipe_Successfull = false
endfunction
//===========================================================================
function InitTrig_Supporter_Spellbreaker takes nothing returns nothing
set gg_trg_Supporter_Spellbreaker = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Supporter_Spellbreaker, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Supporter_Spellbreaker, Condition( function Trig_Supporter_Spellbreaker_Conditions ) )
call TriggerAddAction( gg_trg_Supporter_Spellbreaker, function Trig_Supporter_Spellbreaker_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_Healer_Halo_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'hhia' ) ) then
return false
endif
return true
endfunction
function Trig_Healer_Halo_Actions takes nothing returns nothing
// the variables that will be used in the recipe
// ------------------------------------------
// ------------------------------------------
set udg_TempUnit = GetTriggerUnit()
set udg_Recipe_RequiredItems = 3
set udg_Recipe_RequiredType[1] = 'qq01'
set udg_Recipe_RequiredType[2] = 'qq02'
set udg_Recipe_RequiredType[2] = 'qq30'
set udg_Recipe_ResultItem = 'hl00'
set udg_Recipe_RefundAmount = 0
// ------------------------------------------
// ------------------------------------------
set udg_Recipe_Base_IsRepeating = false
call TriggerExecute( gg_trg_recipe_base )
set udg_Recipe_Successfull = false
endfunction
//===========================================================================
function InitTrig_Healer_Halo takes nothing returns nothing
set gg_trg_Healer_Halo = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Healer_Halo, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Healer_Halo, Condition( function Trig_Healer_Halo_Conditions ) )
call TriggerAddAction( gg_trg_Healer_Halo, function Trig_Healer_Halo_Actions )
endfunction
//TESH.scrollpos=545
//TESH.alwaysfold=0
/*
---------------------------------------------------------
1.2 ->
- Added recipes
- added anti-friendly fire
- added multiboard
- [Charm] will now not bug the quests
- The computer is harder to kill now
- the mana regen is all heroes is now by default 1/s
- the % hp of the heroes is displayed overhead
- for the tank added a second taunt that is target-based
- there are no more conflicting hotkeys for some heroes' abilities
- added more shop areas
---------------------------------------------------------
1.3:
- dead message will no longer display for neutral hostile
- all heroes start with 100% mana now
- typo disater fixed to disaster
- -
- Fixed spell ID conflicts of the resurrection spells of the healer
- the default message for dying heroes will not show now
---------------------------------------------------------
---------------------------------------------------------
1.4:
- if a questgiver has no more quests an exclamation mark won't appear overhead
- Moved soem creeps so you cannot attack them throught the gates
- typo disater fixed to disaster
- - MORE RECIPES
- dedicated shop for recipes
- the default message for dying heroes will not show now
- the color of leaving player in the multibaord is now gray
- the lumber rewarded from creeps is now is now 100fold and the prices are 100fold
- Fixed the bug where heroes do not level after level 5
- Changed the models, icons and sound sets of some heroes for the purpose of making them fit their role
- Your hero will be selected now
- your hero will be selected when resurrected
Fixed the conflicting IDs of the quest abilities so now there won't be quest bugs
- When a player creates an item out ot recipe there is a message now
- when the tank completes a quest a message is shown
---------------------------------------------------------
1.5:
- removed [Thorns Aura] from the tank
- Aded [Thorns Aura] to the support
- Added [Spiked Carapace] to the tank
- Added [Weakening Aura] to the Anti-Support and removed [Faerie Fire]
- Added [Slow Aura] to the Anti-Support and removed [Slow]
- Increased the cooldown of [Charm] to 120 seconds
- fixed the problem where the quest [bandits and murlocs] opened the wrong gate
- the skeleton warriors now have stronger attack and more health
- The primary attribute of Stunner changed to Strength
- Increased the damage of certain creeps
- the RAM can now be cast on ShadowOfDeath
the revival totem renamed to Resurrection stone and put in place of the previous
- NEW: You can use ZORDS to defeat the final boss after you completed all 17 quests
- The day/night cycle is turned off
- Now there is a short cinematic played on start
- added unique item system
- there is an effect when a player leaves and his hero is removed
- added an option to abandon quest
---------------------------------------------------------
1.5a
- mana is 100% at start
- added command -clear
- changed bounty - heroes in range get split bounty! also has floating text
- fixed experience - heroes in range get split experience!
- in teh descriptions of the qeusts now it's included their difficulty
1.5b:
- all tooltips of the used abilities have been edited nicely
- Some terrain edits
Damage's [Flame Strike] replaced with [Blizzard]
Added [Curse] to anti-support
1.5c
attempt to make weakening aura not target allies
increase damage agility to 20 and agility per level to 2
curse now has hotkey
Stunner nwo has normal Banish
1.6
- slow aura will no longer apply on allies
- increased damage of chain lightning
- the hotkey of spirit llnk fixed to I
- mana shield toltip typo fix
- fixed Oderu will no longeи be player 1 but neutral hostile
- Infinite perfection now gives +400 damage as tooltip says
- added command -where
made a new shop witht 12 more recipes
- the cinematic starts faster
- Added duel system
- the second gate for the top left quest area will not open and close as expected
1.6a
the movement speed of all heroes equalized
- the recipe for cosmic power fixed
- the recipe for mindstorming fixed
- slightly edited healer's starting attributes
- at start, the multiboard will be minimized
- increased damage from stomp
- pressing [Escape] selects your hero
- added command -creepdamage[x] which can increase teh difficulty
- rewrote some of the code for the recipe system so that no recipe will require EXACT SLOTS
- Changed the music to custon
- Changed the secodn resource to crystals
- Changed the global weather
- new UI used. Thanks to "Kwaliti"!
- changed the selection circle
- replaced the confirmation modell with that of "Epsilon"
- the cursor is changes
- new command buttons by the panda\
- fixed the gold in the quest descriptions
- the command -where lasts for 5 seconds instead of 1
- ring of mana regen's icon changed to fit better
1.6b
decreased the strength of Damage
created courier for every player that can buy items, deliver them
Oderu is now immune to magic
death message for heroes now only applies to the team
fixed the targets allowed of the neutral hostile difficulty set by player1
added command -shareitem[x] that will make one of your items free to share with someone else
added messages for the difficulty commands
added command -difficulty[x] that combines two command
the recipe Space Hulk is fixed
the recipe Dominance is fixed
added new zone - The Arena
added new command -duelinthearena[x] - a duel that teleports all players to the arena
for the commands requiring a number added a check that prevents the commands being executed with an invald number
the command -unmount is fixed and renamed to -dismount
added a message when a zord dies
when a zord dies his icon will NOT stay
when Oderu is killed there is a message now
1.6c
the command duel in the arena is fixed
when a player is challenged, now there is a message
Superior Disaster typo fix
Inner Fire range fixed for last two levels
handicap command message fix typo
creepdamage command works again
the activation range of shops increased
When oderu dies you will be dismounted and no longer able to mount
now tehre is a message when a player is resurrected
reduced the scaling of the megazords
when a player leaves also his megazord gets removed
Stunner now has entangling roots as hero ability and sleep as normal
added feedback to the Anti-Support
added healing aura to Healer
maximum level set to 25 so that yo ucan learn all abilities
1.6d
- dismount/zord dies/oderu dies now also selects your hero
- when a questgiver has no quests his overhead effect disappears
- changed the loading screen
- changed the preview image
- added a lot of cystal doodads and glaciers
1.7
the difficulty command fixed - handicap value wasnt multiplieid by 100
Anti support renamed to Debuffer
increased the speed of the courier to the maximum
Penguin couries is slightly bigger and has aura to be seen easily
the message that tsays you dont have the requireid items now specifies the recipe
the icons for [Ring of Protection], [Ring of Health], [Ring of Regeneration], [Ring of Power] and [Ring of Speed] have been changed
rearranged the icons in the shop for rings
all recipes have been simplified trigger-wise
For each creep island added a boss
1.7a
added bosses to the bears group and the huntresses group
when you defeat the creeps of a group weithout the boss, there will be a message now
1.7b
now if you try to craft a recipe with missing ingredients, the crystals will be refunded (exception: those with multiple recipes inside one)
selling an item back to the shop give you 100% of the crystals
1.7c
provoke can now be cast on magic immune targets and invulnerable
Fixed the life steal percentage for all levels of Vampyric Aura
-duelinthearena will now telepor the challenger and the challenger agaisnt each other as expected, instead of on the spectator seats
-duelinthearena silences the spectators now until the duel is finished
Entangling roots - duration on heroes reduced to 4 seconds
The penguin courier now has an ability to give the items to the hero
added a command to target your courier
Made teh bountry from island bosses double
reduced the cost of potion of mana, potion of healing and potion of invulnerability to 50 crystals
Because the recipes Cosmic Power and Mindstorming were not workign sometiems I attempted to fix. I think a boolean var was causing the problem so I added at the end f every recipe FALSE. That way it might not cause anymroe problems.
1.7e
- dominance recipe tooltip edit
- typo in the starting message edit
- increased the healing valaues of Holy Light,Healing Wave and Tranquility
- added error message for the difficulty commands
extended the range of the murloc quest so that the boss will become vulnerable when you kill the rest
1.8
in an attempt to stop the doom guards froom crashing the map I removed their abilities
the anti-support typo in some tooltips has been changed to Debuffer as it should be
the message of the command -difficulty now is NOT the same as -creepdamage
now the couriers' auras are team-colored to better recognize them
added commands to target the players
Added 4 summoning stones around the map that can be ued to facilitate going to quests
added atrigger, when players are dueling, his allies cannot cast spells on them, and removed the Judge
Because the WE has a limit of 4 working abilities on an item, I used a spellbook to make the remaining work, for the items:
Beyond,cataclysmic might,Eternity,infinite juggernaut,Infinity,Mighty Disaster,Oblivion,Omniversal Eternity
1.8a
fixed a problem where the trigger that stops you from casting on dueling players also apllied for instant abilities.
1.8b
- the terrible mistake where summoning ability of Summoning stone require the tank to be dead is removed and its position changed
and now targets units as it should be and casting time set to 0 from 5
- summon dialog now has title as expected and also the players hero gets selected
- added Trainer on teh arena that can be used to summon monsters after the quests are completed
1.8c:
added 3 new commands for player1 -> -automaticdifficulty[x] -automaticdifficultyon -automaticdifficultyoff
edited the tooltip of recipe for superiority
1.8d
* Added commands:
-increaseDifficultyAfterEachQuestOn
-increaseDifficultyAfterEachQuestOff
* Now completing a quest awards everyone with 400 crystals.
* The stunner's [Bash] no longer works on heroes (this is to avoid permastun in duels or against bosses!)
* When resurrecting an ally, the Healer has briefly a book in front of him (to indicate)
* The debuffer now has [Faerie Farie] instead of [Feedback]
1.9:
added 19 new recipes in 2 new shop - secret shop and super secret shop
added commands -lock and -unlock
Heroes in the multiboard now have icons
The item Cosmic Infinity's abilities are rearranged to work properly
Added zeppelin toy to the shop for faster transporting
City Entrance renamed to Entrance
Thunder Clap can no longer target neutral
1.9a
Attempted map optimization, because some players were having crashes or freezes of the map:
- Initialization triggers run sequentially now
- The Bosses of the creep groups are given their abilities 10 seconds later.
(because someone complained since 1.7b he couldn't play it so I assume it's because of the bosses.)
- The boss abilities reduced to 12
- some location optimizations to avoid leaks
- The icon of the buff "Creep Boss" changed
- The icon of the buff "Courier" changed
- the list of commands is moved into an optional quest alongwith the two other messages
1.9b
- new way of adding abilities to the bosses: only when a quest is taken
- some terrain edits
1.9c
- edited the abilities of the bosses and tested intentsely until soem peopel did not complain about bugs (mostly those with weaker PCs)
1.9.1
Fixed the bug where the cinematic won't stop for player 2,3,4,5,6
1.9.1a
the message 'not enough lumber' changed to 'not enough crystals'
re-added aura to the bosses cia triggering and special effects
1.9.1b
All heroes were given more names to randomize from
1.9.1c
fixed the multiboard not showing up
1.9.2
fixed the bug with the resurrection
1.9.2a
fixed the bug with the bounty.
the fire effect create from Total Annihilation and Infinite Destruction now has no collision
1.9.2b
removed that test message for bounty
the bosses are again invulnerable until you kill their creeps
the tombstones of the players now cannot move
Now provoke creates an overhead effect on your target
fixed teh bug where during and after a duel you cant cast spells because the constraint trigger was wrongly made
1.9.2c
- Tranquility's duration fixed to 60 seconds for all levels
- Edited the recipe system - made them access teh same trigger so that recipes that require repeating and non-repeating items DO NOT CONFLICT. This is important because some crafted items were given to plaeyrs who craft items at teh same time.
- fixed AGAIN the constraint trigger - this tiem it wont make soem spells not work
- re-Added spell immunity to bosses
- The resurrecting now plays channel animation for the healaer and disables his abilities until the spell is complete
1.9.2d
- fixed thе caused bug where the healer can abuse resurrection because the requirement for dead players was missing
- the dialog for RAM now has title
- [quest completed] typo fix
- the resurrection book gets removed after resurrection
- the coloring of the names in the multiboard works again
- when a duel is active the buffs for duel are successfully applied
- after a duel finishes a new can be offered again FIX
- Debuffer's [Faerie Fire] replaced with [Silence]
- now when a player accepts a duel a sound plays
1.9.3
- the command -shareitem now works and you cannot use it on item slot 1
- the order of the icons in the multiboard have been fixed
- avatar's tooltip edit
- when there is no active quest the command -where will ping in the village
- the bounty will now be increased by 20% for each level of difficulty
- the way the duel buff is applied to heroes is changed. Instead they get an ability and that ability is compared if exists on teh hero
- the returned damage from [Spiked carapace] now increments for every level as supposed to be
- the price is vampiric potion reduced to 50
- the creeps spawned at teh arena from the trainer are now spawned with space between them
- the level of abilities for the training creeps is now adjusted as intended
Added a shop for hidden passive abilities:
- [Talisman of Evasion] has been removed an istead added [Tome of Evasion]
- [Tome of Critical Strike]
- [Tome of Second Wind]
- [Tome of Spell Immunity]
- [Tome of Spell Permanent Invilisibility]
- [Tome of Frost Attack]
- aded command -cam
1.9.4
- added 12 new recipes in one new shop that is located in the area that was the treant protectors
- the Area that was the treant protectors now contains powerful creeps and a shop with recipes
- Increased the damage of thunedr clap
- the damage of the boss huntress commander have been reduced
- added single columns around THE ARENA
- fixed the stats of [Death] to match its tooltip
- [Infinite Might] ability mistake fix
- Added [Destruction]'s effect from its description
1.9.4a
- fixed the multiboard icon for player 5
- The replenish interval for the ability tomes reduced to 5 seconds (tested!)
- fixed the bug where you couldn't challenge again someone to a duel
- fixed the passive ability levelling from the tomes (tested!)
- the bug where the recipe nigh-omnipotence didnt work fixed (tested!)
- the abilities of all heroes are now made to use QWERTY hotkeys
- Provoke will now make the units around the targeted unit stop and not interfere (tested!)
- fixed some typos
1.9.4b
- Provoke will now again work on magic immune units (tested!)
- The Learn tooltip for [Bash] for stunner fixed
- fixed the learning of the hidden passive ability critical strike
- removed the stock replenish interval of [Tome of Strength]
- fixed a HUGE mistake. Some triggers for recipes didnt have the
variable [TempUnit] which caused a resulted item to go in the inventory of
another player that was last set to this variable. FIXED! (tested!). This was the case for at least 10 recipes.
- changed a bit the pathing around the foutnain of mana
- the cast range for summoning stone's summon was set to unlimited
- added to the courier [Take Items] ability which takes items from your hero and gives them to the couerir
- the cooldown of Give Items and Take Items has been set to 1s
1.9.4c
- The stone of return has been made droppable and you can buy it from the shop
- the error mesasge from the command -cam is now local as intended
- the healer's [Healing wave] and [resurrection book] hotkeys conflict resolved
- the resurrection book created by resurrection now will always face towards the healer
- for the hero ability [Lightning Shield] all fields are now fixed!
- the command -shareitem[x] has been added to the commands list in the quest log
- changed the model of the tresure chest - now it has teamcolor and it is used when a player acquires an item or unbounds it
- [Desperation] typo fix
- When the healer resurrects himself he will now be seelcted
- a certain item was made to disappear after being used
- the model of the rune item has also been made team-colored
- the message of the comand -difficulty now also contains how much crystals you will get per creep
- (some people complained all quests are the same, so) Added for each quest area one unique building that gets unlocked after you clear the island
- the quest [Eww,Gross!] is now put in questgiver(middle) from start (was in upper)
- Now every island has one building that is availble once you clear the island of creeps
- When a player leaves the game his items also get removed.
- The super secret shop was converted into a reward building from completing the quest [Doom 2] by changing the pathing around it
- to all creeps groups added item tables with small chance of dropping items
- because the rune ofreturn was made dropapble, now therecipe system looks throught all inventory slots instead of 2 to 6
1.9.4d:
- added bounty off for neutral hostile because i noticed unwanted gold income
- [Recipe for superiority] will now also check slot 1 when crafting
- custom slaughterhouse now sells abominations
- the creeps of the top elft island fixed to be neutral hostile again as intended
- [Compelte quest] now works when the tank is immune to magic
- the abiltiy to teleport to quest destimation now works
1.9.5
- added 3 shops with 12 recipes each
- all recipes that are free did not have explicit statement that their refund is 0, which had the potential to give you crystals if your recipe failed. This is now FIXED.
- Some of the bonuses from [Omniversal Eternity] are now fixed to match its description
- the randomly dropped items from creeps are now only items that you can find in the shop (not recipes or craftings)
- Items picked up by and dropped by the heroes are now invulnerable. This is to prevent other player from bullying them.
- Penguin courier can now be summoned by the item of the same name, which can be bought from the shop and that is given at the start of the game to each hero
1.9.5a
- the recipe BEYOND now works
1.9.6
- When a hero is resurrected his HP% in the multiboard will be 100%
- added in the multiboard more info - kills, deaths and damage done
- added command -ms that tells you your hero's movement speed
- the command -courier will now target a random courier that you own
- all crafted items can now be sold for a full refund
- Summon courier now has special effect
- added 3 more summoning stones
- created a save/load command system!
- Players who are nnot playing will not receive crystals from quests now
- added decorative doodads around some of the shops
1.9.7
- Slightly changed the orange color of the aura of player 6's courier
- [Recipe for Might] is free again
- [Recipe for Spirit] is now free and Spirit now has its cost
- [Recipe for Death] is now free
- When a player dies, the items on his hero and his items around the map and his non-hero units aroudn the map will also be removed,
and in the multiboard the second column also becomes gray
- Damage's Death and Decay now only affects enemy units
- the new 3 summoning stones werent working because I forgot to include them in the loop. FIXED.
- Created an FFA ROOM where you will become hostile to your allies when entering
- all recipes now have in their tooltip a gray text telling the total price of the recipe
- added 3 new recipes in the supersecret shop: [Space], [Spacetime], [Immortality]
- The resurrection stone in top left corner of the map now works
- The tooltip of 8GB RAM will now say that if you give it to ShadowsOfDeath the game will end
- fixed the sell price for some crafted items
- Fixed the problem where the top left quest would react as the top right quest. This was because of conflicting ability IDs.
- Changed the models of the summoning stone and the resurrection stone
- the summoning stone's summon now has casting time 5 seconds.
- added command -GiveControlAfterLeave and -FreeControlAfterLeave
- the quest button will flash now when the game is starting
- added 1 more shop with 6 recipes and edited terrain for it
- added/removed pathing blockers here and there and around the shops
1.9.7a
- added "stand work" animation to the resurrection stone to show when it is resurrecting a hero
- Added the missing [Space] to the super secret shop
- increased the width of the 1-st column of the multiboard to by 5%
- the healer now also becomes red in the multiboard when he dies. (It was player 1's row by mistake)
- the health % in the multiboard for the healer now also will become 100% when he revives
- the 2 comamnds for duel will no longer work if one of the heroes uses a ZORD
- in the tooltip of every quest, included "gives access to: " for the building in that zone
- Added 3 more summonign stones
- Now you cannot challenge to a duel a left player
- Chagned the accessed buildings of two quests to Fountain of Health
- Edited game interface strings and images
- Colorized the classes of the heroes
- Slightly edited the loading screen text
- combines recipes now also have gray text saying total cost
1.9.7b
- added pathing map to the resurrection stone and summoning stone so you dont walk through them
- added pathign map to the shops
- recipe for mindstorming tooltip edit for total prices
- recipe for dominance tooltip edit for total price and its item
- fixeed topleft quest's boss - didnt become vulnerable. This is because the neutral passive untis were also counted as part of the group, therefore not leaving
the boss to be the only remaining in the group, which shouldn't be. FIXED.
- for the command -shareitem x, 1 now also works as it should be
- added new command -time which shows you how much time passed
- summoning a hero now also creates a teleportation effect on the old position
- Debuffer and Support now have new projectiles
- Increased the range of xp gain from 650 to 800
- now in the message for set difficulty, the crystals percentage will be displayed either as integer or a float, without the zeroes
- changed the rally attachment point of Resurrection Stone and now doesnt look weird and oversized
- the error message from the command -save is now local
1.9.7c:
-* fixed the broken position of the advanced shop in the village
-* removed collision size of all shops to avoid pathing bugs and changed their pathing map again
-* Power's chain lightning now can be cast as expected
-* again edited the message for difficulty's crystals
-* put abilities on the heroic resurrection stone as they should have been FOR A LOT OF VERSIONS!!!
-* added AFK system - timer, message, floating text
-* the zords are now unable to walk anywhere except in the area with the final boss
-* when dismounting or oderu dies, there wont be a message for destroyed zord
-* Added a messages for when from the start there isnt a healer or a tank
-* I noticed that setting an item "invulnerable" doesn't work I made all items
with huge hit points. Now you dont have to worry about players destroying your items.
1.9.d:
-* -Fixed a trigger linked to the AFK auto detect
-* If a hero dies and Player 2 is is not playing (or left) a different mesage will be displayed.
-* removed [food cost] from the dead player dummies
-* [Freezer] now works
-* Now when a hero dies a tombstone is created also for the user of the Heroic Resurrection Stone
-' preparation for version 1.9.8
1.9.8
-* now if the healer dies while resurrecting a hero, the hero will not be resurrected
-* increased the number of crytals and glaciers surrounding the islands
-* added "Ice Blocks" around the map that when you destroy you have 20% chance to get a free 100 crystals
-* The zones with shops that are guarded by creeps were turned into optional quests that you can complete from a new NPC at the shop zone below the middle of the map (quests can be returned without being taken)
-* Fixed mistakes in the trigger about detecting AFK players coming out of AFK
-* Fixed a typo in the spell [Summon Hero]
-* Changed the rotation of some [Night Elf Fishing Village] buildings to make it seem more authentic
-* When a quest is completed now a floating text will appear on your hero
-* Added a human village at the top right corner below the Arena
-* Added an NPC [Arena Quests] with 2 repeatable quests in that village
-* Penguin couriers are now vulnerable and when they die there is a message
-* The camera for the cinematic now does not pan when reaching the hero's location, making the cinematic smoother.
-* All village buildings now have a ground texture
-* Added a message when you buy a Zord to inform the player
- the save/load string generating has been ALMOST reworked - added double decrypting and grouping to make the LOAD code shorter. DISABLED these TRIGGERS because I was too lazy to continue my brain power journey.
-* Added one more quest to the main quests, making them 18, in order to make the number even and help simplify to save/load system (and split the quest and zone of Golems into 2)
-* now you cannot see the hit points of the shops
1.9.8a
- fixed a critical bug: main quest did not work (not re-added to NPCs after one is completed) (the conditionals checked for TRUE instead of FALSE)
- fixed optional quests: their abilities did not trigger (ID conflict!)
- added a message for when a selected optional quest is not completed
- ice blocks now dont drop shredders
- ice blocks have new model, which includes death and decay animation
- changed the model of the dropped crystals item from the ice blocks
- the dummies for the neutral building icons now have no names
- fixed a tooltip of an ability
- re-added drops to bosses, that includes shredder
- the preview image and loading screen was changed
- the message for completed quest and collected reward is changed. Now includes the name of the quest.
- reduced gold awarded from quests to 23 becausue of the 18th quest added
- adited terrain in the mid right of the map
- added a cinematic that plays when you buy the RAM
- the starting message removed and you can call it with the command -info
1.9.9
- fixed [Siege Golems Part 2] quest and its ping location
- now the item [Roar] and [Rejuvenation] has a cooldown and mana requirement. Some people exploited it...
- AFK system will now not check the players who left
- colorized the message for saved priest
- colorized the message for crafted item, AFK messages, duel messages
Debuffer:
[weakening aura] removed
[Curse] removed
added [Witchcraft] as hero ability (mass curse + mass reduce armor)
added [Dispel] as non-hero ability
added [Drain Life] as hero ability
Stunner:
[Entangling roots] changed to [Mass Entangling Roots]
[Hex] replaced with [Blood Shackles](dot+stun)
[Bash]'s damage increased per level and written in the learn tooltip
Support:
[Inner fire] changed to [Holy Blessing] which is basically mass inner fire
[Devotion Aura] replaced with [Devotion] which is based on Roaor and increases both armor and mana regen
DAmage:
[Starfall] replaced with [Thunderfury]
[Blizzard] repalced with [Flamestrike] that doesnt require channeling and has no casting time and bigger area of effect
Healer:
[Tranquility]'s heal per second increased to 30 with 20 increment per level
[Healing Aura]'s healing per level increments by 2 with each level now
1.9.9a
- Fixed typos in the ending cinematic
- Colorized the following messagees:
* second message for crafting
* death message
* taking a quest message
* resurrecting message
* Penguin death message
* difficulty change message
- again fixed the ping location of [Golems part 2]. Turns out it wasn’t added, because it didn’t loop to 18, but 17.
- changed “17” to “18” in the meessage for unlocked arena quests after you complete all main quests and the check to 18
- potion of healing and mana increased amount/potency
- added messages for completed optional quests and received reward
- added portrait to the model of chimaera monument
- The floating text that indicates health percentage overhead of the heroes will now have red and yellow colors in addition to green to indicate difference in health and help the healer decide who to heal
- Added a minimap ping when Oderu spawns
- The quests from all quest-givers can now also be cast on magic-immune heroes. This is because the tank has [Avatar] and any hero can learn [Spell Immunity] from the abilities shop. Also, only heroes can take quests.
Healer:
- replaced [Tranquility] with [Holy Restoration](mass rejuvenation), because it will not be channeled.
1.9.9b:
- colorized the messages for some combined recipes
- added new command - abilityinfo[Integer] which shows you a tarrget player's hero which abilities how much levels have
- added pathing bloockers inside two of the fountains of mana
- now the time it takes to complete each quest is counted and announced in the message for completed quest
- with that, added the command -questtimings which displays how much time the team spent on eaach quest
- scroll of animate dead now has a cost
- now when a player leaves his crystals are split between the remaining players
- fixed typos in the informative quest [Available Commands]
- devotion buff typo fix
- added [tome of retraining] to the hero shop
1.9.9c:
- new command added: -showmetheshops
- now the background music will stop when the ending cinematic is playing
- fixed [Potion of Healing]. Now it will work.
- rearranged the positions of all items in the shop [Hero Items]
- added hint message when you take all 18 quests to give the RAM.
- re-added the random drops to all creep groups
1.10:
- Now all quests can be cast on magic-immune units too
- Fixed [Kill Oderu] and [Save the Priests] and [Kill Dragor] quest when completed, to be visible
- All group creep bosses now have unique names
- Penguin Courier finally has [hero inventory] which means he can craft recipes. I worry about people abusing this however.
- Removed stones here and there and blocked pathing between a camp and a quest
- Added 4 more summoning stones
- Now the healer will not be able to resurrect players at locations that are not walkable.
- The coooldown of the summoning ability redued to 5 seconds
- the summoning stones now have (STAR) icons on the minimap
- removed the sound set from the summoning stone
- removed an ycooldowns of [Tome of Retraining]
- added a new item to the hero shop [Rune of Recall] - teleports 1 hero to your position. 1 charge.
1.10a:
- Your courier is now hero, and if he takes a tome, that tome is applied to your hero, instead of the courier! This is now done, because courier picking a tome crashed the game.
- removed rune of recall object from starting area
- when you buy a toy zeppelin from the starting area, it will not be stuck now\
- Your courier will now die from one hit, regardless how much health he has. This is to prevent exploiting it with power-up items.
*/