mirror of
https://github.com/LostArtefacts/TRX.git
synced 2025-05-09 12:07:48 +03:00
phase/cutscene: fix muted audio in consecutive cutscenes
This commit is contained in:
parent
2f8fe72e98
commit
eeb7dbb54e
6 changed files with 87 additions and 86 deletions
|
@ -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',
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue