hardcode ring vaccums

This commit is contained in:
Lat 2023-09-23 11:26:56 +02:00
parent ca90d27e30
commit 12b80b392b
5 changed files with 111 additions and 0 deletions

View file

@ -30702,6 +30702,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
MF_SOLID, // flags
S_NULL // raisestate
},
{ // MT_DLZ_SUCKEDRING,
-1, // doomednum
S_RING, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
0, // 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
0, // speed
32*FRACUNIT, // radius
32*FRACUNIT, // height
0, // display offset
0, // mass
0, // damage
sfx_None, // activesound
MF_NOGRAVITY, // flags
S_NULL // raisestate
},
};

View file

@ -262,6 +262,11 @@ void Obj_DLZSeasawCollide(mobj_t *mo, mobj_t *mo2);
void Obj_DLZHoverSpawn(mobj_t *mo);
void Obj_DLZHoverCollide(mobj_t *mo, mobj_t *mo2);
/* DLZ Ring Vaccum */
void Obj_DLZRingVaccumSpawn(mobj_t *mo);
void Obj_DLZRingVaccumCollide(mobj_t *mo, mobj_t *mo2);
void Obj_DLZSuckedRingThink(mobj_t *mo);
#ifdef __cplusplus
} // extern "C"
#endif

View file

@ -32,6 +32,7 @@ void Obj_DLZHoverSpawn(mobj_t *mo)
mo->destscale = mapobjectscale*4;
}
// collision between MT_PLAYER and hover
void Obj_DLZHoverCollide(mobj_t *mo, mobj_t *mo2)
{
player_t *p = mo->player;
@ -66,4 +67,67 @@ void Obj_DLZHoverCollide(mobj_t *mo, mobj_t *mo2)
p->lasthover = leveltime;
}
}
// Ring Vaccum:
void Obj_DLZRingVaccumSpawn(mobj_t *mo)
{
P_SetScale(mo, mapobjectscale*4);
mo->destscale = mapobjectscale*4;
}
// collision between MT_FLINGRING and ring vaccum
void Obj_DLZRingVaccumCollide(mobj_t *mo, mobj_t *mo2)
{
mobj_t *fake;
if (mo->z + mo->height < mo2->z)
return;
if (mo->z > mo2->z + mo2->height)
return;
if (!P_IsObjectOnGround(mo) || mo->momz)
return;
fake = P_SpawnMobj(mo->x, mo->y, mo->z, MT_FLINGRING);
P_SetScale(fake, mo->scale);
fake->scalespeed = mapobjectscale/64;
fake->destscale = 1;
P_SetTarget(&fake->target, mo2);
fake->angle = R_PointToAngle2(mo2->x, mo2->y, fake->x, fake->y);
fake->movefactor = R_PointToDist2(mo2->x, mo2->y, fake->x, fake->y);
P_RemoveMobj(mo);
}
void Obj_DLZSuckedRingThink(mobj_t *mo)
{
mobj_t *t = mo->target;
fixed_t x, y;
// commit die if the target disappears for some fucking reason
if (!t || P_MobjWasRemoved(t))
{
P_RemoveMobj(mo);
return;
}
x = t->x + mo->movefactor*FINECOSINE(mo->angle>>ANGLETOFINESHIFT);
y = t->y + mo->movefactor*FINESINE(mo->angle>>ANGLETOFINESHIFT);
P_MoveOrigin(mo, x, y, mo->z);
if (mo->cusval < 24)
mo->cusval++;
mo->angle += mo->cusval*ANG1;
if (mo->cusval > 8 && mo->movefactor)
mo->movefactor -= 1;
if (mo->scale < mapobjectscale/12)
P_RemoveMobj(mo);
}

View file

@ -758,6 +758,14 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing)
return BMIT_CONTINUE;
}
if (thing->type == MT_DLZ_RINGVACCUM)
{
if (tm.thing->type == MT_FLINGRING)
Obj_DLZRingVaccumCollide(tm.thing, thing);
return BMIT_CONTINUE;
}
if (tm.thing->type == MT_INSTAWHIP)
{
if (tm.thing->z > thing->z + thing->height)

View file

@ -9733,6 +9733,10 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
Obj_DLZSeasawThink(mobj);
break;
case MT_DLZ_SUCKEDRING:
Obj_DLZSuckedRingThink(mobj);
break;
default:
// check mobj against possible water content, before movement code
P_MobjCheckWater(mobj);
@ -11175,6 +11179,9 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
case MT_DLZ_HOVER:
Obj_DLZHoverSpawn(mobj);
break;
case MT_DLZ_RINGVACCUM:
Obj_DLZRingVaccumSpawn(mobj);
break;
case MT_SNEAKERPANEL:
Obj_SneakerPanelSpawn(mobj);
break;