//===========================================================================
// Counts key structures owned by a player and his or her allies, including
// structures currently upgrading or under construction.
//
// Key structures: Town Hall, Great Hall, Tree of Life, Necropolis
//
function LivingPlayerHallsFilter takes nothing returns boolean
return (IsUnitAliveBJ(GetFilterUnit()) and IsUnitType(GetFilterUnit(),UNIT_TYPE_TOWNHALL))
endfunction
function CountLivingPlayerTownHalls takes player whichPlayer returns integer
local group g
local integer matchedCount
local boolexpr b=Filter(function LivingPlayerHallsFilter)
set g = CreateGroup()
call GroupEnumUnitsOfPlayer(g, whichPlayer, b)
set matchedCount = CountUnitsInGroup(g)
call DestroyGroup(g)
call DestroyBoolExpr(b)
set b=null
set g=null
return matchedCount
endfunction
function Custom_MeleeGetAllyKeyStructureCount takes player whichPlayer returns integer
local integer playerIndex
local player indexPlayer
local integer keyStructs
// Count the number of buildings controlled by all not-yet-defeated co-allies.
set keyStructs = 0
set playerIndex = 0
loop
set indexPlayer = Player(playerIndex)
if (PlayersAreCoAllied(whichPlayer, indexPlayer)) then
set keyStructs = keyStructs + CountLivingPlayerTownHalls(indexPlayer)
// set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, "townhall", true, true)
// set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, "greathall", true, true)
// set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, "treeoflife", true, true)
// set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, "necropolis", true, true)
// set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, "custom_h030", true, true)
// set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, "custom_h01C", true, true)
// set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, "custom_h012", true, true)
// set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, "custom_h013", true, true)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('h013',indexPlayer)//Never use group functions for this, just count living units for player. Much better idea.
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('h014',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('h015',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('h01C',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('h01E',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('h01F',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('h012',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('h02F',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('h02J',indexPlayer)
// set keyStructs = keySructs + CountLivingPlayerUnitsOfTypeId('h030',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('h000',indexPlayer)//Non-modded human custom ids
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('h00D',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('h00E',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('o00C',indexPlayer)//Non-modded orc custom ids
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('o00D',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('o00E',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('e00M',indexPlayer)//Non-modded night elf custom ids
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('e00N',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('e00O',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('u00C',indexPlayer)//Non-modded undead custom ids
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('u00D',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('u00E',indexPlayer)
endif
set playerIndex = playerIndex + 1
exitwhen playerIndex == bj_MAX_PLAYERS
endloop
return keyStructs
endfunction
//===========================================================================
function Custom_MeleePlayerIsCrippled takes player whichPlayer returns boolean
local integer allyStructures = MeleeGetAllyStructureCount(whichPlayer)
local integer allyKeyStructures = Custom_MeleeGetAllyKeyStructureCount(whichPlayer)
// Dead teams are not considered to be crippled.
return (allyStructures > 0) and (allyKeyStructures <= 0)
endfunction
//===========================================================================
// Test each player to determine if anyone has become crippled.
//
function Custom_MeleeCheckForCrippledPlayers takes nothing returns nothing
local integer playerIndex
local player indexPlayer
local force crippledPlayers = CreateForce()
local boolean isNowCrippled
local race indexRace
// The "finish soon" exposure of all players overrides any "crippled" exposure
if bj_finishSoonAllExposed then
return
endif
// Check each player to see if he or she has been crippled or uncrippled.
set playerIndex = 0
loop
set indexPlayer = Player(playerIndex)
set isNowCrippled = Custom_MeleePlayerIsCrippled(indexPlayer)
if (not bj_playerIsCrippled[playerIndex] and isNowCrippled) then
// Player became crippled; start their cripple timer.
set bj_playerIsCrippled[playerIndex] = true
call TimerStart(bj_crippledTimer[playerIndex], bj_MELEE_CRIPPLE_TIMEOUT, false, function MeleeCrippledPlayerTimeout)
if (GetLocalPlayer() == indexPlayer) then
// Use only local code (no net traffic) within this block to avoid desyncs.
// Show the timer window.
call TimerDialogDisplay(bj_crippledTimerWindows[playerIndex], true)
// Display a warning message.
call DisplayTimedTextToPlayer(indexPlayer, 0, 0, bj_MELEE_CRIPPLE_MSG_DURATION, "|cffffcc00"+udg_RevealWarning+"|r")
endif
elseif (bj_playerIsCrippled[playerIndex] and not isNowCrippled) then
// Player became uncrippled; stop their cripple timer.
set bj_playerIsCrippled[playerIndex] = false
call PauseTimer(bj_crippledTimer[playerIndex])
if (GetLocalPlayer() == indexPlayer) then
// Use only local code (no net traffic) within this block to avoid desyncs.
// Hide the timer window for this player.
call TimerDialogDisplay(bj_crippledTimerWindows[playerIndex], false)
// Display a confirmation message if the player's team is still alive.
if (MeleeGetAllyStructureCount(indexPlayer) > 0) then
if (bj_playerIsExposed[playerIndex]) then
call DisplayTimedTextToPlayer(indexPlayer, 0, 0, bj_MELEE_CRIPPLE_MSG_DURATION, GetLocalizedString("CRIPPLE_UNREVEALED"))
else
call DisplayTimedTextToPlayer(indexPlayer, 0, 0, bj_MELEE_CRIPPLE_MSG_DURATION, GetLocalizedString("CRIPPLE_UNCRIPPLED"))
endif
endif
endif
// If the player granted shared vision, deny that vision now.
call MeleeExposePlayer(indexPlayer, false)
endif
set playerIndex = playerIndex + 1
exitwhen playerIndex == bj_MAX_PLAYERS
endloop
endfunction
//===========================================================================
// Determine if the lost unit should result in any defeats or victories.
//
function Custom_MeleeCheckLostUnit takes unit lostUnit returns nothing
local player lostUnitOwner = GetOwningPlayer(lostUnit)
// We only need to check for mortality if this was the last building.
if (GetPlayerStructureCount(lostUnitOwner, true) <= 0) then
call MeleeCheckForLosersAndVictors()
endif
// Check if the lost unit has crippled or uncrippled the player.
// (A team with 0 units is dead, and thus considered uncrippled.)
call Custom_MeleeCheckForCrippledPlayers()
endfunction
//===========================================================================
// Determine if the gained unit should result in any defeats, victories,
// or cripple-status changes.
//
function Custom_MeleeCheckAddedUnit takes unit addedUnit returns nothing
local player addedUnitOwner = GetOwningPlayer(addedUnit)
// If the player was crippled, this unit may have uncrippled him/her.
if (bj_playerIsCrippled[GetPlayerId(addedUnitOwner)]) then
call Custom_MeleeCheckForCrippledPlayers()
endif
endfunction
//===========================================================================
function Custom_MeleeTriggerActionConstructCancel takes nothing returns nothing
call Custom_MeleeCheckLostUnit(GetCancelledStructure())
endfunction
//===========================================================================
function Custom_MeleeTriggerActionUnitDeath takes nothing returns nothing
if (IsUnitType(GetDyingUnit(), UNIT_TYPE_STRUCTURE)) then
call Custom_MeleeCheckLostUnit(GetDyingUnit())
endif
endfunction
//===========================================================================
function Custom_MeleeTriggerActionUnitConstructionStart takes nothing returns nothing
call Custom_MeleeCheckAddedUnit(GetConstructingStructure())
endfunction
//===========================================================================
function Custom_MeleeTriggerActionAllianceChange takes nothing returns nothing
call MeleeCheckForLosersAndVictors()
call Custom_MeleeCheckForCrippledPlayers()
endfunction
//===========================================================================
function MeleeInitVictoryDefeatCustomized takes nothing returns nothing
local trigger trig
local integer index
local player indexPlayer
// Create a timer window for the "finish soon" timeout period, it has no timer
// because it is driven by real time (outside of the game state to avoid desyncs)
set bj_finishSoonTimerDialog = CreateTimerDialog(null)
// Set a trigger to fire when we receive a "finish soon" game event
set trig = CreateTrigger()
call TriggerRegisterGameEvent(trig , EVENT_GAME_TOURNAMENT_FINISH_SOON)
call TriggerAddAction(trig , function MeleeTriggerTournamentFinishSoon)
// Set a trigger to fire when we receive a "finish now" game event
set trig = CreateTrigger()
call TriggerRegisterGameEvent(trig , EVENT_GAME_TOURNAMENT_FINISH_NOW)
call TriggerAddAction(trig , function MeleeTriggerTournamentFinishNow)
// Set up each player's mortality code.
set index = 0
loop
set indexPlayer = Player(index)
// Make sure this player slot is playing.
if ( GetPlayerSlotState(indexPlayer) == PLAYER_SLOT_STATE_PLAYING ) then
set bj_meleeDefeated[index]=false
set bj_meleeVictoried[index]=false
// Create a timer and timer window in case the player is crippled.
set bj_playerIsCrippled[index]=false
set bj_playerIsExposed[index]=false
set bj_crippledTimer[index]=CreateTimer()
set bj_crippledTimerWindows[index]=CreateTimerDialog(bj_crippledTimer[index])
call TimerDialogSetTitle(bj_crippledTimerWindows[index] , MeleeGetCrippledTimerMessage(indexPlayer))
// Set a trigger to fire whenever a building is cancelled for this player.
set trig = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(trig , indexPlayer , EVENT_PLAYER_UNIT_CONSTRUCT_CANCEL , null)
call TriggerAddAction(trig , function Custom_MeleeTriggerActionConstructCancel)
// Set a trigger to fire whenever a unit dies for this player.
set trig = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(trig , indexPlayer , EVENT_PLAYER_UNIT_DEATH , null)
call TriggerAddAction(trig , function Custom_MeleeTriggerActionUnitDeath)
// Set a trigger to fire whenever a unit begins construction for this player
set trig = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(trig , indexPlayer , EVENT_PLAYER_UNIT_CONSTRUCT_START , null)
call TriggerAddAction(trig , function Custom_MeleeTriggerActionUnitConstructionStart)
// Set a trigger to fire whenever this player defeats-out
set trig = CreateTrigger()
call TriggerRegisterPlayerEvent(trig , indexPlayer , EVENT_PLAYER_DEFEAT)
call TriggerAddAction(trig , function MeleeTriggerActionPlayerDefeated)
// Set a trigger to fire whenever this player leaves
set trig = CreateTrigger()
call TriggerRegisterPlayerEvent(trig , indexPlayer , EVENT_PLAYER_LEAVE)
call TriggerAddAction(trig , function MeleeTriggerActionPlayerLeft)
// Set a trigger to fire whenever this player changes his/her alliances.
set trig = CreateTrigger()
call TriggerRegisterPlayerAllianceChange(trig , indexPlayer , ALLIANCE_PASSIVE)
call TriggerRegisterPlayerStateEvent(trig , indexPlayer , PLAYER_STATE_ALLIED_VICTORY , EQUAL , 1)
call TriggerAddAction(trig , function Custom_MeleeTriggerActionAllianceChange)
else
set bj_meleeDefeated[index]=true
set bj_meleeVictoried[index]=false
// Handle leave events for observers
if ( IsPlayerObserver(indexPlayer) ) then
// Set a trigger to fire whenever this player leaves
set trig = CreateTrigger()
call TriggerRegisterPlayerEvent(trig , indexPlayer , EVENT_PLAYER_LEAVE)
call TriggerAddAction(trig , function MeleeTriggerActionPlayerLeft)
endif
endif
set index = index + 1
exitwhen index == bj_MAX_PLAYERS
endloop
// Test for victory / defeat at startup, in case the user has already won / lost.
// Allow for a short time to pass first, so that the map can finish loading.
call TimerStart(CreateTimer() , 2.0 , false , function Custom_MeleeTriggerActionAllianceChange)
endfunction
Name | Type | is_array | initial_value |
AbyssalObliterationCaster | unit | No | |
AbyssalPortalCaster | unit | Yes | |
AbyssalPortalChance | integer | No | |
AbyssalPortalCounter | integer | Yes | |
AbyssalPortalINDEX | integer | No | |
AbyssalPortalLOOP | integer | No | |
AbyssalPortalTimer | integer | Yes | |
AbyssalPortalUnit | unitcode | Yes | |
AbyssalPortalWard | unit | Yes | |
AdventureMode | button | No | |
AnniRayCaster | unit | Yes | |
AnniRayINDEX | integer | No | |
AnniRayLOOP | integer | No | |
AnniRayWard | unit | Yes | |
ArchonicRet | integer | No | |
Arena | dialog | No | |
ArenaNo | button | No | |
ArenaUnit | unit | No | |
ArenaYes | button | No | |
BackStabCasterPOS | real | No | |
BackstabTarget | unit | No | |
BackStabTargetPOS | real | No | |
BerserkCaster | unit | No | |
BerserkDamageBNS | real | No | |
BerserkDamageINIT | integer | No | |
BerserkGroup | group | No | |
BlackHoleCaster | unit | Yes | |
BlackHoleDummy | unit | Yes | |
BlackHoleINDEX | integer | No | |
BlackHoleLOOP | integer | No | |
BlazingHoleCaster | unit | Yes | |
BlazingHoleDummy | unit | Yes | |
BlazingHoleINDEX | integer | No | |
BlazingHoleLOOP | integer | No | |
BloodthornCaster | unit | No | |
BloodthornGroup | group | No | |
BribeCaster | unit | No | |
BribeGold | real | No | |
BribeTarget | unit | No | |
CastPoint | location | No | |
CerebralDominationCaster | unit | Yes | |
CerebralDominationINDEX | integer | No | |
CerebralDominationLOOP | integer | No | |
CerebralDominationPlayer | player | Yes | |
CerebralDominationTarget | unit | Yes | |
CerebralDominationTimer | integer | Yes | |
ChaoticTremorCaster | unit | Yes | |
ChaoticTremorCounter | integer | Yes | |
ChaoticTremorINDEX | integer | No | |
ChaoticTremorLOOP | integer | No | |
ChronosphereS_AbilityEffectAtt | string | No | |
ChronosphereS_AbilityEffectOne | string | No | |
ChronosphereS_AbilityEffectTwo | string | No | |
ChronosphereS_AbilityLevel | integer | No | |
ChronosphereS_AreaRadius | real | Yes | |
ChronosphereS_CancelAbility | abilcode | No | |
ChronosphereS_Cooldown | real | Yes | |
ChronosphereS_Dummy | unit | Yes | |
ChronosphereS_DummySFX | effect | Yes | |
ChronosphereS_DummyType | unitcode | No | |
ChronosphereS_EligibleTarget | boolean | No | |
ChronosphereS_FilterTrig | trigger | No | |
ChronosphereS_Index | integer | No | |
ChronosphereS_MainAbility | abilcode | No | |
ChronosphereS_ManaCost | integer | Yes | |
ChronosphereS_MaxLevel | integer | No | |
ChronosphereS_Point | location | Yes | |
ChronosphereS_PointTarget | location | No | |
ChronosphereS_RelativeAngle | real | No | |
ChronosphereS_RelativeDist | real | No | |
ChronosphereS_Source | unit | No | |
ChronosphereS_Target | unit | No | |
ChronosphereS_Temp | integervar | No | |
ChronosphereS_UnitPoint | location | No | |
ChronosphereS_UnitPointNew | location | No | |
CinematicSkip | boolean | No | |
CountDown | real | No | 1.00 |
CycloneCaster | unit | Yes | |
CycloneDeg | real | Yes | |
CycloneGroup1 | group | Yes | |
CycloneGroup2 | group | Yes | |
CycloneINDEX | integer | No | |
CyclonePoint | location | Yes | |
CycloneTarget | unit | Yes | |
DarkElfButton | button | No | |
DarkElfInvasion | timer | No | |
DeathwaveCaster | unit | No | |
DeathwaveDummy | unit | No | |
DeathwavePOS | location | Yes | |
DeityCaster | unit | Yes | |
DeityCounter | integer | Yes | |
DeityINDEX | integer | No | |
DeityLOOP | integer | No | |
DemonicClaimCaster | unit | No | |
DemonicClaimGroup | group | No | |
DemonicClaimTarget | unit | No | |
DemonicDiversionCaster | unit | No | |
DemonicDiversionTarget | unit | No | |
DemonInvasion | timer | No | |
Distance | real | No | |
DivineDecelerationCV | integer | No | |
DivineDecelerationGroup | group | No | |
DivineDecelerationLvl | integer | Yes | |
DivineDecelerationPOS | location | No | |
DivineRestorationCaster | unit | Yes | |
DivineRestorationINDEX | integer | No | |
DivineRestorationLOOP | integer | No | |
DivineRestorationTarget | unit | Yes | |
DWalkCaster | unit | No | |
DWalkEffect | effect | No | |
DWalkPosition | location | No | |
DWalkTimer | timer | No | |
EngulfCaster | unit | Yes | |
EngulfCounter | integer | Yes | |
EngulfINDEX | integer | No | |
EngulfLOOP | integer | No | |
EngulfSpeed | real | Yes | |
EngulfTarget | unit | Yes | |
EntanglingForestAoe | real | No | |
EntanglingForestCaster | unit | No | |
EntanglingForestPos | location | No | |
EquanimityCaster | unit | No | |
EquanimityDummy | unit | No | |
EternalFlamesCaster | unit | No | |
EternalFlamesPos | location | No | |
EternalInvasion | timer | No | |
EternalsButton | button | No | |
ExiledSpiritDMG | real | No | |
ExiledSpiritHP | real | No | |
EyeofSargerasCaster | unit | Yes | |
EyeofSargerasCounter | integer | Yes | |
EyeofSargerasINDEX | integer | No | |
EyeofSargerasLOOP | integer | No | |
EyeofSargerasPos | location | Yes | |
FelOrcButton | button | No | |
FireboltPos | location | No | |
FrostShieldCaster | unit | No | |
FrostWaveCaster | unit | No | |
FrostWavePos | real | No | |
FrostWaveTarget | unit | No | |
GameMode | integer | No | |
GameModeDialog | dialog | No | |
GameOver | boolean | No | |
Ghostplace | rect | No | |
GoldDiggerCaster | unit | No | |
GoldDiggerGold | integer | No | |
GreedisgoodAbility | abilcode | No | |
HellchargeCaster | unit | Yes | |
HellchargeCounter | integer | Yes | |
HellchargeDeg | real | Yes | |
HellchargeGroup | group | No | |
HellchargeINDEX | integer | No | |
HellchargeLOOP | integer | No | |
HellchargePos | location | Yes | |
HellchargePush | real | Yes | |
HeroChange | force | No | |
HeroChangeLevel | integer | No | |
HeroLimitGroup | force | No | |
Host | player | No | |
HostControlUnit | group | No | |
ImpulsiveWalkCaster | unit | Yes | |
ImpulsiveWalkCounter | integer | Yes | |
ImpulsiveWalkDeg | real | Yes | |
ImpulsiveWalkINDEX | integer | No | |
ImpulsiveWalkLOOP | integer | No | |
ImpulsiveWalkMaxCounter | integer | Yes | |
ImpulsiveWalkPOS | location | Yes | |
ImpureChaosCaster | unit | No | |
ImpureChaosCasterHP | integer | No | |
ImpureChaosCasterMN | integer | No | |
ImpureChaosTarget | unit | No | |
ImpureChaosTargetHP | integer | No | |
ImpureChaosTargetMN | integer | No | |
InstantTpCaster | unit | No | |
IronCurtainCaster | unit | Yes | |
IronCurtainCounter | integer | Yes | |
IronCurtainGroup | group | Yes | |
IronCurtainINDEX | integer | No | |
IronCurtainLOOP | integer | No | |
IronCurtainMaxCounter | integer | Yes | |
IronCurtainPos | real | Yes | |
IsUnitPreplaced | boolean | Yes | |
LastStandBonus | integer | No | |
LastStandBonusInit | integer | No | |
LastStandCaster | unit | No | |
LastStandGroup | group | No | |
LightwaveCaster | unit | No | |
LvlUpwithInt | integer | No | |
MagicExterminationINDEX | integer | No | |
MagicExterminationLOOP | integer | No | |
MagicExterminationTarget | unit | Yes | |
MagneticCaster | unit | Yes | |
MagneticDeg | real | Yes | |
MagneticDistance | real | Yes | |
MagneticINDEX | integer | No | |
MagneticLOOP | integer | No | |
MagneticPos | location | Yes | |
MagneticTarget | unit | Yes | |
MajesticFlameCaster | unit | No | |
MajesticFlamePos | location | Yes | |
ManaConversionTarget | unit | No | |
MeleeMode | button | No | |
MindDistortionTarget | unit | No | |
MindRotCaster | unit | No | |
MindRotPos | location | No | |
Missile | timer | No | |
MovePoint | location | No | |
MutateCaster | unit | No | |
MutateHealth | real | No | |
MutateTarget | unit | No | |
NagaButton | button | No | |
NagaInvasion | timer | No | |
NeutralGroup | force | No | |
NormalRace | button | No | |
OceanicTempestPos | location | No | |
OverpowerBonusAGI | real | Yes | |
OverpowerBonusINT | real | Yes | |
OverpowerBonusSTR | real | Yes | |
OverpowerCaster | unit | Yes | |
OverpowerINDEX | integer | No | |
OverpowerLOOP | integer | No | |
OverpowerTarget | unit | Yes | |
OverwhelmPos | location | No | |
OverwhelmTarget | unit | No | |
ParadoxCaster | player | No | |
ParadoxTarget | player | No | |
ParadoxUnit | unit | No | |
PerseveranceAoe | real | Yes | |
PerseveranceBuff | buffcode | No | |
PerseveranceCaster | unit | No | |
PerseveranceCasterGroup | group | No | |
PerseveranceCustomValue | integer | No | |
PerseveranceGroupCounter | integer | No | |
PerseveranceHeroAbility | abilcode | No | |
PerseveranceHighLevel | integer | Yes | |
PerseveranceLevel | integer | No | |
PerseveranceLifePercent | real | No | |
PerseverancePoint | location | No | |
PerseverancePreMaxHP | integer | Yes | |
PerseveranceScaleMax | integer | Yes | |
PerseveranceSFX | effect | Yes | |
PerseveranceTarget | unit | No | |
PerseveranceTargetGroup | group | No | |
PerseveranceUnitAbility | abilcode | No | |
PickPoint | location | No | |
Players | force | No | |
PureChaosCaster | unit | No | |
PureChaosGroup | group | No | |
PureChaosHP | real | No | |
PureChaosPlayer | player | No | |
QuantumBreakCaster | unit | No | |
Races | dialog | No | |
RageStompCaster | unit | No | |
RainofChaosDMG | real | No | |
RainofChaosHP | real | No | |
RandomAttack0 | integer | Yes | |
RandomAttack1 | integer | No | |
RandomAttack2 | integer | No | |
RandomAttack3 | integer | No | |
RandomAttack4 | integer | No | |
RandomAttack5 | integer | No | |
RandomAttack6 | integer | No | |
RandomChance1 | integer | No | |
RandomChance2 | integer | No | |
RandomHero | unitcode | Yes | |
RandomHeroIndex | integer | Yes | |
RandomUnit1 | unitcode | Yes | |
RandomUnit2 | unitcode | Yes | |
RandomWorker | unitcode | No | opeo |
ResonantDecimationCaster | unit | Yes | |
ResonantDecimationDeg | real | Yes | |
ResonantDecimationDummy | unit | Yes | |
ResonantDecimationINDEX | integer | No | |
ResonantDecimationLOOP | integer | No | |
ResonantDecimationPOS | location | Yes | |
RevealWarning | string | No | You will be revealed to your opponents unless you build a Town-Hall type structure |
SeraphRequiemCaster | unit | No | |
SeraphRequiemPos | real | No | |
ShockWave | real | No | |
SingularityCaster | unit | No | |
SoulExchangeCaster | unit | No | |
SoulExchangeGold | integer | No | |
SoulExchangeLumber | integer | No | |
SoulExchangeTarget | unit | No | |
SpellControlCaster | unit | No | |
SpellControlTarget | unit | No | |
SpiritBeastDMG | real | No | |
SpiritBeastHP | real | No | |
SpiritRitualCaster | unit | No | |
SpiritRitualTarget | unit | No | |
StatIncrease | integer | No | |
SupremeCaster | unit | No | |
SupremeGroup | group | No | |
TailDanceCaster | unit | Yes | |
TailDanceCounter | integer | Yes | |
TailDanceINDEX | integer | No | |
TailDanceLOOP | integer | No | |
Temp_Point | location | No | |
TempGroup | group | No | |
TempPoint0 | location | No | |
TempPoint1 | location | No | |
TempPoint2 | location | No | |
TerrorizeCaster | unit | No | |
TerrorizePos | location | Yes | |
TidalExpansionCaster | unit | No | |
Time | timer | No | |
TimeComp | timer | No | |
TwistingNetherCaster | unit | No | |
UDex | integer | No | |
UDexGen | integer | No | |
UDexNext | integer | Yes | |
UDexPrev | integer | Yes | |
UDexRecycle | integer | No | |
UDexUnits | unit | Yes | |
UDexWasted | integer | No | |
Ultimate | unitcode | No | |
UltimateBoss | unit | No | |
UltimateEntityCaster | unit | No | |
UltimateEntityGroup | group | No | |
UnitHealth | real | No | |
UnitIndexerEnabled | boolean | No | |
UnitIndexEvent | real | No | |
WateryMinionDMG | real | No | |
WateryMinionHP | real | No | |
WhirlwindCaster | unit | Yes | |
WhirlwindDeg | real | Yes | |
WhirlwindDistance | real | Yes | |
WhirlwindINDEX | integer | No | |
WhirlwindLOOP | integer | No | |
WhirlwindMaxDistance | real | Yes | |
WhirlwindPos | location | Yes | |
WhirlwindTarget | unit | Yes | |
WillSegregationCaster | unit | No | |
WillSegregationDamage | integer | No | |
WillSegregationTarget | unit | No | |
WorldWispCaster | unit | Yes | |
WorldWispDeg | real | Yes | |
WorldWispINDEX | integer | No | |
WorldWispLOOP | integer | No | |
WorldWispPos | location | Yes | |
WorldWispRunner | unit | Yes | |
WP_CV | integer | No | |
WP_Local_Sfx | effect | No | |
WP_Point | location | No | |
WP_Structure | unit | No | |
WP_Water_Effect | effect | Yes | |
WrathoftheOldGodCaster | unit | No | |
YounglingSpitCaster | unit | No | |
YounglingSpitTarget | unit | No | |
ZoomOut | integer | No |
library WaterPathing
globals
hashtable WP_Hash = InitHashtable()
endglobals
function WP_Add_Pathing takes location p, real radius returns nothing
local real centerX = GetLocationX(p)
local real centerY = GetLocationY(p)
local real stepsX = radius / 16 // Calculate how many steps are needed based on radius
local real stepsY = radius / 16
local real currentX = centerX - radius
local real currentY
local integer waterCount = 0
local integer x = 0
local integer y = 0
// For debugging:
//local effect sfx
loop
exitwhen currentX > centerX + radius
set currentY = centerY - radius
loop
exitwhen currentY > centerY + radius
// For debugging:
//set sfx = AddSpecialEffect("Abilities\\Spells\\Undead\\AbsorbMana\\AbsorbManaBirthMissile.mdl", currentX, currentY)
//call BlzSetSpecialEffectScale(sfx, 0.4)
set x = R2I(currentX)
set y = R2I(currentY)
set waterCount = LoadInteger(WP_Hash, x, y)
call SaveInteger(WP_Hash, x, y, waterCount + 1)
// Add pathing if this is the first instance of this pathing at the given coordinates
if (waterCount == 0) then
call SetTerrainPathable(currentX, currentY, PATHING_TYPE_FLOATABILITY, true)
endif
set currentY = currentY + 16.0
endloop
set currentX = currentX + 16.0
endloop
endfunction
function WP_Remove_Pathing takes location p, real radius returns nothing
local real centerX = GetLocationX(p)
local real centerY = GetLocationY(p)
local real stepsX = radius / 16 // Calculate how many steps are needed based on radius
local real stepsY = radius / 16
local real currentX = centerX - radius
local real currentY
local integer waterCount = 0
local integer x = 0
local integer y = 0
loop
exitwhen currentX > centerX + radius
set currentY = centerY - radius
loop
exitwhen currentY > centerY + radius
set x = R2I(currentX)
set y = R2I(currentY)
set waterCount = LoadInteger(WP_Hash, x, y)
call SaveInteger(WP_Hash, x, y, waterCount - 1)
// Remove pathing if this is the last instance of this pathing at the given coordinates
if (waterCount == 1) then
call SetTerrainPathable(currentX, currentY, PATHING_TYPE_FLOATABILITY, false)
endif
set currentY = currentY + 16.0
endloop
set currentX = currentX + 16.0
endloop
endfunction
endlibrary