Files
RustRaptor/raptor/src/movie.cpp
T
raptorreplica f7c9b7a02d Vendor raptor source files (was embedded gitlink)
Tree vendored at upstream 0019c5dd; origin + license recorded in
raptor/VENDOR.txt. Windows SDL dev packages excluded via .gitignore.
2026-08-25 22:08:42 +10:00

198 lines
4.7 KiB
C++

#include <string.h>
#include "common.h"
#include "rap.h"
#include "movie.h"
#include "fx.h"
#include "gfxapi.h"
#include "imsapi.h"
#include "glbapi.h"
#include "i_video.h"
#include "kbdapi.h"
int back_patch = -1;
/*************************************************************************
MOVIE_BPatch() Plays Sound FX in background for one anim
*************************************************************************/
void
MOVIE_BPatch(
int soundfx
)
{
back_patch = soundfx;
SND_Patch(back_patch, 127);
}
/*************************************************************************
MOVIE_ShowFrame () - Shows an animation frame
*************************************************************************/
void
MOVIE_ShowFrame(
ANIMLINE *inpic // INPUT : pointer to animpic
)
{
if (inpic)
{
ANIM_Render(inpic);
GFX_MarkUpdate(0, 0, 320, 200);
}
}
/*************************************************************************
MOVIE_Play () - Playes an Animation
*************************************************************************/
int
MOVIE_Play(
FRAME *frame, // INPUT : pointer to array of frame defs
int numplay, // INPUT : number of times to play
char *palette // INPUT : pointer to palette
)
{
int loop, hold;
int flag = 1;
int opt = K_OK;
char fill;
char *pic;
FRAME *curfld;
memset(displaybuffer, 0, 64000);
curfld = frame;
IMS_StartAck();
while (1)
{
I_GetEvent();
pic = (char *)GLB_GetItem(curfld->item);
if (flag)
{
fill = pic[0];
memset(displaybuffer, fill, 64000);
pic++;
}
switch (curfld->startf)
{
case M_NORM:
default:
MOVIE_ShowFrame((ANIMLINE*)pic);
GFX_WaitUpdate(curfld->framerate);
break;
case M_FADEOUT:
GFX_FadeOut(curfld->red, curfld->green, curfld->blue, curfld->startsteps);
[[fallthrough]];
case M_ERASE:
memset(displaybuffer, 0, 64000);
GFX_MarkUpdate(0, 0, 320, 200);
GFX_DisplayUpdate();
break;
case M_FADEIN:
if (flag)
{
GFX_FadeOut(0, 0, 0, 2);
flag = 0;
}
MOVIE_ShowFrame((ANIMLINE*)pic);
GFX_WaitUpdate(curfld->framerate);
GFX_FadeIn(palette, curfld->startsteps);
break;
}
if (curfld->holdframe)
{
for (loop = 0; loop < curfld->holdframe; loop++)
{
hold = GFX_GetFrameCount();
while (GFX_GetFrameCount() == hold)
{
if (!SND_IsPatchPlaying(back_patch))
SND_Patch(back_patch, 127);
}
}
}
else
{
if (back_patch != -1)
{
if (!SND_IsPatchPlaying(back_patch))
SND_Patch(back_patch, 127);
}
}
if (curfld->soundfx != -1)
{
SND_Patch(curfld->soundfx, curfld->fx_xpos);
}
switch (curfld->endf)
{
case M_ERASE:
memset(displaybuffer, 0, 64000);
GFX_MarkUpdate(0, 0, 320, 200);
GFX_DisplayUpdate();
break;
case M_FADEOUT:
GFX_FadeOut(curfld->red, curfld->green, curfld->blue, curfld->endsteps);
break;
case M_FADEIN:
GFX_FadeIn(palette, curfld->startsteps);
break;
case M_PALETTE:
GFX_SetPalette(palette, 0);
break;
}
GLB_FreeItem(curfld->item);
if (!curfld->numframes)
{
if (--numplay)
{
memset(displaybuffer, 0, 64000);
curfld = frame;
flag = 1;
}
else
break;
}
else
{
if (IMS_CheckAck())
{
IMS_StartAck();
opt = K_SKIPALL;
break;
}
flag = 0;
curfld++;
}
}
if (opt)
{
KBD_Clear();
GFX_FadeOut(0, 0, 0, 16);
memset(displaybuffer, 0, 64000);
GFX_MarkUpdate(0, 0, 320, 200);
GFX_DisplayUpdate();
GFX_SetPalette(palette, 0);
}
if (back_patch != -1)
{
SND_StopPatch(back_patch);
back_patch = -1;
}
return opt;
}