mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-02-17 19:11:30 +00:00
MT_EMERALD: prepartion to let orbiting physics be used in a general-purpose manner
- Add Obj_SetEmeraldAwardee
- Separate object receiving emerald from object being
orbited
- Obj_BeginEmeraldOrbit sets both, if the awardee isn't
explicitly set
- Don't HUD track emeralds without emerald flag set
This commit is contained in:
parent
eb477365a4
commit
b86ade712a
3 changed files with 26 additions and 12 deletions
|
|
@ -448,7 +448,8 @@ bool is_object_tracking_target(const mobj_t* mobj)
|
|||
return inDuel == false && battleovertime.enabled;
|
||||
|
||||
case MT_EMERALD:
|
||||
return (specialstageinfo.valid && specialstageinfo.ufo) || is_player_tracking_target();
|
||||
// extravalue1: emerald flag must be set
|
||||
return mobj->extravalue1 && ((specialstageinfo.valid && specialstageinfo.ufo) || is_player_tracking_target());
|
||||
|
||||
case MT_MONITOR:
|
||||
return is_player_tracking_target() && Obj_MonitorGetEmerald(mobj) != 0;
|
||||
|
|
|
|||
|
|
@ -213,6 +213,7 @@ void Obj_EmeraldThink(mobj_t *emerald);
|
|||
void Obj_EmeraldFlareThink(mobj_t *flare);
|
||||
void Obj_BeginEmeraldOrbit(mobj_t *emerald, mobj_t *target, fixed_t radius, INT32 revolution_time, tic_t fuse);
|
||||
void Obj_GiveEmerald(mobj_t *emerald);
|
||||
void Obj_SetEmeraldAwardee(mobj_t *emerald, mobj_t *awardee);
|
||||
|
||||
/* Fake Shadow */
|
||||
mobj_t *Obj_SpawnFakeShadow(mobj_t *from);
|
||||
|
|
|
|||
|
|
@ -15,6 +15,8 @@
|
|||
#define emerald_target_radius(o) ((o)->extravalue2)
|
||||
#define emerald_z_shift(o) ((o)->reactiontime)
|
||||
#define emerald_scale_rate(o) ((o)->movefactor)
|
||||
#define emerald_orbit(o) ((o)->target)
|
||||
#define emerald_award(o) ((o)->tracer)
|
||||
|
||||
// Think of this like EMERALD_SPEED_UP / EMERALD_SPEED_UP_RATE
|
||||
#define EMERALD_SPEED_UP (1) // speed up by this much...
|
||||
|
|
@ -84,7 +86,7 @@ static fixed_t get_target_z(mobj_t *emerald)
|
|||
{
|
||||
fixed_t shift = FixedMul(emerald_z_shift(emerald), FRACUNIT - get_suck_factor(emerald));
|
||||
|
||||
return center_of(emerald->target) + get_bob(emerald) + shift;
|
||||
return center_of(emerald_orbit(emerald)) + get_bob(emerald) + shift;
|
||||
}
|
||||
|
||||
static void speed_up(mobj_t *emerald)
|
||||
|
|
@ -116,8 +118,8 @@ static void Obj_EmeraldOrbitPlayer(mobj_t *emerald)
|
|||
|
||||
P_MoveOrigin(
|
||||
emerald,
|
||||
emerald->target->x + x,
|
||||
emerald->target->y + y,
|
||||
emerald_orbit(emerald)->x + x,
|
||||
emerald_orbit(emerald)->y + y,
|
||||
get_target_z(emerald)
|
||||
);
|
||||
|
||||
|
|
@ -133,9 +135,9 @@ static void Obj_EmeraldOrbitPlayer(mobj_t *emerald)
|
|||
|
||||
void Obj_EmeraldThink(mobj_t *emerald)
|
||||
{
|
||||
if (!P_MobjWasRemoved(emerald->target))
|
||||
if (!P_MobjWasRemoved(emerald_orbit(emerald)))
|
||||
{
|
||||
switch (emerald->target->type)
|
||||
switch (emerald_orbit(emerald)->type)
|
||||
{
|
||||
case MT_SPECIAL_UFO:
|
||||
Obj_UFOEmeraldThink(emerald);
|
||||
|
|
@ -256,7 +258,7 @@ static void spawn_lens_flare(mobj_t *emerald)
|
|||
mobj_t *flare = P_SpawnMobjFromMobj(emerald, 0, 0, 0, MT_EMERALDFLARE);
|
||||
|
||||
P_SetTarget(&flare->target, emerald);
|
||||
P_InstaScale(flare, emerald->target->scale);
|
||||
P_InstaScale(flare, emerald_orbit(emerald)->scale);
|
||||
|
||||
flare->color = emerald->color;
|
||||
flare->colorized = true;
|
||||
|
|
@ -265,7 +267,7 @@ static void spawn_lens_flare(mobj_t *emerald)
|
|||
|
||||
// FIXME: linkdraw doesn't work consistently, so I drew it on top of everyting (and through walls)
|
||||
#if 0
|
||||
P_SetTarget(&flare->tracer, emerald->target);
|
||||
P_SetTarget(&flare->tracer, emerald_orbit(emerald));
|
||||
flare->flags2 |= MF2_LINKDRAW;
|
||||
flare->dispoffset = 1000;
|
||||
#endif
|
||||
|
|
@ -273,7 +275,12 @@ static void spawn_lens_flare(mobj_t *emerald)
|
|||
|
||||
void Obj_BeginEmeraldOrbit(mobj_t *emerald, mobj_t *target, fixed_t radius, INT32 revolution_time, tic_t fuse)
|
||||
{
|
||||
P_SetTarget(&emerald->target, target);
|
||||
P_SetTarget(&emerald_orbit(emerald), target);
|
||||
|
||||
if (P_MobjWasRemoved(emerald_award(emerald)))
|
||||
{
|
||||
P_SetTarget(&emerald_award(emerald), target);
|
||||
}
|
||||
|
||||
emerald_anim_start(emerald) = leveltime;
|
||||
emerald_revolution_time(emerald) = revolution_time;
|
||||
|
|
@ -299,12 +306,12 @@ void Obj_BeginEmeraldOrbit(mobj_t *emerald, mobj_t *target, fixed_t radius, INT3
|
|||
|
||||
void Obj_GiveEmerald(mobj_t *emerald)
|
||||
{
|
||||
if (P_MobjWasRemoved(emerald->target))
|
||||
if (P_MobjWasRemoved(emerald_orbit(emerald)) || P_MobjWasRemoved(emerald_award(emerald)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
player_t *player = emerald->target->player;
|
||||
player_t *player = emerald_award(emerald)->player;
|
||||
|
||||
if (!player)
|
||||
{
|
||||
|
|
@ -314,5 +321,10 @@ void Obj_GiveEmerald(mobj_t *emerald)
|
|||
player->emeralds |= emerald_type(emerald);
|
||||
K_CheckEmeralds(player);
|
||||
|
||||
S_StartSound(emerald->target, emerald->info->deathsound);
|
||||
S_StartSound(emerald_award(emerald), emerald->info->deathsound);
|
||||
}
|
||||
|
||||
void Obj_SetEmeraldAwardee(mobj_t *emerald, mobj_t *awardee)
|
||||
{
|
||||
P_SetTarget(&emerald_award(emerald), awardee);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue