UFO Catchet glass ball

Preliminary offset, no effects, but closer to complete visually.
This commit is contained in:
toaster 2023-04-07 21:01:36 +01:00
parent 8a3d225790
commit 03049db837
4 changed files with 57 additions and 1 deletions

View file

@ -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",

View file

@ -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

View file

@ -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,

View file

@ -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++)
{