//***************************************************************************
//*
//* Altered Melee Starting AI Scripts
//*
//***************************************************************************
//===========================================================================
function AlteredMeleeShowAIRaceDialog takes nothing returns nothing
local integer index = 1
loop
if ( udg_AM_AI_PlayerNum == 0 ) then
if ( udg_AM_RaceChosen[index] == 0 ) then
if ( GetPlayerController(Player(index - 1)) == MAP_CONTROL_COMPUTER ) then
set udg_AM_AI_PlayerNum = index
call DialogSetMessage( udg_AM_RaceDialog_AI_1, ( "Computer Player " + I2S(udg_AM_AI_PlayerNum) + "'s Race" ) )
call DialogDisplay( Player(0), udg_AM_RaceDialog_AI_1, true )
endif
endif
endif
set index = index + 1
exitwhen index == 12
endloop
endfunction
//===========================================================================
function AlteredMeleeStartingAI takes nothing returns nothing
local integer index = 0
local player indexPlayer
local integer indexRace
loop
set indexPlayer = Player(index)
if (GetPlayerSlotState(indexPlayer) == PLAYER_SLOT_STATE_PLAYING) then
set indexRace = udg_AM_RaceChosen[index + 1]
if (GetPlayerController(indexPlayer) == MAP_CONTROL_COMPUTER) then
// Run a race-specific melee AI script.
call PickMeleeAI(indexPlayer, udg_AM_AI_FilePath[indexRace], null, null)
call ShareEverythingWithTeamAI(indexPlayer)
endif
endif
set index = index + 1
exitwhen index == 12
endloop
endfunction
//***************************************************************************
//*
//* Altered Melee Starting Units Scripts
//*
//***************************************************************************
//===========================================================================
// Starting Units for Custom Race Players
// - 1 Tier1 Hall, placed at start location
// - 5 Primary Workers or 3 Primary Workers and 1 Seconday Worker, 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 hallT1
local location nearMineLoc
local location nearTownLoc
local location exactMineLoc
local location heroLoc
local location tempLoc1
local real primaryX
local real primaryY
local real secondaryX
local real secondaryY
local integer mineGold
set nearestMine = MeleeFindNearestMine(startLoc, 2000)
if (nearestMine != null) then
set tempLoc1 = GetUnitLoc(nearestMine)
set nearMineLoc = MeleeGetProjectedLoc(tempLoc1, startLoc, 320, 0)
set primaryX = GetLocationX(nearMineLoc)
set primaryY = GetLocationY(nearMineLoc)
set nearTownLoc = MeleeGetProjectedLoc(startLoc, tempLoc1, 288, 0)
set secondaryX = GetLocationX(nearTownLoc)
set secondaryY = GetLocationY(nearTownLoc)
set exactMineLoc = MeleeGetProjectedLoc(tempLoc1, startLoc, 0, 0)
set mineGold = GetResourceAmount(nearestMine)
call RemoveLocation(tempLoc1)
else
set nearMineLoc = startLoc
set primaryX = GetLocationX(startLoc)
set primaryY = GetLocationY(startLoc) - 224.00
set nearTownLoc = startLoc
set secondaryX = primaryX
set secondaryY = primaryY
set exactMineLoc = startLoc
set mineGold = 19000
endif
//Check to see if race has a special goldmining structure
if (udg_AM_UnitType_Goldmine[whichRace] != null) then
//Check to see if Tier1 Hall entangles gold mines
if (udg_AM_HallEntanglesGoldmine[whichRace] != false) then
//Check to see if the goldmining structure is that race's townhall
if (udg_AM_UnitType_Goldmine[whichRace] == udg_AM_UnitType_TownhallT1[whichRace]) then
// Create a Tier1 Hall to replace the Gold Mine
call RemoveUnit(nearestMine)
set nearestMine = CreateUnitAtLoc(whichPlayer, udg_AM_UnitType_TownhallT1[whichRace], exactMineLoc, 270.0)
call SetResourceAmount(nearestMine, mineGold)
else
// Spawn Tier1 Hall near goldmine.
set hallT1 = CreateUnitAtLoc(whichPlayer, udg_AM_UnitType_TownhallT1[whichRace], nearMineLoc, 270.0)
call IssueTargetOrder(hallT1, "entangleinstant", nearestMine)
endif
else
// Create a Racial Gold Mine to replace the Gold Mine.
if (nearestMine != null) then
call RemoveUnit(nearestMine)
set nearestMine = CreateUnitAtLoc(whichPlayer, udg_AM_UnitType_Goldmine[whichRace], exactMineLoc, 270.0)
call SetResourceAmount(nearestMine, mineGold)
endif
// Spawn Tier1 Hall at the start location.
set hallT1 = CreateUnitAtLoc(whichPlayer, udg_AM_UnitType_TownhallT1[whichRace], startLoc, 270.0)
endif
else
// Spawn Tier1 Hall at the start location.
set hallT1 = CreateUnitAtLoc(whichPlayer, udg_AM_UnitType_TownhallT1[whichRace], startLoc, 270.0)
endif
// Spawn Primary Workers near the mine.
call CreateUnit(whichPlayer, udg_AM_UnitType_PrimaryWorker[whichRace], primaryX + 0.00 * unitSpacing, primaryY + 1.00 * unitSpacing, 270.0)
call CreateUnit(whichPlayer, udg_AM_UnitType_PrimaryWorker[whichRace], primaryX + 1.00 * unitSpacing, primaryY + 0.15 * unitSpacing, 270.0)
call CreateUnit(whichPlayer, udg_AM_UnitType_PrimaryWorker[whichRace], primaryX - 1.00 * unitSpacing, primaryY + 0.15 * unitSpacing, 270.0)
//If secondary workers exist then spawn 1 instead of 2 more primary workers.
if (udg_AM_UnitType_SecondaryWorker[whichRace] != null) then
// Spawn Secondary Workers near the Tier1 Hall.
call CreateUnit(whichPlayer, udg_AM_UnitType_SecondaryWorker[whichRace], secondaryX + 0.60 * unitSpacing, secondaryY - 1.00 * unitSpacing, 270.0)
else
call CreateUnit(whichPlayer, udg_AM_UnitType_PrimaryWorker[whichRace], primaryX + 0.60 * unitSpacing, primaryY - 1.00 * unitSpacing, 270.0)
call CreateUnit(whichPlayer, udg_AM_UnitType_PrimaryWorker[whichRace], primaryX - 0.60 * unitSpacing, primaryY - 1.00 * unitSpacing, 270.0)
endif
//Check to see if race starts with blight around starting area
if (udg_AM_StartsWithBlight[whichRace] == true) then
// Create a patch of blight near the mine.
call SetBlightLoc(whichPlayer,nearMineLoc, 768, true)
endif
// Set random hero spawn point to be near workers.
set heroLoc = Location(primaryX, primaryY - 2.00 * unitSpacing)
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_AM_UnitType_Hero1[whichRace], udg_AM_UnitType_Hero2[whichRace], udg_AM_UnitType_Hero3[whichRace], udg_AM_UnitType_Hero4[whichRace], heroLoc)
else
call SetPlayerState(whichPlayer, PLAYER_STATE_RESOURCE_HERO_TOKENS, 1)
endif
endif
if (doCamera) then
// Center the camera on the initial Peasants.
call SetCameraPositionForPlayer(whichPlayer, primaryX, primaryY )
call SetCameraQuickPositionForPlayer(whichPlayer, primaryX, primaryY )
endif
call RemoveLocation(nearMineLoc)
call RemoveLocation(nearTownLoc)
call RemoveLocation(exactMineLoc)
call RemoveLocation(heroLoc)
endfunction
//===========================================================================
function AlteredMeleeStartingUnits takes nothing returns nothing
local integer index = 0
local player indexPlayer
local location indexStartLoc
call Preloader( "scripts\\SharedMelee.pld" )
loop
set indexPlayer = Player(index)
if (GetPlayerSlotState(indexPlayer) == PLAYER_SLOT_STATE_PLAYING) then
set indexStartLoc = GetStartLocationLoc(GetPlayerStartLocation(indexPlayer))
// Create initial race-specific starting units
call MeleeStartingUnitsCustom(indexPlayer, indexStartLoc, true, true, true, udg_AM_RaceChosen[index + 1])
endif
call RemoveLocation(indexStartLoc)
set index = index + 1
exitwhen index == 12
endloop
call RemoveLocation(indexStartLoc)
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 = 0
local integer buildingCount = 0
local player indexPlayer
// Count the number of buildings controlled by all not-yet-defeated co-allies.
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 == 12
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 = 0
local player indexPlayer
local integer keyStructs = 0
local integer raceIndex = 1
// Count the number of buildings controlled by all not-yet-defeated co-allies.
loop
set indexPlayer = Player(playerIndex)
if (PlayersAreCoAllied(whichPlayer, indexPlayer)) then
loop
set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId(udg_AM_UnitType_TownhallT1[raceIndex], indexPlayer)
if ( udg_AM_UnitType_TownhallT2[raceIndex] != null ) then
set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId(udg_AM_UnitType_TownhallT2[raceIndex], indexPlayer)
endif
if ( udg_AM_UnitType_TownhallT3[raceIndex] != null ) then
set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId(udg_AM_UnitType_TownhallT3[raceIndex], indexPlayer)
endif
if ( udg_AM_UnitType_TownhallT4[raceIndex] != null ) then
set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId(udg_AM_UnitType_TownhallT4[raceIndex], indexPlayer)
endif
if ( udg_AM_UnitType_TownhallT5[raceIndex] != null ) then
set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId(udg_AM_UnitType_TownhallT5[raceIndex], indexPlayer)
endif
if ( udg_AM_UnitType_TownhallT6[raceIndex] != null ) then
set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId(udg_AM_UnitType_TownhallT6[raceIndex], indexPlayer)
endif
if ( udg_AM_UnitType_TownhallT7[raceIndex] != null ) then
set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId(udg_AM_UnitType_TownhallT7[raceIndex], indexPlayer)
endif
if ( udg_AM_UnitType_TownhallT8[raceIndex] != null ) then
set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId(udg_AM_UnitType_TownhallT8[raceIndex], indexPlayer)
endif
if ( udg_AM_UnitType_TownhallT9[raceIndex] != null ) then
set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId(udg_AM_UnitType_TownhallT9[raceIndex], indexPlayer)
endif
set raceIndex = raceIndex + 1
exitwhen raceIndex == (udg_AM_NumOfRaceChoices + 1)
endloop
endif
set playerIndex = playerIndex + 1
exitwhen playerIndex == 12
endloop
return keyStructs
endfunction
//===========================================================================
// Test each player to determine if anyone has been defeated.
//
function AlteredMeleeCheckForLosersAndVictors takes nothing returns nothing
local integer playerIndex = 0
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.
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 == 12
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
local integer indexPlayer = GetPlayerId(whichPlayer)+ 1
return udg_AM_RevealMessage[udg_AM_RaceChosen[indexPlayer]]
endfunction
//===========================================================================
// Returns a race-specific "build X" label for cripple timers.
//
function AlteredMeleeGetCrippledTimerMessage takes player whichPlayer returns string
local integer indexPlayer = GetPlayerId(whichPlayer)+ 1
return udg_AM_BuildWindow[udg_AM_RaceChosen[indexPlayer]]
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 = 0
local player indexPlayer
local force crippledPlayers = CreateForce()
local boolean isNowCrippled = false
// 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.
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], 120.00, 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, 20.00, 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, 20.00, GetLocalizedString("CRIPPLE_UNREVEALED"))
else
call DisplayTimedTextToPlayer(indexPlayer, 0, 0, 20.00, 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 == 12
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()
local trigger t = CreateTrigger()
local dialog d = DialogCreate()
// Just show game over for observers when they leave
if (IsPlayerObserver(thePlayer)) then
if AllowVictoryDefeat(PLAYER_GAME_RESULT_NEUTRAL) then
call RemovePlayer(thePlayer, PLAYER_GAME_RESULT_NEUTRAL)
// Display "player was defeated" or "player has left the game" message
call DisplayTimedTextFromPlayer(thePlayer, 0, 0, 60, GetLocalizedString( "PLAYER_LEFT_GAME" ))
call DialogSetMessage( d, GetLocalizedString( "GAMEOVER_DEFEAT_MSG" ) )
// Only show the continue button if the game is not over and observers on death are allowed
if (not bj_meleeGameOver and IsMapFlagSet(MAP_OBSERVERS_ON_DEATH)) then
call DialogAddButton( d, GetLocalizedString( "GAMEOVER_CONTINUE_OBSERVING" ), GetLocalizedHotkey("GAMEOVER_CONTINUE_OBSERVING") )
endif
set t = CreateTrigger()
call TriggerRegisterDialogButtonEvent( t, DialogAddQuitButton( d, true, GetLocalizedString( "GAMEOVER_QUIT_GAME" ), GetLocalizedHotkey("GAMEOVER_QUIT_GAME") ) )
call DialogDisplay( thePlayer, d, true )
if (thePlayer == GetLocalPlayer()) then
call StartSound(bj_defeatDialogSound)
endif
endif
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 = 0
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.
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 == 12
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
function AlteredMeleeCreateComputerDialog takes nothing returns nothing
local integer raceIndex = 1
// Below automatically sets up the Dialog box for Computer players with Races that have AI
loop
exitwhen raceIndex > udg_AM_NumOfRaceChoices
if ( udg_AM_RaceName[raceIndex] != "" ) then
if ( udg_AM_AI_FilePath[raceIndex] != "" ) then
set udg_AM_NumofRacesWithAI = ( udg_AM_NumofRacesWithAI + 1 )
if ( udg_AM_NumofRacesWithAI <= 9 ) then
set udg_AM_RaceButton_AI[udg_AM_NumofRacesWithAI] = DialogAddButton( udg_AM_RaceDialog_AI_1, udg_AM_RaceName[raceIndex],0 )
set udg_AM_AI_ButtonToRace[udg_AM_NumofRacesWithAI] = raceIndex
else
if ( udg_AM_NumofRacesWithAI <= 19 ) then
set udg_AM_RaceButton_AI[udg_AM_NumofRacesWithAI] = DialogAddButton( udg_AM_RaceDialog_AI_2, udg_AM_RaceName[raceIndex],0 )
set udg_AM_AI_ButtonToRace[udg_AM_NumofRacesWithAI] = raceIndex
else
set udg_AM_RaceButton_AI[udg_AM_NumofRacesWithAI] = DialogAddButton( udg_AM_RaceDialog_AI_3, udg_AM_RaceName[raceIndex],0 )
set udg_AM_AI_ButtonToRace[udg_AM_NumofRacesWithAI] = raceIndex
endif
endif
endif
endif
set raceIndex = raceIndex + 1
endloop
if ( udg_AM_NumofRacesWithAI >= 10 ) then
if ( udg_AM_NumofRacesWithAI <= 19 ) then
set udg_AM_OtherButton[8] = DialogAddButton( udg_AM_RaceDialog_AI_1, "Next",0 )
set udg_AM_OtherButton[10] = DialogAddButton( udg_AM_RaceDialog_AI_2, "Next",0 )
set udg_AM_OtherButton[13] = DialogAddButton( udg_AM_RaceDialog_AI_1, "Previous",0 )
set udg_AM_OtherButton[12] = DialogAddButton( udg_AM_RaceDialog_AI_2, "Previous",0 )
else
set udg_AM_OtherButton[8] = DialogAddButton( udg_AM_RaceDialog_AI_1, "Next",0 )
set udg_AM_OtherButton[9] = DialogAddButton( udg_AM_RaceDialog_AI_2, "Next",0 )
set udg_AM_OtherButton[10] = DialogAddButton( udg_AM_RaceDialog_AI_3, "Next",0 )
set udg_AM_OtherButton[11] = DialogAddButton( udg_AM_RaceDialog_AI_1, "Previous",0 )
set udg_AM_OtherButton[12] = DialogAddButton( udg_AM_RaceDialog_AI_2, "Previous",0 )
set udg_AM_OtherButton[13] = DialogAddButton( udg_AM_RaceDialog_AI_3, "Previous",0 )
endif
endif
set udg_AM_OtherButton[14] = DialogAddButton( udg_AM_RaceDialog_AI_1, "Random",0 )
endfunction
function AlteredMeleeCreatePlayerDialog takes nothing returns nothing
local integer raceIndex = 1
loop
exitwhen raceIndex > udg_AM_NumOfRaceChoices
if ( udg_AM_RaceName[raceIndex] != "" ) then
if ( raceIndex <= 9 ) then
set udg_AM_RaceButton_PL[raceIndex] = DialogAddButton( udg_AM_RaceDialog_PL_1, udg_AM_RaceName[raceIndex],0 )
else
if ( udg_AM_NumOfRaceChoices <= 19 ) then
set udg_AM_RaceButton_PL[raceIndex] = DialogAddButton( udg_AM_RaceDialog_PL_2, udg_AM_RaceName[raceIndex],0 )
else
set udg_AM_RaceButton_PL[raceIndex] = DialogAddButton( udg_AM_RaceDialog_PL_3, udg_AM_RaceName[raceIndex],0 )
endif
endif
else
endif
set raceIndex = raceIndex + 1
endloop
if( udg_AM_NumOfRaceChoices >= 10 ) then
if ( udg_AM_NumOfRaceChoices <= 19 ) then
set udg_AM_OtherButton[1] = DialogAddButton( udg_AM_RaceDialog_PL_1, "Next",0 )
set udg_AM_OtherButton[3] = DialogAddButton( udg_AM_RaceDialog_PL_2, "Next",0 )
set udg_AM_OtherButton[5] = DialogAddButton( udg_AM_RaceDialog_PL_2, "Previous",0 )
set udg_AM_OtherButton[6] = DialogAddButton( udg_AM_RaceDialog_PL_1, "Previous",0 )
else
set udg_AM_OtherButton[1] = DialogAddButton( udg_AM_RaceDialog_PL_1, "Next",0 )
set udg_AM_OtherButton[2] = DialogAddButton( udg_AM_RaceDialog_PL_2, "Next",0 )
set udg_AM_OtherButton[3] = DialogAddButton( udg_AM_RaceDialog_PL_3, "Next",0 )
set udg_AM_OtherButton[4] = DialogAddButton( udg_AM_RaceDialog_PL_1, "Previous",0 )
set udg_AM_OtherButton[5] = DialogAddButton( udg_AM_RaceDialog_PL_2, "Previous",0 )
set udg_AM_OtherButton[6] = DialogAddButton( udg_AM_RaceDialog_PL_3, "Previous",0 )
endif
endif
set udg_AM_OtherButton[7] = DialogAddButton( udg_AM_RaceDialog_PL_1, "Random",0 )
call AlteredMeleeCreateComputerDialog()
endfunction
function Trig_AlteredMeleeCreateStartingUnits_Conditions takes nothing returns boolean
if ( not ( udg_AM_RaceChosen[1] != 0 ) ) then
return false
endif
if ( not ( udg_AM_RaceChosen[2] != 0 ) ) then
return false
endif
if ( not ( udg_AM_RaceChosen[3] != 0 ) ) then
return false
endif
if ( not ( udg_AM_RaceChosen[4] != 0 ) ) then
return false
endif
if ( not ( udg_AM_RaceChosen[5] != 0 ) ) then
return false
endif
if ( not ( udg_AM_RaceChosen[6] != 0 ) ) then
return false
endif
if ( not ( udg_AM_RaceChosen[7] != 0 ) ) then
return false
endif
if ( not ( udg_AM_RaceChosen[8] != 0 ) ) then
return false
endif
if ( not ( udg_AM_RaceChosen[9] != 0 ) ) then
return false
endif
if ( not ( udg_AM_RaceChosen[10] != 0 ) ) then
return false
endif
if ( not ( udg_AM_RaceChosen[11] != 0 ) ) then
return false
endif
if ( not ( udg_AM_RaceChosen[12] != 0 ) ) then
return false
endif
return true
endfunction
function Trig_AlteredMeleeCreateStartingUnits_Actions takes nothing returns nothing
call DisableTrigger( GetTriggeringTrigger() )
call AlteredMeleeStartingUnits()
call AlteredMeleeInitVictoryDefeat()
call AlteredMeleeStartingAI()
endfunction
function Trig_AlteredMeleeDialogClickComputer_Actions takes nothing returns nothing
local integer index = 1
if ( GetClickedButton() == udg_AM_OtherButton[8] ) then
call DialogDisplay( GetTriggerPlayer(), udg_AM_RaceDialog_AI_2, true )
else
if ( GetClickedButton() == udg_AM_OtherButton[9] ) then
call DialogDisplay( GetTriggerPlayer(), udg_AM_RaceDialog_AI_3, true )
else
if ( GetClickedButton() == udg_AM_OtherButton[10] ) then
call DialogDisplay( GetTriggerPlayer(), udg_AM_RaceDialog_AI_1, true )
else
if ( GetClickedButton() == udg_AM_OtherButton[11] ) then
call DialogDisplay( GetTriggerPlayer(), udg_AM_RaceDialog_AI_3, true )
else
if ( GetClickedButton() == udg_AM_OtherButton[12] ) then
call DialogDisplay( GetTriggerPlayer(), udg_AM_RaceDialog_AI_1, true )
else
if ( GetClickedButton() == udg_AM_OtherButton[13] ) then
call DialogDisplay( GetTriggerPlayer(), udg_AM_RaceDialog_AI_2, true )
else
if ( GetClickedButton() == udg_AM_OtherButton[14] ) then
set udg_AM_RaceChosen[udg_AM_AI_PlayerNum] = udg_AM_AI_ButtonToRace[GetRandomInt(1, udg_AM_NumofRacesWithAI)]
set udg_AM_AI_PlayerNum = 0
call AlteredMeleeShowAIRaceDialog()
else
loop
exitwhen index > udg_AM_NumofRacesWithAI
if ( GetClickedButton() == udg_AM_RaceButton_AI[index] ) then
set udg_AM_RaceChosen[udg_AM_AI_PlayerNum] = udg_AM_AI_ButtonToRace[index]
set udg_AM_AI_PlayerNum = 0
call AlteredMeleeShowAIRaceDialog()
else
endif
set index = index + 1
endloop
endif
endif
endif
endif
endif
endif
endif
endfunction
function Trig_AlteredMeleeDialogClickPlayer_Actions takes nothing returns nothing
local integer index = 1
if ( GetClickedButton() == udg_AM_OtherButton[1] ) then
call DialogDisplay( GetTriggerPlayer(), udg_AM_RaceDialog_PL_2, true )
else
if ( GetClickedButton() == udg_AM_OtherButton[2] ) then
call DialogDisplay( GetTriggerPlayer(), udg_AM_RaceDialog_PL_3, true )
else
if ( GetClickedButton() == udg_AM_OtherButton[3] ) then
call DialogDisplay( GetTriggerPlayer(), udg_AM_RaceDialog_PL_1, true )
else
if ( GetClickedButton() == udg_AM_OtherButton[4] ) then
call DialogDisplay( GetTriggerPlayer(), udg_AM_RaceDialog_PL_3, true )
else
if ( GetClickedButton() == udg_AM_OtherButton[5] ) then
call DialogDisplay( GetTriggerPlayer(), udg_AM_RaceDialog_PL_1, true )
else
if ( GetClickedButton() == udg_AM_OtherButton[6] ) then
call DialogDisplay( GetTriggerPlayer(), udg_AM_RaceDialog_PL_2, true )
else
if ( GetClickedButton() == udg_AM_OtherButton[7] ) then
set udg_AM_RaceChosen[GetConvertedPlayerId(GetTriggerPlayer())] = GetRandomInt(1, udg_AM_NumOfRaceChoices)
else
loop
exitwhen index > udg_AM_NumOfRaceChoices
if ( GetClickedButton() == udg_AM_RaceButton_PL[index] ) then
set udg_AM_RaceChosen[GetConvertedPlayerId(GetTriggerPlayer())] = index
else
endif
set index = index + 1
endloop
endif
endif
endif
endif
endif
endif
endif
if ( GetTriggerPlayer() == Player(0) ) then
if ( udg_AM_RaceChosen[1] != 0 ) then
if ( IsMapFlagSet(MAP_RANDOM_RACES) == false ) then
call AlteredMeleeShowAIRaceDialog()
endif
endif
endif
endfunction
function Trig_AlteredMeleeInitRaceChoice_Actions takes nothing returns nothing
// Below sets random race for players if (Use Random Race) is selected in lobby. Shows race choice dialog if not set.
local integer playerIndex = 1
local player whichplayer
loop
exitwhen playerIndex > 12
set whichplayer = ConvertedPlayer(playerIndex)
if ( GetPlayerSlotState(whichplayer) == PLAYER_SLOT_STATE_PLAYING ) then
if (IsPlayerObserver(whichplayer)) then
set udg_AM_RaceChosen[playerIndex] = -1
else
if ( IsMapFlagSet(MAP_RANDOM_RACES) == true ) then
if ( GetPlayerController(whichplayer) == MAP_CONTROL_USER ) then
set udg_AM_RaceChosen[playerIndex] = GetRandomInt(1, udg_AM_NumOfRaceChoices)
else
set udg_AM_RaceChosen[playerIndex] = udg_AM_AI_ButtonToRace[GetRandomInt(1, udg_AM_NumofRacesWithAI)]
endif
else
if ( GetPlayerController(whichplayer) == MAP_CONTROL_USER ) then
call DialogDisplay( whichplayer, udg_AM_RaceDialog_PL_1, true )
endif
endif
endif
else
set udg_AM_RaceChosen[playerIndex] = -1
endif
set playerIndex = playerIndex + 1
endloop
endfunction
function InitAlteredMelee takes nothing returns nothing
local trigger gg_trg_AlteredMeleeInitRaceChoice
local trigger gg_trg_AlteredMeleeDialogClickPlayer
local trigger gg_trg_AlteredMeleeDialogClickComputer
local trigger gg_trg_AlteredMeleeCreateStartingUnits
local integer indexA = 1
local integer indexB = 1
loop
exitwhen indexA > 12
call SetPlayerMaxHeroesAllowed( 3, ConvertedPlayer(indexA) )
// Limit them to one of each type of custom hero
// Custom Heroes
set indexA = indexA + 1
endloop
loop
exitwhen indexB > udg_AM_NumOfRaceChoices
if ( udg_AM_UnitType_Hero1[indexB] != null ) then
call SetPlayerTechMaxAllowedSwap( udg_AM_UnitType_Hero1[indexB], 1, ConvertedPlayer(indexB) )
endif
if ( udg_AM_UnitType_Hero2[indexB] != null ) then
call SetPlayerTechMaxAllowedSwap( udg_AM_UnitType_Hero2[indexB], 1, ConvertedPlayer(indexB) )
endif
if ( udg_AM_UnitType_Hero3[indexB] != null ) then
call SetPlayerTechMaxAllowedSwap( udg_AM_UnitType_Hero3[indexB], 1, ConvertedPlayer(indexB) )
endif
if ( udg_AM_UnitType_Hero4[indexB] != null ) then
call SetPlayerTechMaxAllowedSwap( udg_AM_UnitType_Hero4[indexB], 1, ConvertedPlayer(indexB) )
endif
set indexB = indexB + 1
endloop
call AlteredMeleeCreatePlayerDialog()
set gg_trg_AlteredMeleeInitRaceChoice = CreateTrigger()
call TriggerRegisterTimerEventSingle( gg_trg_AlteredMeleeInitRaceChoice, 1.00 )
call TriggerAddAction( gg_trg_AlteredMeleeInitRaceChoice, function Trig_AlteredMeleeInitRaceChoice_Actions )
set gg_trg_AlteredMeleeDialogClickPlayer = CreateTrigger()
call TriggerRegisterDialogEvent( gg_trg_AlteredMeleeDialogClickPlayer, udg_AM_RaceDialog_PL_1 )
call TriggerRegisterDialogEvent( gg_trg_AlteredMeleeDialogClickPlayer, udg_AM_RaceDialog_PL_2 )
call TriggerRegisterDialogEvent( gg_trg_AlteredMeleeDialogClickPlayer, udg_AM_RaceDialog_PL_3 )
call TriggerAddAction( gg_trg_AlteredMeleeDialogClickPlayer, function Trig_AlteredMeleeDialogClickPlayer_Actions )
set gg_trg_AlteredMeleeDialogClickComputer = CreateTrigger()
call TriggerRegisterDialogEvent( gg_trg_AlteredMeleeDialogClickComputer, udg_AM_RaceDialog_AI_1 )
call TriggerRegisterDialogEvent( gg_trg_AlteredMeleeDialogClickComputer, udg_AM_RaceDialog_AI_2 )
call TriggerRegisterDialogEvent( gg_trg_AlteredMeleeDialogClickComputer, udg_AM_RaceDialog_AI_3 )
call TriggerAddAction( gg_trg_AlteredMeleeDialogClickComputer, function Trig_AlteredMeleeDialogClickComputer_Actions )
set gg_trg_AlteredMeleeCreateStartingUnits = CreateTrigger()
call TriggerRegisterTimerEventPeriodic( gg_trg_AlteredMeleeCreateStartingUnits, 1.00 )
call TriggerAddCondition( gg_trg_AlteredMeleeCreateStartingUnits, Condition( function Trig_AlteredMeleeCreateStartingUnits_Conditions ) )
call TriggerAddAction( gg_trg_AlteredMeleeCreateStartingUnits, function Trig_AlteredMeleeCreateStartingUnits_Actions )
endfunction