From 473febad5519614be18d65237bccb1351e0c8b24 Mon Sep 17 00:00:00 2001 From: Fabian Greffrath Date: Fri, 4 Nov 2022 11:29:14 +0100 Subject: [PATCH] support face gib animations as in the 3DO/Jaguar/PSX ports (#790) * initial support for 6 STFXDTH frames with a 10 tic timing * support 5 or 6 frames, bind to player's xdeathstate * `state` is at least zero, if `have_xdthfaces` is zero, we will return `ST_XDTHFACE - 1` which is equal to `ST_DEADFACE` * adapt to the canonical naming scheme * better safe than sorry * back to the old naming scheme * support up to 9 frames * add comments --- src/st_stuff.c | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/src/st_stuff.c b/src/st_stuff.c index 4a8b2a38..9cc9994d 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -83,9 +83,10 @@ extern boolean inhelpscreens; (ST_NUMSTRAIGHTFACES+ST_NUMTURNFACES+ST_NUMSPECIALFACES) #define ST_NUMEXTRAFACES 2 +#define ST_NUMXDTHFACES 9 #define ST_NUMFACES \ - (ST_FACESTRIDE*ST_NUMPAINFACES+ST_NUMEXTRAFACES) + (ST_FACESTRIDE*ST_NUMPAINFACES+ST_NUMEXTRAFACES+ST_NUMXDTHFACES) #define ST_TURNOFFSET (ST_NUMSTRAIGHTFACES) #define ST_OUCHOFFSET (ST_TURNOFFSET + ST_NUMTURNFACES) @@ -93,6 +94,7 @@ extern boolean inhelpscreens; #define ST_RAMPAGEOFFSET (ST_EVILGRINOFFSET + 1) #define ST_GODFACE (ST_NUMPAINFACES*ST_FACESTRIDE) #define ST_DEADFACE (ST_GODFACE+1) +#define ST_XDTHFACE (ST_DEADFACE+1) #define ST_FACESX 143 #define ST_FACESY 168 @@ -254,6 +256,7 @@ static patch_t *keys[NUMCARDS+3]; // face status patches static patch_t *faces[ST_NUMFACES]; +static int have_xdthfaces; // face background static patch_t *faceback[MAXPLAYERS]; // killough 3/7/98: make array @@ -520,6 +523,19 @@ int ST_calcPainOffset(void) // dead > evil grin > turned head > straight ahead // +static int ST_DeadFace(void) +{ + const int state = (plyr->mo->state - states) - mobjinfo[plyr->mo->type].xdeathstate; + + // [FG] support face gib animations as in the 3DO/Jaguar/PSX ports + if (have_xdthfaces && state >= 0) + { + return ST_XDTHFACE + MIN(state, have_xdthfaces - 1); + } + + return ST_DEADFACE; +} + void ST_updateFaceWidget(void) { int i; @@ -535,7 +551,7 @@ void ST_updateFaceWidget(void) if (!plyr->health) { priority = 9; - st_faceindex = ST_DEADFACE; + st_faceindex = ST_DeadFace(); st_facecount = 1; } } @@ -1044,6 +1060,18 @@ void ST_loadGraphics(void) } faces[facenum++] = W_CacheLumpName("STFGOD0", PU_STATIC); faces[facenum++] = W_CacheLumpName("STFDEAD0", PU_STATIC); + + // [FG] support face gib animations as in the 3DO/Jaguar/PSX ports + for (i = 0; i < ST_NUMXDTHFACES; i++) + { + sprintf(namebuf, "STFXDTH%d0", i); + + if (W_CheckNumForName(namebuf) != -1) + faces[facenum++] = W_CacheLumpName(namebuf, PU_STATIC); + else + break; + } + have_xdthfaces = i; } void ST_loadData(void) @@ -1084,7 +1112,8 @@ void ST_unloadGraphics(void) Z_ChangeTag(faceback[i], PU_CACHE); for (i=0;i