Reaper new anim + fast spawn for testing
This commit is contained in:
parent
5224461184
commit
553013ddbf
|
@ -3085,7 +3085,7 @@ state_t states[NUMSTATES] =
|
||||||
{SPR_MARR, 0, 1, {A_MayonakaArrow}, 0, 0, S_MAYONAKAARROW}, //S_MAYONAKAARROW
|
{SPR_MARR, 0, 1, {A_MayonakaArrow}, 0, 0, S_MAYONAKAARROW}, //S_MAYONAKAARROW
|
||||||
|
|
||||||
//Mementos stuff
|
//Mementos stuff
|
||||||
{SPR_NULL, 0, TICRATE*130, {NULL}, 0, 0, S_REAPER}, //S_REAPER_INVIS
|
{SPR_NULL, 0, TICRATE*20, {NULL}, 0, 0, S_REAPER}, //S_REAPER_INVIS TODO: DON'T FORGET TO CHANGE THAT BACK TO 130*TICRATE WHEN TESTING IS OVER
|
||||||
{SPR_REAP, 0, 1, {A_ReaperThinker}, 0, 0, S_REAPER}, //S_REAPER
|
{SPR_REAP, 0, 1, {A_ReaperThinker}, 0, 0, S_REAPER}, //S_REAPER
|
||||||
{SPR_NULL, 0, 1, {A_MementosTPParticles}, 0, 0, S_MEMENTOSTP}, //S_MEMENTOSTP
|
{SPR_NULL, 0, 1, {A_MementosTPParticles}, 0, 0, S_MEMENTOSTP}, //S_MEMENTOSTP
|
||||||
|
|
||||||
|
|
|
@ -8438,7 +8438,7 @@ void A_RandomShadowFrame(mobj_t *actor)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!actor->extravalue1) // Hack that spawns thoks that look like random shadows. Otherwise the state would overwrite our frame and that's a pain.
|
if (!actor->extravalue1) // Hack that spawns thoks that look like random shadows. Otherwise the state would overwrite our frame and that's a pain.
|
||||||
{
|
{
|
||||||
fake = P_SpawnMobj(actor->x, actor->y, actor->z, MT_THOK);
|
fake = P_SpawnMobj(actor->x, actor->y, actor->z, MT_THOK);
|
||||||
fake->sprite = SPR_ENM1;
|
fake->sprite = SPR_ENM1;
|
||||||
fake->frame = P_RandomRange(0, 6);
|
fake->frame = P_RandomRange(0, 6);
|
||||||
|
@ -8450,9 +8450,9 @@ void A_RandomShadowFrame(mobj_t *actor)
|
||||||
actor->flags2 |= MF2_DONTDRAW;
|
actor->flags2 |= MF2_DONTDRAW;
|
||||||
actor->extravalue1 = 1;
|
actor->extravalue1 = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
P_SetScale(actor, FRACUNIT*3/2);
|
P_SetScale(actor, FRACUNIT*3/2);
|
||||||
|
|
||||||
// I have NO CLUE how to hardcode all of that fancy Linedef Executor shit so the fire spinout will be done by these entities directly.
|
// I have NO CLUE how to hardcode all of that fancy Linedef Executor shit so the fire spinout will be done by these entities directly.
|
||||||
if (P_LookForPlayers(actor, false, false, 512<<FRACBITS)) // got target
|
if (P_LookForPlayers(actor, false, false, 512<<FRACBITS)) // got target
|
||||||
{
|
{
|
||||||
|
@ -8487,7 +8487,7 @@ void A_RoamingShadowThinker(mobj_t *actor)
|
||||||
#endif
|
#endif
|
||||||
// extravalue1 replaces "movetimer"
|
// extravalue1 replaces "movetimer"
|
||||||
// extravalue2 replaces "stoptimer"
|
// extravalue2 replaces "stoptimer"
|
||||||
|
|
||||||
P_SetScale(actor, FRACUNIT*3/2);
|
P_SetScale(actor, FRACUNIT*3/2);
|
||||||
if (!actor->extravalue2)
|
if (!actor->extravalue2)
|
||||||
{
|
{
|
||||||
|
@ -8499,7 +8499,7 @@ void A_RoamingShadowThinker(mobj_t *actor)
|
||||||
actor->extravalue2 = 60;
|
actor->extravalue2 = 60;
|
||||||
}
|
}
|
||||||
// Search for and attack Players venturing too close in front of us.
|
// Search for and attack Players venturing too close in front of us.
|
||||||
|
|
||||||
if (P_LookForPlayers(actor, false, false, 256<<FRACBITS)) // got target
|
if (P_LookForPlayers(actor, false, false, 256<<FRACBITS)) // got target
|
||||||
{
|
{
|
||||||
if (actor->target && !actor->target->player->powers[pw_flashing]
|
if (actor->target && !actor->target->player->powers[pw_flashing]
|
||||||
|
@ -8545,7 +8545,7 @@ void A_MayonakaArrow(mobj_t *actor)
|
||||||
// "animtimer" is replaced by "extravalue1" here.
|
// "animtimer" is replaced by "extravalue1" here.
|
||||||
actor->extravalue1 = ((actor->extravalue1) ? (actor->extravalue1+1) : (P_RandomRange(0, TICRATE*3)));
|
actor->extravalue1 = ((actor->extravalue1) ? (actor->extravalue1+1) : (P_RandomRange(0, TICRATE*3)));
|
||||||
flip = ((actor->spawnpoint->options & 1) ? (3) : (0)); // flip adds 3 frames, which is the flipped version of the sign.
|
flip = ((actor->spawnpoint->options & 1) ? (3) : (0)); // flip adds 3 frames, which is the flipped version of the sign.
|
||||||
|
|
||||||
actor->frame = flip;
|
actor->frame = flip;
|
||||||
if (actor->extravalue1 >= TICRATE*7/2)
|
if (actor->extravalue1 >= TICRATE*7/2)
|
||||||
actor->extravalue1 = 0; // reset to 0 and start a new cycle.
|
actor->extravalue1 = 0; // reset to 0 and start a new cycle.
|
||||||
|
@ -8553,10 +8553,10 @@ void A_MayonakaArrow(mobj_t *actor)
|
||||||
actor->frame = flip+2;
|
actor->frame = flip+2;
|
||||||
else if (actor->extravalue1 > TICRATE*3 && leveltime%2 > 0)
|
else if (actor->extravalue1 > TICRATE*3 && leveltime%2 > 0)
|
||||||
actor->frame = flip+1;
|
actor->frame = flip+1;
|
||||||
|
|
||||||
actor->frame |= FF_PAPERSPRITE;
|
actor->frame |= FF_PAPERSPRITE;
|
||||||
actor->momz = 0;
|
actor->momz = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// A_MementosTPParticles
|
// A_MementosTPParticles
|
||||||
|
@ -8568,21 +8568,21 @@ void A_MementosTPParticles(mobj_t *actor)
|
||||||
mobj_t *mo2;
|
mobj_t *mo2;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
thinker_t *th;
|
thinker_t *th;
|
||||||
|
|
||||||
#ifdef HAVE_BLUA
|
#ifdef HAVE_BLUA
|
||||||
if (LUA_CallAction("A_MementosTPParticles", (actor)))
|
if (LUA_CallAction("A_MementosTPParticles", (actor)))
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (; i<4; i++)
|
for (; i<4; i++)
|
||||||
{
|
{
|
||||||
particle = P_SpawnMobj(actor->x + (P_RandomRange(-256, 256)<<FRACBITS), actor->y + (P_RandomRange(-256, 256)<<FRACBITS), actor->z + (P_RandomRange(48, 256)<<FRACBITS), MT_MEMENTOSPARTICLE);
|
particle = P_SpawnMobj(actor->x + (P_RandomRange(-256, 256)<<FRACBITS), actor->y + (P_RandomRange(-256, 256)<<FRACBITS), actor->z + (P_RandomRange(48, 256)<<FRACBITS), MT_MEMENTOSPARTICLE);
|
||||||
particle->frame = 0;
|
particle->frame = 0;
|
||||||
particle->color = ((i%2) ? (SKINCOLOR_RED) : (SKINCOLOR_BLACK));
|
particle->color = ((i%2) ? (SKINCOLOR_RED) : (SKINCOLOR_BLACK));
|
||||||
particle->destscale = 1;
|
particle->destscale = 1;
|
||||||
P_HomingAttack(particle, actor);
|
P_HomingAttack(particle, actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Although this is mostly used to spawn particles, we will also save the OTHER teleport inside actor->target. That way teleporting doesn't require a thinker iteration.
|
// Although this is mostly used to spawn particles, we will also save the OTHER teleport inside actor->target. That way teleporting doesn't require a thinker iteration.
|
||||||
// Doesn't seem like much given the small amount of mobjs this map has but heh.
|
// Doesn't seem like much given the small amount of mobjs this map has but heh.
|
||||||
if (!actor->target)
|
if (!actor->target)
|
||||||
|
@ -8610,75 +8610,80 @@ void A_ReaperThinker(mobj_t *actor)
|
||||||
mobj_t *particle; // particles to spawn
|
mobj_t *particle; // particles to spawn
|
||||||
int i = 0; // for loops
|
int i = 0; // for loops
|
||||||
angle_t an = ANGLE_22h; // Reminder that angle constants suck.
|
angle_t an = ANGLE_22h; // Reminder that angle constants suck.
|
||||||
|
|
||||||
//Waypoint stuff:
|
//Waypoint stuff:
|
||||||
mobj_t *mo2;
|
mobj_t *mo2;
|
||||||
thinker_t *th;
|
thinker_t *th;
|
||||||
|
|
||||||
//Player targetting stuff:
|
//Player targetting stuff:
|
||||||
INT32 maxscore = 0; // we target the player with the highest score so yeah there you go.
|
INT32 maxscore = 0; // we target the player with the highest score so yeah there you go.
|
||||||
player_t *player; // used as a shortcut in a loop.
|
player_t *player; // used as a shortcut in a loop.
|
||||||
mobj_t *targetplayermo; // the player mo we can eventually target, or whatever.
|
mobj_t *targetplayermo; // the player mo we can eventually target, or whatever.
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_BLUA
|
#ifdef HAVE_BLUA
|
||||||
if (LUA_CallAction("A_ReaperThinker", (actor)))
|
if (LUA_CallAction("A_ReaperThinker", (actor)))
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// We don't have custom variables or whatever so we'll do with whatever the fuck we have left.
|
// We don't have custom variables or whatever so we'll do with whatever the fuck we have left.
|
||||||
|
|
||||||
if (actor->health == 1000) // if health is 1000, set it to a small scale and have it start growing with destscale. Then set the health to uh, not 1000.
|
if (actor->health == 1000) // if health is 1000, set it to a small scale and have it start growing with destscale. Then set the health to uh, not 1000.
|
||||||
{
|
{
|
||||||
actor->scale = 1;
|
actor->scale = 1;
|
||||||
actor->destscale = 2<<FRACBITS;
|
actor->destscale = 2<<FRACBITS;
|
||||||
actor->scalespeed = FRACUNIT/24; // Should take a bit less than 2 seconds to fully grow.
|
actor->scalespeed = FRACUNIT/24; // Should take a bit less than 2 seconds to fully grow.
|
||||||
S_StartSound(NULL, sfx_chain);
|
S_StartSound(NULL, sfx_chain);
|
||||||
actor->health--; // now we have 999 health, so that above won't happen again. Awesome.
|
actor->health--; // now we have 999 health, so that above won't happen again. Awesome.
|
||||||
}
|
}
|
||||||
|
|
||||||
if (actor->scale < 2<<FRACBITS) // we haven't finished growing YET.
|
if (actor->scale < 2<<FRACBITS) // we haven't finished growing YET.
|
||||||
{
|
{
|
||||||
// Spawn particles as we grow out of the floor, ゴ ゴ ゴ ゴ
|
// Spawn particles as we grow out of the floor, ゴ ゴ ゴ ゴ
|
||||||
for (; i<16; i++)
|
for (; i<16; i++)
|
||||||
{
|
{
|
||||||
particle = P_SpawnMobj(actor->x + (P_RandomRange(-60, 60)<<FRACBITS), actor->y + (P_RandomRange(-60, 60)<<FRACBITS), actor->z, MT_THOK);
|
particle = P_SpawnMobj(actor->x + (P_RandomRange(-60, 60)<<FRACBITS), actor->y + (P_RandomRange(-60, 60)<<FRACBITS), actor->z, MT_THOK);
|
||||||
particle->momz = 20<<FRACBITS;
|
particle->momz = 20<<FRACBITS;
|
||||||
particle->color = ((i%2 !=0) ? (SKINCOLOR_RED) : (SKINCOLOR_BLACK));
|
particle->color = ((i%2 !=0) ? (SKINCOLOR_RED) : (SKINCOLOR_BLACK));
|
||||||
particle->frame = 0;
|
particle->frame = 0;
|
||||||
P_SetScale(particle, FRACUNIT/2);
|
P_SetScale(particle, FRACUNIT/2);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Spawn particles in some edgy circle or w/e.
|
// Spawn particles in some edgy circle or w/e.
|
||||||
|
|
||||||
if (leveltime%5 != 0) // spawn the thing under that every tic.
|
if (leveltime%5 != 0) // spawn the thing under that every tic.
|
||||||
return;
|
return;
|
||||||
|
|
||||||
i=0;
|
i=0;
|
||||||
for (; i<15; i++) // spawn in a circle formation or w/e.
|
for (; i<15; i++) // spawn in a circle formation or w/e.
|
||||||
{
|
{
|
||||||
particle = P_SpawnMobj(actor->x, actor->y, actor->z, MT_THOK);
|
particle = P_SpawnMobj(actor->x, actor->y, actor->z, MT_THOK);
|
||||||
particle->momz = 20<<FRACBITS;
|
particle->momz = 20<<FRACBITS;
|
||||||
particle->color = ((i%2 !=0) ? (SKINCOLOR_RED) : (SKINCOLOR_BLACK));
|
particle->color = ((i%2 !=0) ? (SKINCOLOR_RED) : (SKINCOLOR_BLACK));
|
||||||
particle->frame = 0;
|
particle->frame = 0;
|
||||||
P_SetScale(particle, FRACUNIT/2);
|
P_SetScale(particle, FRACUNIT/2);
|
||||||
P_InstaThrust(particle, an*i, 30<<FRACBITS);
|
P_InstaThrust(particle, an*i, 30<<FRACBITS);
|
||||||
}
|
}
|
||||||
return; // don't continue, what lies beyond that is the movement code.
|
return; // don't continue, what lies beyond that is the movement code.
|
||||||
}
|
}
|
||||||
|
|
||||||
// We finished growing and can now be a dangerous piece o' garbage scaring the living heck outta players!
|
// We finished growing and can now be a dangerous piece o' garbage scaring the living heck outta players!
|
||||||
|
|
||||||
actor->flags = MF_NOGRAVITY|MF_PAIN|MF_SPECIAL|MF_NOCLIP|MF_NOCLIPHEIGHT; // set our flags to be a damaging thing.
|
actor->flags = MF_NOGRAVITY|MF_PAIN|MF_SPECIAL|MF_NOCLIP|MF_NOCLIPHEIGHT; // set our flags to be a damaging thing.
|
||||||
|
// Handle animation:
|
||||||
|
if (!(leveltime%5))
|
||||||
|
actor->extravalue2 = (actor->extravalue2 < 9) ? (actor->extravalue2+1) : (0); // Ghetto animation, but hey it works for what it's worth
|
||||||
|
|
||||||
|
actor->frame = actor->extravalue2; // yes i'm that bad at maths don't @ me.
|
||||||
|
|
||||||
if (!actor->target)
|
if (!actor->target)
|
||||||
{
|
{
|
||||||
if (actor->hnext)
|
if (actor->hnext)
|
||||||
{
|
{
|
||||||
P_SetTarget(&actor->target, actor->hnext); // Default back to last waypoint.
|
P_SetTarget(&actor->target, actor->hnext); // Default back to last waypoint.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We have no target and oughta find one, so let's scan through thinkers for a waypoint of angle 0, or something.
|
// We have no target and oughta find one, so let's scan through thinkers for a waypoint of angle 0, or something.
|
||||||
for (th = thinkercap.next; th != &thinkercap; th = th->next)
|
for (th = thinkercap.next; th != &thinkercap; th = th->next)
|
||||||
{
|
{
|
||||||
|
@ -8701,28 +8706,28 @@ void A_ReaperThinker(mobj_t *actor)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // Awesome, we now have a target.
|
else // Awesome, we now have a target.
|
||||||
{
|
{
|
||||||
// Follow target:
|
// Follow target:
|
||||||
P_InstaThrust(actor, R_PointToAngle2(actor->x, actor->y, actor->target->x, actor->target->y), 20<<FRACBITS);
|
P_InstaThrust(actor, R_PointToAngle2(actor->x, actor->y, actor->target->x, actor->target->y), 20<<FRACBITS);
|
||||||
actor->angle = R_PointToAngle2(actor->x, actor->y, actor->target->x, actor->target->y);
|
actor->angle = R_PointToAngle2(actor->x, actor->y, actor->target->x, actor->target->y);
|
||||||
|
|
||||||
// The player we should target if it's near us:
|
// The player we should target if it's near us:
|
||||||
for (i=0; i<MAXPLAYERS; i++)
|
for (i=0; i<MAXPLAYERS; i++)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (!playeringame[i])
|
if (!playeringame[i])
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
player = &players[actor->lastlook];
|
player = &players[actor->lastlook];
|
||||||
if (player && player->mo && player->kartstuff[k_bumper] && player->score >= maxscore)
|
if (player && player->mo && player->kartstuff[k_bumper] && player->score >= maxscore)
|
||||||
{
|
{
|
||||||
targetplayermo = player->mo;
|
targetplayermo = player->mo;
|
||||||
maxscore = player->score;
|
maxscore = player->score;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try to target that player:
|
// Try to target that player:
|
||||||
if (targetplayermo)
|
if (targetplayermo)
|
||||||
{
|
{
|
||||||
|
@ -8734,17 +8739,17 @@ void A_ReaperThinker(mobj_t *actor)
|
||||||
&& !actor->target->player->kartstuff[k_spinouttimer]))
|
&& !actor->target->player->kartstuff[k_spinouttimer]))
|
||||||
P_SetTarget(&actor->target, actor->hnext);
|
P_SetTarget(&actor->target, actor->hnext);
|
||||||
// if the above isn't correct, then we should go back to targetting waypoints or something.
|
// if the above isn't correct, then we should go back to targetting waypoints or something.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Waypoint behavior.
|
// Waypoint behavior.
|
||||||
if (actor->target->type == MT_REAPERWAYPOINT)
|
if (actor->target->type == MT_REAPERWAYPOINT)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (R_PointToDist2(actor->x, actor->y, actor->target->x, actor->target->y) < 22<<FRACBITS)
|
if (R_PointToDist2(actor->x, actor->y, actor->target->x, actor->target->y) < 22<<FRACBITS)
|
||||||
{
|
{
|
||||||
P_SetTarget(&actor->target, NULL); // remove target so we can default back to first waypoint if things go ham.
|
P_SetTarget(&actor->target, NULL); // remove target so we can default back to first waypoint if things go ham.
|
||||||
|
|
||||||
// If we reach close to a waypoint, then we should go to the NEXT one.
|
// If we reach close to a waypoint, then we should go to the NEXT one.
|
||||||
for (th = thinkercap.next; th != &thinkercap; th = th->next)
|
for (th = thinkercap.next; th != &thinkercap; th = th->next)
|
||||||
{
|
{
|
||||||
|
@ -8757,15 +8762,15 @@ void A_ReaperThinker(mobj_t *actor)
|
||||||
continue;
|
continue;
|
||||||
if (mo2->spawnpoint->angle != actor->extravalue1+1)
|
if (mo2->spawnpoint->angle != actor->extravalue1+1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
P_SetTarget(&actor->target, mo2); // The main target we're pursing.
|
P_SetTarget(&actor->target, mo2); // The main target we're pursing.
|
||||||
P_SetTarget(&actor->hnext, mo2); // The last waypoint we hit. We will default back to that if a player goes out of our range!
|
P_SetTarget(&actor->hnext, mo2); // The last waypoint we hit. We will default back to that if a player goes out of our range!
|
||||||
actor->extravalue1++; // This will store the angle of the last waypoint we touched. This will essentially be useful later on.
|
actor->extravalue1++; // This will store the angle of the last waypoint we touched. This will essentially be useful later on.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!actor->target) // If we have no target, revert back to waypoint 0.
|
if (!actor->target) // If we have no target, revert back to waypoint 0.
|
||||||
{
|
{
|
||||||
actor->extravalue1 = 0;
|
actor->extravalue1 = 0;
|
||||||
|
|
Loading…
Reference in New Issue