//TESH.scrollpos=30
//TESH.alwaysfold=0
//===========================================================================
// Replaces a gold mine with a blighted gold mine for the given player.
//
//===========================================================================
// Starting Units for Custom Players
// - 1 Tier1 Hall, placed at start location
// - 5 Gold Workers, placed between start location and nearest gold mine
//
function MeleeStartingUnitsCustom takes player whichPlayer, location startLoc, boolean doHeroes, boolean doCamera, boolean doPreload, integer whichRace returns nothing
local boolean useRandomHero = IsMapFlagSet(MAP_RANDOM_HERO)
local real unitSpacing = 64.00
local unit nearestMine
local unit tree
local location nearMineLoc
local location nearTownLoc
local location exactMineLoc
local location heroLoc
local real peonX
local real peonY
local real ghoulX
local real ghoulY
local integer mineGold
local unit newMine
set nearestMine = MeleeFindNearestMine(startLoc, bj_MELEE_MINE_SEARCH_RADIUS)
if (nearestMine != null) then
set nearMineLoc = MeleeGetProjectedLoc(GetUnitLoc(nearestMine), startLoc, 320, 0)
set peonX = GetLocationX(nearMineLoc)
set peonY = GetLocationY(nearMineLoc)
if (udg_UnitType_Goldmine[whichRace] != null) then
if (udg_UnitType_Goldmine[whichRace] == udg_UnitType_TownhallT1[whichRace]) then
// Replace the nearest gold mine with a Tier1 Hall.
// Save the Gold Mine's properties and remove it.
set exactMineLoc = MeleeGetProjectedLoc(GetUnitLoc(nearestMine), startLoc, 0, 0)
set mineGold = GetResourceAmount(nearestMine)
call RemoveUnit(nearestMine)
// Create a Tier1 Hall to replace the Gold Mine.
set nearestMine = CreateUnitAtLoc(whichPlayer, udg_UnitType_TownhallT1[whichRace], exactMineLoc, bj_UNIT_FACING)
call SetResourceAmount(nearestMine, mineGold)
else
// Replace the nearest gold mine with a new version.
// Replace the nearest gold mine with a Tier1 Hall.
// Save the Gold Mine's properties and remove it.
set exactMineLoc = MeleeGetProjectedLoc(GetUnitLoc(nearestMine), startLoc, 0, 0)
set mineGold = GetResourceAmount(nearestMine)
call RemoveUnit(nearestMine)
// Create a Tier1 Hall to replace the Gold Mine.
set nearestMine = CreateUnitAtLoc(whichPlayer, udg_UnitType_Goldmine[whichRace], exactMineLoc, bj_UNIT_FACING)
call SetResourceAmount(nearestMine, mineGold)
// Spawn Tier1 Hall at the start location.
call CreateUnitAtLoc(whichPlayer, udg_UnitType_TownhallT1[whichRace], startLoc, bj_UNIT_FACING)
endif
else
if (udg_HallEntanglesGoldmine[whichRace] == true) then
// Spawn Tier1 Hall near goldmine.
set tree = CreateUnitAtLoc(whichPlayer, udg_UnitType_TownhallT1[whichRace], nearMineLoc, bj_UNIT_FACING)
call IssueTargetOrder(tree, "entangleinstant", nearestMine)
else
// Spawn Tier1 Hall at the start location.
call CreateUnitAtLoc(whichPlayer, udg_UnitType_TownhallT1[whichRace], startLoc, bj_UNIT_FACING)
endif
endif
// Spawn Gold Workers near the mine.
call CreateUnit(whichPlayer, udg_UnitType_PrimaryWorker[whichRace], peonX + 0.00 * unitSpacing, peonY + 1.00 * unitSpacing, bj_UNIT_FACING)
call CreateUnit(whichPlayer, udg_UnitType_PrimaryWorker[whichRace], peonX + 1.00 * unitSpacing, peonY + 0.15 * unitSpacing, bj_UNIT_FACING)
call CreateUnit(whichPlayer, udg_UnitType_PrimaryWorker[whichRace], peonX - 1.00 * unitSpacing, peonY + 0.15 * unitSpacing, bj_UNIT_FACING)
if (udg_UnitType_SecondaryWorker[whichRace] != null) then
// Spawn Ghoul near the Tier1 Hall.
set nearTownLoc = MeleeGetProjectedLoc(startLoc, GetUnitLoc(nearestMine), 288, 0)
set ghoulX = GetLocationX(nearTownLoc)
set ghoulY = GetLocationY(nearTownLoc)
call CreateUnit(whichPlayer, udg_UnitType_SecondaryWorker[whichRace], ghoulX + 0.60 * unitSpacing, ghoulY - 1.00 * unitSpacing, bj_UNIT_FACING)
else
call CreateUnit(whichPlayer, udg_UnitType_PrimaryWorker[whichRace], peonX + 0.60 * unitSpacing, peonY - 1.00 * unitSpacing, bj_UNIT_FACING)
call CreateUnit(whichPlayer, udg_UnitType_PrimaryWorker[whichRace], peonX - 0.60 * unitSpacing, peonY - 1.00 * unitSpacing, bj_UNIT_FACING)
endif
if (udg_StartsWithBlight[whichRace] == true) then
// Create a patch of blight around the start location.
call SetBlightLoc(whichPlayer,startLoc, 768, true)
endif
// Set random hero spawn point to be off to the side of the start location.
set heroLoc = MeleeGetProjectedLoc(GetUnitLoc(nearestMine), startLoc, 384, 45)
else
// Spawn Tier1 Hall at the start location.
call CreateUnitAtLoc(whichPlayer, udg_UnitType_TownhallT1[whichRace], startLoc, bj_UNIT_FACING)
// Spawn Gold Workers directly south of the Tier1 Hall.
set peonX = GetLocationX(startLoc)
set peonY = GetLocationY(startLoc) - 224.00
call CreateUnit(whichPlayer, udg_UnitType_PrimaryWorker[whichRace], peonX + 2.00 * unitSpacing, peonY + 0.00 * unitSpacing, bj_UNIT_FACING)
call CreateUnit(whichPlayer, udg_UnitType_PrimaryWorker[whichRace], peonX + 1.00 * unitSpacing, peonY + 0.00 * unitSpacing, bj_UNIT_FACING)
call CreateUnit(whichPlayer, udg_UnitType_PrimaryWorker[whichRace], peonX + 0.00 * unitSpacing, peonY + 0.00 * unitSpacing, bj_UNIT_FACING)
if (udg_UnitType_SecondaryWorker[whichRace] != null) then
// Spawn Ghoul near the Tier1 Hall.
call CreateUnit(whichPlayer, udg_UnitType_SecondaryWorker[whichRace], peonX - 1.00 * unitSpacing, peonY + 0.00 * unitSpacing, bj_UNIT_FACING)
else
call CreateUnit(whichPlayer, udg_UnitType_PrimaryWorker[whichRace], peonX - 1.00 * unitSpacing, peonY + 0.00 * unitSpacing, bj_UNIT_FACING)
call CreateUnit(whichPlayer, udg_UnitType_PrimaryWorker[whichRace], peonX - 2.00 * unitSpacing, peonY + 0.00 * unitSpacing, bj_UNIT_FACING)
endif
if (udg_StartsWithBlight[whichRace] == true) then
// Create a patch of blight around the start location.
call SetBlightLoc(whichPlayer,startLoc, 768, true)
endif
// Set random hero spawn point to be just south of the start location.
set heroLoc = Location(peonX, peonY - 2.00 * unitSpacing)
endif
if (doHeroes) then
// If the "Random Hero" option is set, start the player with a random hero.
// Otherwise, give them a "free hero" token.
if useRandomHero then
call MeleeRandomHeroLoc(whichPlayer, udg_UnitType_Hero1[whichRace], udg_UnitType_Hero2[whichRace], udg_UnitType_Hero3[whichRace], udg_UnitType_Hero4[whichRace], heroLoc)
else
call SetPlayerState(whichPlayer, PLAYER_STATE_RESOURCE_HERO_TOKENS, bj_MELEE_STARTING_HERO_TOKENS)
endif
endif
if (doCamera) then
// Center the camera on the initial Peasants.
call SetCameraPositionForPlayer(whichPlayer, peonX, peonY)
call SetCameraQuickPositionForPlayer(whichPlayer, peonX, peonY)
endif
endfunction
//===========================================================================
function AlteredMeleeStartingUnits takes nothing returns nothing
local integer index
local player indexPlayer
local location indexStartLoc
local race indexRace
call Preloader( "scripts\\SharedMelee.pld" )
set index = 0
loop
set indexPlayer = Player(index)
if (GetPlayerSlotState(indexPlayer) == PLAYER_SLOT_STATE_PLAYING) then
set indexStartLoc = GetStartLocationLoc(GetPlayerStartLocation(indexPlayer))
set indexRace = GetPlayerRace(indexPlayer)
// Create initial race-specific starting units
if (udg_RaceChosen[GetConvertedPlayerId(indexPlayer)] == 1) then
call MeleeStartingUnitsHuman(indexPlayer, indexStartLoc, true, true, true)
elseif (udg_RaceChosen[GetConvertedPlayerId(indexPlayer)] == 2) then
call MeleeStartingUnitsOrc(indexPlayer, indexStartLoc, true, true, true)
elseif (udg_RaceChosen[GetConvertedPlayerId(indexPlayer)] == 3) then
call MeleeStartingUnitsUndead(indexPlayer, indexStartLoc, true, true, true)
elseif (udg_RaceChosen[GetConvertedPlayerId(indexPlayer)] == 4) then
call MeleeStartingUnitsNightElf(indexPlayer, indexStartLoc, true, true, true)
else
call MeleeStartingUnitsCustom(indexPlayer, indexStartLoc, true, true, true, udg_RaceChosen[GetConvertedPlayerId(indexPlayer)])
endif
endif
set index = index + 1
exitwhen index == bj_MAX_PLAYERS
endloop
endfunction
//***************************************************************************
//*
//* Altered Melee Template Victory / Defeat Conditions
//*
//***************************************************************************
//===========================================================================
// Count buildings currently owned by all allies, including the player themself.
//
function AlteredMeleeGetAllyStructureCount takes player whichPlayer returns integer
local integer playerIndex
local integer buildingCount
local player indexPlayer
// Count the number of buildings controlled by all not-yet-defeated co-allies.
set buildingCount = 0
set playerIndex = 0
loop
set indexPlayer = Player(playerIndex)
// uncomment to cause defeat even if you have control of ally structures, but yours have been nixed
//if (PlayersAreCoAllied(whichPlayer, indexPlayer) and not bj_meleeDefeated[playerIndex]) then
if (PlayersAreCoAllied(whichPlayer, indexPlayer)) then
set buildingCount = buildingCount + GetPlayerStructureCount(indexPlayer, true)
endif
set playerIndex = playerIndex + 1
exitwhen playerIndex == bj_MAX_PLAYERS
endloop
return buildingCount
endfunction
//===========================================================================
// 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 AlteredMeleeGetAllyKeyStructureCount takes player whichPlayer returns integer
local integer playerIndex
local player indexPlayer
local integer keyStructs
local integer raceIndex
// 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 + 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 raceIndex = 5
loop
set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId(udg_UnitType_TownhallT1[raceIndex], indexPlayer)
set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId(udg_UnitType_TownhallT2[raceIndex], indexPlayer)
set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId(udg_UnitType_TownhallT3[raceIndex], indexPlayer)
set raceIndex = raceIndex + 1
exitwhen raceIndex == (udg_NumOfRaceChoices + 1)
endloop
endif
set playerIndex = playerIndex + 1
exitwhen playerIndex == bj_MAX_PLAYERS
endloop
return keyStructs
endfunction
//===========================================================================
// Test each player to determine if anyone has been defeated.
//
function AlteredMeleeCheckForLosersAndVictors takes nothing returns nothing
local integer playerIndex
local player indexPlayer
local force defeatedPlayers = CreateForce()
local force victoriousPlayers
local boolean gameOver = false
// If the game is already over, do nothing
if (bj_meleeGameOver) then
return
endif
// If the game was disconnected then it is over, in this case we
// don't want to report results for anyone as they will most likely
// conflict with the actual game results
if (GetIntegerGameState(GAME_STATE_DISCONNECTED) != 0) then
set bj_meleeGameOver = true
return
endif
// Check each player to see if he or she has been defeated yet.
set playerIndex = 0
loop
set indexPlayer = Player(playerIndex)
if (not bj_meleeDefeated[playerIndex] and not bj_meleeVictoried[playerIndex]) then
//call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 60, "Player"+I2S(playerIndex)+" has "+I2S(AlteredMeleeGetAllyStructureCount(indexPlayer))+" ally buildings.")
if (AlteredMeleeGetAllyStructureCount(indexPlayer) <= 0) then
// Keep track of each defeated player so that we can give
// them a defeat later.
call ForceAddPlayer(defeatedPlayers, Player(playerIndex))
// Set their defeated flag now so MeleeCheckForVictors
// can detect victors.
set bj_meleeDefeated[playerIndex] = true
endif
endif
set playerIndex = playerIndex + 1
exitwhen playerIndex == bj_MAX_PLAYERS
endloop
// Now that the defeated flags are set, check if there are any victors
set victoriousPlayers = MeleeCheckForVictors()
// Defeat all defeated players
call ForForce(defeatedPlayers, function MeleeDoDefeatEnum)
// Give victory to all victorious players
call ForForce(victoriousPlayers, function MeleeDoVictoryEnum)
// If the game is over we should remove all observers
if (bj_meleeGameOver) then
call MeleeRemoveObservers()
endif
endfunction
//===========================================================================
// Returns a race-specific "build X or be revealed" message.
//
function AlteredMeleeGetCrippledWarningMessage takes player whichPlayer returns string
if (udg_RaceChosen[GetConvertedPlayerId(whichPlayer )] == 1) then
return GetLocalizedString("CRIPPLE_WARNING_HUMAN")
elseif (udg_RaceChosen[GetConvertedPlayerId(whichPlayer )] == 2) then
return GetLocalizedString("CRIPPLE_WARNING_ORC")
elseif (udg_RaceChosen[GetConvertedPlayerId(whichPlayer )] == 3) then
return GetLocalizedString("CRIPPLE_WARNING_NIGHTELF")
elseif (udg_RaceChosen[GetConvertedPlayerId(whichPlayer )] == 4) then
return GetLocalizedString("CRIPPLE_WARNING_UNDEAD")
else
return udg_RevealMessage[udg_RaceChosen[GetConvertedPlayerId(whichPlayer)]]
endif
endfunction
//===========================================================================
// Returns a race-specific "build X" label for cripple timers.
//
function AlteredMeleeGetCrippledTimerMessage takes player whichPlayer returns string
if (udg_RaceChosen[GetConvertedPlayerId(whichPlayer )] == 1) then
return GetLocalizedString("CRIPPLE_TIMER_HUMAN")
elseif (udg_RaceChosen[GetConvertedPlayerId(whichPlayer )] == 2) then
return GetLocalizedString("CRIPPLE_TIMER_ORC")
elseif (udg_RaceChosen[GetConvertedPlayerId(whichPlayer )] == 3) then
return GetLocalizedString("CRIPPLE_TIMER_NIGHTELF")
elseif (udg_RaceChosen[GetConvertedPlayerId(whichPlayer )] == 4) then
return GetLocalizedString("CRIPPLE_TIMER_UNDEAD")
else
return udg_BuildWindow[udg_RaceChosen[GetConvertedPlayerId(whichPlayer)]]
endif
endfunction
//===========================================================================
function AlteredMeleePlayerIsCrippled takes player whichPlayer returns boolean
local integer allyStructures = AlteredMeleeGetAllyStructureCount(whichPlayer)
local integer allyKeyStructures = AlteredMeleeGetAllyKeyStructureCount(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 AlteredMeleeCheckForCrippledPlayers 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 = AlteredMeleePlayerIsCrippled(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, AlteredMeleeGetCrippledWarningMessage(indexPlayer))
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 (AlteredMeleeGetAllyStructureCount(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 AlteredMeleeCheckLostUnit 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 AlteredMeleeCheckForLosersAndVictors()
endif
// Check if the lost unit has crippled or uncrippled the player.
// (A team with 0 units is dead, and thus considered uncrippled.)
call AlteredMeleeCheckForCrippledPlayers()
endfunction
//===========================================================================
// Determine if the gained unit should result in any defeats, victories,
// or cripple-status changes.
//
function AlteredMeleeCheckAddedUnit 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 AlteredMeleeCheckForCrippledPlayers()
endif
endfunction
//===========================================================================
function AlteredMeleeTriggerActionConstructCancel takes nothing returns nothing
call AlteredMeleeCheckLostUnit(GetCancelledStructure())
endfunction
//===========================================================================
function AlteredMeleeTriggerActionUnitDeath takes nothing returns nothing
if (IsUnitType(GetDyingUnit(), UNIT_TYPE_STRUCTURE)) then
call AlteredMeleeCheckLostUnit(GetDyingUnit())
endif
endfunction
//===========================================================================
function AlteredMeleeTriggerActionUnitConstructionStart takes nothing returns nothing
call AlteredMeleeCheckAddedUnit(GetConstructingStructure())
endfunction
//===========================================================================
function AlteredMeleeTriggerActionPlayerDefeated takes nothing returns nothing
local player thePlayer = GetTriggerPlayer()
call CachePlayerHeroData(thePlayer)
if (MeleeGetAllyCount(thePlayer) > 0) then
// If at least one ally is still alive and kicking, share units with
// them and proceed with death.
call ShareEverythingWithTeam(thePlayer)
if (not bj_meleeDefeated[GetPlayerId(thePlayer)]) then
call MeleeDoDefeat(thePlayer)
endif
else
// If no living allies remain, swap all units and buildings over to
// neutral_passive and proceed with death.
call MakeUnitsPassiveForTeam(thePlayer)
if (not bj_meleeDefeated[GetPlayerId(thePlayer)]) then
call MeleeDoDefeat(thePlayer)
endif
endif
call AlteredMeleeCheckForLosersAndVictors()
endfunction
//===========================================================================
function AlteredMeleeTriggerActionPlayerLeft takes nothing returns nothing
local player thePlayer = GetTriggerPlayer()
// Just show game over for observers when they leave
if (IsPlayerObserver(thePlayer)) then
call RemovePlayerPreserveUnitsBJ(thePlayer, PLAYER_GAME_RESULT_NEUTRAL, false)
return
endif
call CachePlayerHeroData(thePlayer)
// This is the same as defeat except the player generates the message
// "player left the game" as opposed to "player was defeated".
if (MeleeGetAllyCount(thePlayer) > 0) then
// If at least one ally is still alive and kicking, share units with
// them and proceed with death.
call ShareEverythingWithTeam(thePlayer)
call MeleeDoLeave(thePlayer)
else
// If no living allies remain, swap all units and buildings over to
// neutral_passive and proceed with death.
call MakeUnitsPassiveForTeam(thePlayer)
call MeleeDoLeave(thePlayer)
endif
call AlteredMeleeCheckForLosersAndVictors()
endfunction
//===========================================================================
function AlteredMeleeTriggerActionAllianceChange takes nothing returns nothing
call AlteredMeleeCheckForLosersAndVictors()
call AlteredMeleeCheckForCrippledPlayers()
endfunction
//===========================================================================
function AlteredMeleeInitVictoryDefeat 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], AlteredMeleeGetCrippledTimerMessage(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 AlteredMeleeTriggerActionConstructCancel)
// 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 AlteredMeleeTriggerActionUnitDeath)
// 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 AlteredMeleeTriggerActionUnitConstructionStart)
// Set a trigger to fire whenever this player defeats-out
set trig = CreateTrigger()
call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_DEFEAT)
call TriggerAddAction(trig, function AlteredMeleeTriggerActionPlayerDefeated)
// Set a trigger to fire whenever this player leaves
set trig = CreateTrigger()
call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_LEAVE)
call TriggerAddAction(trig, function AlteredMeleeTriggerActionPlayerLeft)
// 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 AlteredMeleeTriggerActionAllianceChange)
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 AlteredMeleeTriggerActionPlayerLeft)
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 AlteredMeleeTriggerActionAllianceChange)
endfunction
Name | Type | is_array | initial_value |
BuildWindow | string | Yes | Build Tier1 Hall |
ChargeStrikeCaster | unit | No | |
ChargeStrikeLocation | location | No | |
ChargeStrikeTarget | unit | No | |
EG | group | Yes | |
HallEntanglesGoldmine | boolean | Yes | |
J_Dummy | unit | No | |
J_Hero | unit | No | |
J_Hero_Loc | location | No | |
klongeci | location | No | |
KnockTo | location | No | |
loops | integer | No | |
MoveTo | location | No | |
NumOfPlayerSlots | integer | No | 12 |
NumOfRaceChoices | integer | No | 11 |
o | unit | No | |
o_current_loc | location | No | |
p | unit | No | |
Paranoia_Dummy | unit | No | |
pl | location | No | |
precentage_chance | integer | No | |
Race5 | button | No | |
Race6 | button | No | |
Race7 | button | No | |
Race8 | button | No | |
Race9 | button | No | |
RaceChoices | dialog | No | |
RaceChosen | integer | Yes | |
RaceHuman | button | No | |
RaceNightElf | button | No | |
RaceOrc | button | No | |
RaceUndead | button | No | |
RevealMessage | string | Yes | You will be revealed... |
StartsWithBlight | boolean | Yes | |
t | unit | No | |
tempunit | unit | Yes | |
tl | location | No | |
TmpGroup | group | No | |
TmpUnitFlight | unit | Yes | |
tmpunitint | integer | No | |
UnitType_Goldmine | unitcode | Yes | |
UnitType_Hero1 | unitcode | Yes | |
UnitType_Hero2 | unitcode | Yes | |
UnitType_Hero3 | unitcode | Yes | |
UnitType_Hero4 | unitcode | Yes | |
UnitType_PrimaryWorker | unitcode | Yes | |
UnitType_SecondaryWorker | unitcode | Yes | |
UnitType_TownhallT1 | unitcode | Yes | |
UnitType_TownhallT2 | unitcode | Yes | |
UnitType_TownhallT3 | unitcode | Yes | |
UnitType_TownhallT4 | unitcode | Yes | |
UnitType_TownhallT5 | unitcode | Yes |