From 03049db837c91a0439e5cc7c1ca22ee7a4a0fee1 Mon Sep 17 00:00:00 2001 From: toaster Date: Fri, 7 Apr 2023 21:01:36 +0100 Subject: [PATCH] UFO Catchet glass ball Preliminary offset, no effects, but closer to complete visually. --- src/deh_tables.c | 2 ++ src/info.c | 4 ++++ src/info.h | 4 ++++ src/objects/ufo.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 57 insertions(+), 1 deletion(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index 764bf9742..bdb74b55b 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -4562,6 +4562,8 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_SPECIAL_UFO_POD", "S_SPECIAL_UFO_OVERLAY", + "S_SPECIAL_UFO_GLASS", + "S_SPECIAL_UFO_GLASS_UNDER", "S_SPECIAL_UFO_ARM", "S_SPECIAL_UFO_STEM", diff --git a/src/info.c b/src/info.c index e2c00bd88..253baa581 100644 --- a/src/info.c +++ b/src/info.c @@ -795,6 +795,8 @@ char sprnames[NUMSPRITES + 1][5] = "UFOB", "UFOA", "UFOS", + "SSCA", + "SSCB", "UQMK", @@ -5190,6 +5192,8 @@ state_t states[NUMSTATES] = {SPR_UFOB, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SPECIAL_UFO_POD {SPR_UFOB, 1|FF_FULLBRIGHT|FF_ANIMATE, -1, {NULL}, 1, 1, S_NULL}, // S_SPECIAL_UFO_OVERLAY + {SPR_SSCA, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SPECIAL_UFO_GLASS + {SPR_SSCB, FF_SUBTRACT, -1, {NULL}, 0, 0, S_NULL}, // S_SPECIAL_UFO_GLASS_UNDER {SPR_UFOA, FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_NULL}, // S_SPECIAL_UFO_ARM {SPR_UFOS, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SPECIAL_UFO_STEM diff --git a/src/info.h b/src/info.h index 47ce02a7e..6c9d7c773 100644 --- a/src/info.h +++ b/src/info.h @@ -1346,6 +1346,8 @@ typedef enum sprite SPR_UFOB, SPR_UFOA, SPR_UFOS, + SPR_SSCA, + SPR_SSCB, SPR_UQMK, @@ -5616,6 +5618,8 @@ typedef enum state S_SPECIAL_UFO_POD, S_SPECIAL_UFO_OVERLAY, + S_SPECIAL_UFO_GLASS, + S_SPECIAL_UFO_GLASS_UNDER, S_SPECIAL_UFO_ARM, S_SPECIAL_UFO_STEM, diff --git a/src/objects/ufo.c b/src/objects/ufo.c index 4aa9b949f..ef71da4c0 100644 --- a/src/objects/ufo.c +++ b/src/objects/ufo.c @@ -54,6 +54,8 @@ enum { UFO_PIECE_TYPE_POD, + UFO_PIECE_TYPE_GLASS, + UFO_PIECE_TYPE_GLASS_UNDER, UFO_PIECE_TYPE_ARM, UFO_PIECE_TYPE_STEM, }; @@ -544,6 +546,8 @@ static void UFOKillPiece(mobj_t *piece) switch (ufo_piece_type(piece)) { + case UFO_PIECE_TYPE_GLASS: + case UFO_PIECE_TYPE_GLASS_UNDER: case UFO_PIECE_TYPE_STEM: { piece->tics = 1; @@ -794,18 +798,25 @@ void Obj_UFOPieceThink(mobj_t *piece) return; } - piece->destscale = 3 * ufo->destscale / 2; piece->scalespeed = ufo->scalespeed; switch (ufo_piece_type(piece)) { case UFO_PIECE_TYPE_POD: { + piece->destscale = 3 * ufo->destscale / 2; UFOMoveTo(piece, ufo->x, ufo->y, ufo->z + (132 * piece->scale)); if (S_SoundPlaying(ufo, sfx_clawzm) && ufo_speed(ufo) > 70*FRACUNIT) SpawnUFOSpeedLines(piece); break; } + case UFO_PIECE_TYPE_GLASS: + case UFO_PIECE_TYPE_GLASS_UNDER: + { + piece->destscale = ufo->destscale; + UFOMoveTo(piece, ufo->x, ufo->y, ufo->z); + break; + } case UFO_PIECE_TYPE_ARM: { fixed_t dis = (88 * piece->scale); @@ -813,6 +824,7 @@ void Obj_UFOPieceThink(mobj_t *piece) fixed_t x = ufo->x - FixedMul(dis, FINECOSINE(piece->angle >> ANGLETOFINESHIFT)); fixed_t y = ufo->y - FixedMul(dis, FINESINE(piece->angle >> ANGLETOFINESHIFT)); + piece->destscale = 3 * ufo->destscale / 2; UFOMoveTo(piece, x, y, ufo->z + (24 * piece->scale)); piece->angle -= FixedMul(ANG2, FixedDiv(ufo_speed(ufo), UFO_BASE_SPEED)); @@ -823,6 +835,7 @@ void Obj_UFOPieceThink(mobj_t *piece) fixed_t stemZ = ufo->z + (294 * piece->scale); fixed_t sc = FixedDiv(FixedDiv(ufo->ceilingz - stemZ, piece->scale), 15 * FRACUNIT); + piece->destscale = 3 * ufo->destscale / 2; UFOMoveTo(piece, ufo->x, ufo->y, stemZ); if (sc > 0) { @@ -961,6 +974,39 @@ static mobj_t *InitSpecialUFO(waypoint_t *start) P_SetTarget(&ufo_pieces(ufo), piece); prevPiece = piece; + // Next, the glass ball. + { + piece = P_SpawnMobjFromMobj(ufo, 0, 0, 0, MT_SPECIAL_UFO_PIECE); + P_SetTarget(&ufo_piece_owner(piece), ufo); + + P_SetMobjState(piece, S_SPECIAL_UFO_GLASS); + ufo_piece_type(piece) = UFO_PIECE_TYPE_GLASS; + + /*overlay = P_SpawnMobjFromMobj(piece, 0, 0, 0, MT_OVERLAY); + P_SetTarget(&overlay->target, piece); + P_SetMobjState(overlay, S_SPECIAL_UFO_GLASS_UNDER); + overlay->dispoffset = -20;*/ + + P_SetTarget(&ufo_piece_next(prevPiece), piece); + P_SetTarget(&ufo_piece_prev(piece), prevPiece); + prevPiece = piece; + } + + // This SHOULD have been an MT_OVERLAY... but it simply doesn't + // draw-order stack with the Emerald correctly any other way. + { + piece = P_SpawnMobjFromMobj(ufo, 0, 0, 0, MT_SPECIAL_UFO_PIECE); + P_SetTarget(&ufo_piece_owner(piece), ufo); + + P_SetMobjState(piece, S_SPECIAL_UFO_GLASS_UNDER); + ufo_piece_type(piece) = UFO_PIECE_TYPE_GLASS_UNDER; + piece->dispoffset = -2; + + P_SetTarget(&ufo_piece_next(prevPiece), piece); + P_SetTarget(&ufo_piece_prev(piece), prevPiece); + prevPiece = piece; + } + // Add the catcher arms. for (i = 0; i < UFO_NUMARMS; i++) {