fortressforever-scripts/maps/ff_fusion.lua

378 lines
14 KiB
Lua

-----------------------------------------------------------------------------
-- includes
-----------------------------------------------------------------------------
IncludeScript("base_idzone")
IncludeScript("base_location")
IncludeScript("base_respawnturret")
-----------------------------------------------------------------------------
-- global overrides that you can do what you want with
-----------------------------------------------------------------------------
FORT_POINTS_PER_INITIAL_TOUCH = 200
FORT_POINTS_PER_PERIOD = 50
FORT_POINTS_PER_DEFEND = 100
POINTS_PER_INITIAL_TOUCH = 1
POINTS_PER_PERIOD = 1
DELAY_BEFORE_PERIOD_POINTS = 2
PERIOD_TIME = 1
INITIAL_ROUND_PERIOD = 60
ROUND_SETUP_PERIOD = 17
DEFENSE_PERIOD_TIME = 60
POINTS_PER_DEFENSE_PERIOD = 1
DEFAULT_POINTS_TO_CAP = 10
NUMBER_OF_CAP_POINTS = 3
DELAY_BEFORE_TEAMSWITCH = 3
DELAY_AFTER_CAP = 3
ZONE_COLOR = "purple"
-----------------------------------------------------------------------------
-- Zone-controlling outputs
-----------------------------------------------------------------------------
function oncap_outputs()
OutputEvent( "shake"..phase, "StartShake" )
OutputEvent( "shakebreak"..phase, "Playsound" )
AddSchedule( "Partition_On", 4, OutputEvent,"cp"..phase.."_partition", "TurnOn")
AddSchedule( "Partition_Enabled", 4, OutputEvent,"cp"..phase.."_partition", "Enable")
AddSchedule( "Partition_Door_On", 4, OutputEvent, "cp"..phase.."_partition_door", "TurnOff")
AddSchedule( "Partition_Door_Enable", 4, OutputEvent, "cp"..phase.."_partition_door", "Disable")
AddSchedule( "Areaportal_On", 4, OutputEvent, "cp"..phase.."_areaportal_door", "Open")
AddSchedule( "Areaportal_Partition_On", 4, OutputEvent, "cp"..phase.."_areaportal", "Close")
AddSchedule( "alarm_voice", 2, OutputEvent, "voice1", "PlaySound")
AddSchedule( "alarm_text", 2, schedulemessagetoall, "Zone Captured!")
AddSchedule( "stop_voice", 2.5, OutputEvent, "voice1", "StopSound")
AddSchedule( "alarm_voices", 2.5, OutputEvent, "voice2", "PlaySound")
AddSchedule( "stop_voices", 2.975, OutputEvent, "voice2", "StopSound")
AddSchedule( "35 second warning", 7, schedulemessagetoall, "Gate Opens in 35 seconds!")
AddSchedule( "35 second warning_sound" , 7 , schedulesound, "misc.bloop" )
AddSchedule( "dooropen5sec_sound", 37, schedulecountdown, "5")
AddSchedule( "dooropen4sec_sound", 38, schedulecountdown, "4")
AddSchedule( "dooropen3sec_sound", 39, schedulecountdown, "3")
AddSchedule( "dooropen2sec_sound", 40, schedulecountdown, "2")
AddSchedule( "dooropen1sec_sound", 41, schedulecountdown, "1")
AddSchedule("alarm_events", 42, OutputEvent, "breakglass"..phase, "Break")
AddSchedule("alarm_sounds", 42, OutputEvent, "breakalarm"..phase, "PlaySound")
if phase == 1 then
defender_door_trigger1 = id_door:new({ team = attackers, door = "defender_door1" })
defender_door_trigger2 = id_door:new({ team = attackers, door = "defender_door2" })
end
if phase == 2 then
defender_door_trigger3 = id_door:new({ team = attackers, door = "defender_door3" })
defender_door_trigger4 = id_door:new({ team = attackers, door = "defender_door4" })
end
end
function oncap_outputs_nextphase()
RespawnAllPlayers()
end
function onreset_outputs()
OutputEvent( "breakalarm"..phase, "Playsound" )
OutputEvent( "shake"..phase, "StartShake" )
OutputEvent( "shakebreak"..phase, "Playsound" )
AddSchedule( "alarm_voice", 2, OutputEvent, "voice1", "PlaySound")
AddSchedule( "alarm_text", 2, schedulemessagetoall, "Zone Captured!")
AddSchedule( "stop_voice", 2.5, OutputEvent, "voice1", "StopSound")
AddSchedule( "alarm_voices", 2.5, OutputEvent, "voice2", "PlaySound")
AddSchedule( "stop_voices", 2.97, OutputEvent, "voice2", "StopSound")
end
function zone_on_outputs()
-- use for entities that have two copies per zone (e.g. rotate1 and rotate2)
two1 = phase * 2 - 1
two2 = phase * 2
-- use for entities that have three copies per zone (e.g. rotate1, rotate2, and rotate3)
three1 = phase * 3 - 2
three2 = phase * 3 - 1
three3 = phase * 3
-- use for entities that have three copies per zone (e.g. rotate1, rotate2, rotate3 and rotate4)
four1 = phase * 4 - 3
four2 = phase * 4 - 2
four3 = phase * 4 - 1
four4 = phase * 4
-- outputs
OutputEvent( "alarm"..phase, "PlaySound" )
OutputEvent( "light"..phase, "TurnOn" )
OutputEvent( "spot"..phase, "LightOn" )
OutputEvent( "rotate"..two1, "Start" )
OutputEvent( "rotate"..two2, "Start" )
OutputEvent( "Tesla"..phase, "DoSpark" )
end
function zone_off_outputs()
-- use for entities that have two copies per zone (e.g. rotate1 and rotate2)
two1 = phase * 2 - 1
two2 = phase * 2
-- use for entities that have three copies per zone (e.g. rotate1, rotate2, and rotate3)
three1 = phase * 3 - 2
three2 = phase * 3 - 1
three3 = phase * 3
-- use for entities that have three copies per zone (e.g. rotate1, rotate2, rotate3 and rotate4)
four1 = phase * 4 - 3
four2 = phase * 4 - 2
four3 = phase * 4 - 1
four4 = phase * 4
-- outputs
OutputEvent( "alarm"..phase, "StopSound" )
OutputEvent( "light"..phase, "TurnOff" )
OutputEvent( "spot"..phase, "LightOff" )
OutputEvent( "rotate"..two1, "Stop" )
OutputEvent( "rotate"..two2, "Stop" )
end
function openstartdoor()
-- unlock them doors
attacker_door_trigger1 = id_door:new({ team = attackers, door = "attacker_door1" })
attacker_door_trigger2 = id_door:new({ team = attackers, door = "attacker_door2" })
-- open the first door
OutputEvent( "attacker_door1", "Open" )
OutputEvent( "attacker_door2", "Open" )
end
function onswitch()
-- reset doors to open for the right team
defender_door_trigger1 = id_door:new({ team = defenders, door = "defender_door1" })
defender_door_trigger2 = id_door:new({ team = defenders, door = "defender_door2" })
defender_door_trigger3 = id_door:new({ team = defenders, door = "defender_door3" })
defender_door_trigger4 = id_door:new({ team = defenders, door = "defender_door4" })
defender_door_trigger5 = id_door:new({ team = defenders, door = "defender_door5" })
defender_door_trigger6 = id_door:new({ team = defenders, door = "defender_door6" })
defender_door_trigger7 = id_door:new({ team = defenders, door = "defender_door7" })
defender_door_trigger8 = id_door:new({ team = defenders, door = "defender_door8" })
-- lock them doors
attacker_door_trigger1 = id_door:new({ team = Team.kUnassigned, door = "attacker_door1" })
attacker_door_trigger2 = id_door:new({ team = Team.kUnassigned, door = "attacker_door2" })
OutputEvent( "point_template", "ForceSpawn" )
end
function onswitch_bluetodef()
-- switch the lights
OutputEvent( "defender_light1", "TurnOff" )
OutputEvent( "defender_spotlight1", "LightOff" )
OutputEvent( "defender_light2", "TurnOn" )
OutputEvent( "defender_spotlight2", "LightOn" )
OutputEvent( "cp1_partition", "TurnOff" )
OutputEvent( "cp1_partition", "Disable" )
OutputEvent( "cp2_partition", "TurnOff" )
OutputEvent( "cp2_partition", "Disable" )
OutputEvent( "cp1_areaportal", "Open" )
OutputEvent( "cp1_areaportal_door", "Close" )
OutputEvent( "cp2_areaportal", "Open" )
OutputEvent( "cp2_areaportal_door", "Close" )
OutputEvent( "cp1_partition_door", "TurnOn")
OutputEvent( "cp1_partition_door", "Enable")
OutputEvent( "cp2_partition_door", "TurnOn")
OutputEvent( "cp2_partition_door", "Enable")
-- switch them packs, for real this time; this is a workaround due to how the touchflags are set in base.lua
local num_packs = 9
for i=1,num_packs do
entity = GetEntityByName( "gen_pack_defender"..i )
local info = CastToInfoScript( entity )
info:SetTouchFlags({ AllowFlags.kBlue})
end
end
function onswitch_redtodef()
-- switch the lights
OutputEvent( "defender_light1", "TurnOn" )
OutputEvent( "defender_spotlight1", "LightOn" )
OutputEvent( "defender_light2", "TurnOff" )
OutputEvent( "defender_spotlight2", "LightOff" )
OutputEvent( "cp1_partition", "TurnOff" )
OutputEvent( "cp1_partition", "Disable" )
OutputEvent( "cp2_partition", "TurnOff" )
OutputEvent( "cp2_partition", "Disable" )
OutputEvent( "cp1_areaportal", "Open" )
OutputEvent( "cp1_areaportal_door", "Close" )
OutputEvent( "cp2_areaportal", "Open" )
OutputEvent( "cp2_areaportal_door", "Close" )
OutputEvent( "cp1_partition_door", "TurnOn")
OutputEvent( "cp1_partition_door", "Enable")
OutputEvent( "cp2_partition_door", "TurnOn")
OutputEvent( "cp2_partition_door", "Enable")
-- switch them packs, for real this time; this is a workaround due to how the touchflags are set in base.lua
local num_packs = 9
for i=1,num_packs do
entity = GetEntityByName( "gen_pack_defender"..i )
local info = CastToInfoScript( entity )
info:SetTouchFlags({ AllowFlags.kRed})
end
end
-----------------------------------------------------------------------------
-- backpacks, doors, etc. etc.
-----------------------------------------------------------------------------
gen_pack = genericbackpack:new({
health = 30,
armor = 25,
grenades = 20,
nails = 50,
shells = 300,
rockets = 15,
gren1 = 1,
gren2 = 0,
cells = 120,
respawntime = 10,
model = "models/items/backpack/backpack.mdl",
materializesound = "Item.Materialize",
touchsound = "Backpack.Touch"
})
function gen_pack:dropatspawn() return false
end
gen_pack_defender1 = gen_pack:new({ touchflags = {AllowFlags.kRed} })
gen_pack_defender2 = gen_pack:new({ touchflags = {AllowFlags.kRed} })
gen_pack_defender3 = gen_pack:new({ touchflags = {AllowFlags.kRed} })
gen_pack_defender4 = gen_pack:new({ touchflags = {AllowFlags.kRed} })
gen_pack_defender5 = gen_pack:new({ touchflags = {AllowFlags.kRed} })
gen_pack_defender6 = gen_pack:new({ touchflags = {AllowFlags.kRed} })
gen_pack_defender7 = gen_pack:new({ touchflags = {AllowFlags.kRed} })
gen_pack_defender8 = gen_pack:new({ touchflags = {AllowFlags.kRed} })
gen_pack_defender9 = gen_pack:new({ touchflags = {AllowFlags.kRed} })
-----------------------------------------------------------------------------
-- No Fucking Annoyances
-----------------------------------------------------------------------------
noannoyances = trigger_ff_script:new({})
function noannoyances:onbuild( build_entity )
return EVENT_DISALLOWED
end
function noannoyances:onexplode( explode_entity )
if IsGrenade( explode_entity ) then
return EVENT_DISALLOWED
end
return EVENT_ALLOWED
end
function noannoyances:oninfect( infect_entity )
return EVENT_DISALLOWED
end
no_annoyances = noannoyances
spawn_protection = noannoyances
------------------------------------------------------------------
--Resup Doors
------------------------------------------------------------------
neutral_door_trigger1 = trigger_ff_script:new({})
function neutral_door_trigger1:ontouch( trigger_entity )
OutputEvent( "neutral_door1", "Open" )
end
id_door = trigger_ff_script:new({ team = Team.kUnassigned, door = nil })
function id_door:allowed( touch_entity )
if IsPlayer( touch_entity ) then
local player = CastToPlayer( touch_entity )
return player:GetTeamId() == self.team
end
return EVENT_DISALLOWED
end
function id_door:ontrigger( touch_entity )
if IsPlayer( touch_entity ) then
OutputEvent(self.door, "Open")
end
end
attacker_door_trigger1 = id_door:new({ team = Team.kUnassigned, door = "attacker_door1" })
attacker_door_trigger2 = id_door:new({ team = Team.kUnassigned, door = "attacker_door2" })
defender_door_trigger1 = id_door:new({ team = defenders, door = "defender_door1" })
defender_door_trigger2 = id_door:new({ team = defenders, door = "defender_door2" })
defender_door_trigger3 = id_door:new({ team = defenders, door = "defender_door3" })
defender_door_trigger4 = id_door:new({ team = defenders, door = "defender_door4" })
defender_door_trigger5 = id_door:new({ team = defenders, door = "defender_door5" })
defender_door_trigger6 = id_door:new({ team = defenders, door = "defender_door6" })
defender_spawn = base_defender_spawn:new({phase=1})
defender_spawn2 = base_defender_spawn:new({phase=2})
defender_spawn3 = base_defender_spawn:new({phase=3})
attacker_spawn = base_attacker_spawn:new({phase=1})
attacker_spawn2 = base_attacker_spawn:new({phase=2})
attacker_spawn3 = base_attacker_spawn:new({phase=3})
------------------------------------------------------------------
--Elevator
------------------------------------------------------------------
-- keeps track of elevator goings on
local elev_collection = Collection()
elev_trigger_add = trigger_ff_script:new({ })
-- registers attackers as they hit the top
function elev_trigger_add:ontouch( trigger_entity )
if IsPlayer( trigger_entity ) then
local player = CastToPlayer( trigger_entity )
elev_collection:AddItem( player )
end
end
elev_trigger_remove = trigger_ff_script:new({ })
function elev_trigger_remove:onendtouch( trigger_entity )
if IsPlayer( trigger_entity ) then
local player = CastToPlayer( trigger_entity )
elev_collection:RemoveItem( player )
end
end
function elev_trigger_remove:oninactive( trigger_entity )
elev_collection:RemoveAllItems()
end
elev_trigger = trigger_ff_script:new({ })
function elev_trigger:allowed( trigger_entity )
if IsPlayer( trigger_entity ) then
local player = CastToPlayer( trigger_entity )
for playerx in elev_collection.items do
playerx = CastToPlayer(playerx)
if playerx:GetId() == player:GetId() then
return EVENT_DISALLOWED
end
end
end
return EVENT_ALLOWED
end
function elev_trigger:ontouch( trigger_entity )
if IsPlayer( trigger_entity ) then
--local player = CastToPlayer( trigger_entity )
OutputEvent( "elev2", "Open" )
end
end