Skip to content

Commit de790fe

Browse files
authored
Merge pull request #110 from cortex-command-community/dynamic-music-manager
Dynamic Music Manager
2 parents bfe4acb + 018efdc commit de790fe

Some content is hidden

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

65 files changed

+1606
-680
lines changed

CHANGELOG.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,37 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66

77
## [Unreleased]
88

9+
<details><summary><b>Added</b></summary>
10+
11+
- New music system, including a dynamic horizontal sequencing system, under the new music manager `MusicMan`.
12+
`PlayDynamicSong(string songName, string songSectionName, bool playImmediately, bool playTransition, bool smoothFade)` to play a new DynamicSong.
13+
`SetNextDynamicSongSection(string songSectionName, bool playImmediately, bool playTransition, bool smoothFade)` to queue a new DynamicSongSection for the currently playing song.
14+
`PlayInterruptingMusic(SoundContainer soundContainer)` to start an interrupting piece of music which will pause any playing DynamicSong. Note that pause menu music happily overrides this currently.
15+
`EndInterruptingMusic()` to end any playing interrupting music, and resume any paused DynamicSongs.
16+
`EndDynamicMusic(bool fadeOut)` to end any currently playing dynamic music, optionally immediately fading it out. If not fading it out, the currently playing piece will play to completion.
17+
`ResetMusicState()` to immediately end all music and return the MusicMan to a blank state.
18+
19+
- New entities `DynamicSongSection` and `DynamicSong` which are used for organizing music to play using the new system.
20+
`DynamicSongSection` is made up of TransitionSoundContainers, SoundContainers, a string SectionType, and either randomnorepeat or shuffle SoundContainerSelectionCycleMode.
21+
`DynamicSong` is a simple container of DynamicSongSections. It can have one DefaultSongSection and as many added sections as needed.
22+
23+
- New `SoundContainer` features.
24+
Lua property `Paused` (R/W) to pause or unpause all sounds of a SoundContainer. Newly played sounds will not begin playback until unpaused.
25+
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.
26+
27+
</details>
28+
929
<details><summary><b>Changed</b></summary>
1030

1131
- Conquest activities will once again fall-back to using base dropships and rockets if a random selection of the selected tech's craft can't find one capable of carrying passengers and/or cargo.
1232

33+
- ALl music-related functionality from AudioMan has been removed due to the addition of the MusicMan. Generic DynamicSongs have been put in to use instead.
34+
Mod activities that used to queue up all the vanilla music should now instead call, for example, `MusicMan:PlayDynamicSong("Generic Battle Music")`
35+
36+
</details>
37+
38+
<details><summary><b>Removed</b></summary>
39+
1340
</details>
1441

1542
<details><summary><b>Fixed</b></summary>

Data/Base.rte/Activities/BrainVsBrain.lua

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ function BrainvsBrain:StartActivity(isNewGame)
4242
if self.CPUTeam ~= Activity.NOTEAM then
4343
self.CPUTechID = PresetMan:GetModuleID(self.TechName[self.CPUTeam]);
4444
end
45+
46+
MusicMan:PlayDynamicSong("Generic Battle Music");
4547

4648
if isNewGame then
4749
self:StartNewGame();
@@ -311,16 +313,11 @@ function BrainvsBrain:EndActivity()
311313
if not self:IsPaused() then
312314
-- Play sad music if no humans are left
313315
if self:HumanBrainCount() == 0 then
314-
AudioMan:ClearMusicQueue();
315-
AudioMan:PlayMusic("Base.rte/Music/dBSoundworks/udiedfinal.ogg", 2, -1.0);
316-
AudioMan:QueueSilence(10);
317-
AudioMan:QueueMusicStream("Base.rte/Music/dBSoundworks/ccambient4.ogg");
316+
MusicMan:PlayDynamicSong("Generic Defeat Music", "Default", true);
317+
MusicMan:PlayDynamicSong("Generic Ambient Music");
318318
else
319-
-- But if humans are left, then play happy music!
320-
AudioMan:ClearMusicQueue();
321-
AudioMan:PlayMusic("Base.rte/Music/dBSoundworks/uwinfinal.ogg", 2, -1.0);
322-
AudioMan:QueueSilence(10);
323-
AudioMan:QueueMusicStream("Base.rte/Music/dBSoundworks/ccambient4.ogg");
319+
MusicMan:PlayDynamicSong("Generic Victory Music", "Default", true);
320+
MusicMan:PlayDynamicSong("Generic Ambient Music");
324321
end
325322
end
326323
end

Data/Base.rte/Activities/BunkerBreach.lua

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,8 @@ function BunkerBreach:StartActivity(isNewGame)
253253
FrameMan:ClearScreenText(self:ScreenOfPlayer(player));
254254
end
255255
end
256+
257+
MusicMan:PlayDynamicSong("Generic Battle Music");
256258

257259
if isNewGame then
258260
-- Because of game oddities, we need to set funds to match starting gold manually.
@@ -326,15 +328,11 @@ function BunkerBreach:EndActivity()
326328
-- Temp fix so music doesn't start playing if ending the Activity when changing resolution through the ingame settings.
327329
if not self:IsPaused() then
328330
if self.WinnerTeam == self.CPUTeam then
329-
AudioMan:ClearMusicQueue();
330-
AudioMan:PlayMusic("Base.rte/Music/dBSoundworks/udiedfinal.ogg", 2, -1.0);
331-
AudioMan:QueueSilence(10);
332-
AudioMan:QueueMusicStream("Base.rte/Music/dBSoundworks/ccambient4.ogg");
331+
MusicMan:PlayDynamicSong("Generic Defeat Music", "Default", true);
332+
MusicMan:PlayDynamicSong("Generic Ambient Music");
333333
else
334-
AudioMan:ClearMusicQueue();
335-
AudioMan:PlayMusic("Base.rte/Music/dBSoundworks/uwinfinal.ogg", 2, -1.0);
336-
AudioMan:QueueSilence(10);
337-
AudioMan:QueueMusicStream("Base.rte/Music/dBSoundworks/ccambient4.ogg");
334+
MusicMan:PlayDynamicSong("Generic Victory Music", "Default", true);
335+
MusicMan:PlayDynamicSong("Generic Ambient Music");
338336
end
339337
end
340338
end

Data/Base.rte/Activities/Harvester.lua

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ function Harvester:StartNewGame()
6060
self.randomSpawnTime = 5000;
6161
elseif self.Difficulty <= GameActivity.NUTSDIFFICULTY then
6262
self.goldNeeded = 7500;
63-
self.goldDisplay = "sevent thousand five hundred";
63+
self.goldDisplay = "seven thousand five hundred";
6464
self.baseSpawnTime = 8000;
6565
self.randomSpawnTime = 4500;
6666
elseif self.Difficulty <= GameActivity.MAXDIFFICULTY then
@@ -82,9 +82,9 @@ function Harvester:SetupHumanPlayerBrains()
8282
-- If we can't find an unassigned brain in the scene to give each player, then force to go into editing mode to place one
8383
if not foundBrain then
8484
self.ActivityState = Activity.EDITING;
85-
AudioMan:ClearMusicQueue();
86-
AudioMan:PlayMusic("Base.rte/Music/dBSoundworks/ccambient4.ogg", -1, -1);
85+
MusicMan:PlayDynamicSong("Generic Ambient Music");
8786
else
87+
MusicMan:PlayDynamicSong("Generic Battle Music");
8888
-- Set the found brain to be the selected actor at start
8989
self:SetPlayerBrain(foundBrain, player);
9090
self:SwitchToActor(foundBrain, player, self:GetTeamOfPlayer(player));
@@ -132,22 +132,22 @@ function Harvester:EndActivity()
132132
if not self:IsPaused() then
133133
-- Play sad music if no humans are left
134134
if self:HumanBrainCount() == 0 then
135-
AudioMan:ClearMusicQueue();
136-
AudioMan:PlayMusic("Base.rte/Music/dBSoundworks/udiedfinal.ogg", 2, -1.0);
137-
AudioMan:QueueSilence(10);
138-
AudioMan:QueueMusicStream("Base.rte/Music/dBSoundworks/ccambient4.ogg");
135+
MusicMan:PlayDynamicSong("Generic Defeat Music", "Default", true);
136+
MusicMan:PlayDynamicSong("Generic Ambient Music");
139137
else
140138
-- But if humans are left, then play happy music!
141-
AudioMan:ClearMusicQueue();
142-
AudioMan:PlayMusic("Base.rte/Music/dBSoundworks/uwinfinal.ogg", 2, -1.0);
143-
AudioMan:QueueSilence(10);
144-
AudioMan:QueueMusicStream("Base.rte/Music/dBSoundworks/ccambient4.ogg");
139+
MusicMan:PlayDynamicSong("Generic Victory Music", "Default", true);
140+
MusicMan:PlayDynamicSong("Generic Ambient Music");
145141
end
146142
end
147143
end
148144

149145
function Harvester:UpdateActivity()
150146
if self.ActivityState ~= Activity.OVER and self.ActivityState ~= Activity.EDITING then
147+
if not self.musicStarted then
148+
self.musicStarted = true;
149+
MusicMan:PlayDynamicSong("Generic Battle Music", "Default", true);
150+
end
151151
--Determine how much gold the players started with.
152152
if self.humanTeamFundsAfterInitialEditingPhase == -1 then
153153
self.humanTeamFundsAfterInitialEditingPhase = self:GetTeamFunds(Activity.TEAM_1);
@@ -337,5 +337,6 @@ function Harvester:UpdateActivity()
337337
end
338338
else
339339
self.startMessageTimer:Reset();
340+
self.musicStarted = false;
340341
end
341342
end

Data/Base.rte/Activities/KeepieUppie.lua

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ function KeepieUppie:StartNewGame()
6969
self.randomSpawnTime = 4000;
7070
end
7171
self.enemySpawnTimeLimit = 2000;
72+
73+
MusicMan:PlayDynamicSong("Generic Boss Fight Music");
7274

7375
for player = Activity.PLAYER_1, Activity.MAXPLAYERCOUNT - 1 do
7476
if self:PlayerActive(player) and self:PlayerHuman(player) then
@@ -120,16 +122,11 @@ function KeepieUppie:EndActivity()
120122
if not self:IsPaused() then
121123
-- Play sad music if no humans are left
122124
if self:HumanBrainCount() == 0 then
123-
AudioMan:ClearMusicQueue();
124-
AudioMan:PlayMusic("Base.rte/Music/dBSoundworks/udiedfinal.ogg", 2, -1.0);
125-
AudioMan:QueueSilence(10);
126-
AudioMan:QueueMusicStream("Base.rte/Music/dBSoundworks/ccambient4.ogg");
125+
MusicMan:PlayDynamicSong("Generic Defeat Music", "Default", true);
126+
MusicMan:PlayDynamicSong("Generic Ambient Music");
127127
else
128-
-- But if humans are left, then play happy music!
129-
AudioMan:ClearMusicQueue();
130-
AudioMan:PlayMusic("Base.rte/Music/dBSoundworks/uwinfinal.ogg", 2, -1.0);
131-
AudioMan:QueueSilence(10);
132-
AudioMan:QueueMusicStream("Base.rte/Music/dBSoundworks/ccambient4.ogg");
128+
MusicMan:PlayDynamicSong("Generic Victory Music", "Default", true);
129+
MusicMan:PlayDynamicSong("Generic Ambient Music");
133130
end
134131
end
135132
end

Data/Base.rte/Activities/Massacre.lua

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,9 @@ function Massacre:SetupHumanPlayerBrains()
8080
-- If we can't find an unassigned brain in the scene to give each player, then force to go into editing mode to place one
8181
if not foundBrain then
8282
self.ActivityState = Activity.EDITING;
83-
AudioMan:ClearMusicQueue();
84-
AudioMan:PlayMusic("Base.rte/Music/dBSoundworks/ccambient4.ogg", -1, -1);
83+
MusicMan:PlayDynamicSong("Generic Ambient Music");
8584
else
85+
MusicMan:PlayDynamicSong("Generic Battle Music");
8686
-- Set the found brain to be the selected actor at start
8787
self:SetPlayerBrain(foundBrain, player);
8888
self:SwitchToActor(foundBrain, player, self:GetTeamOfPlayer(player));
@@ -129,22 +129,22 @@ function Massacre:EndActivity()
129129
if not self:IsPaused() then
130130
-- Play sad music if no humans are left
131131
if self:HumanBrainCount() == 0 then
132-
AudioMan:ClearMusicQueue();
133-
AudioMan:PlayMusic("Base.rte/Music/dBSoundworks/udiedfinal.ogg", 2, -1.0);
134-
AudioMan:QueueSilence(10);
135-
AudioMan:QueueMusicStream("Base.rte/Music/dBSoundworks/ccambient4.ogg");
132+
MusicMan:PlayDynamicSong("Generic Defeat Music", "Default", true);
133+
MusicMan:PlayDynamicSong("Generic Ambient Music");
136134
else
137135
-- But if humans are left, then play happy music!
138-
AudioMan:ClearMusicQueue();
139-
AudioMan:PlayMusic("Base.rte/Music/dBSoundworks/uwinfinal.ogg", 2, -1.0);
140-
AudioMan:QueueSilence(10);
141-
AudioMan:QueueMusicStream("Base.rte/Music/dBSoundworks/ccambient4.ogg");
136+
MusicMan:PlayDynamicSong("Generic Victory Music", "Default", true);
137+
MusicMan:PlayDynamicSong("Generic Ambient Music");
142138
end
143139
end
144140
end
145141

146142
function Massacre:UpdateActivity()
147143
if self.ActivityState ~= Activity.OVER and self.ActivityState ~= Activity.EDITING then
144+
if not self.musicStarted then
145+
self.musicStarted = true;
146+
MusicMan:PlayDynamicSong("Generic Battle Music", "Default", true);
147+
end
148148
for player = Activity.PLAYER_1, Activity.MAXPLAYERCOUNT - 1 do
149149
if self:PlayerActive(player) and self:PlayerHuman(player) then
150150
--Display messages.
@@ -340,5 +340,6 @@ function Massacre:UpdateActivity()
340340
end
341341
else
342342
self.startMessageTimer:Reset();
343+
self.musicStarted = false;
343344
end
344345
end

Data/Base.rte/Activities/MetaFight.lua

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -503,8 +503,7 @@ function MetaFight:StartActivity()
503503

504504
-- Starting in pregame, so play some appropriate music
505505
if self.ActivityState == Activity.PREGAME then
506-
AudioMan:ClearMusicQueue();
507-
AudioMan:PlayMusic("Base.rte/Music/dBSoundworks/ccambient4.ogg", -1, -1);
506+
MusicMan:PlayDynamicSong("Generic Ambient Music");
508507
end
509508

510509
-- Disable AI if we are editing pregame
@@ -561,23 +560,17 @@ function MetaFight:EndActivity()
561560
-- Should not clear blueprints because this wipes all placed loadouts info
562561
--SceneMan.Scene:ClearPlacedObjectSet(Scene.BLUEPRINT);
563562
-- Sad music
564-
AudioMan:ClearMusicQueue();
565-
AudioMan:PlayMusic("Base.rte/Music/dBSoundworks/udiedfinal.ogg", 2, -1.0);
566-
AudioMan:QueueSilence(10);
567-
AudioMan:QueueMusicStream("Base.rte/Music/dBSoundworks/ccambient4.ogg");
563+
MusicMan:PlayDynamicSong("Generic Defeat Music", "Default", true);
564+
MusicMan:PlayDynamicSong("Generic Ambient Music");
568565
-- Also play sad music if no humans are left
569566
elseif self:HumanBrainCount() == 0 then
570-
AudioMan:ClearMusicQueue();
571-
AudioMan:PlayMusic("Base.rte/Music/dBSoundworks/udiedfinal.ogg", 2, -1.0);
572-
AudioMan:QueueSilence(10);
573-
AudioMan:QueueMusicStream("Base.rte/Music/dBSoundworks/ccambient4.ogg");
567+
MusicMan:PlayDynamicSong("Generic Defeat Music", "Default", true);
568+
MusicMan:PlayDynamicSong("Generic Ambient Music");
574569
-- But if humans are left, then play happy music!
575570
else
576571
-- Win music!
577-
AudioMan:ClearMusicQueue();
578-
AudioMan:PlayMusic("Base.rte/Music/dBSoundworks/uwinfinal.ogg", 2, -1.0);
579-
AudioMan:QueueSilence(10);
580-
AudioMan:QueueMusicStream("Base.rte/Music/dBSoundworks/ccambient4.ogg");
572+
MusicMan:PlayDynamicSong("Generic Victory Music", "Default", true);
573+
MusicMan:PlayDynamicSong("Generic Ambient Music");
581574
end
582575
end
583576

@@ -851,12 +844,7 @@ function MetaFight:UpdateActivity()
851844
UInputMan:SetMouseValueMagnitude(0, -1);
852845
SceneMan.Scene:ResetPathFinding();
853846
-- Start the in-game music track
854-
AudioMan:ClearMusicQueue();
855-
AudioMan:PlayMusic("Base.rte/Music/dBSoundworks/cc2g.ogg", 0, -1.0);
856-
AudioMan:QueueSilence(30);
857-
AudioMan:QueueMusicStream("Base.rte/Music/Watts/Last Man.ogg");
858-
AudioMan:QueueSilence(30);
859-
AudioMan:QueueMusicStream("Base.rte/Music/dBSoundworks/cc2g.ogg");
847+
MusicMan:PlayDynamicSong("Generic Battle Music");
860848

861849
-- Find LZs for the AI teams
862850
self:DesignateLZs();

Data/Base.rte/Activities/OneManArmy.lua

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ function OneManArmy:StartNewGame()
7676
secondaryGroup = "Weapons - Secondary";
7777
end
7878
self.enemySpawnTimeLimit = 500;
79+
80+
MusicMan:PlayDynamicSong("Generic Battle Music");
7981

8082
MovableMan:OpenAllDoors(true, -1);
8183
for actor in MovableMan.AddedActors do
@@ -239,16 +241,12 @@ function OneManArmy:EndActivity()
239241
if not self:IsPaused() then
240242
--Play sad music if no humans are left
241243
if self:HumanBrainCount() == 0 then
242-
AudioMan:ClearMusicQueue();
243-
AudioMan:PlayMusic("Base.rte/Music/dBSoundworks/udiedfinal.ogg", 2, -1.0);
244-
AudioMan:QueueSilence(10);
245-
AudioMan:QueueMusicStream("Base.rte/Music/dBSoundworks/ccambient4.ogg");
244+
MusicMan:PlayDynamicSong("Generic Defeat Music", "Default", true);
245+
MusicMan:PlayDynamicSong("Generic Ambient Music");
246246
else
247247
--But if humans are left, play happy music!
248-
AudioMan:ClearMusicQueue();
249-
AudioMan:PlayMusic("Base.rte/Music/dBSoundworks/uwinfinal.ogg", 2, -1.0);
250-
AudioMan:QueueSilence(10);
251-
AudioMan:QueueMusicStream("Base.rte/Music/dBSoundworks/ccambient4.ogg");
248+
MusicMan:PlayDynamicSong("Generic Victory Music", "Default", true);
249+
MusicMan:PlayDynamicSong("Generic Ambient Music");
252250
end
253251
end
254252
end

Data/Base.rte/Activities/OneManArmyDiggers.lua

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ function OneManArmy:StartNewGame()
8080
secondaryGroup = "Tools";
8181
end
8282
self.enemySpawnTimeLimit = 500;
83+
84+
MusicMan:PlayDynamicSong("Generic Battle Music");
8385

8486
MovableMan:OpenAllDoors(true, -1);
8587
for actor in MovableMan.AddedActors do
@@ -203,16 +205,12 @@ function OneManArmy:EndActivity()
203205
if not self:IsPaused() then
204206
-- Play sad music if no humans are left
205207
if self:HumanBrainCount() == 0 then
206-
AudioMan:ClearMusicQueue();
207-
AudioMan:PlayMusic("Base.rte/Music/dBSoundworks/udiedfinal.ogg", 2, -1.0);
208-
AudioMan:QueueSilence(10);
209-
AudioMan:QueueMusicStream("Base.rte/Music/dBSoundworks/ccambient4.ogg");
208+
MusicMan:PlayDynamicSong("Generic Defeat Music", "Default", true);
209+
MusicMan:PlayDynamicSong("Generic Ambient Music");
210210
else
211211
-- But if humans are left, then play happy music!
212-
AudioMan:ClearMusicQueue();
213-
AudioMan:PlayMusic("Base.rte/Music/dBSoundworks/uwinfinal.ogg", 2, -1.0);
214-
AudioMan:QueueSilence(10);
215-
AudioMan:QueueMusicStream("Base.rte/Music/dBSoundworks/ccambient4.ogg");
212+
MusicMan:PlayDynamicSong("Generic Victory Music", "Default", true);
213+
MusicMan:PlayDynamicSong("Generic Ambient Music");
216214
end
217215
end
218216
end

Data/Base.rte/Activities/OneManArmyZeroG.lua

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ function OneManArmyZeroG:StartNewGame()
8686
self.timeDisplay = timeLimitText .. " minutes";
8787
self.enemySpawnTimeLimit = 500;
8888

89+
MusicMan:PlayDynamicSong("Generic Battle Music");
90+
8991
local automoverController = CreateActor("Invisible Automover Controller", "Base.rte");
9092
automoverController.Team = -1;
9193
automoverController:SetNumberValue("MovementSpeed", 16);
@@ -268,16 +270,12 @@ function OneManArmyZeroG:EndActivity()
268270
if not self:IsPaused() then
269271
--Play sad music if no humans are left
270272
if self:HumanBrainCount() == 0 then
271-
AudioMan:ClearMusicQueue();
272-
AudioMan:PlayMusic("Base.rte/Music/dBSoundworks/udiedfinal.ogg", 2, -1.0);
273-
AudioMan:QueueSilence(10);
274-
AudioMan:QueueMusicStream("Base.rte/Music/dBSoundworks/ccambient4.ogg");
273+
MusicMan:PlayDynamicSong("Generic Defeat Music", "Default", true);
274+
MusicMan:PlayDynamicSong("Generic Ambient Music");
275275
else
276276
--But if humans are left, play happy music!
277-
AudioMan:ClearMusicQueue();
278-
AudioMan:PlayMusic("Base.rte/Music/dBSoundworks/uwinfinal.ogg", 2, -1.0);
279-
AudioMan:QueueSilence(10);
280-
AudioMan:QueueMusicStream("Base.rte/Music/dBSoundworks/ccambient4.ogg");
277+
MusicMan:PlayDynamicSong("Generic Victory Music", "Default", true);
278+
MusicMan:PlayDynamicSong("Generic Ambient Music");
281279
end
282280
end
283281
end

0 commit comments

Comments
 (0)