mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-04-27 12:31:54 +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;
|
return inDuel == false && battleovertime.enabled;
|
||||||
|
|
||||||
case MT_EMERALD:
|
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:
|
case MT_MONITOR:
|
||||||
return is_player_tracking_target() && Obj_MonitorGetEmerald(mobj) != 0;
|
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_EmeraldFlareThink(mobj_t *flare);
|
||||||
void Obj_BeginEmeraldOrbit(mobj_t *emerald, mobj_t *target, fixed_t radius, INT32 revolution_time, tic_t fuse);
|
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_GiveEmerald(mobj_t *emerald);
|
||||||
|
void Obj_SetEmeraldAwardee(mobj_t *emerald, mobj_t *awardee);
|
||||||
|
|
||||||
/* Fake Shadow */
|
/* Fake Shadow */
|
||||||
mobj_t *Obj_SpawnFakeShadow(mobj_t *from);
|
mobj_t *Obj_SpawnFakeShadow(mobj_t *from);
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,8 @@
|
||||||
#define emerald_target_radius(o) ((o)->extravalue2)
|
#define emerald_target_radius(o) ((o)->extravalue2)
|
||||||
#define emerald_z_shift(o) ((o)->reactiontime)
|
#define emerald_z_shift(o) ((o)->reactiontime)
|
||||||
#define emerald_scale_rate(o) ((o)->movefactor)
|
#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
|
// Think of this like EMERALD_SPEED_UP / EMERALD_SPEED_UP_RATE
|
||||||
#define EMERALD_SPEED_UP (1) // speed up by this much...
|
#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));
|
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)
|
static void speed_up(mobj_t *emerald)
|
||||||
|
|
@ -116,8 +118,8 @@ static void Obj_EmeraldOrbitPlayer(mobj_t *emerald)
|
||||||
|
|
||||||
P_MoveOrigin(
|
P_MoveOrigin(
|
||||||
emerald,
|
emerald,
|
||||||
emerald->target->x + x,
|
emerald_orbit(emerald)->x + x,
|
||||||
emerald->target->y + y,
|
emerald_orbit(emerald)->y + y,
|
||||||
get_target_z(emerald)
|
get_target_z(emerald)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -133,9 +135,9 @@ static void Obj_EmeraldOrbitPlayer(mobj_t *emerald)
|
||||||
|
|
||||||
void Obj_EmeraldThink(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:
|
case MT_SPECIAL_UFO:
|
||||||
Obj_UFOEmeraldThink(emerald);
|
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);
|
mobj_t *flare = P_SpawnMobjFromMobj(emerald, 0, 0, 0, MT_EMERALDFLARE);
|
||||||
|
|
||||||
P_SetTarget(&flare->target, emerald);
|
P_SetTarget(&flare->target, emerald);
|
||||||
P_InstaScale(flare, emerald->target->scale);
|
P_InstaScale(flare, emerald_orbit(emerald)->scale);
|
||||||
|
|
||||||
flare->color = emerald->color;
|
flare->color = emerald->color;
|
||||||
flare->colorized = true;
|
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)
|
// FIXME: linkdraw doesn't work consistently, so I drew it on top of everyting (and through walls)
|
||||||
#if 0
|
#if 0
|
||||||
P_SetTarget(&flare->tracer, emerald->target);
|
P_SetTarget(&flare->tracer, emerald_orbit(emerald));
|
||||||
flare->flags2 |= MF2_LINKDRAW;
|
flare->flags2 |= MF2_LINKDRAW;
|
||||||
flare->dispoffset = 1000;
|
flare->dispoffset = 1000;
|
||||||
#endif
|
#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)
|
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_anim_start(emerald) = leveltime;
|
||||||
emerald_revolution_time(emerald) = revolution_time;
|
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)
|
void Obj_GiveEmerald(mobj_t *emerald)
|
||||||
{
|
{
|
||||||
if (P_MobjWasRemoved(emerald->target))
|
if (P_MobjWasRemoved(emerald_orbit(emerald)) || P_MobjWasRemoved(emerald_award(emerald)))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
player_t *player = emerald->target->player;
|
player_t *player = emerald_award(emerald)->player;
|
||||||
|
|
||||||
if (!player)
|
if (!player)
|
||||||
{
|
{
|
||||||
|
|
@ -314,5 +321,10 @@ void Obj_GiveEmerald(mobj_t *emerald)
|
||||||
player->emeralds |= emerald_type(emerald);
|
player->emeralds |= emerald_type(emerald);
|
||||||
K_CheckEmeralds(player);
|
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