mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-12-23 16:32:36 +00:00
Move overtime stuff to k_battle.c
This commit is contained in:
parent
3633dc341a
commit
48ff9ddf85
6 changed files with 224 additions and 218 deletions
|
|
@ -263,9 +263,6 @@ INT16 votelevels[5][2]; // Levels that were rolled by the host
|
||||||
SINT8 votes[MAXPLAYERS]; // Each player's vote
|
SINT8 votes[MAXPLAYERS]; // Each player's vote
|
||||||
SINT8 pickedvote; // What vote the host rolls
|
SINT8 pickedvote; // What vote the host rolls
|
||||||
|
|
||||||
// Battle overtime system
|
|
||||||
struct battleovertime battleovertime;
|
|
||||||
|
|
||||||
// Server-sided, synched variables
|
// Server-sided, synched variables
|
||||||
SINT8 battlewanted[4]; // WANTED players in battle, worth x2 points
|
SINT8 battlewanted[4]; // WANTED players in battle, worth x2 points
|
||||||
tic_t wantedcalcdelay; // Time before it recalculates WANTED
|
tic_t wantedcalcdelay; // Time before it recalculates WANTED
|
||||||
|
|
|
||||||
214
src/k_battle.c
214
src/k_battle.c
|
|
@ -13,6 +13,9 @@
|
||||||
#include "r_main.h"
|
#include "r_main.h"
|
||||||
#include "r_defs.h" // MAXFFLOORS
|
#include "r_defs.h" // MAXFFLOORS
|
||||||
#include "info.h"
|
#include "info.h"
|
||||||
|
#include "s_sound.h"
|
||||||
|
#include "m_random.h"
|
||||||
|
#include "r_sky.h" // skyflatnum
|
||||||
|
|
||||||
// Capsules mode enabled for this map?
|
// Capsules mode enabled for this map?
|
||||||
boolean battlecapsules = false;
|
boolean battlecapsules = false;
|
||||||
|
|
@ -241,6 +244,217 @@ void K_CheckBumpers(void)
|
||||||
P_DoPlayerExit(&players[i]);
|
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, boolean ceiling)
|
||||||
|
{
|
||||||
|
UINT8 i;
|
||||||
|
fixed_t flatz[MAXPLANESPERSECTOR];
|
||||||
|
boolean flip[MAXPLANESPERSECTOR];
|
||||||
|
UINT8 numflats = 0;
|
||||||
|
mobj_t *mo;
|
||||||
|
subsector_t *ss = R_IsPointInSubsector(x, y);
|
||||||
|
sector_t *sec;
|
||||||
|
|
||||||
|
if (!ss)
|
||||||
|
return;
|
||||||
|
sec = ss->sector;
|
||||||
|
|
||||||
|
// convoluted stuff JUST to get all of the planes we need to draw orbs on :V
|
||||||
|
|
||||||
|
for (i = 0; i < MAXPLANESPERSECTOR; i++)
|
||||||
|
flip[i] = false;
|
||||||
|
|
||||||
|
if (sec->floorpic != skyflatnum)
|
||||||
|
{
|
||||||
|
#ifdef ESLOPE
|
||||||
|
flatz[numflats] = (sec->f_slope ? P_GetZAt(sec->f_slope, x, y) : sec->floorheight);
|
||||||
|
#else
|
||||||
|
flatz[numflats] = (sec->floorheight);
|
||||||
|
#endif
|
||||||
|
numflats++;
|
||||||
|
}
|
||||||
|
if (sec->ceilingpic != skyflatnum && ceiling)
|
||||||
|
{
|
||||||
|
#ifdef ESLOPE
|
||||||
|
flatz[numflats] = (sec->c_slope ? P_GetZAt(sec->c_slope, x, y) : sec->ceilingheight) - FixedMul(mobjinfo[type].height, scale);
|
||||||
|
#else
|
||||||
|
flatz[numflats] = (sec->ceilingheight) - FixedMul(mobjinfo[type].height, scale);
|
||||||
|
#endif
|
||||||
|
flip[numflats] = true;
|
||||||
|
numflats++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sec->ffloors)
|
||||||
|
{
|
||||||
|
ffloor_t *rover;
|
||||||
|
for (rover = sec->ffloors; rover; rover = rover->next)
|
||||||
|
{
|
||||||
|
if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER))
|
||||||
|
continue;
|
||||||
|
if (*rover->toppic != skyflatnum)
|
||||||
|
{
|
||||||
|
#ifdef ESLOPE
|
||||||
|
flatz[numflats] = (*rover->t_slope ? P_GetZAt(*rover->t_slope, x, y) : *rover->topheight);
|
||||||
|
#else
|
||||||
|
flatz[numflats] = (*rover->topheight);
|
||||||
|
#endif
|
||||||
|
numflats++;
|
||||||
|
}
|
||||||
|
if (*rover->bottompic != skyflatnum && ceiling)
|
||||||
|
{
|
||||||
|
#ifdef ESLOPE
|
||||||
|
flatz[numflats] = (*rover->b_slope ? P_GetZAt(*rover->b_slope, x, y) : *rover->bottomheight) - FixedMul(mobjinfo[type].height, scale);
|
||||||
|
#else
|
||||||
|
flatz[numflats] = (*rover->bottomheight) - FixedMul(mobjinfo[type].height, scale);
|
||||||
|
#endif
|
||||||
|
flip[numflats] = true;
|
||||||
|
numflats++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (numflats <= 0) // no flats
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i = 0; i < numflats; i++)
|
||||||
|
{
|
||||||
|
mo = P_SpawnMobj(x, y, flatz[i], type);
|
||||||
|
|
||||||
|
// Lastly, if this can see the skybox mobj, then... we just wasted our time :V
|
||||||
|
if (skyboxmo[0] && !P_MobjWasRemoved(skyboxmo[0]))
|
||||||
|
{
|
||||||
|
const fixed_t sbz = skyboxmo[0]->z;
|
||||||
|
fixed_t checkz = sec->floorheight;
|
||||||
|
|
||||||
|
while (checkz < sec->ceilingheight)
|
||||||
|
{
|
||||||
|
P_TeleportMove(skyboxmo[0], skyboxmo[0]->x, skyboxmo[0]->y, checkz);
|
||||||
|
if (P_CheckSight(skyboxmo[0], mo))
|
||||||
|
{
|
||||||
|
P_RemoveMobj(mo);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
checkz += 32*mapobjectscale;
|
||||||
|
}
|
||||||
|
|
||||||
|
P_TeleportMove(skyboxmo[0], skyboxmo[0]->x, skyboxmo[0]->y, sbz);
|
||||||
|
|
||||||
|
if (P_MobjWasRemoved(mo))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
P_SetScale(mo, scale);
|
||||||
|
|
||||||
|
if (flip[i])
|
||||||
|
{
|
||||||
|
mo->flags2 |= MF2_OBJECTFLIP;
|
||||||
|
mo->eflags |= MFE_VERTICALFLIP;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case MT_OVERTIMEFOG:
|
||||||
|
mo->destscale = 8*mo->scale;
|
||||||
|
mo->momz = P_RandomRange(1,8)*mo->scale;
|
||||||
|
break;
|
||||||
|
case MT_OVERTIMEORB:
|
||||||
|
//mo->destscale = mo->scale/4;
|
||||||
|
mo->frame += ((leveltime/4) % 8);
|
||||||
|
/*if (battleovertime.enabled < 10*TICRATE)
|
||||||
|
mo->flags2 |= MF2_SHADOW;*/
|
||||||
|
mo->angle = R_PointToAngle2(mo->x, mo->y, battleovertime.x, battleovertime.y) + ANGLE_90;
|
||||||
|
mo->z += P_RandomRange(0,48) * mo->scale;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef MAXPLANESPERSECTOR
|
||||||
|
|
||||||
|
void K_RunBattleOvertime(void)
|
||||||
|
{
|
||||||
|
UINT16 i, j;
|
||||||
|
|
||||||
|
if (battleovertime.enabled < 10*TICRATE)
|
||||||
|
{
|
||||||
|
battleovertime.enabled++;
|
||||||
|
if (battleovertime.enabled == TICRATE)
|
||||||
|
S_StartSound(NULL, sfx_bhurry);
|
||||||
|
if (battleovertime.enabled == 10*TICRATE)
|
||||||
|
S_StartSound(NULL, sfx_kc40);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (battleovertime.radius > battleovertime.minradius)
|
||||||
|
battleovertime.radius -= mapobjectscale;
|
||||||
|
else
|
||||||
|
battleovertime.radius = battleovertime.minradius;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 16 orbs at the normal minimum size of 512
|
||||||
|
{
|
||||||
|
const fixed_t pi = (22<<FRACBITS) / 7; // loose approximation, this doesn't need to be incredibly precise
|
||||||
|
fixed_t scale = mapobjectscale + (battleovertime.radius/2048);
|
||||||
|
fixed_t sprwidth = 32*scale;
|
||||||
|
fixed_t circumference = FixedMul(pi, battleovertime.radius<<1);
|
||||||
|
UINT16 orbs = circumference / sprwidth;
|
||||||
|
angle_t angoff = ANGLE_MAX / orbs;
|
||||||
|
|
||||||
|
for (i = 0; i < orbs; i++)
|
||||||
|
{
|
||||||
|
angle_t ang = (i * angoff) + FixedAngle((leveltime/2)<<FRACBITS);
|
||||||
|
fixed_t x = battleovertime.x + P_ReturnThrustX(NULL, ang, battleovertime.radius - FixedMul(mobjinfo[MT_OVERTIMEORB].radius, scale));
|
||||||
|
fixed_t y = battleovertime.y + P_ReturnThrustY(NULL, ang, battleovertime.radius - FixedMul(mobjinfo[MT_OVERTIMEORB].radius, scale));
|
||||||
|
K_SpawnOvertimeParticles(x, y, scale, MT_OVERTIMEORB, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (battleovertime.enabled < 10*TICRATE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/*if (!S_IdPlaying(sfx_s3kd4s)) // global ambience
|
||||||
|
S_StartSoundAtVolume(NULL, sfx_s3kd4s, min(255, ((4096*mapobjectscale) - battleovertime.radius)>>FRACBITS / 2));*/
|
||||||
|
|
||||||
|
for (i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
j = 0;
|
||||||
|
while (j < 32) // max attempts
|
||||||
|
{
|
||||||
|
fixed_t x = battleovertime.x + ((P_RandomRange(-64,64) * 128)<<FRACBITS);
|
||||||
|
fixed_t y = battleovertime.y + ((P_RandomRange(-64,64) * 128)<<FRACBITS);
|
||||||
|
fixed_t closestdist = battleovertime.radius + (8*mobjinfo[MT_OVERTIMEFOG].radius);
|
||||||
|
j++;
|
||||||
|
if (P_AproxDistance(x-battleovertime.x, y-battleovertime.y) < closestdist)
|
||||||
|
continue;
|
||||||
|
K_SpawnOvertimeParticles(x, y, 4*mapobjectscale, MT_OVERTIMEFOG, false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void K_SetupMovingCapsule(mapthing_t *mt, mobj_t *mobj)
|
static void K_SetupMovingCapsule(mapthing_t *mt, mobj_t *mobj)
|
||||||
{
|
{
|
||||||
UINT8 sequence = mt->extrainfo-1;
|
UINT8 sequence = mt->extrainfo-1;
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,9 @@
|
||||||
#include "doomtype.h"
|
#include "doomtype.h"
|
||||||
#include "d_player.h"
|
#include "d_player.h"
|
||||||
|
|
||||||
|
// Battle overtime system
|
||||||
|
struct battleovertime battleovertime;
|
||||||
|
|
||||||
extern boolean battlecapsules;
|
extern boolean battlecapsules;
|
||||||
extern UINT8 maptargets, numtargets;
|
extern UINT8 maptargets, numtargets;
|
||||||
|
|
||||||
|
|
@ -11,6 +14,7 @@ boolean K_IsPlayerWanted(player_t *player);
|
||||||
void K_CalculateBattleWanted(void);
|
void K_CalculateBattleWanted(void);
|
||||||
void K_SpawnBattlePoints(player_t *source, player_t *victim, UINT8 amount);
|
void K_SpawnBattlePoints(player_t *source, player_t *victim, UINT8 amount);
|
||||||
void K_CheckBumpers(void);
|
void K_CheckBumpers(void);
|
||||||
|
void K_RunBattleOvertime(void);
|
||||||
void K_SpawnBattleCapsules(void);
|
void K_SpawnBattleCapsules(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -230,7 +230,6 @@ boolean P_SetMobjState(mobj_t *mobj, statenum_t state);
|
||||||
void P_RunOverlays(void);
|
void P_RunOverlays(void);
|
||||||
fixed_t P_CalculateShadowFloor(mobj_t *mobj, fixed_t x, fixed_t y, fixed_t z, fixed_t radius, fixed_t height, boolean flip, boolean player);
|
fixed_t P_CalculateShadowFloor(mobj_t *mobj, fixed_t x, fixed_t y, fixed_t z, fixed_t radius, fixed_t height, boolean flip, boolean player);
|
||||||
void P_RunShadows(void);
|
void P_RunShadows(void);
|
||||||
void P_RunBattleOvertime(void);
|
|
||||||
void P_MobjThinker(mobj_t *mobj);
|
void P_MobjThinker(mobj_t *mobj);
|
||||||
boolean P_RailThinker(mobj_t *mobj);
|
boolean P_RailThinker(mobj_t *mobj);
|
||||||
void P_PushableThinker(mobj_t *mobj);
|
void P_PushableThinker(mobj_t *mobj);
|
||||||
|
|
|
||||||
210
src/p_mobj.c
210
src/p_mobj.c
|
|
@ -6482,216 +6482,6 @@ static void P_RemoveShadow(mobj_t *thing)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// SAL'S KART BATTLE MODE OVERTIME HANDLER
|
|
||||||
#define MAXPLANESPERSECTOR (MAXFFLOORS+1)*2
|
|
||||||
static void P_SpawnOvertimeParticles(fixed_t x, fixed_t y, fixed_t scale, mobjtype_t type, boolean ceiling)
|
|
||||||
{
|
|
||||||
UINT8 i;
|
|
||||||
fixed_t flatz[MAXPLANESPERSECTOR];
|
|
||||||
boolean flip[MAXPLANESPERSECTOR];
|
|
||||||
UINT8 numflats = 0;
|
|
||||||
mobj_t *mo;
|
|
||||||
subsector_t *ss = R_IsPointInSubsector(x, y);
|
|
||||||
sector_t *sec;
|
|
||||||
|
|
||||||
if (!ss)
|
|
||||||
return;
|
|
||||||
sec = ss->sector;
|
|
||||||
|
|
||||||
// convoluted stuff JUST to get all of the planes we need to draw orbs on :V
|
|
||||||
|
|
||||||
for (i = 0; i < MAXPLANESPERSECTOR; i++)
|
|
||||||
flip[i] = false;
|
|
||||||
|
|
||||||
if (sec->floorpic != skyflatnum)
|
|
||||||
{
|
|
||||||
#ifdef ESLOPE
|
|
||||||
flatz[numflats] = (sec->f_slope ? P_GetZAt(sec->f_slope, x, y) : sec->floorheight);
|
|
||||||
#else
|
|
||||||
flatz[numflats] = (sec->floorheight);
|
|
||||||
#endif
|
|
||||||
numflats++;
|
|
||||||
}
|
|
||||||
if (sec->ceilingpic != skyflatnum && ceiling)
|
|
||||||
{
|
|
||||||
#ifdef ESLOPE
|
|
||||||
flatz[numflats] = (sec->c_slope ? P_GetZAt(sec->c_slope, x, y) : sec->ceilingheight) - FixedMul(mobjinfo[type].height, scale);
|
|
||||||
#else
|
|
||||||
flatz[numflats] = (sec->ceilingheight) - FixedMul(mobjinfo[type].height, scale);
|
|
||||||
#endif
|
|
||||||
flip[numflats] = true;
|
|
||||||
numflats++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sec->ffloors)
|
|
||||||
{
|
|
||||||
ffloor_t *rover;
|
|
||||||
for (rover = sec->ffloors; rover; rover = rover->next)
|
|
||||||
{
|
|
||||||
if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER))
|
|
||||||
continue;
|
|
||||||
if (*rover->toppic != skyflatnum)
|
|
||||||
{
|
|
||||||
#ifdef ESLOPE
|
|
||||||
flatz[numflats] = (*rover->t_slope ? P_GetZAt(*rover->t_slope, x, y) : *rover->topheight);
|
|
||||||
#else
|
|
||||||
flatz[numflats] = (*rover->topheight);
|
|
||||||
#endif
|
|
||||||
numflats++;
|
|
||||||
}
|
|
||||||
if (*rover->bottompic != skyflatnum && ceiling)
|
|
||||||
{
|
|
||||||
#ifdef ESLOPE
|
|
||||||
flatz[numflats] = (*rover->b_slope ? P_GetZAt(*rover->b_slope, x, y) : *rover->bottomheight) - FixedMul(mobjinfo[type].height, scale);
|
|
||||||
#else
|
|
||||||
flatz[numflats] = (*rover->bottomheight) - FixedMul(mobjinfo[type].height, scale);
|
|
||||||
#endif
|
|
||||||
flip[numflats] = true;
|
|
||||||
numflats++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (numflats <= 0) // no flats
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (i = 0; i < numflats; i++)
|
|
||||||
{
|
|
||||||
mo = P_SpawnMobj(x, y, flatz[i], type);
|
|
||||||
|
|
||||||
// Lastly, if this can see the skybox mobj, then... we just wasted our time :V
|
|
||||||
if (skyboxmo[0] && !P_MobjWasRemoved(skyboxmo[0]))
|
|
||||||
{
|
|
||||||
const fixed_t sbz = skyboxmo[0]->z;
|
|
||||||
fixed_t checkz = sec->floorheight;
|
|
||||||
|
|
||||||
while (checkz < sec->ceilingheight)
|
|
||||||
{
|
|
||||||
P_TeleportMove(skyboxmo[0], skyboxmo[0]->x, skyboxmo[0]->y, checkz);
|
|
||||||
if (P_CheckSight(skyboxmo[0], mo))
|
|
||||||
{
|
|
||||||
P_RemoveMobj(mo);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
checkz += 32*mapobjectscale;
|
|
||||||
}
|
|
||||||
|
|
||||||
P_TeleportMove(skyboxmo[0], skyboxmo[0]->x, skyboxmo[0]->y, sbz);
|
|
||||||
|
|
||||||
if (P_MobjWasRemoved(mo))
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
P_SetScale(mo, scale);
|
|
||||||
|
|
||||||
if (flip[i])
|
|
||||||
{
|
|
||||||
mo->flags2 |= MF2_OBJECTFLIP;
|
|
||||||
mo->eflags |= MFE_VERTICALFLIP;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(type)
|
|
||||||
{
|
|
||||||
case MT_OVERTIMEFOG:
|
|
||||||
mo->destscale = 8*mo->scale;
|
|
||||||
mo->momz = P_RandomRange(1,8)*mo->scale;
|
|
||||||
break;
|
|
||||||
case MT_OVERTIMEORB:
|
|
||||||
//mo->destscale = mo->scale/4;
|
|
||||||
mo->frame += ((leveltime/4) % 8);
|
|
||||||
/*if (battleovertime.enabled < 10*TICRATE)
|
|
||||||
mo->flags2 |= MF2_SHADOW;*/
|
|
||||||
mo->angle = R_PointToAngle2(mo->x, mo->y, battleovertime.x, battleovertime.y) + ANGLE_90;
|
|
||||||
mo->z += P_RandomRange(0,48) * mo->scale;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#undef MAXPLANESPERSECTOR
|
|
||||||
|
|
||||||
void P_RunBattleOvertime(void)
|
|
||||||
{
|
|
||||||
UINT16 i, j;
|
|
||||||
|
|
||||||
if (battleovertime.enabled < 10*TICRATE)
|
|
||||||
{
|
|
||||||
battleovertime.enabled++;
|
|
||||||
if (battleovertime.enabled == TICRATE)
|
|
||||||
S_StartSound(NULL, sfx_bhurry);
|
|
||||||
if (battleovertime.enabled == 10*TICRATE)
|
|
||||||
S_StartSound(NULL, sfx_kc40);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (battleovertime.radius > battleovertime.minradius)
|
|
||||||
battleovertime.radius -= mapobjectscale;
|
|
||||||
else
|
|
||||||
battleovertime.radius = battleovertime.minradius;
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 16 orbs at the normal minimum size of 512
|
|
||||||
{
|
|
||||||
const fixed_t pi = (22<<FRACBITS) / 7; // loose approximation, this doesn't need to be incredibly precise
|
|
||||||
fixed_t scale = mapobjectscale + (battleovertime.radius/2048);
|
|
||||||
fixed_t sprwidth = 32*scale;
|
|
||||||
fixed_t circumference = FixedMul(pi, battleovertime.radius<<1);
|
|
||||||
UINT16 orbs = circumference / sprwidth;
|
|
||||||
angle_t angoff = ANGLE_MAX / orbs;
|
|
||||||
|
|
||||||
for (i = 0; i < orbs; i++)
|
|
||||||
{
|
|
||||||
angle_t ang = (i * angoff) + FixedAngle((leveltime/2)<<FRACBITS);
|
|
||||||
fixed_t x = battleovertime.x + P_ReturnThrustX(NULL, ang, battleovertime.radius - FixedMul(mobjinfo[MT_OVERTIMEORB].radius, scale));
|
|
||||||
fixed_t y = battleovertime.y + P_ReturnThrustY(NULL, ang, battleovertime.radius - FixedMul(mobjinfo[MT_OVERTIMEORB].radius, scale));
|
|
||||||
P_SpawnOvertimeParticles(x, y, scale, MT_OVERTIMEORB, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (battleovertime.enabled < 10*TICRATE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/*if (!S_IdPlaying(sfx_s3kd4s)) // global ambience
|
|
||||||
S_StartSoundAtVolume(NULL, sfx_s3kd4s, min(255, ((4096*mapobjectscale) - battleovertime.radius)>>FRACBITS / 2));*/
|
|
||||||
|
|
||||||
for (i = 0; i < 16; i++)
|
|
||||||
{
|
|
||||||
j = 0;
|
|
||||||
while (j < 32) // max attempts
|
|
||||||
{
|
|
||||||
fixed_t x = battleovertime.x + ((P_RandomRange(-64,64) * 128)<<FRACBITS);
|
|
||||||
fixed_t y = battleovertime.y + ((P_RandomRange(-64,64) * 128)<<FRACBITS);
|
|
||||||
fixed_t closestdist = battleovertime.radius + (8*mobjinfo[MT_OVERTIMEFOG].radius);
|
|
||||||
j++;
|
|
||||||
if (P_AproxDistance(x-battleovertime.x, y-battleovertime.y) < closestdist)
|
|
||||||
continue;
|
|
||||||
P_SpawnOvertimeParticles(x, y, 4*mapobjectscale, MT_OVERTIMEFOG, false);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void A_BossDeath(mobj_t *mo);
|
void A_BossDeath(mobj_t *mo);
|
||||||
// AI for the Koopa boss.
|
// AI for the Koopa boss.
|
||||||
static void P_KoopaThinker(mobj_t *koopa)
|
static void P_KoopaThinker(mobj_t *koopa)
|
||||||
|
|
|
||||||
10
src/p_tick.c
10
src/p_tick.c
|
|
@ -642,14 +642,15 @@ void P_Ticker(boolean run)
|
||||||
if (run)
|
if (run)
|
||||||
{
|
{
|
||||||
P_RunThinkers();
|
P_RunThinkers();
|
||||||
if (G_BattleGametype() && battleovertime.enabled)
|
|
||||||
P_RunBattleOvertime();
|
|
||||||
|
|
||||||
// Run any "after all the other thinkers" stuff
|
// Run any "after all the other thinkers" stuff
|
||||||
for (i = 0; i < MAXPLAYERS; i++)
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo))
|
if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo))
|
||||||
P_PlayerAfterThink(&players[i]);
|
P_PlayerAfterThink(&players[i]);
|
||||||
|
|
||||||
|
if (G_BattleGametype() && battleovertime.enabled)
|
||||||
|
K_RunBattleOvertime();
|
||||||
|
|
||||||
#ifdef HAVE_BLUA
|
#ifdef HAVE_BLUA
|
||||||
LUAh_ThinkFrame();
|
LUAh_ThinkFrame();
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -796,14 +797,15 @@ void P_PreTicker(INT32 frames)
|
||||||
}
|
}
|
||||||
|
|
||||||
P_RunThinkers();
|
P_RunThinkers();
|
||||||
if (G_BattleGametype() && battleovertime.enabled)
|
|
||||||
P_RunBattleOvertime();
|
|
||||||
|
|
||||||
// Run any "after all the other thinkers" stuff
|
// Run any "after all the other thinkers" stuff
|
||||||
for (i = 0; i < MAXPLAYERS; i++)
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo))
|
if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo))
|
||||||
P_PlayerAfterThink(&players[i]);
|
P_PlayerAfterThink(&players[i]);
|
||||||
|
|
||||||
|
if (G_BattleGametype() && battleovertime.enabled)
|
||||||
|
K_RunBattleOvertime();
|
||||||
|
|
||||||
#ifdef HAVE_BLUA
|
#ifdef HAVE_BLUA
|
||||||
LUAh_ThinkFrame();
|
LUAh_ThinkFrame();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue