phase/cutscene: fix muted audio in consecutive cutscenes

This commit is contained in:
Marcin Kurczewski 2024-02-19 10:19:38 +01:00
parent 2f8fe72e98
commit eeb7dbb54e
6 changed files with 87 additions and 86 deletions

View file

@ -128,7 +128,6 @@ sources = [
'src/game/effects/gunshot.c',
'src/game/fmv.c',
'src/game/game/game.c',
'src/game/game/game_cutscene.c',
'src/game/game/game_demo.c',
'src/game/game/game_draw.c',
'src/game/gamebuf.c',

View file

@ -14,8 +14,6 @@ GAMEFLOW_OPTION Game_Loop(void);
void Game_ProcessInput(void);
GAMEFLOW_OPTION Game_Cutscene_Start(int32_t level_num);
void Game_Demo(void);
bool Game_Demo_ProcessInput(void);

View file

@ -1,75 +0,0 @@
#include "game/game.h"
#include "config.h"
#include "game/gameflow.h"
#include "game/items.h"
#include "game/lara.h"
#include "game/lara/lara_hair.h"
#include "game/level.h"
#include "global/const.h"
#include "global/types.h"
#include "global/vars.h"
#include <stdint.h>
static void Game_Cutscene_InitialiseHair(int32_t level_num);
static void Game_Cutscene_InitialiseHair(int32_t level_num)
{
if (!g_Config.enable_braid || !g_Objects[O_HAIR].loaded) {
return;
}
GAME_OBJECT_ID lara_type = g_GameFlow.levels[level_num].lara_type;
if (lara_type == O_LARA) {
return;
}
int16_t lara_item_num = NO_ITEM;
for (int i = 0; i < g_LevelItemCount; i++) {
if (g_Items[i].object_number == lara_type) {
lara_item_num = i;
break;
}
}
if (lara_item_num == NO_ITEM) {
return;
}
Lara_InitialiseLoad(lara_item_num);
Lara_Initialise(level_num);
Lara_Hair_SetLaraType(lara_type);
Item_SwitchToObjAnim(g_LaraItem, 0, 0, lara_type);
ANIM_STRUCT *cut_anim = &g_Anims[g_LaraItem->anim_number];
g_LaraItem->current_anim_state = g_LaraItem->goal_anim_state =
g_LaraItem->required_anim_state = cut_anim->current_anim_state;
}
GAMEFLOW_OPTION Game_Cutscene_Start(const int32_t level_num)
{
if (!Level_Initialise(level_num)) {
return GF_NOP_BREAK;
}
Game_Cutscene_InitialiseHair(level_num);
for (int16_t room_num = 0; room_num < g_RoomCount; room_num++) {
if (g_RoomInfo[room_num].flipped_room >= 0) {
g_RoomInfo[g_RoomInfo[room_num].flipped_room].bound_active = 1;
}
}
g_RoomsToDrawCount = 0;
for (int16_t room_num = 0; room_num < g_RoomCount; room_num++) {
if (!g_RoomInfo[room_num].bound_active) {
if (g_RoomsToDrawCount + 1 < MAX_ROOMS_TO_DRAW) {
g_RoomsToDraw[g_RoomsToDrawCount++] = room_num;
}
}
}
g_CineFrame = 0;
return GF_NOP;
}

View file

@ -10,6 +10,7 @@
#include "game/music.h"
#include "game/objects/creatures/bacon_lara.h"
#include "game/phase/phase.h"
#include "game/phase/phase_cutscene.h"
#include "game/phase/phase_picture.h"
#include "game/phase/phase_stats.h"
#include "game/room.h"
@ -1280,13 +1281,15 @@ GameFlow_InterpretSequence(int32_t level_num, GAMEFLOW_LEVEL_TYPE level_type)
case GFS_START_CINE:
if (level_type != GFL_SAVED) {
ret = Game_Cutscene_Start((int32_t)(intptr_t)seq->data);
PHASE_CUTSCENE_DATA phase_args = {
.level_num = (int32_t)(intptr_t)seq->data,
};
Phase_Set(PHASE_CUTSCENE, &phase_args);
}
break;
case GFS_LOOP_CINE:
if (level_type != GFL_SAVED) {
Phase_Set(PHASE_CUTSCENE, NULL);
ret = Game_Loop();
}
break;
@ -1493,12 +1496,15 @@ GameFlow_StorySoFar(int32_t level_num, int32_t savegame_level)
}
break;
case GFS_START_CINE:
ret = Game_Cutscene_Start((int32_t)(intptr_t)seq->data);
case GFS_START_CINE: {
PHASE_CUTSCENE_DATA phase_args = {
.level_num = (int32_t)(intptr_t)seq->data,
};
Phase_Set(PHASE_CUTSCENE, &phase_args);
break;
}
case GFS_LOOP_CINE:
Phase_Set(PHASE_CUTSCENE, NULL);
ret = Game_Loop();
break;

View file

@ -1,28 +1,95 @@
#include "game/phase/phase_cutscene.h"
#include "config.h"
#include "game/camera.h"
#include "game/effects.h"
#include "game/game.h"
#include "game/gameflow.h"
#include "game/input.h"
#include "game/items.h"
#include "game/lara.h"
#include "game/lara/lara_hair.h"
#include "game/level.h"
#include "game/music.h"
#include "game/output.h"
#include "game/shell.h"
#include "game/sound.h"
#include "global/const.h"
#include "global/types.h"
#include "global/vars.h"
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
static const int32_t m_CinematicAnimationRate = 0x8000;
static int32_t m_FrameCount = 0;
static void Phase_Cutscene_InitialiseHair(int32_t level_num);
static void Phase_Cutscene_Start(void *arg);
static void Phase_Cutscene_End(void);
static GAMEFLOW_OPTION Phase_Cutscene_Control(int32_t nframes);
static void Game_Cutscene_Draw(void);
static void Phase_Cutscene_Draw(void);
static void Phase_Cutscene_InitialiseHair(int32_t level_num)
{
if (!g_Config.enable_braid || !g_Objects[O_HAIR].loaded) {
return;
}
GAME_OBJECT_ID lara_type = g_GameFlow.levels[level_num].lara_type;
if (lara_type == O_LARA) {
return;
}
int16_t lara_item_num = NO_ITEM;
for (int i = 0; i < g_LevelItemCount; i++) {
if (g_Items[i].object_number == lara_type) {
lara_item_num = i;
break;
}
}
if (lara_item_num == NO_ITEM) {
return;
}
Lara_InitialiseLoad(lara_item_num);
Lara_Initialise(level_num);
Lara_Hair_SetLaraType(lara_type);
Item_SwitchToObjAnim(g_LaraItem, 0, 0, lara_type);
ANIM_STRUCT *cut_anim = &g_Anims[g_LaraItem->anim_number];
g_LaraItem->current_anim_state = g_LaraItem->goal_anim_state =
g_LaraItem->required_anim_state = cut_anim->current_anim_state;
}
static void Phase_Cutscene_Start(void *arg)
{
const PHASE_CUTSCENE_DATA *data = (const PHASE_CUTSCENE_DATA *)arg;
if (!Level_Initialise(data->level_num)) {
return;
}
Phase_Cutscene_InitialiseHair(data->level_num);
for (int16_t room_num = 0; room_num < g_RoomCount; room_num++) {
if (g_RoomInfo[room_num].flipped_room >= 0) {
g_RoomInfo[g_RoomInfo[room_num].flipped_room].bound_active = 1;
}
}
g_RoomsToDrawCount = 0;
for (int16_t room_num = 0; room_num < g_RoomCount; room_num++) {
if (!g_RoomInfo[room_num].bound_active) {
if (g_RoomsToDrawCount + 1 < MAX_ROOMS_TO_DRAW) {
g_RoomsToDraw[g_RoomsToDrawCount++] = room_num;
}
}
}
g_CineFrame = 0;
}
static void Phase_Cutscene_End(void)
{
@ -67,7 +134,7 @@ static void Phase_Cutscene_Draw(void)
}
PHASER g_CutscenePhaser = {
.start = NULL,
.start = Phase_Cutscene_Start,
.end = Phase_Cutscene_End,
.control = Phase_Cutscene_Control,
.draw = Phase_Cutscene_Draw,

View file

@ -2,4 +2,10 @@
#include "game/phase/phase.h"
#include <stdint.h>
typedef struct PHASE_CUTSCENE_DATA {
int32_t level_num;
} PHASE_CUTSCENE_DATA;
extern PHASER g_CutscenePhaser;