From 0e9e68a9cc3c6c56c2c141f79e24206d88b65f6d Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Sun, 11 Jun 2023 18:33:47 -0700 Subject: [PATCH 1/5] Light level linkdraw fixes --- src/r_things.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/r_things.c b/src/r_things.c index 8a2bb8251..a890676ca 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -2240,9 +2240,9 @@ static void R_ProjectSprite(mobj_t *thing) 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 lights_array = scalelight[n >> LIGHTSEGSHIFT]; @@ -2272,7 +2272,7 @@ static void R_ProjectSprite(mobj_t *thing) lightnum = thing->subsector->sector->lightlevel; } - lightnum = (lightnum + R_ThingLightLevel(thing)) >> LIGHTSEGSHIFT; + lightnum = (lightnum + R_ThingLightLevel(oldthing)) >> LIGHTSEGSHIFT; if (lightnum < 0) lights_array = scalelight[0]; @@ -2843,8 +2843,6 @@ static void R_SortVisSprites(vissprite_t* vsprsortedhead, UINT32 start, UINT32 e if (dsfirst != &unsorted) { - if (!(ds->cut & SC_FULLBRIGHT)) - ds->colormap = dsfirst->colormap; ds->extra_colormap = dsfirst->extra_colormap; // reusing dsnext... From c12ad72fff703c737be0a83bb08ac7b1729a51be Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Sun, 11 Jun 2023 18:41:32 -0700 Subject: [PATCH 2/5] Instawhip "drop shadow" underlay --- src/info.c | 2 +- src/objects/instawhip.c | 19 ++++++++++++++++++- src/p_mobj.c | 5 +++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/info.c b/src/info.c index 6e01d67b1..daaa8104b 100644 --- a/src/info.c +++ b/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_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_GBDY, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_BLOCKBODY diff --git a/src/objects/instawhip.c b/src/objects/instawhip.c index f7abb9640..32cd1958e 100644 --- a/src/objects/instawhip.c +++ b/src/objects/instawhip.c @@ -29,7 +29,7 @@ void Obj_InstaWhipThink (mobj_t *whip) player->glanceDir = -2; // Visuals - whip->renderflags |= RF_NOSPLATBILLBOARD; + whip->renderflags |= RF_NOSPLATBILLBOARD|RF_FULLBRIGHT; if (whip->renderflags & RF_DONTDRAW) whip->renderflags &= ~RF_DONTDRAW; @@ -38,5 +38,22 @@ void Obj_InstaWhipThink (mobj_t *whip) if (whip->extravalue2) // Whip has no hitbox but removing it is a pain in the ass whip->renderflags |= RF_DONTDRAW; + + // UGLY! + fixed_t dropOffset = 15*FRACUNIT; + whip->z -= dropOffset; + + mobj_t *dropshadow = P_SpawnGhostMobj(whip); + dropshadow->fuse = 2; + dropshadow->flags2 = MF2_LINKDRAW; + P_SetTarget(&dropshadow->tracer, whip); + dropshadow->renderflags = whip->renderflags; + dropshadow->lightlevel = 0; + dropshadow->extravalue1 = 1; // Suppress fade-out behavior! + dropshadow->renderflags &= ~(RF_TRANSMASK|RF_FULLBRIGHT); + dropshadow->renderflags |= RF_ABSOLUTELIGHTLEVEL; + + // FUCK! + whip->z += dropOffset; } } diff --git a/src/p_mobj.c b/src/p_mobj.c index 73b1db7c8..939f90219 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9850,6 +9850,11 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->type == MT_GHOST && mobj->fuse > 0) // Not guaranteed to be MF_SCENERY or not MF_SCENERY! { + if (mobj->frame & SPR_IWHP) + { + if (P_MobjWasRemoved(mobj->tracer)) + mobj->renderflags |= RF_DONTDRAW; + } if (mobj->extravalue1 > 0) // Sonic Advance 2 mode { if (mobj->extravalue2 >= 2) From 2dcfd9542f111624a4b5bfc45ee190e9cb18fb69 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Sun, 11 Jun 2023 20:29:43 -0700 Subject: [PATCH 3/5] Instawhip polish round bleven --- src/deh_tables.c | 1 + src/info.c | 27 ++++++++++++++ src/info.h | 1 + src/k_kart.c | 3 +- src/k_kart.h | 1 + src/objects/instawhip.c | 17 --------- src/p_local.h | 1 + src/p_mobj.c | 25 ++++++++++--- src/p_user.c | 79 +++++++++++++++++++++++++++++++++++++++++ 9 files changed, 132 insertions(+), 23 deletions(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index 8bd721381..c58a4bb0c 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -5268,6 +5268,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_TUBEWAYPOINT", "MT_PUSH", "MT_GHOST", + "MT_FAKESHADOW", "MT_OVERLAY", "MT_ANGLEMAN", "MT_POLYANCHOR", diff --git a/src/info.c b/src/info.c index daaa8104b..b7bddd784 100644 --- a/src/info.c +++ b/src/info.c @@ -21427,6 +21427,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 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 -1, // doomednum S_NULL, // spawnstate diff --git a/src/info.h b/src/info.h index c2d7a0356..7c770562a 100644 --- a/src/info.h +++ b/src/info.h @@ -6379,6 +6379,7 @@ typedef enum mobj_type MT_TUBEWAYPOINT, MT_PUSH, MT_GHOST, + MT_FAKESHADOW, MT_OVERLAY, MT_ANGLEMAN, MT_POLYANCHOR, diff --git a/src/k_kart.c b/src/k_kart.c index 6c1df9b6d..920274054 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7938,7 +7938,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (leveltime < starttime) { - player->instaShieldCooldown = INSTAWHIP_STARTOFRACE; + player->instaShieldCooldown = (gametyperules & GTR_SPHERES) ? INSTAWHIP_STARTOFBATTLE : INSTAWHIP_STARTOFRACE; } else if (player->rings > 0) { @@ -10699,6 +10699,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) P_SetScale(whip, player->mo->scale); P_SetTarget(&whip->target, player->mo); K_MatchGenericExtraFlags(whip, player->mo); + P_SpawnFakeShadow(whip, 20); whip->fuse = 12; // Changing instawhip animation duration? Look here player->flashing = max(player->flashing, 12); player->mo->momz += 4*mapobjectscale; diff --git a/src/k_kart.h b/src/k_kart.h index 98e97899d..af7d142d2 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -34,6 +34,7 @@ Make sure this matches the actual number of states #define INSTAWHIP_COOLDOWN (TICRATE*2) #define INSTAWHIP_STARTOFRACE (255) +#define INSTAWHIP_STARTOFBATTLE (1) #define INSTAWHIP_DROPGUARD (12) #define GUARDBREAK_COOLDOWN (TICRATE*4) diff --git a/src/objects/instawhip.c b/src/objects/instawhip.c index 32cd1958e..14eff3318 100644 --- a/src/objects/instawhip.c +++ b/src/objects/instawhip.c @@ -38,22 +38,5 @@ void Obj_InstaWhipThink (mobj_t *whip) if (whip->extravalue2) // Whip has no hitbox but removing it is a pain in the ass whip->renderflags |= RF_DONTDRAW; - - // UGLY! - fixed_t dropOffset = 15*FRACUNIT; - whip->z -= dropOffset; - - mobj_t *dropshadow = P_SpawnGhostMobj(whip); - dropshadow->fuse = 2; - dropshadow->flags2 = MF2_LINKDRAW; - P_SetTarget(&dropshadow->tracer, whip); - dropshadow->renderflags = whip->renderflags; - dropshadow->lightlevel = 0; - dropshadow->extravalue1 = 1; // Suppress fade-out behavior! - dropshadow->renderflags &= ~(RF_TRANSMASK|RF_FULLBRIGHT); - dropshadow->renderflags |= RF_ABSOLUTELIGHTLEVEL; - - // FUCK! - whip->z += dropOffset; } } diff --git a/src/p_local.h b/src/p_local.h index 738faffd3..41615484e 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -186,6 +186,7 @@ void P_SetObjectMomZ(mobj_t *mo, fixed_t value, boolean relative); void P_RestoreMusic(player_t *player); void P_EndingMusic(void); 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_GivePlayerSpheres(player_t *player, INT32 num_spheres); void P_GivePlayerLives(player_t *player, INT32 numlives); diff --git a/src/p_mobj.c b/src/p_mobj.c index 939f90219..6f96b6dbc 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9850,11 +9850,6 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->type == MT_GHOST && mobj->fuse > 0) // Not guaranteed to be MF_SCENERY or not MF_SCENERY! { - if (mobj->frame & SPR_IWHP) - { - if (P_MobjWasRemoved(mobj->tracer)) - mobj->renderflags |= RF_DONTDRAW; - } if (mobj->extravalue1 > 0) // Sonic Advance 2 mode { if (mobj->extravalue2 >= 2) @@ -9886,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 if (mobj->flags & MF_SCENERY) { diff --git a/src/p_user.c b/src/p_user.c index a5e9df25a..4793588dc 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1253,6 +1253,85 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj) 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 // From 76c783fe69d82ca73e999be656eb9fc64115ac61 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Sun, 11 Jun 2023 20:33:36 -0700 Subject: [PATCH 4/5] SpawnFakeShadow for Lua --- src/lua_baselib.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 6cf4b054b..47d0e5994 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -1298,6 +1298,18 @@ static int lib_pSpawnGhostMobj(lua_State *L) 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) { player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); @@ -4008,6 +4020,7 @@ static luaL_Reg lib[] = { {"P_PlayJingleMusic",lib_pPlayJingleMusic}, {"P_RestoreMusic",lib_pRestoreMusic}, {"P_SpawnGhostMobj",lib_pSpawnGhostMobj}, + {"P_SpawnFakeShadow",lib_pSpawnFakeShadow}, {"P_GivePlayerRings",lib_pGivePlayerRings}, {"P_GivePlayerLives",lib_pGivePlayerLives}, {"P_MovePlayer",lib_pMovePlayer}, From 530dd293cd2bf9fefb2d71f1d5230349f885efaa Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Mon, 12 Jun 2023 15:15:25 -0700 Subject: [PATCH 5/5] Tab fixes --- src/objects/instawhip.c | 54 ++++++++++++++++++++--------------------- src/p_user.c | 4 +-- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/objects/instawhip.c b/src/objects/instawhip.c index 14eff3318..d2b38044f 100644 --- a/src/objects/instawhip.c +++ b/src/objects/instawhip.c @@ -5,38 +5,38 @@ void Obj_InstaWhipThink (mobj_t *whip) { - if (P_MobjWasRemoved(whip->target)) - { - P_RemoveMobj(whip); - } - else - { - mobj_t *mo = whip->target; - player_t *player = mo->player; + if (P_MobjWasRemoved(whip->target)) + { + P_RemoveMobj(whip); + } + else + { + mobj_t *mo = whip->target; + player_t *player = mo->player; - // Follow player - whip->flags &= ~(MF_NOCLIPTHING); - P_SetScale(whip, whip->target->scale); + // Follow player + whip->flags &= ~(MF_NOCLIPTHING); + P_SetScale(whip, whip->target->scale); P_MoveOrigin(whip, mo->x, mo->y, mo->z + mo->height/2); whip->flags |= MF_NOCLIPTHING; - // Twirl - whip->angle = whip->target->angle + (ANG30 * 2 * whip->fuse); - whip->target->player->drawangle = whip->angle; - if (player->follower) - player->follower->angle = whip->angle; - player->pflags |= PF_GAINAX; - player->glanceDir = -2; + // Twirl + whip->angle = whip->target->angle + (ANG30 * 2 * whip->fuse); + whip->target->player->drawangle = whip->angle; + if (player->follower) + player->follower->angle = whip->angle; + player->pflags |= PF_GAINAX; + player->glanceDir = -2; - // Visuals - whip->renderflags |= RF_NOSPLATBILLBOARD|RF_FULLBRIGHT; + // Visuals + whip->renderflags |= RF_NOSPLATBILLBOARD|RF_FULLBRIGHT; - if (whip->renderflags & RF_DONTDRAW) - whip->renderflags &= ~RF_DONTDRAW; - else - whip->renderflags |= RF_DONTDRAW; + if (whip->renderflags & RF_DONTDRAW) + whip->renderflags &= ~RF_DONTDRAW; + else + whip->renderflags |= RF_DONTDRAW; - if (whip->extravalue2) // Whip has no hitbox but removing it is a pain in the ass - whip->renderflags |= RF_DONTDRAW; - } + if (whip->extravalue2) // Whip has no hitbox but removing it is a pain in the ass + whip->renderflags |= RF_DONTDRAW; + } } diff --git a/src/p_user.c b/src/p_user.c index 4793588dc..e8e3281a7 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1322,11 +1322,11 @@ mobj_t *P_SpawnFakeShadow(mobj_t *mobj, UINT8 offset) ghost->old_roll = mobj->old_roll2; ghost->renderflags &= ~(RF_TRANSMASK|RF_FULLBRIGHT); - ghost->renderflags |= RF_ABSOLUTELIGHTLEVEL; + ghost->renderflags |= RF_ABSOLUTELIGHTLEVEL; ghost->lightlevel = 0; ghost->flags2 |= MF2_LINKDRAW; - P_SetTarget(&ghost->tracer, mobj); + P_SetTarget(&ghost->tracer, mobj); return ghost; }