- Joined
- Apr 11, 2006
- Messages
- 338
Hello,
I've been keeping a huge little game alive for about 17 years (sic!) - it's Jungle Trolls Reborn.
Many people have helped to keep it running, and from time to time I just have to ask for help here when there is a problem that is beyond my capabilities.
This time, there is this issue with lost items that is pestering the game for years and I seem to be unable to solve it.
The problem is the following: when a hero troll dies, most of his items are dropped, except for certain item classes (Artifact and PowerUP, essencially weapons and armor) that are instead hidden with SetItemVisibleBJ and stored as an array variable. When he is revived, that variable is used to give him back the items - but at times it seems that one of the functions fails and part of the items are lost instead.
The trigger wasn't scripted by me and it was eventually converted to JASS, so it's rather unreadable. I'll do whatever I can to clarify.
This is the function that handles troll death:
These are the temp variables defined by the trigger:
List of functions referred in the snippet above:
And this is the trigger that handles the revive of the troll and uses the variables mentioned above to restore his items:
More clarifications:
I've been keeping a huge little game alive for about 17 years (sic!) - it's Jungle Trolls Reborn.
Many people have helped to keep it running, and from time to time I just have to ask for help here when there is a problem that is beyond my capabilities.
This time, there is this issue with lost items that is pestering the game for years and I seem to be unable to solve it.
The problem is the following: when a hero troll dies, most of his items are dropped, except for certain item classes (Artifact and PowerUP, essencially weapons and armor) that are instead hidden with SetItemVisibleBJ and stored as an array variable. When he is revived, that variable is used to give him back the items - but at times it seems that one of the functions fails and part of the items are lost instead.
The trigger wasn't scripted by me and it was eventually converted to JASS, so it's rather unreadable. I'll do whatever I can to clarify.
This is the function that handles troll death:
JASS:
// ========== Hero Die Special Action ==========
if ( Trig_Global_Unit_Die_Func014C() ) then
if ( Trig_Global_Unit_Die_Func014Func001C() ) then
set udg_ChainsawOn[udg_TempIntegerArray[3]] = false
call UnitRemoveItemSwapped( udg_ChainSawItem[udg_TempIntegerArray[3]], udg_TempUnitArray[1] )
call RemoveItem( udg_ChainSawItem[udg_TempIntegerArray[3]] )
call UnitAddItemByIdSwapped( 'I05S', udg_TempUnitArray[1] )
call SetItemUserData( GetLastCreatedItem(), udg_ChainSawValue[udg_TempIntegerArray[3]] )
else
endif
set udg_N = 1
loop
exitwhen udg_N > 6
if ( Trig_Global_Unit_Die_Func014Func002Func001C() ) then
if ( Trig_Global_Unit_Die_Func014Func002Func001Func001C() ) then
set udg_EquipItem[( ( udg_N * 100 ) + udg_TempIntegerArray[3] )] = null
call UnitRemoveItemFromSlotSwapped( udg_N, udg_TempUnitArray[1] )
else
call DisableTrigger( gg_trg_Global_Item_Drop )
set udg_EquipItem[( ( udg_N * 100 ) + udg_TempIntegerArray[3] )] = UnitItemInSlotBJ(udg_TempUnitArray[1], udg_N)
call UnitRemoveItemFromSlotSwapped( udg_N, udg_TempUnitArray[1] )
call SetItemVisibleBJ( false, udg_EquipItem[( ( udg_N * 100 ) + udg_TempIntegerArray[3] )] )
call EnableTrigger( gg_trg_Global_Item_Drop )
endif
else
set udg_EquipItem[( ( udg_N * 100 ) + udg_TempIntegerArray[3] )] = null
endif
set udg_N = udg_N + 1
endloop
set udg_RightHand[udg_TempIntegerArray[3]] = 0
set udg_LeftHand[udg_TempIntegerArray[3]] = 0
set udg_SpellBook_Owned[udg_TempIntegerArray[3]] = 0
set udg_DollOwned[udg_TempIntegerArray[3]] = 0
set udg_ArmorOwned[udg_TempIntegerArray[3]] = 0
set udg_BootsOwned[udg_TempIntegerArray[3]] = 0
set udg_GauntletsOwned[udg_TempIntegerArray[3]] = 0
set udg_MaskOwned[udg_TempIntegerArray[3]] = 0
set udg_Headpiece_owned[udg_TempIntegerArray[3]] = 0
set udg_Hero_Xp[udg_TempIntegerArray[3]] = GetHeroXP(udg_TempUnitArray[1])
set udg_Hero_Agility[udg_TempIntegerArray[3]] = GetHeroStatBJ(bj_HEROSTAT_AGI, udg_TempUnitArray[1], false)
set udg_Hero_Intelligence[udg_TempIntegerArray[3]] = GetHeroStatBJ(bj_HEROSTAT_INT, udg_TempUnitArray[1], false)
set udg_Hero_Strength[udg_TempIntegerArray[3]] = GetHeroStatBJ(bj_HEROSTAT_STR, udg_TempUnitArray[1], false)
set udg_DiseaseResist[udg_TempIntegerArray[3]] = 50
set udg_run_energy[udg_TempIntegerArray[3]] = 10.00
set udg_Loc = GetUnitLoc(udg_TempUnitArray[1])
call CreateNUnitsAtLoc( 1, 'n000', udg_TempPlayerArray[1], udg_Loc, bj_UNIT_FACING )
if ( Trig_Global_Unit_Die_Func014Func020C() ) then
call DisplayTimedTextToForce( GetPlayersAll(), 6.00, ( ( "|c009966ffOld Troll:|r |c00ffff64" + GetPlayerName(udg_TempPlayerArray[1]) ) + " troll be dead!|r" ) )
call DisplayTimedTextToPlayer( udg_TempPlayerArray[1], 0, 0, 6.00, "TRIGSTR_2343" )
set udg_Hero_Deaths[udg_TempIntegerArray[3]] = 1
else
if ( Trig_Global_Unit_Die_Func014Func020Func001C() ) then
call DisplayTimedTextToForce( GetPlayersAll(), 6.00, ( ( "|c009966ffOld Troll:|r |c00ffff64" + GetPlayerName(udg_TempPlayerArray[1]) ) + " troll be dead!|r" ) )
call DisplayTimedTextToPlayer( udg_TempPlayerArray[1], 0, 0, 6.00, "TRIGSTR_1855" )
set udg_Hero_Deaths[udg_TempIntegerArray[3]] = ( udg_Hero_Deaths[udg_TempIntegerArray[3]] + 1 )
call UnitRemoveAbilityBJ( 'A084', GetLastCreatedUnit() )
call UnitAddAbilityBJ( 'A01A', GetLastCreatedUnit() )
else
endif
endif
call RemoveLocation(udg_Loc)
set udg_Troll_Spirit[udg_TempIntegerArray[3]] = GetLastCreatedUnit()
call SelectUnitForPlayerSingle( GetLastCreatedUnit(), udg_TempPlayerArray[1] )
set udg_Heat[udg_TempIntegerArray[3]] = 0
call SetPlayerStateBJ( ConvertedPlayer(udg_TempIntegerArray[3]), PLAYER_STATE_RESOURCE_GOLD, 0 )
call SetPlayerStateBJ( ConvertedPlayer(udg_TempIntegerArray[3]), PLAYER_STATE_RESOURCE_LUMBER, 0 )
call UnitRemoveAbilityBJ( 'A0DQ', udg_Score_Memorial[udg_TempIntegerArray[3]] )
call UnitAddAbilityBJ( 'A0DS', udg_Score_Memorial[udg_TempIntegerArray[3]] )
if ( Trig_Global_Unit_Die_Func014Func029C() ) then
call KillUnit( GetLastCreatedUnit() )
else
endif
if ( Trig_Global_Unit_Die_Func014Func030C() ) then
call UnitAddAbilityBJ( 'S004', udg_BoatLoaded[udg_TempIntegerArray[3]] )
else
endif
else
endif
These are the temp variables defined by the trigger:
JASS:
function Trig_Global_Unit_Die_Actions takes nothing returns nothing
set udg_TempUnitArray[0] = GetKillingUnitBJ()
set udg_TempUnitType[0] = GetUnitTypeId(GetKillingUnitBJ())
set udg_TempIntegerArray[0] = GetUnitPointValueByType(udg_TempUnitType[0])
set udg_TempPlayerArray[0] = GetOwningPlayer(udg_TempUnitArray[0])
set udg_TempIntegerArray[2] = GetConvertedPlayerId(udg_TempPlayerArray[0])
set udg_TempUnitArray[1] = GetTriggerUnit()
set udg_TempUnitType[1] = GetUnitTypeId(GetTriggerUnit())
set udg_TempIntegerArray[1] = GetUnitPointValueByType(udg_TempUnitType[1])
set udg_TempPlayerArray[1] = GetOwningPlayer(udg_TempUnitArray[1])
set udg_TempIntegerArray[3] = GetConvertedPlayerId(udg_TempPlayerArray[1])
List of functions referred in the snippet above:
- Trig_Global_Unit_Die_Func014C - checks if that's a hero
- Trig_Global_Unit_Die_Func014Func001C - this is a special case when the troll holds a chainsaw
- Trig_Global_Unit_Die_Func014Func002Func001Func003C - checks if there are items that need to be preserved
- Trig_Global_Unit_Die_Func014Func002Func001Func001C - this is a special case that checks if hardcore mode is enabled
- Trig_Global_Unit_Die_Func014Func020C - checks if the hero dies for the first time, as there is a free revive
- Trig_Global_Unit_Die_Func014Func020Func001C - when the troll died again
- Trig_Global_Unit_Die_Func014Func030C - special case when dying troll is in a boat
And this is the trigger that handles the revive of the troll and uses the variables mentioned above to restore his items:
JASS:
function Trig_Troll_Revive_Func003C takes nothing returns boolean
if ( ( GetUnitTypeId(GetSpellAbilityUnit()) == 'n000' ) ) then
return true
endif
if ( ( GetUnitTypeId(GetSpellTargetUnit()) == 'n000' ) ) then
return true
endif
return false
endfunction
function Trig_Troll_Revive_Conditions takes nothing returns boolean
if ( not Trig_Troll_Revive_Func003C() ) then
return false
endif
return true
endfunction
function Trig_Troll_Revive_Func004Func001Func003001 takes nothing returns boolean
return ( udg_Hero_Type[udg_A] == 'H001' )
endfunction
function Trig_Troll_Revive_Func004Func001Func004001 takes nothing returns boolean
return ( udg_Hero_Type[udg_A] == 'H000' )
endfunction
function Trig_Troll_Revive_Func004Func001Func007Func001Func001C takes nothing returns boolean
if ( not ( IsPlayerInForce(GetOwningPlayer(udg_Hero_Troll[udg_A]), udg_Team[3]) == true ) ) then
return false
endif
return true
endfunction
function Trig_Troll_Revive_Func004Func001Func007Func001C takes nothing returns boolean
if ( not ( IsPlayerInForce(GetOwningPlayer(udg_Hero_Troll[udg_A]), udg_Team[2]) == true ) ) then
return false
endif
return true
endfunction
function Trig_Troll_Revive_Func004Func001Func007C takes nothing returns boolean
if ( not ( IsPlayerInForce(GetOwningPlayer(udg_Hero_Troll[udg_A]), udg_Team[1]) == true ) ) then
return false
endif
return true
endfunction
function Trig_Troll_Revive_Func004Func001Func020C takes nothing returns boolean
if ( not ( udg_Heart_Grizzly[udg_A] == true ) ) then
return false
endif
return true
endfunction
function Trig_Troll_Revive_Func004Func001Func021Func002C takes nothing returns boolean
if ( not ( GetUnitTypeId(udg_Hero_Troll[udg_A]) == 'H001' ) ) then
return false
endif
return true
endfunction
function Trig_Troll_Revive_Func004Func001Func021C takes nothing returns boolean
if ( not ( udg_Heart_Snake[udg_A] == true ) ) then
return false
endif
return true
endfunction
function Trig_Troll_Revive_Func004Func001Func022C takes nothing returns boolean
if ( not ( udg_Heart_Werewolf[udg_A] == true ) ) then
return false
endif
return true
endfunction
function Trig_Troll_Revive_Func004Func001Func026Func001C takes nothing returns boolean
if ( not ( udg_EquipItem[( ( udg_N * 100 ) + udg_A )] != null ) ) then
return false
endif
return true
endfunction
function Trig_Troll_Revive_Func004Func001C takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A084' ) ) then
return false
endif
return true
endfunction
function Trig_Troll_Revive_Func004Func004C takes nothing returns boolean
if ( ( GetSpellAbilityId() == 'A008' ) ) then
return true
endif
if ( ( GetSpellAbilityId() == 'A08Z' ) ) then
return true
endif
return false
endfunction
function Trig_Troll_Revive_Func004Func005001 takes nothing returns boolean
return ( udg_Hero_Type[udg_A] == 'H001' )
endfunction
function Trig_Troll_Revive_Func004Func006001 takes nothing returns boolean
return ( udg_Hero_Type[udg_A] == 'H000' )
endfunction
function Trig_Troll_Revive_Func004Func011Func001Func001C takes nothing returns boolean
if ( not ( IsPlayerInForce(GetOwningPlayer(udg_Hero_Troll[udg_A]), udg_Team[3]) == true ) ) then
return false
endif
return true
endfunction
function Trig_Troll_Revive_Func004Func011Func001C takes nothing returns boolean
if ( not ( IsPlayerInForce(GetOwningPlayer(udg_Hero_Troll[udg_A]), udg_Team[2]) == true ) ) then
return false
endif
return true
endfunction
function Trig_Troll_Revive_Func004Func011C takes nothing returns boolean
if ( not ( IsPlayerInForce(GetOwningPlayer(udg_Hero_Troll[udg_A]), udg_Team[1]) == true ) ) then
return false
endif
return true
endfunction
function Trig_Troll_Revive_Func004Func024C takes nothing returns boolean
if ( not ( udg_Heart_Grizzly[udg_A] == true ) ) then
return false
endif
return true
endfunction
function Trig_Troll_Revive_Func004Func025Func002C takes nothing returns boolean
if ( not ( GetUnitTypeId(udg_Hero_Troll[udg_A]) == 'H001' ) ) then
return false
endif
return true
endfunction
function Trig_Troll_Revive_Func004Func025C takes nothing returns boolean
if ( not ( udg_Heart_Snake[udg_A] == true ) ) then
return false
endif
return true
endfunction
function Trig_Troll_Revive_Func004Func026C takes nothing returns boolean
if ( not ( udg_Heart_Werewolf[udg_A] == true ) ) then
return false
endif
return true
endfunction
function Trig_Troll_Revive_Func004C takes nothing returns boolean
if ( not Trig_Troll_Revive_Func004Func004C() ) then
return false
endif
return true
endfunction
function Trig_Troll_Revive_Actions takes nothing returns nothing
local unit u
local integer id
if ( Trig_Troll_Revive_Func004C() ) then
set udg_A = GetConvertedPlayerId(GetOwningPlayer(GetSpellTargetUnit()))
call UnitRemoveItemFromSlotSwapped( 1, udg_Troll_Spirit[udg_A] )
if ( Trig_Troll_Revive_Func004Func005001() ) then
call SetPlayerStateBJ( ConvertedPlayer(udg_A), PLAYER_STATE_RESOURCE_GOLD, 250 )
else
call SetPlayerStateBJ( ConvertedPlayer(udg_A), PLAYER_STATE_RESOURCE_GOLD, 200 )
endif
if ( Trig_Troll_Revive_Func004Func006001() ) then
call SetPlayerStateBJ( ConvertedPlayer(udg_A), PLAYER_STATE_RESOURCE_LUMBER, 125 )
else
call SetPlayerStateBJ( ConvertedPlayer(udg_A), PLAYER_STATE_RESOURCE_LUMBER, 100 )
endif
call ReplaceUnitBJ( udg_Troll_Spirit[udg_A], udg_Hero_Type[udg_A], bj_UNIT_STATE_METHOD_MAXIMUM )
set udg_Hero_Troll[udg_A] = GetLastReplacedUnitBJ()
set u = udg_Hero_Troll[udg_A]
set id = 1+GetPlayerId(GetOwningPlayer(GetSpellTargetUnit()))
if ( Trig_Troll_Revive_Func004Func011C() ) then
set udg_Loc = GetUnitLoc(udg_Totem[1])
else
if ( Trig_Troll_Revive_Func004Func011Func001C() ) then
set udg_Loc = GetUnitLoc(udg_Totem[2])
else
if ( Trig_Troll_Revive_Func004Func011Func001Func001C() ) then
set udg_Loc = GetUnitLoc(udg_Totem[3])
else
set udg_Loc = GetUnitLoc(udg_Hero_Troll[udg_A])
endif
endif
endif
call SetUnitPositionLoc( udg_Hero_Troll[udg_A], udg_Loc )
call AddSpellEffectByIdLoc( 'AHhb', EFFECT_TYPE_TARGET, udg_Loc )
set udg_Revive[udg_A] = GetLastCreatedEffectBJ()
call RemoveLocation(udg_Loc)
call AddHeroXPSwapped( udg_Hero_Xp[udg_A], udg_Hero_Troll[udg_A], false )
call SetHeroStr( udg_Hero_Troll[udg_A], udg_Hero_Strength[udg_A], true )
call SetHeroInt( udg_Hero_Troll[udg_A], udg_Hero_Intelligence[udg_A], true )
call SetHeroAgi( udg_Hero_Troll[udg_A], udg_Hero_Agility[udg_A], true )
call SetUnitAbilityLevelSwapped( 'ACba', udg_Hero_Troll[udg_A], udg_GameDiff )
call SetUnitAbilityLevelSwapped( 'ACnr', udg_Hero_Troll[udg_A], udg_GameDiff )
call SelectUnitForPlayerSingle( udg_Hero_Troll[udg_A], ConvertedPlayer(udg_A) )
call IssueImmediateOrder( udg_Hero_Troll[udg_A], "replenishon" )
if ( Trig_Troll_Revive_Func004Func024C() ) then
set udg_Heat[udg_A] = ( udg_Heat[udg_A] + 10 )
else
endif
if ( Trig_Troll_Revive_Func004Func025C() ) then
set udg_Crit_block[udg_A] = ( udg_Crit_block[udg_A] + 1 )
if ( Trig_Troll_Revive_Func004Func025Func002C() ) then
call SetUnitAbilityLevelSwapped( 'A07Z', udg_Hero_Troll[udg_A], 2 )
else
call SetUnitAbilityLevelSwapped( 'Arpb', udg_Hero_Troll[udg_A], 2 )
endif
else
endif
if ( Trig_Troll_Revive_Func004Func026C() ) then
set udg_Crit_power[udg_A] = ( udg_Crit_power[udg_A] + 1 )
else
endif
call DisplayTimedTextToPlayer( ConvertedPlayer(udg_A), 0, 0, 6.00, "TRIGSTR_1453" )
call UnitRemoveAbilityBJ( 'A0DS', udg_Score_Memorial[udg_A] )
call UnitAddAbilityBJ( 'A0DQ', udg_Score_Memorial[udg_A] )
set id = 1+GetPlayerId(GetOwningPlayer(GetSpellTargetUnit()))
set udg_N = 1
loop
exitwhen udg_N > 6
call DisableTrigger( gg_trg_Global_Item_Drop )
call SetItemVisibleBJ( true, udg_EquipItem[( ( udg_N * 100 ) + udg_A )] )
call UnitAddItemSwapped( udg_EquipItem[( ( udg_N * 100 ) + udg_A )], udg_Hero_Troll[udg_A] )
call EnableTrigger( gg_trg_Global_Item_Drop )
set udg_N = udg_N + 1
endloop
call TriggerSleepAction( 1.00 )
call DestroyEffectBJ( udg_Revive[udg_A] )
else
if ( Trig_Troll_Revive_Func004Func001C() ) then
set udg_A = GetConvertedPlayerId(GetOwningPlayer(GetSpellAbilityUnit()))
call UnitRemoveItemFromSlotSwapped( 1, udg_Troll_Spirit[udg_A] )
if ( Trig_Troll_Revive_Func004Func001Func003001() ) then
call SetPlayerStateBJ( ConvertedPlayer(udg_A), PLAYER_STATE_RESOURCE_GOLD, 250 )
else
call SetPlayerStateBJ( ConvertedPlayer(udg_A), PLAYER_STATE_RESOURCE_GOLD, 200 )
endif
if ( Trig_Troll_Revive_Func004Func001Func004001() ) then
call SetPlayerStateBJ( ConvertedPlayer(udg_A), PLAYER_STATE_RESOURCE_LUMBER, 125 )
else
call SetPlayerStateBJ( ConvertedPlayer(udg_A), PLAYER_STATE_RESOURCE_LUMBER, 100 )
endif
call ReplaceUnitBJ( udg_Troll_Spirit[udg_A], udg_Hero_Type[udg_A], bj_UNIT_STATE_METHOD_MAXIMUM )
set udg_Hero_Troll[udg_A] = GetLastReplacedUnitBJ()
if ( Trig_Troll_Revive_Func004Func001Func007C() ) then
set udg_Loc = GetUnitLoc(udg_Totem[1])
else
if ( Trig_Troll_Revive_Func004Func001Func007Func001C() ) then
set udg_Loc = GetUnitLoc(udg_Totem[2])
else
if ( Trig_Troll_Revive_Func004Func001Func007Func001Func001C() ) then
set udg_Loc = GetUnitLoc(udg_Totem[3])
else
set udg_Loc = GetUnitLoc(udg_Hero_Troll[udg_A])
endif
endif
endif
call SetUnitPositionLoc( udg_Hero_Troll[udg_A], udg_Loc )
call AddSpellEffectByIdLoc( 'AHhb', EFFECT_TYPE_TARGET, udg_Loc )
set udg_Revive[udg_A] = GetLastCreatedEffectBJ()
call RemoveLocation(udg_Loc)
call AddHeroXPSwapped( udg_Hero_Xp[udg_A], udg_Hero_Troll[udg_A], false )
call SetHeroStr( udg_Hero_Troll[udg_A], udg_Hero_Strength[udg_A], true )
call SetHeroInt( udg_Hero_Troll[udg_A], udg_Hero_Intelligence[udg_A], true )
call SetHeroAgi( udg_Hero_Troll[udg_A], udg_Hero_Agility[udg_A], true )
call SetUnitAbilityLevelSwapped( 'ACba', udg_Hero_Troll[udg_A], udg_GameDiff )
call SetUnitAbilityLevelSwapped( 'ACnr', udg_Hero_Troll[udg_A], udg_GameDiff )
call SelectUnitForPlayerSingle( udg_Hero_Troll[udg_A], ConvertedPlayer(udg_A) )
call IssueImmediateOrder( udg_Hero_Troll[udg_A], "replenishon" )
if ( Trig_Troll_Revive_Func004Func001Func020C() ) then
set udg_Heat[udg_A] = ( udg_Heat[udg_A] + 10 )
else
endif
if ( Trig_Troll_Revive_Func004Func001Func021C() ) then
set udg_Crit_block[udg_A] = ( udg_Crit_block[udg_A] + 1 )
if ( Trig_Troll_Revive_Func004Func001Func021Func002C() ) then
call SetUnitAbilityLevelSwapped( 'A07Z', udg_Hero_Troll[udg_A], 2 )
else
call SetUnitAbilityLevelSwapped( 'Arpb', udg_Hero_Troll[udg_A], 2 )
endif
else
endif
if ( Trig_Troll_Revive_Func004Func001Func022C() ) then
set udg_Crit_power[udg_A] = ( udg_Crit_power[udg_A] + 1 )
else
endif
call DisplayTimedTextToPlayer( ConvertedPlayer(udg_A), 0, 0, 6.00, "TRIGSTR_1453" )
call UnitRemoveAbilityBJ( 'A0DS', udg_Score_Memorial[udg_A] )
call UnitAddAbilityBJ( 'A0DQ', udg_Score_Memorial[udg_A] )
set udg_N = 1
loop
exitwhen udg_N > 6
if ( Trig_Troll_Revive_Func004Func001Func026Func001C() ) then
call DisableTrigger( gg_trg_Global_Item_Drop )
call SetItemVisibleBJ( true, udg_EquipItem[( ( udg_N * 100 ) + udg_A )] )
call UnitAddItemSwapped( udg_EquipItem[( ( udg_N * 100 ) + udg_A )], udg_Hero_Troll[udg_A] )
call EnableTrigger( gg_trg_Global_Item_Drop )
else
endif
set udg_N = udg_N + 1
endloop
call TriggerSleepAction( 1.00 )
call DestroyEffectBJ( udg_Revive[udg_A] )
else
endif
endif
endfunction
//===========================================================================
function InitTrig_Troll_Revive takes nothing returns nothing
set gg_trg_Troll_Revive = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Troll_Revive, EVENT_PLAYER_UNIT_SPELL_CAST )
call TriggerAddCondition( gg_trg_Troll_Revive, Condition( function Trig_Troll_Revive_Conditions ) )
call TriggerAddAction( gg_trg_Troll_Revive, function Trig_Troll_Revive_Actions )
endfunction
More clarifications:
- n000 is a Troll Soul unit.
- A084, A008 and A08Z are abilities that can revive a troll soul and replace it with a Troll.
- H000, H001, H002, H003 are troll classes - some of them have specific initial values of Gold and Lumber that are used to track Food and Heat.
- Score_Memorial is used to show "profession" expertise and current dead/alive status.
Last edited: