diff --git a/assets/test_chambers/test_chamber_00/test_chamber_00.yaml b/assets/test_chambers/test_chamber_00/test_chamber_00.yaml index 5eeac66..5aab1db 100644 --- a/assets/test_chambers/test_chamber_00/test_chamber_00.yaml +++ b/assets/test_chambers/test_chamber_00/test_chamber_00.yaml @@ -2,7 +2,7 @@ operators: [] cutscenes: INTRO: - - play_sound AMBIENCE_BASE 0.2 0.5 + - q_sound AMBIENCE_BASE CH_AMBIENT SubtitleKeyNone 0.55 - play_animation player player_intro - play_animation glass_cover_0 glass_cover_0_open - play_animation glass_cover_1 glass_cover_1_open diff --git a/assets/test_chambers/test_chamber_01/test_chamber_01.yaml b/assets/test_chambers/test_chamber_01/test_chamber_01.yaml index 877e1c7..bfc6d09 100644 --- a/assets/test_chambers/test_chamber_01/test_chamber_01.yaml +++ b/assets/test_chambers/test_chamber_01/test_chamber_01.yaml @@ -2,7 +2,7 @@ operators: [] cutscenes: START: - - play_sound AMBIENCE_BASE 0.2 0.5 + - q_sound AMBIENCE_BASE CH_AMBIENT SubtitleKeyNone 0.55 - delay 1 - start_cutscene portal_loop - set_signal FIRST_ELEVATOR diff --git a/assets/test_chambers/test_chamber_02/test_chamber_02.yaml b/assets/test_chambers/test_chamber_02/test_chamber_02.yaml index cc1b530..9c117e0 100644 --- a/assets/test_chambers/test_chamber_02/test_chamber_02.yaml +++ b/assets/test_chambers/test_chamber_02/test_chamber_02.yaml @@ -1,6 +1,6 @@ cutscenes: INTRO: - - play_sound AMBIENCE_BASE 0.2 0.5 + - q_sound AMBIENCE_BASE CH_AMBIENT SubtitleKeyNone 0.55 - q_sound SOUNDS_02_PART1_ENTRY_1 CH_GLADOS PORTAL_02_PART1_ENTRY_1 - q_sound SOUNDS_02_PART1_ENTRY_2 CH_GLADOS PORTAL_02_PART1_ENTRY_2 - delay 2 diff --git a/assets/test_chambers/test_chamber_03/test_chamber_03.yaml b/assets/test_chambers/test_chamber_03/test_chamber_03.yaml index 0093b80..7a0ce9f 100644 --- a/assets/test_chambers/test_chamber_03/test_chamber_03.yaml +++ b/assets/test_chambers/test_chamber_03/test_chamber_03.yaml @@ -17,7 +17,7 @@ cutscenes: - wait_for_signal horizontal_activiate 2 - q_sound 03_PART2_PLATFORM_ACTIVATED_1 CH_GLADOS PORTAL_03_PART2_PLATFORM_ACTIVATED_1 INTRO: - - play_sound AMBIENCE_BASE 0.2 0.5 + - q_sound AMBIENCE_BASE CH_AMBIENT SubtitleKeyNone 0.55 - save_checkpoint 0 - open_portal ground_portal 0 - q_sound SOUNDS_03_PART1_ENTRY_1 CH_GLADOS PORTAL_03_PART1_ENTRY_1 diff --git a/assets/test_chambers/test_chamber_04/test_chamber_04.yaml b/assets/test_chambers/test_chamber_04/test_chamber_04.yaml index 6621bda..e3c44cc 100644 --- a/assets/test_chambers/test_chamber_04/test_chamber_04.yaml +++ b/assets/test_chambers/test_chamber_04/test_chamber_04.yaml @@ -2,7 +2,7 @@ cutscenes: SUCCESS: - q_sound SOUNDS_04_PART1_SUCCESS_1 CH_GLADOS PORTAL_04_PART1_SUCCESS_1 INTRO_CUTSCENE: - - play_sound AMBIENCE_BASE 0.2 0.5 + - q_sound AMBIENCE_BASE CH_AMBIENT SubtitleKeyNone 0.55 - q_sound SOUNDS_04_PART1_ENTRY_1 CH_GLADOS PORTAL_04_PART1_ENTRY_1 - wait_for_channel CH_GLADOS - q_sound PORTAL_PROCEDURAL_JIGGLE_BONE CH_MUSIC SubtitleKeyNone diff --git a/assets/test_chambers/test_chamber_05/test_chamber_05.yaml b/assets/test_chambers/test_chamber_05/test_chamber_05.yaml index 2f3c0f3..733d4c4 100644 --- a/assets/test_chambers/test_chamber_05/test_chamber_05.yaml +++ b/assets/test_chambers/test_chamber_05/test_chamber_05.yaml @@ -2,7 +2,7 @@ operators: [] cutscenes: INTRO_CUTSCENE: - - play_sound AMBIENCE_BASE 0.2 0.5 + - q_sound AMBIENCE_BASE CH_AMBIENT SubtitleKeyNone 0.55 - set_signal cube_dropper - open_portal portal_0 0 - q_sound SOUNDS_05_PART1_ENTRY_1 CH_GLADOS PORTAL_05_PART1_ENTRY_1 diff --git a/assets/test_chambers/test_chamber_06/test_chamber_06.yaml b/assets/test_chambers/test_chamber_06/test_chamber_06.yaml index 2900f56..d19c478 100644 --- a/assets/test_chambers/test_chamber_06/test_chamber_06.yaml +++ b/assets/test_chambers/test_chamber_06/test_chamber_06.yaml @@ -8,7 +8,7 @@ cutscenes: - play_animation piston_top piston_top_0 - play_animation piston_bottom piston_bottom_0 FIRST_ROOM: - - play_sound AMBIENCE_BASE 0.2 0.5 + - q_sound AMBIENCE_BASE CH_AMBIENT SubtitleKeyNone 0.55 - q_sound SOUNDS_06_PART1_ENTRY_1 CH_GLADOS PORTAL_06_PART1_ENTRY_1 - delay 2 - rumble 2 diff --git a/assets/test_chambers/test_chamber_07/test_chamber_07.yaml b/assets/test_chambers/test_chamber_07/test_chamber_07.yaml index 2b0c571..e075ff3 100644 --- a/assets/test_chambers/test_chamber_07/test_chamber_07.yaml +++ b/assets/test_chambers/test_chamber_07/test_chamber_07.yaml @@ -21,7 +21,7 @@ cutscenes: DROWN_PLAYER: - kill_player water START: - - play_sound AMBIENCE_BASE 0.2 0.5 + - q_sound AMBIENCE_BASE CH_AMBIENT SubtitleKeyNone 0.55 - delay 1 - start_cutscene portal_loop - start_cutscene platform_ferry diff --git a/src/levels/cutscene_runner.c b/src/levels/cutscene_runner.c index fd90791..7d902de 100644 --- a/src/levels/cutscene_runner.c +++ b/src/levels/cutscene_runner.c @@ -41,10 +41,15 @@ struct QueuedSound* gCutsceneNextFreeSound; struct QueuedSound* gCutsceneSoundQueues[CH_COUNT]; ALSndId gCutsceneCurrentSound[CH_COUNT]; +u16 gCutsceneCurrentSoundId[CH_COUNT]; +u16 gCutsceneCurrentSubtitleId[CH_COUNT]; +float gCutsceneCurrentVolume[CH_COUNT]; + float gCutsceneChannelPitch[CH_COUNT] = { [CH_GLADOS] = 0.5f, [CH_MUSIC] = 0.5f, + [CH_AMBIENT] = 0.5f }; void cutsceneRunnerCancel(struct CutsceneRunner* runner); @@ -62,6 +67,9 @@ void cutsceneRunnerReset() { for (int i = 0; i < CH_COUNT; ++i) { gCutsceneSoundQueues[i] = NULL; gCutsceneCurrentSound[i] = SOUND_ID_NONE; + gCutsceneCurrentSoundId[i] = SOUND_ID_NONE; + gCutsceneCurrentSubtitleId[i] = SubtitleKeyNone; + gCutsceneCurrentVolume[i] = 0.0f; } struct CutsceneRunner* current = gRunningCutscenes; @@ -463,6 +471,8 @@ void cutscenesUpdateSounds() { subtitleType = SubtitleTypeCloseCaption; }else if (i == CH_MUSIC){ soundType = SoundTypeMusic; + }else if (i == CH_AMBIENT){ + soundType = SoundTypeAll; } if (!soundPlayerIsPlaying(gCutsceneCurrentSound[i])) { @@ -470,7 +480,12 @@ void cutscenesUpdateSounds() { struct QueuedSound* curr = gCutsceneSoundQueues[i]; gCutsceneCurrentSound[i] = soundPlayerPlay(curr->soundId, curr->volume, gCutsceneChannelPitch[i], NULL, NULL, soundType); - hudShowSubtitle(&gScene.hud, curr->subtitleId, subtitleType); + gCutsceneCurrentSoundId[i] = curr->soundId; + gCutsceneCurrentSubtitleId[i] = curr->subtitleId; + gCutsceneCurrentVolume[i] = curr->volume; + if (curr->subtitleId != SubtitleKeyNone){ + hudShowSubtitle(&gScene.hud, curr->subtitleId, subtitleType); + } gCutsceneSoundQueues[i] = curr->next; @@ -483,6 +498,9 @@ void cutscenesUpdateSounds() { } gCutsceneCurrentSound[i] = SOUND_ID_NONE; + gCutsceneCurrentSoundId[i] = SOUND_ID_NONE; + gCutsceneCurrentSubtitleId[i] = SubtitleKeyNone; + gCutsceneCurrentVolume[i] = 0.0f; } } } @@ -609,6 +627,20 @@ void cutsceneSerializeWrite(struct Serializer* serializer, SerializeAction actio action(serializer, &gTriggeredCutscenes, sizeof(gTriggeredCutscenes)); + for (int i = 0; i < CH_COUNT; ++i) { + s16 curr = gCutsceneCurrentSound[i]; + action(serializer, &curr, sizeof(curr)); + + u16 currId = gCutsceneCurrentSoundId[i]; + action(serializer, &currId, sizeof(currId)); + + u16 subtitleId = gCutsceneCurrentSubtitleId[i]; + action(serializer, &subtitleId, sizeof(subtitleId)); + + u8 volume = (u8)(clampf(gCutsceneCurrentVolume[i], 0.0f, 1.0f) * 255.0f); + action(serializer, &volume, sizeof(volume)); + } + for (int i = 0; i < CH_COUNT; ++i) { struct QueuedSound* curr = gCutsceneSoundQueues[i]; @@ -639,6 +671,27 @@ void cutsceneSerializeRead(struct Serializer* serializer) { serializeRead(serializer, &gTriggeredCutscenes, sizeof (gTriggeredCutscenes)); + for (int i = 0; i < CH_COUNT; ++i) { + s16 curr; + serializeRead(serializer, &curr, sizeof(curr)); + gCutsceneCurrentSound[i] = curr; + + u16 currId; + serializeRead(serializer, &currId, sizeof(currId)); + gCutsceneCurrentSoundId[i] = currId; + + u16 subtitleId; + serializeRead(serializer, &subtitleId, sizeof(subtitleId)); + gCutsceneCurrentSubtitleId[i] = subtitleId; + + u8 volume; + serializeRead(serializer, &volume, sizeof(volume)); + gCutsceneCurrentVolume[i] = volume * (1.0f / 255.0f); + if (curr != SOUND_ID_NONE){ + cutsceneQueueSound(gCutsceneCurrentSoundId[i], gCutsceneCurrentVolume[i], i, gCutsceneCurrentSubtitleId[i]); + } + } + for (int i = 0; i < CH_COUNT; ++i) { s16 nextId; serializeRead(serializer, &nextId, sizeof(nextId)); diff --git a/src/levels/level_definition.h b/src/levels/level_definition.h index 83abef0..fd0a701 100644 --- a/src/levels/level_definition.h +++ b/src/levels/level_definition.h @@ -69,8 +69,9 @@ enum CutscenePromptType { #define CH_NONE 0xFF #define CH_GLADOS 0 #define CH_MUSIC 1 +#define CH_AMBIENT 2 -#define CH_COUNT 2 +#define CH_COUNT 3 struct CutsceneStep { enum CutsceneStepType type;