Files
2HUCardTDGame/aghanim_singleplayer/scripts/vscripts/encounters/encounter_starting_room.lua
2021-10-24 15:36:18 -04:00

231 lines
8.0 KiB
Lua
Executable File

require( "map_encounter" )
require( "aghanim_utility_functions" )
require( "spawner" )
--------------------------------------------------------------------------------
if CMapEncounter_StartingRoom == nil then
CMapEncounter_StartingRoom = class( {}, {}, CMapEncounter )
end
--------------------------------------------------------------------------------
function CMapEncounter_StartingRoom:constructor( hRoom, szEncounterName )
CMapEncounter.constructor( self, hRoom, szEncounterName )
self:GetRoom().hSpawnGroupHandle = GetActiveSpawnGroupHandle()
self.bRewardsSelected = false
self.bSpokenGameStartLine = false
self.bAllButtonsReady = false
end
--------------------------------------------------------------------------------
function CMapEncounter_StartingRoom:Start()
self.flStartTime = GameRules:GetGameTime()
if GameRules.Aghanim:HasSetAscensionLevel() == false then
-- Default the ascension level now in case we do any developer shit, and juke the system to think we haven't set it yet
GameRules.Aghanim:SetAscensionLevel( 0 )
GameRules.Aghanim.bHasSetAscensionLevel = false
local nMaxOption = GameRules.Aghanim:GetMaxAllowedAscensionLevel()
local nOption = 0
while nOption <= nMaxOption do
local hAscensionLocator = Entities:FindByName( nil, "ascension_picker_locator_" .. ( nOption + 1 ) )
if hAscensionLocator == nil then
break
end
local vOrigin = hAscensionLocator:GetAbsOrigin()
local vAngles = hAscensionLocator:GetAnglesAsVector()
local pickerTable =
{
MapUnitName = "npc_dota_aghsfort_watch_tower_option_1",
origin = tostring( vOrigin.x ) .. " " .. tostring( vOrigin.y ) .. " " .. tostring( vOrigin.z ),
angles = tostring( vAngles.x ) .. " " .. tostring( vAngles.y ) .. " " .. tostring( vAngles.z ),
OptionNumber = tostring( nOption + 1 ),
teamnumber = DOTA_TEAM_NEUTRALS,
AscensionLevelPicker = 1,
}
CreateUnitFromTable( pickerTable, vOrigin )
nOption = nOption + 1
end
if nOption == 0 then
print( "Unable to find ascension_picker_locator_ entities!\n" )
self:OnAscensionLevelSelected( { level = 1 } )
return
end
end
-- Use encounter name to display "select ascension level"
self:Introduce()
-- Players Ready
self.nPlayersReady = 0
local nTriggerStartTouchEvent = ListenToGameEvent( "trigger_start_touch", Dynamic_Wrap( getclass( self ), "OnTriggerStartTouch" ), self )
table.insert( self.EventListeners, nTriggerStartTouchEvent )
local nTriggerEndTouchEvent = ListenToGameEvent( "trigger_end_touch", Dynamic_Wrap( getclass( self ), "OnTriggerEndTouch" ), self )
table.insert( self.EventListeners, nTriggerEndTouchEvent )
local nAscensionSelectedEvent = ListenToGameEvent( "aghsfort_ascension_level_selected", Dynamic_Wrap( getclass( self ), "OnAscensionLevelSelected" ), self )
table.insert( self.EventListeners, nAscensionSelectedEvent )
end
--------------------------------------------------------------------------------
function CMapEncounter_StartingRoom:OnAscensionLevelSelected( event )
print( "Ascension Level " .. event.level .. " selected" )
GameRules.Aghanim:SetAscensionLevel( event.level - 1 )
end
--------------------------------------------------------------------------------
function CMapEncounter_StartingRoom:OnThink()
CMapEncounter.OnThink( self )
-- Don't speak until all players are connected
if self.bSpokenGameStartLine == false then
local nConnectedPlayerCount = 0
local nPlayerCount = 0
for nPlayerID = 0, AGHANIM_PLAYERS - 1 do
if PlayerResource:GetTeam( nPlayerID ) == DOTA_TEAM_GOODGUYS and PlayerResource:IsValidPlayerID( nPlayerID ) then
nPlayerCount = nPlayerCount + 1
if PlayerResource:GetConnectionState( nPlayerID ) == DOTA_CONNECTION_STATE_CONNECTED then
nConnectedPlayerCount = nConnectedPlayerCount + 1
end
end
end
if nConnectedPlayerCount == nPlayerCount then
GameRules.Aghanim:GetAnnouncer():OnGameStarted( )
self.bSpokenGameStartLine = true
end
end
-- Update UI indicating who has picked their reward
local vecRewardState = GameRules.Aghanim:DetermineRewardSelectionState()
if vecRewardState ~= nil then
local nNumSelected = 0
local vecPlayers = GameRules.Aghanim:GetConnectedPlayers()
for i=1,#vecPlayers do
if vecRewardState[ tostring( vecPlayers[i] ) ] == true then
nNumSelected = nNumSelected + 1
end
end
self:UpdateEncounterObjective( "objective_select_aghanims_fragmants", nNumSelected, nil )
if #vecPlayers > 0 and nNumSelected == #vecPlayers then
self:GetRoom().bSpawnGroupReady = true
self.bRewardsSelected = true
end
end
end
--------------------------------------------------------------------------------
function CMapEncounter_StartingRoom:InitializeObjectives()
--CMapEncounter.InitializeObjectives( self )
self:AddEncounterObjective( "objective_stand_on_buttons", 0, 4 )
self:AddEncounterObjective( "objective_select_aghanims_fragmants", 0, 4 )
end
--------------------------------------------------------------------------------
function CMapEncounter_StartingRoom:OnTriggerStartTouch( event )
if self.bAllButtonsReady == true then
return
end
-- Get the trigger that activates the room
local szTriggerName = event.trigger_name
local hUnit = EntIndexToHScript( event.activator_entindex )
local hTriggerEntity = EntIndexToHScript( event.caller_entindex )
if szTriggerName == "trigger_player_1"
or szTriggerName == "trigger_player_2"
or szTriggerName == "trigger_player_3"
or szTriggerName == "trigger_player_4" then
--printf( "szTriggerName: %s, hUnit:GetUnitName(): %s, hTriggerEntity:GetName(): %s", szTriggerName, hUnit:GetUnitName(), hTriggerEntity:GetName() )
self.nPlayersReady = self.nPlayersReady + 1
self:UpdateEncounterObjective( "objective_stand_on_buttons", self.nPlayersReady, nil )
local vecPlayers = GameRules.Aghanim:GetConnectedPlayers()
if #vecPlayers > 0 then
if self.nPlayersReady == #vecPlayers then
self.bAllButtonsReady = true
self:GenerateRewards()
-- We want to announce rewards during the starting room
GameRules.Aghanim:GetAnnouncer():OnSelectRewards()
-- Open the main gate
local hRelays = self:GetRoom():FindAllEntitiesInRoomByName( "main_gate_open_relay", false )
for _, hRelay in pairs( hRelays ) do
hRelay:Trigger( nil, nil )
end
end
end
end
end
--------------------------------------------------------------------------------
function CMapEncounter_StartingRoom:OnTriggerEndTouch( event )
if self.bAllButtonsReady == true then
return
end
-- Get the trigger that activates the room
local szTriggerName = event.trigger_name
local hUnit = EntIndexToHScript( event.activator_entindex )
local hTriggerEntity = EntIndexToHScript( event.caller_entindex )
if szTriggerName == "trigger_player_1"
or szTriggerName == "trigger_player_2"
or szTriggerName == "trigger_player_3"
or szTriggerName == "trigger_player_4" then
--printf( "szTriggerName: %s, hUnit:GetUnitName(): %s, hTriggerEntity:GetName(): %s", szTriggerName, hUnit:GetUnitName(), hTriggerEntity:GetName() )
self.nPlayersReady = self.nPlayersReady - 1
self:UpdateEncounterObjective( "objective_stand_on_buttons", self.nPlayersReady, nil )
end
end
--------------------------------------------------------------------------------
function CMapEncounter_StartingRoom:CheckForCompletion()
return GameRules.Aghanim:HasSetAscensionLevel() == true and self.bRewardsSelected == true
end
--------------------------------------------------------------------------------
function CMapEncounter_StartingRoom:OnComplete()
CMapEncounter.OnComplete( self )
for nPlayerID=0,AGHANIM_PLAYERS-1 do
local hHero = PlayerResource:GetSelectedHeroEntity( nPlayerID )
if hHero then
hHero:SetAbilityPoints( 2 )
EmitSoundOnClient( "General.LevelUp", hHero:GetPlayerOwner() )
ParticleManager:ReleaseParticleIndex( ParticleManager:CreateParticle( "particles/generic_hero_status/hero_levelup.vpcf", PATTACH_ABSORIGIN_FOLLOW, nil ) )
end
end
end
--------------------------------------------------------------------------------
return CMapEncounter_StartingRoom