UFO beam spawning behavior

- Spawned from underneath the UFO and is thrusted downwards
- Is spawned as splats instead of papersprites
- Colorized to sapphire
- Despawns on any ground contact
This commit is contained in:
SteelT 2023-06-29 11:54:18 -04:00 committed by James R
parent 275358e394
commit bf394f1f38
6 changed files with 69 additions and 2 deletions

View file

@ -4590,6 +4590,8 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
"S_BATTLEUFO", "S_BATTLEUFO",
"S_BATTLEUFO_LEG", "S_BATTLEUFO_LEG",
"S_BATTLEUFO_DIE", "S_BATTLEUFO_DIE",
"S_BATTLEUFO_BEAM1",
"S_BATTLEUFO_BEAM2",
"S_POWERUP_AURA", "S_POWERUP_AURA",
}; };
@ -5727,6 +5729,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
"MT_BATTLEUFO_SPAWNER", "MT_BATTLEUFO_SPAWNER",
"MT_BATTLEUFO", "MT_BATTLEUFO",
"MT_BATTLEUFO_LEG", "MT_BATTLEUFO_LEG",
"MT_BATTLEUFO_BEAM",
"MT_POWERUP_AURA", "MT_POWERUP_AURA",
}; };

View file

@ -5264,6 +5264,8 @@ state_t states[NUMSTATES] =
{SPR_BUFO, 0, -1, {A_SetScale}, 3*FRACUNIT/2 , 0, S_NULL}, // S_BATTLEUFO {SPR_BUFO, 0, -1, {A_SetScale}, 3*FRACUNIT/2 , 0, S_NULL}, // S_BATTLEUFO
{SPR_BUFO, 1, -1, {A_SetScale}, 2*FRACUNIT/2, 0, S_NULL}, // S_BATTLEUFO_LEG {SPR_BUFO, 1, -1, {A_SetScale}, 2*FRACUNIT/2, 0, S_NULL}, // S_BATTLEUFO_LEG
{SPR_BUFO, 0, 4, {A_BossScream}, 0, MT_EXPLODE, S_BATTLEUFO_DIE}, // S_BATTLEUFO_DIE {SPR_BUFO, 0, 4, {A_BossScream}, 0, MT_EXPLODE, S_BATTLEUFO_DIE}, // S_BATTLEUFO_DIE
{SPR_DEZL, 1|FF_ANIMATE, 15, {NULL}, 2, 5, S_BATTLEUFO_BEAM2}, // S_BATTLEUFO_BEAM1
{SPR_DEZL, 3, -1, {NULL}, 0, 0, S_NULL}, // S_BATTLEUFO_BEAM2
{SPR_RBOW, FF_PAPERSPRITE|FF_ADD|FF_FULLBRIGHT|FF_ANIMATE, -1, {NULL}, 14, 2, S_NULL}, // S_POWERUP_AURA {SPR_RBOW, FF_PAPERSPRITE|FF_ADD|FF_FULLBRIGHT|FF_ANIMATE, -1, {NULL}, 14, 2, S_NULL}, // S_POWERUP_AURA
}; };
@ -22881,7 +22883,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP, // flags MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP, // flags
S_NULL // raisestate S_NULL // raisestate
}, },
{ // MT_SIGNSPARKLE { // MT_SIGNSPARKLE
-1, // doomednum -1, // doomednum
S_SIGNSPARK1, // spawnstate S_SIGNSPARK1, // spawnstate
@ -29988,6 +29990,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate S_NULL // raisestate
}, },
{ // MT_BATTLEUFO_BEAM
-1, // doomednum
S_BATTLEUFO_BEAM1, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
8, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_NULL, // deathstate
S_NULL, // xdeathstate
sfx_None, // deathsound
-(FRACUNIT/2), // speed
64*FRACUNIT, // radius
55*FRACUNIT, // height
0, // display offset
0, // mass
0, // damage
sfx_None, // activesound
MF_NOGRAVITY|MF_NOCLIP|MF_DONTENCOREMAP, // flags
S_NULL // raisestate
},
{ // MT_POWERUP_AURA { // MT_POWERUP_AURA
-1, // doomednum -1, // doomednum
S_POWERUP_AURA, // spawnstate S_POWERUP_AURA, // spawnstate

View file

@ -5693,6 +5693,8 @@ typedef enum state
S_BATTLEUFO, S_BATTLEUFO,
S_BATTLEUFO_LEG, S_BATTLEUFO_LEG,
S_BATTLEUFO_DIE, S_BATTLEUFO_DIE,
S_BATTLEUFO_BEAM1,
S_BATTLEUFO_BEAM2,
S_POWERUP_AURA, S_POWERUP_AURA,
@ -6849,6 +6851,7 @@ typedef enum mobj_type
MT_BATTLEUFO_SPAWNER, MT_BATTLEUFO_SPAWNER,
MT_BATTLEUFO, MT_BATTLEUFO,
MT_BATTLEUFO_LEG, MT_BATTLEUFO_LEG,
MT_BATTLEUFO_BEAM,
MT_POWERUP_AURA, MT_POWERUP_AURA,

View file

@ -171,6 +171,7 @@ void Obj_UnlinkBattleUFOSpawner(mobj_t *spawner);
void Obj_SpawnBattleUFOFromSpawner(void); void Obj_SpawnBattleUFOFromSpawner(void);
INT32 Obj_GetFirstBattleUFOSpawnerID(void); INT32 Obj_GetFirstBattleUFOSpawnerID(void);
void Obj_ResetUFOSpawners(void); void Obj_ResetUFOSpawners(void);
void Obj_BattleUFOBeamThink(mobj_t *beam);
/* Power-Up Aura */ /* Power-Up Aura */
void Obj_SpawnPowerUpAura(player_t* player); void Obj_SpawnPowerUpAura(player_t* player);

View file

@ -29,6 +29,15 @@ struct UFO : mobj_t
{ {
Spawner* spawner() const { return static_cast<Spawner*>(ufo_spawner(this)); } Spawner* spawner() const { return static_cast<Spawner*>(ufo_spawner(this)); }
void spawner(Spawner* n) { P_SetTarget(&ufo_spawner(this), n); } void spawner(Spawner* n) { P_SetTarget(&ufo_spawner(this), n); }
void spawn_beam()
{
mobj_t *x;
x = P_SpawnMobjFromMobj(this, 0, 0, this->z - this->height, MT_BATTLEUFO_BEAM);
x->renderflags |= RF_FLOORSPRITE|RF_NOSPLATBILLBOARD|RF_SLOPESPLAT|RF_NOSPLATROLLANGLE;
x->colorized = true;
x->color = SKINCOLOR_SAPPHIRE;
}
}; };
struct SpawnerCompare struct SpawnerCompare
@ -109,12 +118,19 @@ SpawnerList g_spawners;
}; // namespace }; // namespace
void Obj_BattleUFOThink(mobj_t *ufo) void Obj_BattleUFOThink(mobj_t *mobj)
{ {
UFO* ufo = static_cast<UFO*>(mobj);
// Copied and slightly modified from k_kart.c // Copied and slightly modified from k_kart.c
fixed_t sine = FixedMul(ufo->scale, BATTLEUFO_BOB_AMP * FINESINE((((M_TAU_FIXED * BATTLEUFO_BOB_SPEED) * leveltime) >> ANGLETOFINESHIFT) & FINEMASK)); fixed_t sine = FixedMul(ufo->scale, BATTLEUFO_BOB_AMP * FINESINE((((M_TAU_FIXED * BATTLEUFO_BOB_SPEED) * leveltime) >> ANGLETOFINESHIFT) & FINEMASK));
fixed_t targz = FixedMul(ufo->scale, sine) * P_MobjFlip(ufo); fixed_t targz = FixedMul(ufo->scale, sine) * P_MobjFlip(ufo);
ufo->momz = targz; ufo->momz = targz;
if ((leveltime/2) & 1)
{
ufo->spawn_beam();
}
} }
void Obj_BattleUFODeath(mobj_t *mobj) void Obj_BattleUFODeath(mobj_t *mobj)
@ -201,3 +217,13 @@ void Obj_ResetUFOSpawners(void)
{ {
g_spawners = {}; g_spawners = {};
} }
void Obj_BattleUFOBeamThink(mobj_t *beam)
{
P_SetObjectMomZ(beam, beam->info->speed, true);
if (P_IsObjectOnGround(beam))
{
P_RemoveMobj(beam);
}
}

View file

@ -8446,6 +8446,11 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
Obj_BattleUFOLegThink(mobj); Obj_BattleUFOLegThink(mobj);
break; break;
} }
case MT_BATTLEUFO_BEAM:
{
Obj_BattleUFOBeamThink(mobj);
break;
}
case MT_ROCKETSNEAKER: case MT_ROCKETSNEAKER:
if (!mobj->target || !mobj->target->health) if (!mobj->target || !mobj->target->health)
{ {