1--[[
2   Copyright 2007-2020 The OpenRA Developers (see AUTHORS)
3   This file is part of OpenRA, which is free software. It is made
4   available to you under the terms of the GNU General Public License
5   as published by the Free Software Foundation, either version 3 of
6   the License, or (at your option) any later version. For more
7   information, see COPYING.
8]]
9IntroAttackers = { IntroSoldier1, IntroSoldier2, IntroSoldier3 }
10
11BridgeShroudTrigger = { CPos.New(63, 71), CPos.New(64, 71), CPos.New(65, 71), CPos.New(69, 65), CPos.New(70, 65), CPos.New(71, 65) }
12BridgeExplosionTrigger = { CPos.New(66, 69), CPos.New(67, 69), CPos.New(68, 69) }
13TransportTrigger = { CPos.New(75, 58) }
14EnemyBaseShroudTrigger = { CPos.New(64, 52), CPos.New(64, 53), CPos.New(64, 54), CPos.New(64, 55), CPos.New(64, 56), CPos.New(64, 57), CPos.New(64, 58), CPos.New(64, 59), CPos.New(64, 60), CPos.New(64, 61), CPos.New(64, 62), CPos.New(64, 63), CPos.New(64, 64) }
15ParachuteTrigger = { CPos.New(80, 66), CPos.New(81, 66), CPos.New(82, 66), CPos.New(83, 66), CPos.New(84, 66), CPos.New(85, 66),CPos.New(86, 66), CPos.New(87, 66), CPos.New(88, 66), CPos.New(89, 66) }
16EnemyBaseEntranceShroudTrigger = { CPos.New(80, 73), CPos.New(81, 73), CPos.New(82, 73), CPos.New(83, 73), CPos.New(84, 73), CPos.New(85, 73),CPos.New(86, 73), CPos.New(87, 73), CPos.New(88, 73), CPos.New(89, 73) }
17
18SendUSSRParadrops = function()
19	paraproxy1 = Actor.Create("powerproxy.paratroopers", false, { Owner = player })
20	paraproxy1.ActivateParatroopers(ParachuteBaseEntrance.CenterPosition,  Facing.North)
21	paraproxy1.Destroy()
22end
23
24SendUSSRParadropsBase = function()
25	paraproxy2 = Actor.Create("powerproxy.paratroopers2", false, { Owner = player })
26	paraproxy2.ActivateParatroopers(ParachuteBase1.CenterPosition, Facing.East)
27	paraproxy2.Destroy()
28	paraproxy3 = Actor.Create("powerproxy.paratroopers3", false, { Owner = player })
29	paraproxy3.ActivateParatroopers(ParachuteBase2.CenterPosition, Facing.East)
30	paraproxy3.Destroy()
31end
32
33Trigger.OnEnteredFootprint(BridgeShroudTrigger, function(a, id)
34	if not bridgeShroudTrigger and a.Owner == player then
35		bridgeShroudTrigger = true
36		local cameraBridge = Actor.Create("camera", true, { Owner = player, Location = CameraBridge.Location })
37		Trigger.AfterDelay(DateTime.Seconds(15), function()
38			cameraBridge.Destroy()
39		end)
40	end
41end)
42
43Trigger.OnEnteredFootprint(BridgeExplosionTrigger, function(a, id)
44	if not bridgeExplosionTrigger and a.Owner == player then
45		bridgeExplosionTrigger = true
46		if not BarrelBridge.IsDead then
47			BarrelBridge.Kill()
48		end
49	end
50end)
51
52Trigger.OnEnteredFootprint(EnemyBaseEntranceShroudTrigger, function(a, id)
53	if not enemyBaseEntranceShroudTrigger and a.Owner == player then
54		enemyBaseEntranceShroudTrigger = true
55		local cameraBaseEntrance = Actor.Create("camera", true, { Owner = player, Location = CameraBaseEntrance.Location })
56		Trigger.AfterDelay(DateTime.Seconds(15), function()
57			cameraBaseEntrance.Destroy()
58		end)
59	end
60end)
61
62Trigger.OnEnteredFootprint(EnemyBaseShroudTrigger, function(a, id)
63	if not enemyBaseShroudTrigger and a.Owner == player then
64		enemyBaseShroudTrigger = true
65		local cameraBase1 = Actor.Create("camera", true, { Owner = player, Location = CameraBase1.Location })
66		local cameraBase2 = Actor.Create("camera", true, { Owner = player, Location = CameraBase2.Location })
67		Trigger.AfterDelay(DateTime.Seconds(15), function()
68			cameraBase1.Destroy()
69			cameraBase2.Destroy()
70		end)
71	end
72end)
73
74Trigger.OnEnteredFootprint(ParachuteTrigger, function(a, id)
75	if not parachuteTrigger and a.Owner == player then
76		parachuteTrigger = true
77		SendUSSRParadrops()
78		Media.PlaySpeechNotification(player, "ReinforcementsArrived")
79	end
80end)
81
82Trigger.OnEnteredFootprint(TransportTrigger, function(a, id)
83	if not transportTrigger and a.Type == "truk" then
84		transportTrigger = true
85		if not TransportTruck.IsDead then
86			TransportTruck.Wait(DateTime.Seconds(5))
87			TransportTruck.Move(TransportWaypoint2.Location)
88			TransportTruck.Wait(DateTime.Seconds(5))
89			TransportTruck.Move(TransportWaypoint3.Location)
90			TransportTruck.Wait(DateTime.Seconds(5))
91			TransportTruck.Move(TransportWaypoint1.Location)
92		end
93		Trigger.AfterDelay(DateTime.Seconds(10), function()
94			transportTrigger = false
95		end)
96	end
97end)
98
99Trigger.OnKilled(BarrelBase, function()
100		SendUSSRParadropsBase()
101		Media.PlaySpeechNotification(player, "ReinforcementsArrived")
102end)
103
104Trigger.OnKilled(BarrelBridge, function()
105	local bridgepart = Map.ActorsInBox(BridgeCheck1.CenterPosition, BridgeCheck2.CenterPosition, function(self) return self.Type == "br1" end)[1]
106	if not bridgepart.IsDead then
107		bridgepart.Kill()
108	end
109end)
110
111Trigger.OnKilled(Church1, function()
112	Actor.Create("moneycrate", true, { Owner = player, Location = TransportWaypoint3.Location })
113end)
114
115Trigger.OnKilled(Church2, function()
116	Actor.Create("healcrate", true, { Owner = player, Location = Church2.Location })
117end)
118
119Trigger.OnKilled(ForwardCommand, function()
120	enemy.MarkCompletedObjective(alliedObjective)
121end)
122
123Trigger.OnKilled(IntroSoldier1, function()
124	local cameraIntro = Actor.Create("camera", true, { Owner = player, Location = CameraStart.Location })
125	Trigger.AfterDelay(DateTime.Seconds(15), function()
126		cameraIntro.Destroy()
127	end)
128end)
129
130WorldLoaded = function()
131	player = Player.GetPlayer("USSR")
132	enemy = Player.GetPlayer("Greece")
133	Utils.Do(IntroAttackers, function(actor)
134		if not actor.IsDead then
135			Trigger.OnIdle(actor, actor.Hunt)
136		end
137	end)
138	Trigger.AfterDelay(0, function()
139		local buildings = Utils.Where(Map.ActorsInWorld, function(self) return self.Owner == enemy and self.HasProperty("StartBuildingRepairs") end)
140		Utils.Do(buildings, function(actor)
141			Trigger.OnDamaged(actor, function(building, attacker)
142				if building.Owner == enemy and building.Health < building.MaxHealth * 0.8 then
143					building.StartBuildingRepairs()
144				end
145			end)
146		end)
147	end)
148	Trigger.OnObjectiveAdded(player, function(p, id)
149		Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective")
150	end)
151	Trigger.OnObjectiveCompleted(player, function(p, id)
152		Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
153	end)
154	Trigger.OnObjectiveFailed(player, function(p, id)
155		Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed")
156	end)
157	Trigger.OnPlayerWon(player, function()
158		Media.PlaySpeechNotification(player, "Win")
159	end)
160	Trigger.OnPlayerLost(player, function()
161		Media.PlaySpeechNotification(player, "Lose")
162	end)
163	alliedObjective = enemy.AddPrimaryObjective("Destroy all Soviet troops.")
164	sovietObjective1 = player.AddPrimaryObjective("Protect the Command Center.")
165	sovietObjective2 = player.AddPrimaryObjective("Destroy all Allied units and structures.")
166end
167
168Tick = function()
169	if player.HasNoRequiredUnits() then
170		enemy.MarkCompletedObjective(alliedObjective)
171	end
172
173	if enemy.HasNoRequiredUnits() then
174		player.MarkCompletedObjective(sovietObjective1)
175		player.MarkCompletedObjective(sovietObjective2)
176	end
177
178	if enemy.Resources >= enemy.ResourceCapacity * 0.75 then
179		enemy.Cash = enemy.Cash + enemy.Resources - enemy.ResourceCapacity * 0.25
180		enemy.Resources = enemy.ResourceCapacity * 0.25
181	end
182end
183