Skip to content

Commit 2b6c5a4

Browse files
committed
stage skips, item dispensers
1 parent 936d865 commit 2b6c5a4

File tree

14 files changed

+460
-8
lines changed

14 files changed

+460
-8
lines changed

Data/Base.rte/Scenes/Objects/Bunkers/BunkerSystems/GenericCapturable/GenericCapturable.lua

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,25 @@ function OnGlobalMessage(self, message, object)
22

33
--print("capturablegotglobalmessage")
44

5-
if message == self.deactivationMessage then
5+
if message == self.deactivationMessage or message == "DEACTIVATEALLCAPTURABLES" then
66
self.Deactivated = true;
77
self.dominantTeam = self.Team;
88
self.capturingTeam = self.Team;
99
self.captureProgress = 1;
10-
elseif message == self.activationMessage then
10+
elseif message == self.activationMessage or message == "ACTIVATEALLCAPTURABLES" then
1111
self.Deactivated = false;
1212
end
1313

1414
end
1515

1616
function OnMessage(self, message, object)
1717

18-
if message == self.deactivationMessage then
18+
if message == self.deactivationMessage or message == "DEACTIVATEALLCAPTURABLES" then
1919
self.Deactivated = true;
2020
self.dominantTeam = self.Team;
2121
self.capturingTeam = self.Team;
2222
self.captureProgress = 1;
23-
elseif message == self.activationMessage then
23+
elseif message == self.activationMessage or message == "ACTIVATEALLCAPTURABLES" then
2424
self.Deactivated = false;
2525
end
2626

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
///////////////////////////////////////////////////////////////////////
2+
// Item Dispenser
3+
4+
AddPieSlice = PieSlice
5+
PresetName = Item Dispenser Use
6+
Description = Use
7+
Direction = Left
8+
Icon = Icon
9+
CopyOf = Trade Star
10+
ScriptPath = Base.rte/Scenes/Objects/Bunkers/BunkerSystems/ItemDispenser/ItemDispenserPieSliceActions.lua
11+
FunctionName = CommandActorItemDispenserUse
12+
13+
AddActor = MOSRotating
14+
PresetName = Generic Item Dispenser
15+
AddToGroup = Bunker Systems
16+
Description = An item dispenser. Use with pie menu.
17+
PinStrength = 11000
18+
Mass = 0
19+
Buyable = 1
20+
GoldValue = 200
21+
RestThreshold = 0
22+
HitsMOs = 0
23+
GetsHitByMOs = 0
24+
SpriteFile = ContentFile
25+
FilePath = Base.rte/Scenes/Objects/Bunkers/BunkerSystems/ItemDispenser/ItemDispenser.png
26+
FrameCount = 1
27+
SpriteOffset = Vector
28+
X = -23
29+
Y = -29
30+
SpriteAnimMode = 0
31+
SpriteAnimDuration = 1000
32+
ScriptPath = Base.rte/Scenes/Objects/Bunkers/BunkerSystems/ItemDispenser/ItemDispenser.lua
33+
AtomGroup = AtomGroup
34+
AutoGenerate = 1
35+
DeepGroup = AtomGroup
36+
AutoGenerate = 1
37+
DeepCheck = 1
38+
// Unfortunately, due to how item creation works, we need the name of the item, ClassName of the item (like HDFirearm, AHuman, etc), AND TechCame, like Browncoats.rte, Coalition.rte, etc.
39+
// Make sure to set all 3 of these correctly if you change these values at runtime.
40+
AddCustomValue = StringValue
41+
ItemToDispensePresetName = SMG
42+
AddCustomValue = StringValue
43+
ItemToDispenseClassName = HDFirearm
44+
AddCustomValue = StringValue
45+
ItemToDispenseTechName = Base.rte
46+
AddCustomValue = NumberValue // Limit of how many items to dispense total before deactivating. -1 is infinite.
47+
ItemLimit = -1
48+
AddCustomValue = NumberValue // Cooldown in MS between dispensing items.
49+
CooldownTime = 3000
50+
AddCustomValue = StringValue // Message to receive that will deactivate this dispenser and render it unusable.
51+
DeactivationMessage = DeactivateItemDispenser_GenericItemDispenser
52+
AddCustomValue = StringValue // Message to receive that will activate this dispenser and make it usable.
53+
ActivationMessage = ActivateItemDispenser_GenericItemDispenser
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
--[[MULTITHREAD]]--
2+
3+
function OnMessage(self, message)
4+
5+
if message == self.deactivationMessage or message == "DEACTIVATEALLITEMDISPENSERS" then
6+
self.Deactivated = true;
7+
elseif message == self.activationMessage or message == "ACTIVATEALLITEMDISPENSERS" then
8+
self.Deactivated = false;
9+
end
10+
11+
end
12+
13+
function OnGlobalMessage(self, message)
14+
15+
if message == self.deactivationMessage or message == "DEACTIVATEALLITEMDISPENSERS" then
16+
self.Deactivated = true;
17+
elseif message == self.activationMessage or message == "ACTIVATEALLITEMDISPENSERS" then
18+
self.Deactivated = false;
19+
end
20+
21+
end
22+
23+
function Create(self)
24+
25+
self.deactivationMessage = self:GetStringValue("DeactivationMessage");
26+
self.activationMessage = self:GetStringValue("ActivationMessage");
27+
28+
local createFunc = "Create" .. self:GetStringValue("ItemToDispenseClassName");
29+
self.itemToDispense = _G[createFunc](self:GetStringValue("ItemToDispensePresetName"), self:GetStringValue("ItemToDispenseTechName"));
30+
31+
self.Activity = ToGameActivity(ActivityMan:GetActivity());
32+
33+
self.cooldownTimer = Timer();
34+
if self:NumberValueExists("cooldownTimer") then
35+
self.cooldownTimer.ElapsedRealTimeMS = self:GetNumberValue("cooldownTimer");
36+
self:RemoveNumberValue("cooldownTimer");
37+
end
38+
self.cooldownTime = self:GetNumberValue("CooldownTime");
39+
40+
if self:NumberValueExists("itemsDispensed") then
41+
self.itemsDispensed = self:GetNumberValue("itemsDispensed");
42+
self:RemoveNumberValue("itemsDispensed");
43+
else
44+
self.itemsDispensed = 0;
45+
end
46+
47+
self.itemLimit = self:GetNumberValue("ItemLimit");
48+
49+
self.Message = "";
50+
self.messageTimer = Timer();
51+
self.messageTime = 0;
52+
53+
self.closeActorTable = {};
54+
self.actorUpdateTimer = Timer();
55+
self.actorUpdateDelay = 50;
56+
57+
self.detectRange = 50;
58+
59+
self.usePieSlice = CreatePieSlice("Item Dispenser Use", "Base.rte");
60+
end
61+
62+
function ThreadedUpdate(self)
63+
64+
if self.actorUpdateTimer:IsPastSimMS(self.actorUpdateDelay) then
65+
for actor in MovableMan:GetMOsInRadius(self.Pos, self.detectRange) do
66+
if (not self.Deactivated) and (not self.closeActorTable[actor.UniqueID]) and IsAHuman(actor) or IsACrab(actor) then
67+
actor = ToActor(actor);
68+
self.closeActorTable[actor.UniqueID] = actor.UniqueID;
69+
end
70+
end
71+
72+
self:RequestSyncedUpdate();
73+
end
74+
75+
if not self.cooldownTimer:IsPastSimMS(self.cooldownTime) then
76+
PrimitiveMan:DrawTextPrimitive(self.Pos + Vector(0, -20), tostring(self.cooldownTime - self.cooldownTimer.ElapsedSimTimeMS), true, 1);
77+
end
78+
79+
if not self.messageTimer:IsPastSimMS(self.messageTime) then
80+
PrimitiveMan:DrawTextPrimitive(self.Pos, self.Message, true, 1);
81+
end
82+
83+
PrimitiveMan:DrawTextPrimitive(self.Pos + Vector(0, 20), "Team: " .. self.Team, true, 1);
84+
85+
end
86+
87+
function SyncedUpdate(self)
88+
89+
if self.actorUpdateTimer:IsPastSimMS(self.actorUpdateDelay) then
90+
self.actorUpdateTimer:Reset();
91+
92+
for k, v in pairs(self.closeActorTable) do
93+
local actor = MovableMan:FindObjectByUniqueID(v);
94+
if actor and MovableMan:ValidMO(actor) then
95+
actor = ToActor(actor);
96+
local dist = SceneMan:ShortestDistance(self.Pos, actor.Pos, true);
97+
if self.Deactivated or dist:MagnitudeIsGreaterThan(self.detectRange) then
98+
actor.PieMenu:RemovePieSlicesByPresetName(self.usePieSlice.PresetName);
99+
actor:RemoveNumberValue("ItemDispenser_Use");
100+
self.closeActorTable[k] = nil;
101+
else
102+
actor.PieMenu:AddPieSliceIfPresetNameIsUnique(self.usePieSlice, self);
103+
if actor:NumberValueExists("ItemDispenser_Use") then
104+
actor:RemoveNumberValue("ItemDispenser_Use");
105+
if not self.Deactivated and self.cooldownTimer:IsPastSimMS(self.cooldownTime) then
106+
107+
local team = actor.Team;
108+
local item = self.itemToDispense:Clone();
109+
item.Pos = self.Pos;
110+
item.Team = team
111+
MovableMan:AddMO(item);
112+
113+
self.itemsDispensed = self.itemsDispensed + 1;
114+
115+
if self.itemLimit >= 0 and self.itemsDispensed >= self.itemLimit then
116+
self.Deactivated = true;
117+
end
118+
119+
self.cooldownTimer:Reset();
120+
121+
else
122+
123+
if self.Deactivated then
124+
if self.itemLimit >= 0 and self.itemsDispensed >= self.itemLimit then
125+
self.messageTimer:Reset();
126+
self.messageTime = 3000;
127+
self.Message = "Out of stock!";
128+
else
129+
self.messageTimer:Reset();
130+
self.messageTime = 3000;
131+
self.Message = "Out of order!";
132+
end
133+
else
134+
self.messageTimer:Reset();
135+
self.messageTime = 3000;
136+
self.Message = "Not ready yet!";
137+
end
138+
end
139+
140+
end
141+
end
142+
else
143+
self.closeActorTable[k] = nil;
144+
end
145+
end
146+
end
147+
end
148+
149+
function OnSave(self)
150+
self:SetNumberValue("cooldownTimer", self.cooldownTimer.ElapsedRealTimeMS);
151+
self:SetNumberValue("itemsDispensed", self.itemsDispensed);
152+
end
1.48 KB
Loading
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
function CommandActorItemDispenserUse(self)
2+
self:SetNumberValue("ItemDispenser_Use", 1);
3+
end

Data/Base.rte/Scenes/Objects/Bunkers/Bunkers.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ IncludeFile = Base.rte/Scenes/Objects/Bunkers/BunkerSystems/Conveyors/Conveyors.
2525
IncludeFile = Base.rte/Scenes/Objects/Bunkers/BunkerSystems/Teleporters/Teleporters.ini
2626
IncludeFile = Base.rte/Scenes/Objects/Bunkers/BunkerSystems/BackgroundDoors/BackgroundDoors.ini
2727
IncludeFile = Base.rte/Scenes/Objects/Bunkers/BunkerSystems/BuyDoor/BuyDoor.ini
28+
IncludeFile = Base.rte/Scenes/Objects/Bunkers/BunkerSystems/ItemDispenser/ItemDispenser.ini
2829
IncludeFile = Base.rte/Scenes/Objects/Bunkers/BunkerSystems/GenericCapturable/GenericCapturable.ini
2930
IncludeFile = Base.rte/Scenes/Objects/Bunkers/BunkerSystems/BunkerSystems.ini
3031

Data/Browncoats.rte/Activities/RefineryAssault.lua

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,10 @@ function RefineryAssault:StartActivity(newGame)
254254

255255
MovableMan:SendGlobalMessage("DeactivateCapturable_RefineryLCHackConsole1");
256256
MovableMan:SendGlobalMessage("DeactivateCapturable_RefineryLCHackConsole2");
257+
MovableMan:SendGlobalMessage("DeactivateCapturable_RefineryS3BuyDoorConsole1");
258+
MovableMan:SendGlobalMessage("DeactivateCapturable_RefineryS3BuyDoorConsole2");
259+
MovableMan:SendGlobalMessage("DeactivateCapturable_RefineryS3BuyDoorConsole3");
260+
MovableMan:SendGlobalMessage("DeactivateCapturable_RefineryS3BuyDoorConsole4");
257261
MovableMan:SendGlobalMessage("DeactivateCapturable_RefineryS3OilCapturable");
258262

259263
-- Stage stuff

Data/Browncoats.rte/Activities/RefineryAssaultFunctions.lua

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ function RefineryAssault:HandleMessage(message, object)
66

77
print(message)
88
print(object)
9+
10+
-- this is ugly, but there's no way to avoid this stuff except hiding it away even harder than in this separate script...
911

1012
if message == "Captured_RefineryLCHackConsole1" then
1113

@@ -139,8 +141,32 @@ function RefineryAssault:HandleMessage(message, object)
139141
if self.stage3ConsolesBroken == 3 then
140142
self.HUDHandler:RemoveObjective(self.humanTeam, "S3DestroyConsoles");
141143
end
144+
145+
elseif message == "Captured_RefineryS3FireWeaponryConsole" then
146+
147+
self.deliveryCreationHandler:AddAvailablePreset(self.humanTeam, "FL-200 Heatlance", "HDFirearm", "Browncoats.rte");
148+
self.deliveryCreationHandler:AddAvailablePreset(self.humanTeam, "IN-02 Backblast", "HDFirearm", "Browncoats.rte");
149+
150+
self.deliveryCreationHandler:RemoveAvailablePreset(self.aiTeam, "FL-200 Heatlance");
151+
-- don't remove the IN-02, castrates the brownies too much this early on.
142152

143153
end
154+
155+
156+
-- DEBUG STAGE SKIPS
157+
158+
if message == "Stage1Skip" then
159+
for a in MovableMan.Actors do if a.Team == 1 and a.ClassName == "AHuman" and SceneMan.Scene:WithinArea("Mission Stage Area 1", a.Pos) then a.Health = 0 end end
160+
elseif message == "Stage2Skip" then
161+
self.stage2HoldingBothConsoles = true;
162+
self.stage2TimeToHoldConsoles = 0;
163+
elseif message == "Stage3Skip" then
164+
self.stage3ConsolesBroken = 3
165+
self.HUDHandler:RemoveObjective(self.humanTeam, "S3DestroyConsoles");
166+
self.enemyActorTables.stage3FacilityOperator = {};
167+
end
168+
169+
144170

145171
end
146172

@@ -556,6 +582,10 @@ function RefineryAssault:MonitorStage2()
556582
MovableMan:SendGlobalMessage("DeactivateCapturable_RefineryLCHackConsole1");
557583
MovableMan:SendGlobalMessage("DeactivateCapturable_RefineryLCHackConsole2");
558584

585+
MovableMan:SendGlobalMessage("ActivateCapturable_RefineryS3BuyDoorConsole1");
586+
MovableMan:SendGlobalMessage("ActivateCapturable_RefineryS3BuyDoorConsole2");
587+
MovableMan:SendGlobalMessage("ActivateCapturable_RefineryS3BuyDoorConsole3");
588+
559589
MovableMan:SendGlobalMessage("ActivateCapturable_RefineryS3OilCapturable");
560590

561591
-- Setup stage 3 consoles
@@ -677,6 +707,10 @@ function RefineryAssault:MonitorStage3()
677707
self:GetBanner(GUIBanner.YELLOW, 0):ShowText("DOORS OPEN WOW!", GUIBanner.FLYBYLEFTWARD, 1500, Vector(FrameMan.PlayerScreenWidth, FrameMan.PlayerScreenHeight), 0.4, 4000, 0)
678708
self.Stage = 4;
679709

710+
-- Capturables
711+
712+
MovableMan:SendGlobalMessage("ActivateCapturable_RefineryS3BuyDoorConsole4");
713+
680714
end
681715

682716
end

Data/Browncoats.rte/Scenes/Objects/Capturables/Capturables.ini

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,4 +185,31 @@ AddActor = MOSRotating
185185
AddCustomValue = StringValue
186186
ActivationMessage = ActivateCapturable_RefineryS3BuyDoorConsole4
187187
AddCustomValue = NumberValue
188-
DeactivateOnCapture = 0
188+
DeactivateOnCapture = 0
189+
190+
AddActor = MOSRotating
191+
CopyOf = Generic Capturable Computer
192+
PresetName = Refinery S3 Fire Weaponry Console
193+
ScriptPath = Browncoats.rte/Scenes/Objects/Capturables/RefineryCapturableFX.lua
194+
AddCustomValue = NumberValue
195+
StartTeam = 1
196+
AddCustomValue = NumberValue
197+
SecondsToCapture = 10
198+
AddCustomValue = NumberValue
199+
InstantReset = 0
200+
AddCustomValue = NumberValue
201+
NeutralIfNotFullyCapped = 0
202+
AddCustomValue = NumberValue
203+
NeedFullControlToCap = 0
204+
AddCustomValue = StringValue
205+
SceneCaptureArea = CaptureArea_RefineryS3FireWeaponryConsole
206+
AddCustomValue = NumberValue
207+
SendCaptureMessageGlobally = 1
208+
AddCustomValue = StringValue
209+
CaptureMessage = Captured_RefineryS3FireWeaponryConsole
210+
AddCustomValue = StringValue
211+
DeactivationMessage = DeactivateCapturable_RefineryS3FireWeaponryConsole
212+
AddCustomValue = StringValue
213+
ActivationMessage = ActivateCapturable_RefineryS3FireWeaponryConsole
214+
AddCustomValue = NumberValue
215+
DeactivateOnCapture = 1
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
function OnGlobalMessage(self, message)
2+
3+
if message == "Captured_RefineryS3FireWeaponryConsole" then
4+
self:SendMessage("ACTIVATEALLITEMDISPENSERS");
5+
end
6+
7+
end
8+
9+
function Create(self)
10+
11+
self:SendMessage("DEACTIVATEALLITEMDISPENSERS");
12+
13+
end

0 commit comments

Comments
 (0)