Add center point mobj, polish the visual a bit more, reduce the speed that the barrier shrinks

This commit is contained in:
Sally Coolatta 2020-10-22 17:38:06 -04:00
parent 7430df5f4f
commit 9ad88cdfa9
6 changed files with 141 additions and 177 deletions

View file

@ -9286,9 +9286,10 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_TIREGREASE",
"S_OVERTIMEFOG",
"S_OVERTIMEORB",
"S_OVERTIMEBEAM",
"S_OVERTIME_BULB1",
"S_OVERTIME_BULB2",
"S_OVERTIME_LASER",
"S_OVERTIME_CENTER",
"S_BATTLECAPSULE_SIDE1",
"S_BATTLECAPSULE_SIDE2",
@ -10382,9 +10383,8 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
"MT_SPBDUST",
"MT_TIREGREASE",
"MT_OVERTIMEFOG",
"MT_OVERTIMEORB",
"MT_OVERTIMEBEAM",
"MT_OVERTIME_PARTICLE",
"MT_OVERTIME_CENTER",
"MT_BATTLECAPSULE",
"MT_BATTLECAPSULE_PIECE",

View file

@ -713,7 +713,9 @@ char sprnames[NUMSPRITES + 1][5] =
"DRAF",
"GRES",
"OTFG",
"OTBU",
"OTLS",
"OTCP",
"DBOS", // Drift boost flame
@ -4995,9 +4997,10 @@ state_t states[NUMSTATES] =
{SPR_GRES, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 2, 4, S_NULL}, // S_TIREGREASE
{SPR_OTFG, FF_FULLBRIGHT|FF_TRANS50, TICRATE, {NULL}, 0, 0, S_NULL}, // S_OVERTIMEFOG
{SPR_OTFG, 1|FF_FULLBRIGHT|FF_PAPERSPRITE, 1, {NULL}, 0, 0, S_NULL}, // S_OVERTIMEORB
{SPR_OTFG, 1|FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_NULL}, // S_OVERTIMEBEAM
{SPR_OTBU, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_NULL}, // S_OVERTIME_BULB1
{SPR_OTBU, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_NULL}, // S_OVERTIME_BULB2
{SPR_OTLS, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_NULL}, // S_OVERTIME_LASER
{SPR_OTCP, 0, -1, {NULL}, 0, 0, S_NULL}, // S_OVERTIME_CENTER
{SPR_CAPS, FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_NULL}, // S_BATTLECAPSULE_SIDE1
{SPR_CAPS, FF_PAPERSPRITE|1, -1, {NULL}, 0, 0, S_NULL}, // S_BATTLECAPSULE_SIDE2
@ -28402,9 +28405,9 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate
},
{ // MT_OVERTIMEFOG
{ // MT_OVERTIME_PARTICLE
-1, // doomednum
S_OVERTIMEFOG, // spawnstate
S_NULL, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
@ -28420,8 +28423,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
sfx_None, // deathsound
0, // speed
16<<FRACBITS, // radius
32<<FRACBITS, // height
-1, // display offset
24<<FRACBITS, // height
0, // display offset
100, // mass
0, // damage
sfx_None, // activesound
@ -28429,36 +28432,9 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate
},
{ // MT_OVERTIMEORB
-1, // doomednum
S_OVERTIMEORB, // 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
0, // speed
16<<FRACBITS, // radius
48<<FRACBITS, // height
-1, // display offset
100, // mass
0, // damage
sfx_None, // activesound
MF_NOBLOCKMAP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP, // flags
S_NULL // raisestate
},
{ // MT_OVERTIMEBEAM
-1, // doomednum
S_OVERTIMEBEAM, // spawnstate
{ // MT_OVERTIME_CENTER
3775, // doomednum
S_OVERTIME_CENTER, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
@ -28475,11 +28451,11 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
0, // speed
48<<FRACBITS, // radius
48<<FRACBITS, // height
-1, // display offset
0, // display offset
100, // mass
0, // damage
sfx_None, // activesound
MF_NOBLOCKMAP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP, // flags
MF_SOLID|MF_DONTENCOREMAP, // flags
S_NULL // raisestate
},

View file

@ -984,7 +984,9 @@ typedef enum sprite
SPR_DRAF,
SPR_GRES,
SPR_OTFG,
SPR_OTBU,
SPR_OTLS,
SPR_OTCP,
SPR_DBOS, // Drift boost flame
@ -5147,9 +5149,10 @@ typedef enum state
S_TIREGREASE,
S_OVERTIMEFOG,
S_OVERTIMEORB,
S_OVERTIMEBEAM,
S_OVERTIME_BULB1,
S_OVERTIME_BULB2,
S_OVERTIME_LASER,
S_OVERTIME_CENTER,
S_BATTLECAPSULE_SIDE1,
S_BATTLECAPSULE_SIDE2,
@ -6263,9 +6266,8 @@ typedef enum mobj_type
MT_SPBDUST,
MT_TIREGREASE,
MT_OVERTIMEFOG,
MT_OVERTIMEORB,
MT_OVERTIMEBEAM,
MT_OVERTIME_PARTICLE,
MT_OVERTIME_CENTER,
MT_BATTLECAPSULE,
MT_BATTLECAPSULE_PIECE,

View file

@ -277,52 +277,81 @@ void K_CheckBumpers(void)
P_DoPlayerExit(&players[i]);
}
#define MAXPLANESPERSECTOR (MAXFFLOORS+1)*2
static void K_SpawnOvertimeParticles(fixed_t x, fixed_t y, fixed_t scale, mobjtype_t type)
static void K_SpawnOvertimeLaser(fixed_t x, fixed_t y, fixed_t scale)
{
UINT8 i;
UINT8 i, j;
for (i = 0; i <= r_splitscreen; i++)
{
player_t *player = &players[displayplayers[i]];
mobj_t *mo;
INT32 f = 0;
fixed_t zpos;
SINT8 flip;
if (player == NULL || player->mo == NULL || P_MobjWasRemoved(player->mo) == true)
{
continue;
}
mo = P_SpawnMobj(x, y, player->mo->z + (player->mo->height / 2), type);
P_SetScale(mo, scale);
if (player->mo->eflags & MFE_VERTICALFLIP)
{
mo->flags2 |= MF2_OBJECTFLIP;
mo->eflags |= MFE_VERTICALFLIP;
zpos = player->mo->z + player->mo->height;
}
else
{
zpos = player->mo->z;
}
mo->drawflags |= (MFD_DONTDRAW & ~(K_GetPlayerDontDrawFlag(player)));
flip = P_MobjFlip(player->mo);
switch (type)
for (j = 0; j < 3; j++)
{
case MT_OVERTIMEFOG:
mo->destscale = 8 * mo->scale;
mo->momz = P_RandomRange(1,8) * mo->scale;
break;
case MT_OVERTIMEORB:
mo->angle = R_PointToAngle2(mo->x, mo->y, battleovertime.x, battleovertime.y) + ANGLE_90;
mobj_t *mo = P_SpawnMobj(x, y, zpos, MT_OVERTIME_PARTICLE);
if (leveltime & 1)
f = 3;
else
f = (leveltime / 2) % 3;
if (player->mo->eflags & MFE_VERTICALFLIP)
{
mo->flags2 |= MF2_OBJECTFLIP;
mo->eflags |= MFE_VERTICALFLIP;
}
mo->frame += f;
break;
default:
break;
mo->angle = R_PointToAngle2(mo->x, mo->y, battleovertime.x, battleovertime.y) + ANGLE_90;
mo->drawflags |= (MFD_DONTDRAW & ~(K_GetPlayerDontDrawFlag(player)));
P_SetScale(mo, scale);
switch (j)
{
case 0:
P_SetMobjState(mo, S_OVERTIME_BULB1);
if (leveltime & 1)
mo->frame += 1;
//P_SetScale(mo, mapobjectscale);
zpos += 35 * mo->scale * flip;
break;
case 1:
P_SetMobjState(mo, S_OVERTIME_LASER);
if (leveltime & 1)
mo->frame += 3;
else
mo->frame += (leveltime / 2) % 3;
//P_SetScale(mo, scale);
zpos += 346 * mo->scale * flip;
break;
case 2:
P_SetMobjState(mo, S_OVERTIME_BULB2);
if (leveltime & 1)
mo->frame += 1;
//P_SetScale(mo, mapobjectscale);
break;
default:
I_Error("Bruh moment has occured\n");
return;
}
}
}
}
@ -331,8 +360,6 @@ static void K_SpawnOvertimeParticles(fixed_t x, fixed_t y, fixed_t scale, mobjty
void K_RunBattleOvertime(void)
{
UINT32 i, j;
if (battleovertime.enabled < 10*TICRATE)
{
battleovertime.enabled++;
@ -343,81 +370,35 @@ void K_RunBattleOvertime(void)
}
else if (battleovertime.radius > 0)
{
if (battleovertime.radius > 4*mapobjectscale)
battleovertime.radius -= 4*mapobjectscale;
if (battleovertime.radius > 2*mapobjectscale)
battleovertime.radius -= 2*mapobjectscale;
else
battleovertime.radius = 0;
}
if (battleovertime.radius <= 0)
{
return;
}
/*
if (leveltime & 1)
{
UINT8 transparency = tr_trans50;
if (!splitscreen && players[displayplayers[0]].mo)
{
INT32 dist = P_AproxDistance(battleovertime.x-players[displayplayers[0]].mo->x, battleovertime.y-players[displayplayers[0]].mo->y);
transparency = max(0, NUMTRANSMAPS - ((256 + (dist>>FRACBITS)) / 256));
}
if (transparency < NUMTRANSMAPS)
{
mobj_t *beam = P_SpawnMobj(battleovertime.x, battleovertime.y, battleovertime.z + (mobjinfo[MT_RANDOMITEM].height/2), MT_OVERTIMEBEAM);
P_SetScale(beam, beam->scale*2);
if (transparency > 0)
beam->frame |= transparency<<FF_TRANSSHIFT;
}
}
*/
if (battleovertime.radius > 0)
{
const fixed_t pi = (22 * FRACUNIT) / 7; // loose approximation, this doesn't need to be incredibly precise
fixed_t scale = mapobjectscale + (battleovertime.radius / 2048);
fixed_t sprwidth = 64 * scale;
const UINT32 orbs = 32;
const angle_t angoff = ANGLE_MAX / orbs;
const UINT8 spriteSpacing = 128;
fixed_t circumference = FixedMul(pi, battleovertime.radius * 2);
UINT32 orbs = circumference / sprwidth;
angle_t angoff = ANGLE_MAX / orbs;
fixed_t scale = max(circumference / spriteSpacing / orbs, mapobjectscale);
fixed_t size = FixedMul(mobjinfo[MT_OVERTIME_PARTICLE].radius, scale);
fixed_t posOffset = max(battleovertime.radius - size, 0);
UINT32 i;
for (i = 0; i < orbs; i++)
{
angle_t ang = (i * angoff);
fixed_t size = FixedMul(mobjinfo[MT_OVERTIMEORB].radius, mapobjectscale);
angle_t ang = (i * angoff) + FixedAngle((leveltime * FRACUNIT) / 4);
fixed_t x = battleovertime.x + P_ReturnThrustX(NULL, ang, battleovertime.radius + size);
fixed_t y = battleovertime.y + P_ReturnThrustY(NULL, ang, battleovertime.radius + size);
fixed_t x = battleovertime.x + P_ReturnThrustX(NULL, ang, posOffset);
fixed_t y = battleovertime.y + P_ReturnThrustY(NULL, ang, posOffset);
K_SpawnOvertimeParticles(x, y, mapobjectscale, MT_OVERTIMEORB);
}
}
if (battleovertime.enabled < 10*TICRATE)
return;
for (i = 0; i < 16; i++)
{
j = 0;
while (j < 32) // max attempts
{
fixed_t scale = 4*mapobjectscale;
fixed_t x = battleovertime.x + (P_RandomRange(-64,64) * scale);
fixed_t y = battleovertime.y + (P_RandomRange(-64,64) * scale);
fixed_t closestdist = battleovertime.radius + (8 * FixedMul(mobjinfo[MT_OVERTIMEFOG].radius, scale));
j++;
if (P_AproxDistance(x - battleovertime.x, y - battleovertime.y) < closestdist)
continue;
K_SpawnOvertimeParticles(x, y, scale, MT_OVERTIMEFOG);
break;
K_SpawnOvertimeLaser(x, y, scale);
}
}
}

View file

@ -5751,10 +5751,21 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
{
player->kartstuff[k_wanted]++;
if ((battleovertime.enabled >= 10*TICRATE) && (P_AproxDistance(player->mo->x - battleovertime.x, player->mo->y - battleovertime.y) - (player->mo->radius * 2)) > battleovertime.radius)
if (battleovertime.enabled >= 10*TICRATE)
{
P_KillMobj(player->mo, NULL, NULL, DMG_NORMAL);
player->kartstuff[k_bumper] = 0;
fixed_t distanceToBarrier = 0;
if (battleovertime.radius > 0)
{
distanceToBarrier = R_PointToDist2(player->mo->x, player->mo->y, battleovertime.x, battleovertime.y) - (player->mo->radius * 2);
}
if (distanceToBarrier > battleovertime.radius)
{
//P_KillMobj(player->mo, NULL, NULL, DMG_NORMAL);
player->kartstuff[k_bumper] = 0;
P_DamageMobj(player->mo, NULL, NULL, 1, DMG_NORMAL);
}
}
}

View file

@ -726,7 +726,7 @@ void P_TouchStarPost(mobj_t *post, player_t *player, boolean snaptopost)
}
// Easily make it so that overtime works offline
#define TESTOVERTIMEINFREEPLAY
//#define TESTOVERTIMEINFREEPLAY
/** Checks if the level timer is over the timelimit and the round should end,
* unless you are in overtime. In which case leveltime may stretch out beyond
@ -743,8 +743,10 @@ void P_CheckTimeLimit(void)
if (!cv_timelimit.value)
return;
#ifndef TESTOVERTIMEINFREEPLAY
if (battlecapsules) // capsules override any time limit settings
return;
#endif
if (!(gametyperules & GTR_TIMELIMIT))
return;
@ -770,51 +772,43 @@ void P_CheckTimeLimit(void)
// Initiate the kill zone
if (!battleovertime.enabled)
{
INT32 b = 0;
thinker_t *th;
mobj_t *item = NULL;
mobj_t *center = NULL;
P_RespawnBattleBoxes(); // FORCE THESE TO BE RESPAWNED FOR THIS!!!!!!!
// Find us an item box to center on.
// TO DO: DON'T do this, instead use a specialized center point object
// just use 0,0 if it's not found
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
{
mobj_t *thismo;
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
continue;
thismo = (mobj_t *)th;
if (thismo->type != MT_RANDOMITEM)
continue;
if (thismo->threshold == 69) // Disappears
continue;
b++;
// Only select items that are on the ground, ignore ones in the air. Ambush flag inverts this rule.
if ((!P_IsObjectOnGround(thismo)) != (thismo->flags2 & MF2_AMBUSH))
continue;
if (item == NULL || (b < nummapboxes && P_RandomChance(((nummapboxes-b)*FRACUNIT)/nummapboxes))) // This is to throw off the RNG some
item = thismo;
if (b >= nummapboxes) // end early if we've found them all already
if (thismo->type == MT_OVERTIME_CENTER)
{
center = thismo;
break;
}
}
if (item == NULL) // no item found, could happen if every item is in the air or has ambush flag, or the map has none
if (center == NULL || P_MobjWasRemoved(center))
{
CONS_Alert(CONS_WARNING, "No usuable items for Battle overtime!\n");
return;
CONS_Alert(CONS_WARNING, "No center point for overtime!\n");
battleovertime.x = 0;
battleovertime.y = 0;
battleovertime.z = 0;
}
else
{
battleovertime.x = center->x;
battleovertime.y = center->y;
battleovertime.z = center->z;
}
//item->threshold = 70; // Set constant respawn
battleovertime.x = item->x;
battleovertime.y = item->y;
battleovertime.z = item->z;
battleovertime.radius = 4096 * mapobjectscale;
battleovertime.enabled = 1;
S_StartSound(NULL, sfx_kc47);
}