mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Merge branch 'whip-shadow' into 'master'
Whip shadow + polish See merge request KartKrew/Kart!1282
This commit is contained in:
commit
908d84b44b
11 changed files with 176 additions and 34 deletions
|
|
@ -5268,6 +5268,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
|
||||||
"MT_TUBEWAYPOINT",
|
"MT_TUBEWAYPOINT",
|
||||||
"MT_PUSH",
|
"MT_PUSH",
|
||||||
"MT_GHOST",
|
"MT_GHOST",
|
||||||
|
"MT_FAKESHADOW",
|
||||||
"MT_OVERLAY",
|
"MT_OVERLAY",
|
||||||
"MT_ANGLEMAN",
|
"MT_ANGLEMAN",
|
||||||
"MT_POLYANCHOR",
|
"MT_POLYANCHOR",
|
||||||
|
|
|
||||||
29
src/info.c
29
src/info.c
|
|
@ -3951,7 +3951,7 @@ state_t states[NUMSTATES] =
|
||||||
|
|
||||||
{SPR_SLPT, FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_SLIPTIDEZIP
|
{SPR_SLPT, FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_SLIPTIDEZIP
|
||||||
|
|
||||||
{SPR_IWHP, FF_FULLBRIGHT|FF_FLOORSPRITE|FF_ANIMATE|0, -1, {NULL}, 6, 2, S_NULL}, // S_INSTAWHIP
|
{SPR_IWHP, FF_FLOORSPRITE|FF_ANIMATE|0, -1, {NULL}, 6, 2, S_NULL}, // S_INSTAWHIP
|
||||||
{SPR_GRNG, FF_FULLBRIGHT|FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_BLOCKRING
|
{SPR_GRNG, FF_FULLBRIGHT|FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_BLOCKRING
|
||||||
{SPR_GBDY, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_BLOCKBODY
|
{SPR_GBDY, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_BLOCKBODY
|
||||||
|
|
||||||
|
|
@ -21427,6 +21427,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
S_NULL // raisestate
|
S_NULL // raisestate
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{ // MT_FAKESHADOW
|
||||||
|
-1, // doomednum
|
||||||
|
S_THOK, // spawnstate
|
||||||
|
1, // spawnhealth
|
||||||
|
S_NULL, // seestate
|
||||||
|
sfx_None, // seesound
|
||||||
|
0, // reactiontime
|
||||||
|
sfx_None, // attacksound
|
||||||
|
S_NULL, // painstate
|
||||||
|
0, // painchance
|
||||||
|
sfx_None, // painsound
|
||||||
|
S_NULL, // meleestate
|
||||||
|
S_NULL, // missilestate
|
||||||
|
S_NULL, // deathstate
|
||||||
|
S_NULL, // xdeathstate
|
||||||
|
sfx_None, // deathsound
|
||||||
|
0, // speed
|
||||||
|
16*FRACUNIT, // radius
|
||||||
|
48*FRACUNIT, // height
|
||||||
|
-1, // display offset
|
||||||
|
1000, // mass
|
||||||
|
8, // damage
|
||||||
|
sfx_None, // activesound
|
||||||
|
MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_SCENERY|MF_DONTENCOREMAP, // flags
|
||||||
|
S_NULL // raisestate
|
||||||
|
},
|
||||||
|
|
||||||
{ // MT_OVERLAY
|
{ // MT_OVERLAY
|
||||||
-1, // doomednum
|
-1, // doomednum
|
||||||
S_NULL, // spawnstate
|
S_NULL, // spawnstate
|
||||||
|
|
|
||||||
|
|
@ -6379,6 +6379,7 @@ typedef enum mobj_type
|
||||||
MT_TUBEWAYPOINT,
|
MT_TUBEWAYPOINT,
|
||||||
MT_PUSH,
|
MT_PUSH,
|
||||||
MT_GHOST,
|
MT_GHOST,
|
||||||
|
MT_FAKESHADOW,
|
||||||
MT_OVERLAY,
|
MT_OVERLAY,
|
||||||
MT_ANGLEMAN,
|
MT_ANGLEMAN,
|
||||||
MT_POLYANCHOR,
|
MT_POLYANCHOR,
|
||||||
|
|
|
||||||
|
|
@ -7938,7 +7938,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
||||||
|
|
||||||
if (leveltime < starttime)
|
if (leveltime < starttime)
|
||||||
{
|
{
|
||||||
player->instaShieldCooldown = INSTAWHIP_STARTOFRACE;
|
player->instaShieldCooldown = (gametyperules & GTR_SPHERES) ? INSTAWHIP_STARTOFBATTLE : INSTAWHIP_STARTOFRACE;
|
||||||
}
|
}
|
||||||
else if (player->rings > 0)
|
else if (player->rings > 0)
|
||||||
{
|
{
|
||||||
|
|
@ -10700,6 +10700,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
||||||
P_SetScale(whip, player->mo->scale);
|
P_SetScale(whip, player->mo->scale);
|
||||||
P_SetTarget(&whip->target, player->mo);
|
P_SetTarget(&whip->target, player->mo);
|
||||||
K_MatchGenericExtraFlags(whip, player->mo);
|
K_MatchGenericExtraFlags(whip, player->mo);
|
||||||
|
P_SpawnFakeShadow(whip, 20);
|
||||||
whip->fuse = 12; // Changing instawhip animation duration? Look here
|
whip->fuse = 12; // Changing instawhip animation duration? Look here
|
||||||
player->flashing = max(player->flashing, 12);
|
player->flashing = max(player->flashing, 12);
|
||||||
player->mo->momz += 4*mapobjectscale;
|
player->mo->momz += 4*mapobjectscale;
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@ Make sure this matches the actual number of states
|
||||||
|
|
||||||
#define INSTAWHIP_COOLDOWN (TICRATE*2)
|
#define INSTAWHIP_COOLDOWN (TICRATE*2)
|
||||||
#define INSTAWHIP_STARTOFRACE (255)
|
#define INSTAWHIP_STARTOFRACE (255)
|
||||||
|
#define INSTAWHIP_STARTOFBATTLE (1)
|
||||||
#define INSTAWHIP_DROPGUARD (12)
|
#define INSTAWHIP_DROPGUARD (12)
|
||||||
#define GUARDBREAK_COOLDOWN (TICRATE*4)
|
#define GUARDBREAK_COOLDOWN (TICRATE*4)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1298,6 +1298,18 @@ static int lib_pSpawnGhostMobj(lua_State *L)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int lib_pSpawnFakeShadow(lua_State *L)
|
||||||
|
{
|
||||||
|
mobj_t *mobj = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ));
|
||||||
|
UINT8 offset = (UINT8)luaL_checkinteger(L, 2);
|
||||||
|
NOHUD
|
||||||
|
INLEVEL
|
||||||
|
if (!mobj)
|
||||||
|
return LUA_ErrInvalid(L, "mobj_t");
|
||||||
|
LUA_PushUserdata(L, P_SpawnFakeShadow(mobj, offset), META_MOBJ);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int lib_pGivePlayerRings(lua_State *L)
|
static int lib_pGivePlayerRings(lua_State *L)
|
||||||
{
|
{
|
||||||
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
||||||
|
|
@ -4008,6 +4020,7 @@ static luaL_Reg lib[] = {
|
||||||
{"P_PlayJingleMusic",lib_pPlayJingleMusic},
|
{"P_PlayJingleMusic",lib_pPlayJingleMusic},
|
||||||
{"P_RestoreMusic",lib_pRestoreMusic},
|
{"P_RestoreMusic",lib_pRestoreMusic},
|
||||||
{"P_SpawnGhostMobj",lib_pSpawnGhostMobj},
|
{"P_SpawnGhostMobj",lib_pSpawnGhostMobj},
|
||||||
|
{"P_SpawnFakeShadow",lib_pSpawnFakeShadow},
|
||||||
{"P_GivePlayerRings",lib_pGivePlayerRings},
|
{"P_GivePlayerRings",lib_pGivePlayerRings},
|
||||||
{"P_GivePlayerLives",lib_pGivePlayerLives},
|
{"P_GivePlayerLives",lib_pGivePlayerLives},
|
||||||
{"P_MovePlayer",lib_pMovePlayer},
|
{"P_MovePlayer",lib_pMovePlayer},
|
||||||
|
|
|
||||||
|
|
@ -5,38 +5,38 @@
|
||||||
|
|
||||||
void Obj_InstaWhipThink (mobj_t *whip)
|
void Obj_InstaWhipThink (mobj_t *whip)
|
||||||
{
|
{
|
||||||
if (P_MobjWasRemoved(whip->target))
|
if (P_MobjWasRemoved(whip->target))
|
||||||
{
|
{
|
||||||
P_RemoveMobj(whip);
|
P_RemoveMobj(whip);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mobj_t *mo = whip->target;
|
mobj_t *mo = whip->target;
|
||||||
player_t *player = mo->player;
|
player_t *player = mo->player;
|
||||||
|
|
||||||
// Follow player
|
// Follow player
|
||||||
whip->flags &= ~(MF_NOCLIPTHING);
|
whip->flags &= ~(MF_NOCLIPTHING);
|
||||||
P_SetScale(whip, whip->target->scale);
|
P_SetScale(whip, whip->target->scale);
|
||||||
P_MoveOrigin(whip, mo->x, mo->y, mo->z + mo->height/2);
|
P_MoveOrigin(whip, mo->x, mo->y, mo->z + mo->height/2);
|
||||||
whip->flags |= MF_NOCLIPTHING;
|
whip->flags |= MF_NOCLIPTHING;
|
||||||
|
|
||||||
// Twirl
|
// Twirl
|
||||||
whip->angle = whip->target->angle + (ANG30 * 2 * whip->fuse);
|
whip->angle = whip->target->angle + (ANG30 * 2 * whip->fuse);
|
||||||
whip->target->player->drawangle = whip->angle;
|
whip->target->player->drawangle = whip->angle;
|
||||||
if (player->follower)
|
if (player->follower)
|
||||||
player->follower->angle = whip->angle;
|
player->follower->angle = whip->angle;
|
||||||
player->pflags |= PF_GAINAX;
|
player->pflags |= PF_GAINAX;
|
||||||
player->glanceDir = -2;
|
player->glanceDir = -2;
|
||||||
|
|
||||||
// Visuals
|
// Visuals
|
||||||
whip->renderflags |= RF_NOSPLATBILLBOARD;
|
whip->renderflags |= RF_NOSPLATBILLBOARD|RF_FULLBRIGHT;
|
||||||
|
|
||||||
if (whip->renderflags & RF_DONTDRAW)
|
if (whip->renderflags & RF_DONTDRAW)
|
||||||
whip->renderflags &= ~RF_DONTDRAW;
|
whip->renderflags &= ~RF_DONTDRAW;
|
||||||
else
|
else
|
||||||
whip->renderflags |= RF_DONTDRAW;
|
whip->renderflags |= RF_DONTDRAW;
|
||||||
|
|
||||||
if (whip->extravalue2) // Whip has no hitbox but removing it is a pain in the ass
|
if (whip->extravalue2) // Whip has no hitbox but removing it is a pain in the ass
|
||||||
whip->renderflags |= RF_DONTDRAW;
|
whip->renderflags |= RF_DONTDRAW;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -186,6 +186,7 @@ void P_SetObjectMomZ(mobj_t *mo, fixed_t value, boolean relative);
|
||||||
void P_RestoreMusic(player_t *player);
|
void P_RestoreMusic(player_t *player);
|
||||||
void P_EndingMusic(void);
|
void P_EndingMusic(void);
|
||||||
mobj_t *P_SpawnGhostMobj(mobj_t *mobj);
|
mobj_t *P_SpawnGhostMobj(mobj_t *mobj);
|
||||||
|
mobj_t *P_SpawnFakeShadow(mobj_t *mobj, UINT8 offset);
|
||||||
INT32 P_GivePlayerRings(player_t *player, INT32 num_rings);
|
INT32 P_GivePlayerRings(player_t *player, INT32 num_rings);
|
||||||
INT32 P_GivePlayerSpheres(player_t *player, INT32 num_spheres);
|
INT32 P_GivePlayerSpheres(player_t *player, INT32 num_spheres);
|
||||||
void P_GivePlayerLives(player_t *player, INT32 numlives);
|
void P_GivePlayerLives(player_t *player, INT32 numlives);
|
||||||
|
|
|
||||||
20
src/p_mobj.c
20
src/p_mobj.c
|
|
@ -9881,6 +9881,26 @@ void P_MobjThinker(mobj_t *mobj)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mobj->type == MT_FAKESHADOW)
|
||||||
|
{
|
||||||
|
mobj->renderflags &= ~RF_DONTDRAW;
|
||||||
|
|
||||||
|
if (P_MobjWasRemoved(mobj->tracer))
|
||||||
|
{
|
||||||
|
P_RemoveMobj(mobj);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
P_MoveOrigin(mobj, mobj->tracer->x, mobj->tracer->y, mobj->tracer->z - mobj->threshold*mapobjectscale);
|
||||||
|
mobj->angle = mobj->tracer->angle;
|
||||||
|
|
||||||
|
mobj->frame = mobj->tracer->frame;
|
||||||
|
mobj->frame &= ~FF_FULLBRIGHT;
|
||||||
|
|
||||||
|
if (mobj->tracer->renderflags & RF_DONTDRAW)
|
||||||
|
mobj->renderflags |= RF_DONTDRAW;
|
||||||
|
}
|
||||||
|
|
||||||
// Special thinker for scenery objects
|
// Special thinker for scenery objects
|
||||||
if (mobj->flags & MF_SCENERY)
|
if (mobj->flags & MF_SCENERY)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
79
src/p_user.c
79
src/p_user.c
|
|
@ -1253,6 +1253,85 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj)
|
||||||
return ghost;
|
return ghost;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// P_SpawnFakeShadow
|
||||||
|
//
|
||||||
|
// Spawns a silhouette that copies its tracer and copies RF_DONTDRAW
|
||||||
|
//
|
||||||
|
mobj_t *P_SpawnFakeShadow(mobj_t *mobj, UINT8 offset)
|
||||||
|
{
|
||||||
|
mobj_t *ghost = P_SpawnMobj(mobj->x, mobj->y, mobj->z - offset*mapobjectscale, MT_FAKESHADOW);
|
||||||
|
ghost->threshold = offset;
|
||||||
|
|
||||||
|
P_SetTarget(&ghost->target, mobj);
|
||||||
|
|
||||||
|
P_SetScale(ghost, mobj->scale);
|
||||||
|
ghost->destscale = mobj->scale;
|
||||||
|
|
||||||
|
if (mobj->eflags & MFE_VERTICALFLIP)
|
||||||
|
{
|
||||||
|
ghost->eflags |= MFE_VERTICALFLIP;
|
||||||
|
ghost->z += mobj->height - ghost->height;
|
||||||
|
}
|
||||||
|
|
||||||
|
ghost->color = mobj->color;
|
||||||
|
ghost->colorized = mobj->colorized; // Kart: they should also be colorized if their origin is
|
||||||
|
|
||||||
|
ghost->angle = (mobj->player ? mobj->player->drawangle : mobj->angle);
|
||||||
|
ghost->roll = mobj->roll;
|
||||||
|
ghost->pitch = mobj->pitch;
|
||||||
|
ghost->sprite = mobj->sprite;
|
||||||
|
ghost->sprite2 = mobj->sprite2;
|
||||||
|
ghost->frame = mobj->frame;
|
||||||
|
ghost->tics = -1;
|
||||||
|
ghost->renderflags = mobj->renderflags;
|
||||||
|
ghost->fuse = -1;
|
||||||
|
ghost->skin = mobj->skin;
|
||||||
|
ghost->standingslope = mobj->standingslope;
|
||||||
|
|
||||||
|
ghost->sprxoff = mobj->sprxoff;
|
||||||
|
ghost->spryoff = mobj->spryoff;
|
||||||
|
ghost->sprzoff = mobj->sprzoff;
|
||||||
|
ghost->rollangle = mobj->rollangle;
|
||||||
|
|
||||||
|
ghost->spritexscale = mobj->spritexscale;
|
||||||
|
ghost->spriteyscale = mobj->spriteyscale;
|
||||||
|
ghost->spritexoffset = mobj->spritexoffset;
|
||||||
|
ghost->spriteyoffset = mobj->spriteyoffset;
|
||||||
|
|
||||||
|
if (mobj->flags2 & MF2_OBJECTFLIP)
|
||||||
|
ghost->flags |= MF2_OBJECTFLIP;
|
||||||
|
|
||||||
|
if (!(mobj->flags & MF_DONTENCOREMAP))
|
||||||
|
ghost->flags &= ~MF_DONTENCOREMAP;
|
||||||
|
|
||||||
|
if (mobj->player && mobj->player->followmobj)
|
||||||
|
{
|
||||||
|
mobj_t *ghost2 = P_SpawnGhostMobj(mobj->player->followmobj);
|
||||||
|
P_SetTarget(&ghost2->tracer, ghost);
|
||||||
|
P_SetTarget(&ghost->tracer, ghost2);
|
||||||
|
ghost2->flags2 |= (mobj->player->followmobj->flags2 & MF2_LINKDRAW);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy interpolation data :)
|
||||||
|
ghost->old_x = mobj->old_x2;
|
||||||
|
ghost->old_y = mobj->old_y2;
|
||||||
|
ghost->old_z = mobj->old_z2;
|
||||||
|
ghost->old_angle = (mobj->player ? mobj->player->old_drawangle2 : mobj->old_angle2);
|
||||||
|
ghost->old_pitch = mobj->old_pitch2;
|
||||||
|
ghost->old_roll = mobj->old_roll2;
|
||||||
|
|
||||||
|
ghost->renderflags &= ~(RF_TRANSMASK|RF_FULLBRIGHT);
|
||||||
|
ghost->renderflags |= RF_ABSOLUTELIGHTLEVEL;
|
||||||
|
ghost->lightlevel = 0;
|
||||||
|
|
||||||
|
ghost->flags2 |= MF2_LINKDRAW;
|
||||||
|
P_SetTarget(&ghost->tracer, mobj);
|
||||||
|
|
||||||
|
return ghost;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// P_DoPlayerExit
|
// P_DoPlayerExit
|
||||||
//
|
//
|
||||||
|
|
|
||||||
|
|
@ -2240,9 +2240,9 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (thing->renderflags & RF_ABSOLUTELIGHTLEVEL)
|
if (oldthing->renderflags & RF_ABSOLUTELIGHTLEVEL)
|
||||||
{
|
{
|
||||||
const UINT8 n = R_ThingLightLevel(thing);
|
const UINT8 n = R_ThingLightLevel(oldthing);
|
||||||
|
|
||||||
// n = uint8 aka 0 - 255, so the shift will always be 0 - LIGHTLEVELS - 1
|
// n = uint8 aka 0 - 255, so the shift will always be 0 - LIGHTLEVELS - 1
|
||||||
lights_array = scalelight[n >> LIGHTSEGSHIFT];
|
lights_array = scalelight[n >> LIGHTSEGSHIFT];
|
||||||
|
|
@ -2272,7 +2272,7 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||||
lightnum = thing->subsector->sector->lightlevel;
|
lightnum = thing->subsector->sector->lightlevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
lightnum = (lightnum + R_ThingLightLevel(thing)) >> LIGHTSEGSHIFT;
|
lightnum = (lightnum + R_ThingLightLevel(oldthing)) >> LIGHTSEGSHIFT;
|
||||||
|
|
||||||
if (lightnum < 0)
|
if (lightnum < 0)
|
||||||
lights_array = scalelight[0];
|
lights_array = scalelight[0];
|
||||||
|
|
@ -2843,8 +2843,6 @@ static void R_SortVisSprites(vissprite_t* vsprsortedhead, UINT32 start, UINT32 e
|
||||||
|
|
||||||
if (dsfirst != &unsorted)
|
if (dsfirst != &unsorted)
|
||||||
{
|
{
|
||||||
if (!(ds->cut & SC_FULLBRIGHT))
|
|
||||||
ds->colormap = dsfirst->colormap;
|
|
||||||
ds->extra_colormap = dsfirst->extra_colormap;
|
ds->extra_colormap = dsfirst->extra_colormap;
|
||||||
|
|
||||||
// reusing dsnext...
|
// reusing dsnext...
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue