mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Emerald orbits player after UFO Catcher is broken
This commit is contained in:
parent
1c4ec2325e
commit
2f9ae94b62
3 changed files with 51 additions and 2 deletions
|
|
@ -382,7 +382,7 @@ 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 || is_player_tracking_target();
|
return (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;
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
#include "../info.h"
|
#include "../info.h"
|
||||||
#include "../m_random.h"
|
#include "../m_random.h"
|
||||||
#include "../p_local.h"
|
#include "../p_local.h"
|
||||||
|
#include "../tables.h"
|
||||||
|
|
||||||
void Obj_SpawnEmeraldSparks(mobj_t *mobj)
|
void Obj_SpawnEmeraldSparks(mobj_t *mobj)
|
||||||
{
|
{
|
||||||
|
|
@ -24,6 +25,33 @@ void Obj_SpawnEmeraldSparks(mobj_t *mobj)
|
||||||
sparkle->sprzoff = mobj->sprzoff;
|
sparkle->sprzoff = mobj->sprzoff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void Obj_EmeraldOrbitPlayer(mobj_t *emerald)
|
||||||
|
{
|
||||||
|
const int kOrbitTics = 64;
|
||||||
|
const int kPhaseTics = 128;
|
||||||
|
|
||||||
|
const fixed_t orbit_radius = 100 * mapobjectscale;
|
||||||
|
const fixed_t orbit_height = 30 * mapobjectscale;
|
||||||
|
|
||||||
|
mobj_t *targ = emerald->target;
|
||||||
|
|
||||||
|
angle_t a = emerald->angle;
|
||||||
|
|
||||||
|
fixed_t x = FixedMul(orbit_radius, FCOS(a));
|
||||||
|
fixed_t y = FixedMul(orbit_radius, FSIN(a));
|
||||||
|
|
||||||
|
angle_t phase = (ANGLE_MAX / kPhaseTics) * (leveltime % kPhaseTics);
|
||||||
|
|
||||||
|
P_MoveOrigin(
|
||||||
|
emerald,
|
||||||
|
targ->x + x,
|
||||||
|
targ->y + y,
|
||||||
|
targ->z + targ->height + FixedMul(orbit_height, FSIN(a + phase))
|
||||||
|
);
|
||||||
|
|
||||||
|
emerald->angle += ANGLE_MAX / kOrbitTics;
|
||||||
|
}
|
||||||
|
|
||||||
void Obj_EmeraldThink(mobj_t *emerald)
|
void Obj_EmeraldThink(mobj_t *emerald)
|
||||||
{
|
{
|
||||||
if (!P_MobjWasRemoved(emerald->target))
|
if (!P_MobjWasRemoved(emerald->target))
|
||||||
|
|
@ -34,6 +62,10 @@ void Obj_EmeraldThink(mobj_t *emerald)
|
||||||
Obj_UFOEmeraldThink(emerald);
|
Obj_UFOEmeraldThink(emerald);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MT_PLAYER:
|
||||||
|
Obj_EmeraldOrbitPlayer(emerald);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,8 @@
|
||||||
|
|
||||||
#define ufo_intangible(o) ((o)->cusval)
|
#define ufo_intangible(o) ((o)->cusval)
|
||||||
|
|
||||||
|
#define ufo_emerald(o) ((o)->tracer)
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
UFO_PIECE_TYPE_POD,
|
UFO_PIECE_TYPE_POD,
|
||||||
|
|
@ -854,6 +856,8 @@ void Obj_PlayerUFOCollide(mobj_t *ufo, mobj_t *other)
|
||||||
|
|
||||||
boolean Obj_UFOEmeraldCollect(mobj_t *ufo, mobj_t *toucher)
|
boolean Obj_UFOEmeraldCollect(mobj_t *ufo, mobj_t *toucher)
|
||||||
{
|
{
|
||||||
|
mobj_t *emerald = ufo_emerald(ufo);
|
||||||
|
|
||||||
if (toucher->player != NULL)
|
if (toucher->player != NULL)
|
||||||
{
|
{
|
||||||
if (P_CanPickupItem(toucher->player, 0) == false)
|
if (P_CanPickupItem(toucher->player, 0) == false)
|
||||||
|
|
@ -874,7 +878,19 @@ boolean Obj_UFOEmeraldCollect(mobj_t *ufo, mobj_t *toucher)
|
||||||
|
|
||||||
ACS_RunEmeraldScript(toucher);
|
ACS_RunEmeraldScript(toucher);
|
||||||
|
|
||||||
CONS_Printf("You win!\n");
|
if (!P_MobjWasRemoved(emerald))
|
||||||
|
{
|
||||||
|
const int kScaleTics = 16;
|
||||||
|
|
||||||
|
// Emerald will now orbit the player
|
||||||
|
P_SetTarget(&emerald->target, toucher);
|
||||||
|
|
||||||
|
// Scale down because the emerald is huge
|
||||||
|
// Super Emerald needs to be scaled down further
|
||||||
|
emerald->destscale = emerald->scale / (ufo_emeraldnum(ufo) > 7 ? 3 : 2);
|
||||||
|
emerald->scalespeed = abs(emerald->destscale - emerald->scale) / kScaleTics;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1044,6 +1060,7 @@ static mobj_t *InitSpecialUFO(waypoint_t *start)
|
||||||
}
|
}
|
||||||
|
|
||||||
P_SetTarget(&emerald->target, ufo);
|
P_SetTarget(&emerald->target, ufo);
|
||||||
|
P_SetTarget(&ufo_emerald(ufo), emerald);
|
||||||
|
|
||||||
ufo->color = emerald->color; // for minimap
|
ufo->color = emerald->color; // for minimap
|
||||||
overlay->color = emerald->color;
|
overlay->color = emerald->color;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue