Skip to content

Commit 4668831

Browse files
authored
Merge pull request #142 from cortex-command-community/browncoat-mission
Browncoat Mission Progress
2 parents e956e03 + 62f7a5f commit 4668831

File tree

463 files changed

+143691
-79393
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

463 files changed

+143691
-79393
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
3131
- New `SoundContainer` features.
3232
Lua property `Paused` (R/W) to pause or unpause all sounds of a SoundContainer. Newly played sounds will not begin playback until unpaused.
3333
Lua function `GetAudibleVolume` to get the real audible volume of a SoundContainer's sounds as a float from 0 to 1. This accounts for literally everything, including game volume.
34+
35+
- New `AEmitter` and `PEmitter` INI and Lua (R/W) property `PlayBurstSound` which denotes whether the BurstSound should play when appropriate. This should not be confused for a trigger - it's just a enable/disable toggle to avoid having to remove and add BurstSound altogether.
3436

3537
- Allow lua scripts to use LuaJIT's BitOp module (see https://bitop.luajit.org/api.html)
3638

@@ -54,6 +56,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5456

5557
- `MovableMan:OpenAllDoors()`, when passed `NOTEAM`, will now open/close doors specifically for `NOTEAM` (instead of all doors).
5658

59+
- MOs now only play the BurstSound of the first Wound they receive in a frame, which not only solves audio spam during e.g. explosions but also preserves intended audio when firing guns with a high ParticleCount at them.
60+
5761
</details>
5862

5963
<details><summary><b>Fixed</b></summary>

Data/Base.rte/Activities/Utility/DeliveryCreationHandler.lua

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,38 @@ function DeliveryCreationHandler:OnSave(saveLoadHandler)
278278

279279
end
280280

281+
function DeliveryCreationHandler:GetHandlerAsSerialized(saveLoadHandler)
282+
return saveLoadHandler:SerializeTable(self.saveTable);
283+
end
284+
285+
function DeliveryCreationHandler:ReplaceHandlerWithSerialized(saveLoadHandler, saveTable)
286+
self.saveTable = saveLoadHandler:DeserializeTable(saveTable);
287+
288+
-- re-add virtual teams
289+
290+
for team, techName in pairs(self.saveTable.virtualTeams) do
291+
self:AddVirtualTeam(team, techName);
292+
end
293+
294+
-- redo adding and removing presets
295+
296+
for team, presetsTable in pairs(self.saveTable.teamRemovedPresets) do
297+
for i, presetName in pairs(self.saveTable.teamRemovedPresets[team]) do
298+
self:RemoveAvailablePreset(team, presetName, true);
299+
end
300+
end
301+
302+
for team, presetsTable in pairs(self.saveTable.teamAddedPresets) do
303+
for i, presetTable in pairs(self.saveTable.teamAddedPresets[team]) do
304+
self:AddAvailablePreset(team, presetTable.PresetName, presetTable.ClassName, presetTable.TechName, true);
305+
end
306+
end
307+
308+
if self.verboseLogging then
309+
print("INFO: DeliveryCreationHandler just replaced itself with a serialized saveTable!");
310+
end
311+
end
312+
281313
function DeliveryCreationHandler:AddVirtualTeam(team, techName)
282314

283315
if team and techName then
@@ -441,7 +473,7 @@ function DeliveryCreationHandler:ReplaceInfantryTypeWeightsTable(team, newWeight
441473

442474
return true;
443475
else
444-
print("DeliveryCreationHandler tried to replace infantry type weights, but wasn't given both a team and a table!");
476+
print("ERROR: DeliveryCreationHandler tried to replace infantry type weights, but wasn't given both a team and a table!");
445477
return false;
446478
end
447479

@@ -458,7 +490,7 @@ function DeliveryCreationHandler:AddAvailablePreset(team, presetName, className,
458490
for i, groupTable in pairs(self.teamPresetTables[team]) do
459491
for presetIndex, presetTable in pairs(groupTable) do
460492
if presetTable.PresetName == presetName then
461-
print("DeliveryCreationHandler tried to add an available preset that was already there!");
493+
print("ERROR: DeliveryCreationHandler tried to add an available preset that was already there!");
462494
return false;
463495
end
464496
end
@@ -491,7 +523,7 @@ function DeliveryCreationHandler:AddAvailablePreset(team, presetName, className,
491523
return true;
492524

493525
else
494-
print("DeliveryCreationHandler tried to add an available preset but was not given all of a team, presetName, className, and techName!");
526+
print("ERROR: DeliveryCreationHandler tried to add an available preset but was not given all of a team, presetName, className, and techName!");
495527
return false;
496528
end
497529

@@ -500,6 +532,10 @@ end
500532
function DeliveryCreationHandler:RemoveAvailablePreset(team, presetName, doNotSaveNewEntry)
501533

502534
-- check through every group and delete the preset with the given presetname from every one
535+
536+
if self.verboseLogging then
537+
print("INFO: DeliveryCreationHandler is trying to delete preset " .. presetName .. " from team " .. team);
538+
end
503539

504540
local found = false;
505541

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
--------------------------------------- Instructions ---------------------------------------
2+
3+
------- Require this in your script like so:
4+
5+
-- self.GameIntensityCalculator = require("Activities/Utility/GameIntensityCalculator");
6+
-- self.GameIntensityCalculator:Initialize(Activity, bool newGame, bool verboseLogging, number intensityValuePerHPBarLost, number intensityDegradationRatePerSecond);
7+
8+
-- Call self.GameIntensityCalculator:UpdateGameIntensityCalculator() every frame.
9+
10+
-- The main update function will return an intensity number between 0 and 1.
11+
-- This corresponds to how much damage has been dealt directly within all the player's views.
12+
-- Use the two number arguments to control how the intensity value rises and falls.
13+
-- One "HP Bar" is considered a standard 100 HP.
14+
15+
------- Saving/Loading
16+
17+
-- Saving and loading requires you to also have the SaveLoadHandler ready.
18+
-- Simply run OnSave(instancedSaveLoadHandler) and OnLoad(instancedSaveLoadHandler) when appropriate.
19+
20+
--------------------------------------- Misc. Information ---------------------------------------
21+
22+
--
23+
24+
25+
26+
27+
local GameIntensityCalculator = {};
28+
29+
function GameIntensityCalculator:Create()
30+
local Members = {};
31+
32+
setmetatable(Members, self);
33+
self.__index = self;
34+
35+
return Members;
36+
end
37+
38+
function GameIntensityCalculator:Initialize(activity, newGame, intensityValuePerHPBarLost, intensityDegradationRatePerSecond, verboseLogging)
39+
self.verboseLogging = verboseLogging
40+
41+
self.Activity = activity;
42+
43+
if not intensityValuePerHPBarLost then
44+
intensityValuePerHPBarLost = 0.2;
45+
end
46+
if not intensityDegradationRatePerSecond then
47+
intensityDegradationRatePerSecond = 0.01;
48+
end
49+
50+
-- One "HP Bar" is considered 100 HP
51+
self.intensityValuePerHPBarLost = intensityValuePerHPBarLost;
52+
53+
self.intensityDegradationRatePerSecond = intensityDegradationRatePerSecond;
54+
55+
if newGame then
56+
self.saveTable = {};
57+
self.saveTable.CurrentIntensity = -0.5;
58+
end
59+
60+
print("INFO: GameIntensityCalculator initialized!")
61+
end
62+
63+
function GameIntensityCalculator:OnLoad(saveLoadHandler)
64+
print("INFO: GameIntensityCalculator loading...");
65+
self.saveTable = saveLoadHandler:ReadSavedStringAsTable("GameIntensityCalculatorMainTable");
66+
print("INFO: GameIntensityCalculator loaded!");
67+
end
68+
69+
function GameIntensityCalculator:OnSave(saveLoadHandler)
70+
print("INFO: GameIntensityCalculator saving...");
71+
saveLoadHandler:SaveTableAsString("GameIntensityCalculatorMainTable", self.saveTable);
72+
print("INFO: GameIntensityCalculator saved!");
73+
end
74+
75+
function GameIntensityCalculator:GetCurrentIntensity()
76+
return math.min(1, self.saveTable.CurrentIntensity, math.max(0, self.saveTable.CurrentIntensity));
77+
end
78+
79+
function GameIntensityCalculator:UpdateGameIntensityCalculator()
80+
self.saveTable.CurrentIntensity = math.max(-0.5, self.saveTable.CurrentIntensity - (self.intensityDegradationRatePerSecond * TimerMan.DeltaTimeSecs));
81+
82+
local healthLostThisFrame = 0;
83+
84+
for player = Activity.PLAYER_1, Activity.MAXPLAYERCOUNT - 1 do
85+
if self.Activity:PlayerActive(player) and self.Activity:PlayerHuman(player) then
86+
local screenBox = Box(CameraMan:GetOffset(player), CameraMan:GetOffset(player) + Vector(FrameMan.PlayerScreenWidth, FrameMan.PlayerScreenHeight));
87+
for mo in MovableMan:GetMOsInBox(screenBox, -1, true) do
88+
if IsActor(mo) then
89+
mo = ToActor(mo);
90+
healthLostThisFrame = math.max(0, healthLostThisFrame + mo.PrevHealth - mo.Health);
91+
end
92+
end
93+
end
94+
end
95+
96+
if healthLostThisFrame > 0 then
97+
--print("health lost this frame: " .. healthLostThisFrame);
98+
end
99+
100+
self.saveTable.CurrentIntensity = math.min(1.25, self.saveTable.CurrentIntensity + self.intensityValuePerHPBarLost * (healthLostThisFrame/100))
101+
102+
--print("intensity: " .. self.saveTable.CurrentIntensity);
103+
104+
return math.min(1, self.saveTable.CurrentIntensity, math.max(0, self.saveTable.CurrentIntensity));
105+
end
106+
107+
108+
return GameIntensityCalculator:Create();

Data/Base.rte/Activities/Utility/HUDHandler.lua

Lines changed: 87 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -102,12 +102,14 @@ function HUDHandler:Initialize(activity, newGame, verboseLogging)
102102

103103
self.descriptionSpacing = 15;
104104

105-
-- reinit camera timers always
105+
-- reinit timers always
106106

107107
self.teamCameraTimers = {};
108+
self.teamScreenTextTimers = {};
108109

109110
for team = 0, self.Activity.TeamCount do
110111
self.teamCameraTimers[team] = Timer();
112+
self.teamScreenTextTimers[team] = Timer();
111113
end
112114

113115
if newGame then
@@ -123,6 +125,7 @@ function HUDHandler:Initialize(activity, newGame, verboseLogging)
123125
self.saveTable.teamTables[team].Objectives = {};
124126

125127
self.saveTable.teamTables[team].cameraQueue = {};
128+
self.saveTable.teamTables[team].screenTextQueue = {};
126129
self.saveTable.teamTables[team].cinematicBars = false;
127130
self.saveTable.teamTables[team].cinematicBarThickness = 50;
128131
self.saveTable.teamTables[team].cinematicBarAnimationTimer = Timer();
@@ -176,7 +179,7 @@ function HUDHandler:OnSave(saveLoadHandler)
176179
saveLoadHandler:SaveTableAsString("HUDHandlerMainTable", self.saveTable);
177180
print("INFO: HUDHandler saved!");
178181

179-
-- camera timers deliberately not saved, might as well reset them all
182+
-- timers deliberately not saved, might as well reset them all
180183

181184
end
182185

@@ -254,6 +257,41 @@ function HUDHandler:DrawCinematicBars(team)
254257

255258
end
256259

260+
function HUDHandler:QueueScreenText(team, text, textTime, blinkInterval, centered)
261+
local screenTextTable = {};
262+
263+
textTime = textTime and textTime or 5000;
264+
blinkInterval = blinkInterval and blinkInterval or -1;
265+
centered = centered and centered or false;
266+
267+
if team and text then
268+
screenTextTable.Text = text;
269+
screenTextTable.textTime = textTime;
270+
screenTextTable.blinkInterval = blinkInterval;
271+
screenTextTable.Centered = centered;
272+
else
273+
print("ERROR: HUDHandler tried to queue ScreenText with no team or no text!");
274+
return false;
275+
end
276+
277+
if #self.saveTable.teamTables[team].screenTextQueue == 0 then
278+
self.teamScreenTextTimers[team]:Reset();
279+
end
280+
281+
table.insert(self.saveTable.teamTables[team].screenTextQueue, screenTextTable);
282+
283+
return self.saveTable.teamTables[team].screenTextQueue[#self.saveTable.teamTables[team].screenTextQueue];
284+
end
285+
286+
function HUDHandler:RemoveAllScreenTexts(team)
287+
if team then
288+
self.saveTable.teamTables[team].screenTextQueue = {};
289+
else
290+
print("ERROR: HUDHandlier tried to remove all ScreenTexts but wasn't given a team!");
291+
return false;
292+
end
293+
end
294+
257295
function HUDHandler:QueueCameraPanEvent(team, name, pos, speed, holdTime, notCancellable, cinematicBars, disableHUDFully, callback)
258296
local cameraTable = {};
259297

@@ -291,38 +329,43 @@ function HUDHandler:QueueCameraPanEvent(team, name, pos, speed, holdTime, notCan
291329
end
292330

293331
function HUDHandler:GetCameraPanEventCount(team)
294-
295332
if team then
296333
return #self.saveTable.teamTables[team].cameraQueue;
297334
else
298335
print("ERROR: HUDHandlier tried to get a camera pan event count but wasn't given a team!");
299336
return false;
300337
end
301-
302338
end
303339

304340
function HUDHandler:RemoveCameraPanEvent(team, name)
305-
306-
for i, cameraTable in ipairs(self.saveTable.teamTables[team].cameraQueue) do
307-
if cameraTable.Name == name then
308-
table.remove(self.saveTable.teamTables[team].cameraQueue, i);
309-
break;
341+
if team and name then
342+
for i, cameraTable in ipairs(self.saveTable.teamTables[team].cameraQueue) do
343+
if cameraTable.Name == name then
344+
table.remove(self.saveTable.teamTables[team].cameraQueue, i);
345+
break;
346+
end
310347
end
348+
else
349+
print("ERROR: HUDHandlier tried to remove a camera pan event but wasn't given a team or a name!");
350+
return false;
311351
end
312-
313352
end
314353

315354
function HUDHandler:RemoveAllCameraPanEvents(team, doNotResetHUD)
316-
317-
self.saveTable.teamTables[team].cameraQueue = {};
318-
319-
if not doNotResetHUD then
320-
for team = 0, #self.saveTable.teamTables do
321-
FrameMan:SetHudDisabled(false);
355+
if team then
356+
self.saveTable.teamTables[team].cameraQueue = {};
357+
358+
if not doNotResetHUD then
359+
for k, player in pairs(self.saveTable.playersInTeamTables[team]) do
360+
self.Activity:SetViewState(Activity.ACTORSELECT, player);
361+
FrameMan:SetHudDisabled(false, self.Activity:ScreenOfPlayer(player));
362+
end
322363
self:SetCinematicBars(team, false, false);
323364
end
365+
else
366+
print("ERROR: HUDHandlier tried to remove all camera pan events but wasn't given a team!");
367+
return false;
324368
end
325-
326369
end
327370

328371
function HUDHandler:SetCameraMinimumAndMaximumX(team, minimumX, maximumX)
@@ -498,6 +541,24 @@ function HUDHandler:UpdateHUDHandler()
498541
end
499542
end
500543
end
544+
545+
-- screen texts
546+
local screenTextTable = self.saveTable.teamTables[team].screenTextQueue[1];
547+
548+
if screenTextTable then
549+
for k, player in pairs(self.saveTable.playersInTeamTables[team]) do
550+
FrameMan:SetScreenText(screenTextTable.Text, self.Activity:ScreenOfPlayer(player), screenTextTable.blinkInterval, -1, screenTextTable.Centered);
551+
end
552+
if self.teamScreenTextTimers[team]:IsPastSimMS(screenTextTable.textTime) then
553+
self.teamScreenTextTimers[team]:Reset();
554+
table.remove(self.saveTable.teamTables[team].screenTextQueue, 1);
555+
if not self.saveTable.teamTables[team].screenTextQueue[1] then
556+
for k, player in pairs(self.saveTable.playersInTeamTables[team]) do
557+
FrameMan:ClearScreenText(self.Activity:ScreenOfPlayer(player));
558+
end
559+
end
560+
end
561+
end
501562

502563
-- Objectives
503564
if not PerformanceMan.ShowPerformanceStats == true and not disableDrawingObjectives then
@@ -535,8 +596,15 @@ function HUDHandler:UpdateHUDHandler()
535596

536597
-- c++ objectives are per team, not per player, so we can't do it per player yet...
537598
if objTable.Position and spectatorView then
538-
local pos = not objTable.Position.PresetName and objTable.Position or objTable.Position.Pos; -- severely ghetto mo check
539-
self.Activity:AddObjectivePoint(objTable.shortName, pos, team, GameActivity.ARROWDOWN);
599+
local pos;
600+
if objTable.Position.PresetName then -- severely ghetto mo check
601+
pos = objTable.Position.Pos;
602+
else
603+
pos = objTable.Position;
604+
end
605+
if not (pos.Magnitude == 0) then -- if it's 0, 0 something probably went wrong, don't display it
606+
self.Activity:AddObjectivePoint(objTable.shortName, pos, team, GameActivity.ARROWDOWN);
607+
end
540608
end
541609
end
542610
end

Data/Base.rte/Devices/Explosives/RemoteExplosive/RemoteExplosiveDetonator.lua

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,9 @@ function Create(self)
1010
end
1111

1212
function ThreadedUpdate(self)
13-
if self.ID ~= self.RootID then
14-
local actor = MovableMan:GetMOFromID(self.RootID);
15-
if MovableMan:IsActor(actor) then
16-
self.alliedTeam = ToActor(actor).Team;
17-
end
13+
local parent = self:GetRootParent();
14+
if MovableMan:IsActor(parent) then
15+
self.alliedTeam = ToActor(parent).Team;
1816
end
1917
if self.Magazine then
2018
if self:IsActivated() then

0 commit comments

Comments
 (0)