From a6ef3c12b047f78f47efe41e5130f96b07652bd5 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 17 Jul 2019 23:55:39 -0400 Subject: [PATCH 1/8] Seperate MF2_DONTDRAW and MF2_SHADOW into it's own varied set of flags -- drawflags. - Split MF2_DONTDRAW into MFD_DONTDRAWP[1-4], also replaces MFE_DRAWONLYFORP[1-4]. - Split MF2_SHADOW into MFD_FULLBRIGHT and MFD_TRANS80. I also added an entire spectrum of options for transparency & brightness overrides, since I've found myself wishing for stuff like that before. - Tethering was updated for it's client-sided drawing to apply to splitscreens too. - Removed cv_transparency. The transparency overrides don't seem to work yet (obvious on things using MFD_SHADOW), just running out of time to look into it so I'm pushing what I have. --- src/dehacked.c | 8 +- src/g_game.c | 6 +- src/hardware/hw_main.c | 201 ++++++++++++++++++----------------------- src/hardware/hw_md2.c | 27 +++++- src/k_kart.c | 95 ++++++++----------- src/k_kart.h | 1 + src/p_enemy.c | 22 ++--- src/p_inter.c | 4 +- src/p_mobj.c | 153 ++++++++++++++----------------- src/p_mobj.h | 48 ++++++++-- src/p_user.c | 30 +++--- src/r_main.c | 2 - src/r_main.h | 1 - src/r_segs.c | 10 +- src/r_things.c | 87 +++++++----------- src/r_things.h | 2 +- 16 files changed, 324 insertions(+), 373 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index be45f3f0f..5834234bf 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -8033,7 +8033,7 @@ static const char *const MOBJFLAG2_LIST[] = { "AXIS", // It's a NiGHTS axis! (For faster checking) "TWOD", // Moves like it's in a 2D level "DONTRESPAWN", // Don't respawn this object! - "DONTDRAW", // Don't generate a vissprite + "\x01", // free: 1<<3 (name un-matchable) "AUTOMATIC", // Thrown ring has automatic properties "RAILRING", // Thrown ring has rail properties "BOUNCERING", // Thrown ring has bounce properties @@ -8050,7 +8050,7 @@ static const char *const MOBJFLAG2_LIST[] = { "JUSTATTACKED", // can be pushed by other moving mobjs "FIRING", // turret fire "SUPERFIRE", // Firing something with Super Sonic-stopping properties. Or, if mobj has MF_MISSILE, this is the actual fire from it. - "SHADOW", // Fuzzy draw, makes targeting harder. + "\x01", // free: 1<<20 (name un-matchable) "STRONGBOX", // Flag used for "strong" random monitors. "OBJECTFLIP", // Flag for objects that always have flipped gravity. "SKULLFLY", // Special handling: skull in flight. @@ -8073,10 +8073,6 @@ static const char *const MOBJEFLAG_LIST[] = { "JUSTBOUNCEDWALL", // SRB2Kart: Mobj already bounced off a wall this tic "SPRUNG", // Mobj was already sprung this tic "APPLYPMOMZ", // Platform movement - "DRAWONLYFORP1", // SRB2Kart: Splitscreen sprite draw flags - "DRAWONLYFORP2", - "DRAWONLYFORP3", - "DRAWONLYFORP4", NULL }; diff --git a/src/g_game.c b/src/g_game.c index e406e29d1..c19571ad3 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2510,7 +2510,7 @@ static inline void G_PlayerFinishLevel(INT32 player) memset(p->kartstuff, 0, sizeof (p->kartstuff)); // SRB2kart p->ringweapons = 0; - p->mo->flags2 &= ~MF2_SHADOW; // cancel invisibility + p->mo->drawflags &= ~(MFD_TRANSMASK|MFD_BRIGHTMASK); // cancel invisibility P_FlashPal(p, 0, 0); // Resets p->starpostangle = 0; p->starposttime = 0; @@ -5982,7 +5982,7 @@ void G_PreviewRewind(tic_t previewtime) if (!info->playerinfo[i].ingame || !info->playerinfo[i].player.mo) { if (players[i].mo) - players[i].mo->flags2 |= MF2_DONTDRAW; + players[i].mo->drawflags |= MFD_DONTDRAW; continue; } @@ -5990,7 +5990,7 @@ void G_PreviewRewind(tic_t previewtime) if (!players[i].mo) continue; //@TODO spawn temp object to act as a player display - players[i].mo->flags2 &= ~MF2_DONTDRAW; + players[i].mo->drawflags &= ~MFD_DONTDRAW; P_UnsetThingPosition(players[i].mo); #define TWEEN(pr) info->playerinfo[i].mobj.pr + FixedMul((INT32) (next_info->playerinfo[i].mobj.pr - info->playerinfo[i].mobj.pr), tweenvalue) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 0d024dc65..28eceac6f 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -4256,45 +4256,12 @@ static void HWR_DrawSpriteShadow(gr_vissprite_t *spr, GLPatch_t *gpatch, float t sSurf.FlatColor.s.blue = 0x00; sSurf.FlatColor.s.green = 0x00; - /*if (spr->mobj->frame & FF_TRANSMASK || spr->mobj->flags2 & MF2_SHADOW) - { - sector_t *sector = spr->mobj->subsector->sector; - UINT8 lightlevel = 255; - extracolormap_t *colormap = sector->extra_colormap; - - if (sector->numlights) - { - INT32 light = R_GetPlaneLight(sector, spr->mobj->floorz, false); - - if (!(spr->mobj->frame & FF_FULLBRIGHT)) - { - lightlevel = *sector->lightlist[light].lightlevel; - if (spr->mobj->frame & FF_SEMIBRIGHT) - lightlevel = 128 + (lightlevel>>1); - } - - if (sector->lightlist[light].extra_colormap) - colormap = sector->lightlist[light].extra_colormap; - } - else - { - lightlevel = sector->lightlevel; - - if (sector->extra_colormap) - colormap = sector->extra_colormap; - } - - if (colormap) - sSurf.FlatColor.rgba = HWR_Lighting(lightlevel/2, colormap->rgba, colormap->fadergba, false, true); - else - sSurf.FlatColor.rgba = HWR_Lighting(lightlevel/2, NORMALFOG, FADEFOG, false, true); - }*/ - // shadow is always half as translucent as the sprite itself - if (!cv_translucency.value) // use default translucency (main sprite won't have any translucency) - sSurf.FlatColor.s.alpha = 0x80; // default - else if (spr->mobj->flags2 & MF2_SHADOW) - sSurf.FlatColor.s.alpha = 0x20; + if (spr->mobj->drawflags & MFD_TRANSMASK) + { + HWR_TranstableToAlpha((spr->mobj->drawflags & MFD_TRANSMASK) - MFD_TRANS10, &sSurf); + sSurf.FlatColor.s.alpha /= 2; //cut alpha in half! + } else if (spr->mobj->frame & FF_TRANSMASK) { HWR_TranstableToAlpha((spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT, &sSurf); @@ -4356,6 +4323,7 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) FUINT lightlevel; FBITFIELD blend = 0; UINT8 alpha; + UINT8 brightmode = 0; INT32 i; float realtop, realbot, top, bot; @@ -4468,16 +4436,8 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) // co-ordinates memcpy(wallVerts, baseWallVerts, sizeof(baseWallVerts)); - if (!cv_translucency.value) // translucency disabled - { - Surf.FlatColor.s.alpha = 0xFF; - blend = PF_Translucent|PF_Occlude; - } - else if (spr->mobj->flags2 & MF2_SHADOW) - { - Surf.FlatColor.s.alpha = 0x40; - blend = PF_Translucent; - } + if (spr->mobj->drawflags & MFD_TRANSMASK) + blend = HWR_TranstableToAlpha((spr->mobj->drawflags & MFD_TRANSMASK) - MFD_TRANS10, &Surf); else if (spr->mobj->frame & FF_TRANSMASK) blend = HWR_TranstableToAlpha((spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT, &Surf); else @@ -4494,15 +4454,30 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) temp = FLOAT_TO_FIXED(realtop); + if (spr->mobj->drawflags & MFD_BRIGHTMASK) + { + if (spr->mobj->drawflags & MFD_FULLBRIGHT) + brightmode = 1; + else if (spr->mobj->drawflags & MFD_SEMIBRIGHT) + brightmode = 2; + } + else + { + if (spr->mobj->frame & FF_FULLBRIGHT) + brightmode = 1; + else if (spr->mobj->frame & FF_SEMIBRIGHT) + brightmode = 2; + } + #ifdef ESLOPE // Start with the lightlevel and colormap from the top of the sprite lightlevel = 255; colormap = list[sector->numlights - 1].extra_colormap; - if (!(spr->mobj->frame & FF_FULLBRIGHT)) + if (brightmode != 1) { lightlevel = *list[sector->numlights - 1].lightlevel; - if (spr->mobj->frame & FF_SEMIBRIGHT) + if (brightmode == 2) lightlevel = 128 + (lightlevel>>1); } @@ -4512,10 +4487,10 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) : sector->lightlist[i].height; if (h <= temp) { - if (!(spr->mobj->frame & FF_FULLBRIGHT)) + if (brightmode != 1) { lightlevel = *list[i-1].lightlevel; - if (spr->mobj->frame & FF_SEMIBRIGHT) + if (brightmode == 2) lightlevel = 128 + (lightlevel>>1); } colormap = list[i-1].extra_colormap; @@ -4524,10 +4499,10 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) } #else i = R_GetPlaneLight(sector, temp, false); - if (!(spr->mobj->frame & FF_FULLBRIGHT)) + if (brightmode != 1) { lightlevel = *list[i].lightlevel; - if (spr->mobj->frame & FF_SEMIBRIGHT) + if (brightmode == 2) lightlevel = 128 + (lightlevel>>1); } colormap = list[i].extra_colormap; @@ -4544,10 +4519,10 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) // even if we aren't changing colormap or lightlevel, we still need to continue drawing down the sprite if (!(list[i].flags & FF_NOSHADE) && (list[i].flags & FF_CUTSPRITES)) { - if (!(spr->mobj->frame & FF_FULLBRIGHT)) + if (brightmode != 1) { lightlevel = *list[i].lightlevel; - if (spr->mobj->frame & FF_SEMIBRIGHT) + if (brightmode == 2) lightlevel = 128 + (lightlevel>>1); } colormap = list[i].extra_colormap; @@ -4839,12 +4814,28 @@ static void HWR_DrawSprite(gr_vissprite_t *spr) { sector_t *sector = spr->mobj->subsector->sector; UINT8 lightlevel = 255; + UINT8 brightmode = 0; extracolormap_t *colormap = sector->extra_colormap; - if (!(spr->mobj->frame & FF_FULLBRIGHT)) + if (spr->mobj->drawflags & MFD_BRIGHTMASK) + { + if (spr->mobj->drawflags & MFD_FULLBRIGHT) + brightmode = 1; + else if (spr->mobj->drawflags & MFD_SEMIBRIGHT) + brightmode = 2; + } + else + { + if (spr->mobj->frame & FF_FULLBRIGHT) + brightmode = 1; + else if (spr->mobj->frame & FF_SEMIBRIGHT) + brightmode = 2; + } + + if (brightmode != 1) { lightlevel = sector->lightlevel; - if (spr->mobj->frame & FF_SEMIBRIGHT) + if (brightmode == 2) lightlevel = 128 + (lightlevel>>1); } @@ -4856,16 +4847,9 @@ static void HWR_DrawSprite(gr_vissprite_t *spr) { FBITFIELD blend = 0; - if (!cv_translucency.value) // translucency disabled - { - Surf.FlatColor.s.alpha = 0xFF; - blend = PF_Translucent|PF_Occlude; - } - else if (spr->mobj->flags2 & MF2_SHADOW) - { - Surf.FlatColor.s.alpha = 0x40; - blend = PF_Translucent; - } + + if (spr->mobj->drawflags & MFD_TRANSMASK) + blend = HWR_TranstableToAlpha((spr->mobj->frame & MFD_TRANSMASK) - MFD_TRANS10, &Surf); else if (spr->mobj->frame & FF_TRANSMASK) blend = HWR_TranstableToAlpha((spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT, &Surf); else @@ -4934,15 +4918,31 @@ static inline void HWR_DrawPrecipitationSprite(gr_vissprite_t *spr) { sector_t *sector = spr->mobj->subsector->sector; UINT8 lightlevel = 255; + UINT8 brightmode = 0; extracolormap_t *colormap = sector->extra_colormap; + if (spr->mobj->drawflags & MFD_BRIGHTMASK) + { + if (spr->mobj->drawflags & MFD_FULLBRIGHT) + brightmode = 1; + else if (spr->mobj->drawflags & MFD_SEMIBRIGHT) + brightmode = 2; + } + else + { + if (spr->mobj->frame & FF_FULLBRIGHT) + brightmode = 1; + else if (spr->mobj->frame & FF_SEMIBRIGHT) + brightmode = 2; + } + if (sector->numlights) { INT32 light; light = R_GetPlaneLight(sector, spr->mobj->z + spr->mobj->height, false); // Always use the light at the top instead of whatever I was doing before - if (!(spr->mobj->frame & FF_FULLBRIGHT)) + if (brightmode != 1) lightlevel = *sector->lightlist[light].lightlevel; if (sector->lightlist[light].extra_colormap) @@ -4950,14 +4950,14 @@ static inline void HWR_DrawPrecipitationSprite(gr_vissprite_t *spr) } else { - if (!(spr->mobj->frame & FF_FULLBRIGHT)) + if (brightmode != 1) lightlevel = sector->lightlevel; if (sector->extra_colormap) colormap = sector->extra_colormap; } - if (spr->mobj->frame & FF_SEMIBRIGHT) + if (brightmode == 2) lightlevel = 128 + (lightlevel>>1); if (colormap) @@ -4966,11 +4966,8 @@ static inline void HWR_DrawPrecipitationSprite(gr_vissprite_t *spr) Surf.FlatColor.rgba = HWR_Lighting(lightlevel, NORMALFOG, FADEFOG, false, false); } - if (spr->mobj->flags2 & MF2_SHADOW) - { - Surf.FlatColor.s.alpha = 0x40; - blend = PF_Translucent; - } + if (spr->mobj->drawflags & MFD_TRANSMASK) + blend = HWR_TranstableToAlpha((spr->mobj->frame & MFD_TRANSMASK) - MFD_TRANS10, &Surf); else if (spr->mobj->frame & FF_TRANSMASK) blend = HWR_TranstableToAlpha((spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT, &Surf); else @@ -5062,7 +5059,7 @@ static void HWR_SortVisSprites(void) best = gr_vsprsortedhead.next; for (i = 0; i < gr_visspritecount; i++) { - if ((best->mobj->flags2 & MF2_SHADOW) || (best->mobj->frame & FF_TRANSMASK)) + if ((best->mobj->drawflags & MFD_TRANSMASK) || (best->mobj->frame & FF_TRANSMASK)) { if (best == gr_vsprsortedhead.next) { @@ -5482,27 +5479,14 @@ static void HWR_AddSprites(sector_t *sec) { for (thing = sec->thinglist; thing; thing = thing->snext) { - if (thing->sprite == SPR_NULL || thing->flags2 & MF2_DONTDRAW) + if (thing->sprite == SPR_NULL) continue; - if (splitscreen) - { - if (thing->eflags & MFE_DRAWONLYFORP1) - if (viewssnum != 0) - continue; - - if (thing->eflags & MFE_DRAWONLYFORP2) - if (viewssnum != 1) - continue; - - if (thing->eflags & MFE_DRAWONLYFORP3 && splitscreen > 1) - if (viewssnum != 2) - continue; - - if (thing->eflags & MFE_DRAWONLYFORP4 && splitscreen > 2) - if (viewssnum != 3) - continue; - } + if ((viewssnum == 0 && (thing->drawflags & MFD_DONTDRAWP1)) + || (viewssnum == 1 && (thing->drawflags & MFD_DONTDRAWP2)) + || (viewssnum == 2 && (thing->drawflags & MFD_DONTDRAWP3)) + || (viewssnum == 3 && (thing->drawflags & MFD_DONTDRAWP4))) + continue; approx_dist = P_AproxDistance(viewx-thing->x, viewy-thing->y); @@ -5517,27 +5501,14 @@ static void HWR_AddSprites(sector_t *sec) // Draw everything in sector, no checks for (thing = sec->thinglist; thing; thing = thing->snext) { - if (thing->sprite == SPR_NULL || thing->flags2 & MF2_DONTDRAW) + if (thing->sprite == SPR_NULL) continue; - if (splitscreen) - { - if (thing->eflags & MFE_DRAWONLYFORP1) - if (viewssnum != 0) - continue; - - if (thing->eflags & MFE_DRAWONLYFORP2) - if (viewssnum != 1) - continue; - - if (thing->eflags & MFE_DRAWONLYFORP3 && splitscreen > 1) - if (viewssnum != 2) - continue; - - if (thing->eflags & MFE_DRAWONLYFORP4 && splitscreen > 2) - if (viewssnum != 3) - continue; - } + if ((viewssnum == 0 && (thing->drawflags & MFD_DONTDRAWP1)) + || (viewssnum == 1 && (thing->drawflags & MFD_DONTDRAWP2)) + || (viewssnum == 2 && (thing->drawflags & MFD_DONTDRAWP3)) + || (viewssnum == 3 && (thing->drawflags & MFD_DONTDRAWP4))) + continue; HWR_ProjectSprite(thing); } diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index d217f4094..44a7a26e5 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -879,15 +879,31 @@ void HWR_DrawMD2(gr_vissprite_t *spr) { sector_t *sector = spr->mobj->subsector->sector; UINT8 lightlevel = 255; + UINT8 brightmode = 0; extracolormap_t *colormap = sector->extra_colormap; + if (spr->mobj->drawflags & MFD_BRIGHTMASK) + { + if (spr->mobj->drawflags & MFD_FULLBRIGHT) + brightmode = 1; + else if (spr->mobj->drawflags & MFD_SEMIBRIGHT) + brightmode = 2; + } + else + { + if (spr->mobj->frame & FF_FULLBRIGHT) + brightmode = 1; + else if (spr->mobj->frame & FF_SEMIBRIGHT) + brightmode = 2; + } + if (sector->numlights) { INT32 light; light = R_GetPlaneLight(sector, spr->mobj->z + spr->mobj->height, false); // Always use the light at the top instead of whatever I was doing before - if (!(spr->mobj->frame & FF_FULLBRIGHT)) + if (brightmode != 1) lightlevel = *sector->lightlist[light].lightlevel; if (sector->lightlist[light].extra_colormap) @@ -895,13 +911,16 @@ void HWR_DrawMD2(gr_vissprite_t *spr) } else { - if (!(spr->mobj->frame & FF_FULLBRIGHT)) + if (brightmode != 1) lightlevel = sector->lightlevel; if (sector->extra_colormap) colormap = sector->extra_colormap; } + if (brightmode == 2) + lightlevel = 128 + (lightlevel>>1); + if (colormap) Surf.FlatColor.rgba = HWR_Lighting(lightlevel, colormap->rgba, colormap->fadergba, false, false); else @@ -927,8 +946,8 @@ void HWR_DrawMD2(gr_vissprite_t *spr) //if (tics > durs) //durs = tics; - if (spr->mobj->flags2 & MF2_SHADOW) - Surf.FlatColor.s.alpha = 0x40; + if (spr->mobj->drawflags & MFD_TRANSMASK) + HWR_TranstableToAlpha((spr->mobj->drawflags & MFD_TRANSMASK) - MFD_TRANS10, &Surf); else if (spr->mobj->frame & FF_TRANSMASK) HWR_TranstableToAlpha((spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT, &Surf); else diff --git a/src/k_kart.c b/src/k_kart.c index c56c7c982..e3202903b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -595,6 +595,24 @@ void K_RegisterKartStuff(void) //} +// Not sure what's a good place for this function +// I'll get around to splitting *everything* in this file into better places soon... +UINT16 K_GetPlayerDontDrawFlag(player_t *player) +{ + UINT16 flag = 0; + + if (player == &players[displayplayers[0]]) + flag = MFD_DONTDRAWP1; + else if (player == &players[displayplayers[1]]) + flag = MFD_DONTDRAWP2; + else if (player == &players[displayplayers[2]]) + flag = MFD_DONTDRAWP3; + else if (player == &players[displayplayers[3]]) + flag = MFD_DONTDRAWP4; + + return flag; +} + boolean K_IsPlayerLosing(player_t *player) { INT32 winningpos = 1; @@ -1629,9 +1647,9 @@ static void K_DrawDraftCombiring(player_t *player, player_t *victim, fixed_t cur band->colorized = true; band->fuse = 2; if (transparent) - band->flags2 |= MF2_SHADOW; - if (!P_IsDisplayPlayer(player) && !P_IsDisplayPlayer(victim)) - band->flags2 |= MF2_DONTDRAW; + band->drawflags |= MFD_SHADOW; + + band->drawflags |= MFD_DONTDRAW & ~(K_GetPlayerDontDrawFlag(player) | K_GetPlayerDontDrawFlag(victim)); } curx += stepx; @@ -1852,11 +1870,7 @@ void K_MatchGenericExtraFlags(mobj_t *mo, mobj_t *master) K_FlipFromObject(mo, master); // visibility (usually for hyudoro) - mo->flags2 = (mo->flags2 & ~MF2_DONTDRAW)|(master->flags2 & MF2_DONTDRAW); - mo->eflags = (mo->eflags & ~MFE_DRAWONLYFORP1)|(master->eflags & MFE_DRAWONLYFORP1); - mo->eflags = (mo->eflags & ~MFE_DRAWONLYFORP2)|(master->eflags & MFE_DRAWONLYFORP2); - mo->eflags = (mo->eflags & ~MFE_DRAWONLYFORP3)|(master->eflags & MFE_DRAWONLYFORP3); - mo->eflags = (mo->eflags & ~MFE_DRAWONLYFORP4)|(master->eflags & MFE_DRAWONLYFORP4); + mo->drawflags = (master->drawflags & MFD_DONTDRAW); } static void K_SpawnDashDustRelease(player_t *player) @@ -1915,7 +1929,7 @@ static void K_SpawnBrakeDriftSparks(player_t *player) // Be sure to update the m P_SetTarget(&sparks->target, player->mo); P_SetScale(sparks, (sparks->destscale = player->mo->scale)); K_MatchGenericExtraFlags(sparks, player->mo); - sparks->flags2 |= MF2_DONTDRAW; + sparks->drawflags |= MFD_DONTDRAW; } /** \brief Calculates the respawn timer and drop-boosting @@ -3390,7 +3404,7 @@ void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent) } if (translucent) - dust->flags2 |= MF2_SHADOW; + dust->drawflags |= MFD_SHADOW; } void K_SpawnDraftDust(mobj_t *mo) @@ -4545,9 +4559,9 @@ static void K_MoveHeldObjects(player_t *player) cur->flags &= ~MF_NOCLIPTHING; if (player->kartstuff[k_rocketsneakertimer] <= TICRATE && (leveltime & 1)) - cur->flags2 |= MF2_DONTDRAW; + cur->drawflags |= MFD_DONTDRAW; else - cur->flags2 &= ~MF2_DONTDRAW; + cur->drawflags &= ~MFD_DONTDRAW; if (num & 1) P_SetMobjStateNF(cur, (vibrate ? S_ROCKETSNEAKER_LVIBRATE : S_ROCKETSNEAKER_L)); @@ -5020,7 +5034,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) //ghost->momy = (3*player->mo->momy)/4; //ghost->momz = (3*player->mo->momz)/4; if (leveltime & 1) - ghost->flags2 |= MF2_DONTDRAW; + ghost->drawflags |= MFD_DONTDRAW; } if (P_IsObjectOnGround(player->mo)) @@ -5056,7 +5070,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) debtflag->color = player->skincolor; debtflag->fuse = 2; if (P_IsDisplayPlayer(player)) - debtflag->flags2 |= MF2_DONTDRAW; + debtflag->drawflags |= MFD_DONTDRAW; } } @@ -6430,61 +6444,31 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->kartstuff[k_hyudorotimer] > 0) { - if (splitscreen) - { - if (leveltime & 1) - player->mo->flags2 |= MF2_DONTDRAW; - else - player->mo->flags2 &= ~MF2_DONTDRAW; - - if (player->kartstuff[k_hyudorotimer] >= (1*TICRATE/2) && player->kartstuff[k_hyudorotimer] <= hyudorotime-(1*TICRATE/2)) - { - if (player == &players[displayplayers[1]]) - player->mo->eflags |= MFE_DRAWONLYFORP2; - else if (player == &players[displayplayers[2]] && splitscreen > 1) - player->mo->eflags |= MFE_DRAWONLYFORP3; - else if (player == &players[displayplayers[3]] && splitscreen > 2) - player->mo->eflags |= MFE_DRAWONLYFORP4; - else if (player == &players[displayplayers[0]]) - player->mo->eflags |= MFE_DRAWONLYFORP1; - else - player->mo->flags2 |= MF2_DONTDRAW; - } - else - player->mo->eflags &= ~(MFE_DRAWONLYFORP1|MFE_DRAWONLYFORP2|MFE_DRAWONLYFORP3|MFE_DRAWONLYFORP4); - } + if (leveltime & 1) + player->mo->drawflags |= MFD_DONTDRAW; else { - if (P_IsDisplayPlayer(player) - || (!P_IsDisplayPlayer(player) && (player->kartstuff[k_hyudorotimer] < (1*TICRATE/2) || player->kartstuff[k_hyudorotimer] > hyudorotime-(1*TICRATE/2)))) - { - if (leveltime & 1) - player->mo->flags2 |= MF2_DONTDRAW; - else - player->mo->flags2 &= ~MF2_DONTDRAW; - } + if (player->kartstuff[k_hyudorotimer] >= (TICRATE/2) && player->kartstuff[k_hyudorotimer] <= hyudorotime-(TICRATE/2)) + player->mo->drawflags &= ~K_GetPlayerDontDrawFlag(player); else - player->mo->flags2 |= MF2_DONTDRAW; + player->mo->drawflags &= ~MFD_DONTDRAW; } player->powers[pw_flashing] = player->kartstuff[k_hyudorotimer]; // We'll do this for now, let's people know about the invisible people through subtle hints } else if (player->kartstuff[k_hyudorotimer] == 0) - { - player->mo->flags2 &= ~MF2_DONTDRAW; - player->mo->eflags &= ~(MFE_DRAWONLYFORP1|MFE_DRAWONLYFORP2|MFE_DRAWONLYFORP3|MFE_DRAWONLYFORP4); - } + player->mo->drawflags &= ~MFD_DONTDRAW; if (G_BattleGametype() && player->kartstuff[k_bumper] <= 0) // dead in match? you da bomb { K_DropItems(player); //K_StripItems(player); K_StripOther(player); - player->mo->flags2 |= MF2_SHADOW; + player->mo->drawflags |= MFD_SHADOW; player->powers[pw_flashing] = player->kartstuff[k_comebacktimer]; } else if (G_RaceGametype() || player->kartstuff[k_bumper] > 0) { - player->mo->flags2 &= ~MF2_SHADOW; + player->mo->drawflags &= ~(MFD_TRANSMASK|MFD_BRIGHTMASK); } } @@ -9240,7 +9224,7 @@ static void K_drawKartFirstPerson(void) UINT8 *colmap = NULL; ticcmd_t *cmd = &stplyr->cmd; - if (stplyr->spectator || !stplyr->mo || (stplyr->mo->flags2 & MF2_DONTDRAW)) + if (stplyr->spectator || !stplyr->mo || (stplyr->mo->drawflags & MFD_DONTDRAW)) return; if (stplyr == &players[displayplayers[1]] && splitscreen) @@ -9262,10 +9246,7 @@ static void K_drawKartFirstPerson(void) { if (stplyr->speed < (20*stplyr->mo->scale) && (leveltime & 1) && !splitscreen) y++; - // the following isn't EXPLICITLY right, it just gets the result we want, but i'm too lazy to look up the right way to do it - if (stplyr->mo->flags2 & MF2_SHADOW) - splitflags |= FF_TRANS80; - else if (stplyr->mo->frame & FF_TRANSMASK) + if (stplyr->mo->frame & FF_TRANSMASK) splitflags |= (stplyr->mo->frame & FF_TRANSMASK); } diff --git a/src/k_kart.h b/src/k_kart.h index b91e8c8a1..1d48fb928 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -20,6 +20,7 @@ UINT8 K_GetKartColorByName(const char *name); void K_RegisterKartStuff(void); +UINT16 K_GetPlayerDontDrawFlag(player_t *player); boolean K_IsPlayerLosing(player_t *player); boolean K_IsPlayerWanted(player_t *player); fixed_t K_GetKartGameSpeedScalar(SINT8 value); diff --git a/src/p_enemy.c b/src/p_enemy.c index 10bfb4d52..ff4af507e 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3409,10 +3409,10 @@ void A_BubbleSpawn(mobj_t *actor) if (!(actor->eflags & MFE_UNDERWATER)) { // Don't draw or spawn bubbles above water - actor->flags2 |= MF2_DONTDRAW; + actor->drawflags |= MFD_DONTDRAW; return; } - actor->flags2 &= ~MF2_DONTDRAW; + actor->drawflags &= ~MFD_DONTDRAW; if (!(actor->flags2 & MF2_AMBUSH)) { @@ -3544,9 +3544,9 @@ void A_BubbleCheck(mobj_t *actor) return; #endif if (actor->eflags & MFE_UNDERWATER) - actor->flags2 &= ~MF2_DONTDRAW; // underwater so draw + actor->drawflags &= ~MFD_DONTDRAW; // underwater so draw else - actor->flags2 |= MF2_DONTDRAW; // above water so don't draw + actor->drawflags |= MFD_DONTDRAW; // above water so don't draw } // Function: A_AttractChase @@ -3659,9 +3659,9 @@ void A_AttractChase(mobj_t *actor) // Rings flicker before disappearing if (actor->fuse && actor->fuse < 5*TICRATE && (leveltime & 1)) - actor->flags2 |= MF2_DONTDRAW; + actor->drawflags |= MFD_DONTDRAW; else - actor->flags2 &= ~MF2_DONTDRAW; + actor->drawflags &= ~MFD_DONTDRAW; // spilled rings have ghost trails and get capped to a certain speed if (actor->type == (mobjtype_t)actor->info->reactiontime) @@ -3882,9 +3882,9 @@ void A_ThrownRing(mobj_t *actor) // spilled rings (and thrown bounce) flicker before disappearing if (leveltime & 1 && actor->fuse > 0 && actor->fuse < 2*TICRATE && actor->type != MT_THROWNGRENADE) - actor->flags2 |= MF2_DONTDRAW; + actor->drawflags |= MFD_DONTDRAW; else - actor->flags2 &= ~MF2_DONTDRAW; + actor->drawflags &= ~MFD_DONTDRAW; if (actor->tracer && actor->tracer->health <= 0) P_SetTarget(&actor->tracer, NULL); @@ -5365,9 +5365,9 @@ void A_CrawlaCommanderThink(mobj_t *actor) thefloor = actor->floorz; if (actor->fuse & 1) - actor->flags2 |= MF2_DONTDRAW; + actor->drawflags |= MFD_DONTDRAW; else - actor->flags2 &= ~MF2_DONTDRAW; + actor->drawflags &= ~MFD_DONTDRAW; if (actor->reactiontime > 0) actor->reactiontime--; @@ -8803,7 +8803,7 @@ void A_RandomShadowFrame(mobj_t *actor) fake->destscale = FRACUNIT*3/2; fake->angle = actor->angle; fake->tics = -1; - actor->flags2 |= MF2_DONTDRAW; + actor->drawflags |= MFD_DONTDRAW; actor->extravalue1 = 1; } diff --git a/src/p_inter.c b/src/p_inter.c index de14b3db9..9a053b68e 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2218,7 +2218,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source) target->player->score = 0; }*/ - target->flags2 &= ~MF2_DONTDRAW; + target->drawflags &= ~MFD_DONTDRAW; } // if killed by a player @@ -2917,7 +2917,7 @@ static void P_KillPlayer(player_t *player, mobj_t *source, INT32 damage) { mobj_t *boom; player->mo->flags |= (MF_NOGRAVITY|MF_NOCLIP); - player->mo->flags2 |= MF2_DONTDRAW; + player->mo->drawflags |= MFD_DONTDRAW; boom = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_FZEROBOOM); boom->scale = player->mo->scale; boom->angle = player->mo->angle; diff --git a/src/p_mobj.c b/src/p_mobj.c index 970829812..c4b084c9b 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6011,14 +6011,14 @@ static void P_NightsItemChase(mobj_t *thing) if (thing->info->painstate) P_SetMobjState(thing,thing->info->painstate); else - thing->flags2 |= MF2_SHADOW; + thing->drawflags |= MFD_SHADOW; } else { if (thing->info->painstate) P_SetMobjState(thing,thing->info->spawnstate); else - thing->flags2 &= ~MF2_SHADOW; + thing->drawflags &= ~(MFD_TRANSMASK|MFD_BRIGHTMASK); } } @@ -6212,7 +6212,7 @@ void P_RunShadows(void) if (!mobj->target || P_MobjWasRemoved(mobj->target)) { - mobj->flags2 |= MF2_DONTDRAW; + mobj->drawflags |= MFD_DONTDRAW; continue; // shouldn't you already be dead? } @@ -6225,7 +6225,7 @@ void P_RunShadows(void) if (((mobj->target->eflags & MFE_VERTICALFLIP) && mobj->target->z+mobj->target->height > mobj->target->ceilingz) || (!(mobj->target->eflags & MFE_VERTICALFLIP) && mobj->target->z < floorz)) - mobj->flags2 |= MF2_DONTDRAW; + mobj->drawflags |= MFD_DONTDRAW; // First scale to the same radius P_SetScale(mobj, FixedDiv(mobj->target->radius, mobj->info->radius)); @@ -6619,30 +6619,7 @@ void P_MobjThinker(mobj_t *mobj) offz = mobj->target->height / 5; } - if (mobj->target->eflags & MFE_DRAWONLYFORP1) // groooooaann... - mobj->eflags |= MFE_DRAWONLYFORP1; - else - mobj->eflags &= ~MFE_DRAWONLYFORP1; - - if (mobj->target->eflags & MFE_DRAWONLYFORP2) - mobj->eflags |= MFE_DRAWONLYFORP2; - else - mobj->eflags &= ~MFE_DRAWONLYFORP2; - - if (mobj->target->eflags & MFE_DRAWONLYFORP3) - mobj->eflags |= MFE_DRAWONLYFORP3; - else - mobj->eflags &= ~MFE_DRAWONLYFORP3; - - if (mobj->target->eflags & MFE_DRAWONLYFORP4) - mobj->eflags |= MFE_DRAWONLYFORP4; - else - mobj->eflags &= ~MFE_DRAWONLYFORP4; - - if (mobj->target->flags2 & MF2_DONTDRAW) - mobj->flags2 |= MF2_DONTDRAW; - else - mobj->flags2 &= ~MF2_DONTDRAW; + mobj->drawflags = (mobj->target->drawflags & MFD_DONTDRAW); if (mobj->target->eflags & MFE_VERTICALFLIP) offz += 4*FRACUNIT; @@ -6705,7 +6682,7 @@ void P_MobjThinker(mobj_t *mobj) || (P_IsDisplayPlayer(mobj->target->player)) #endif ) - mobj->flags2 |= MF2_DONTDRAW; + mobj->drawflags |= MFD_DONTDRAW; P_UnsetThingPosition(mobj); mobj->x = mobj->target->x; @@ -6755,7 +6732,7 @@ void P_MobjThinker(mobj_t *mobj) mobj->tracer->colorized = false; } - if (!(mobj->flags2 & MF2_DONTDRAW)) + if (!(mobj->drawflags & MFD_DONTDRAW)) { const INT32 numberdisplaymin = ((mobj->target->player->kartstuff[k_itemtype] == KITEM_ORBINAUT) ? 5 : 2); @@ -6765,7 +6742,7 @@ void P_MobjThinker(mobj_t *mobj) P_SetMobjState(mobj, S_PLAYERARROW_BOX); mobj->tracer->sprite = SPR_ITEM; mobj->tracer->frame = FF_FULLBRIGHT|(((mobj->target->player->kartstuff[k_itemroulette] % (13*3)) / 3) + 1); - mobj->tracer->flags2 &= ~MF2_DONTDRAW; + mobj->tracer->drawflags &= ~MFD_DONTDRAW; } else if (mobj->target->player->kartstuff[k_stolentimer] > 0) { @@ -6773,16 +6750,16 @@ void P_MobjThinker(mobj_t *mobj) mobj->tracer->sprite = SPR_ITEM; mobj->tracer->frame = FF_FULLBRIGHT|KITEM_HYUDORO; if (leveltime & 2) - mobj->tracer->flags2 &= ~MF2_DONTDRAW; + mobj->tracer->drawflags &= ~MFD_DONTDRAW; else - mobj->tracer->flags2 |= MF2_DONTDRAW; + mobj->tracer->drawflags |= MFD_DONTDRAW; } else if ((mobj->target->player->kartstuff[k_stealingtimer] > 0) && (leveltime & 2)) { P_SetMobjState(mobj, S_PLAYERARROW_BOX); mobj->tracer->sprite = SPR_ITEM; mobj->tracer->frame = FF_FULLBRIGHT|KITEM_HYUDORO; - mobj->tracer->flags2 &= ~MF2_DONTDRAW; + mobj->tracer->drawflags &= ~MFD_DONTDRAW; } else if (mobj->target->player->kartstuff[k_eggmanexplode] > 1) { @@ -6790,9 +6767,9 @@ void P_MobjThinker(mobj_t *mobj) mobj->tracer->sprite = SPR_ITEM; mobj->tracer->frame = FF_FULLBRIGHT|KITEM_EGGMAN; if (leveltime & 1) - mobj->tracer->flags2 &= ~MF2_DONTDRAW; + mobj->tracer->drawflags &= ~MFD_DONTDRAW; else - mobj->tracer->flags2 |= MF2_DONTDRAW; + mobj->tracer->drawflags |= MFD_DONTDRAW; } else if (mobj->target->player->kartstuff[k_rocketsneakertimer] > 1) { @@ -6801,9 +6778,9 @@ void P_MobjThinker(mobj_t *mobj) mobj->tracer->sprite = SPR_ITEM; mobj->tracer->frame = FF_FULLBRIGHT|KITEM_ROCKETSNEAKER; if (leveltime & 1) - mobj->tracer->flags2 &= ~MF2_DONTDRAW; + mobj->tracer->drawflags &= ~MFD_DONTDRAW; else - mobj->tracer->flags2 |= MF2_DONTDRAW; + mobj->tracer->drawflags |= MFD_DONTDRAW; } else if (mobj->target->player->kartstuff[k_growshrinktimer] > 0) { @@ -6812,9 +6789,9 @@ void P_MobjThinker(mobj_t *mobj) mobj->tracer->frame = FF_FULLBRIGHT|KITEM_GROW; if (leveltime & 1) - mobj->tracer->flags2 &= ~MF2_DONTDRAW; + mobj->tracer->drawflags &= ~MFD_DONTDRAW; else - mobj->tracer->flags2 |= MF2_DONTDRAW; + mobj->tracer->drawflags |= MFD_DONTDRAW; } else if (mobj->target->player->kartstuff[k_itemtype] && mobj->target->player->kartstuff[k_itemamount] > 0) { @@ -6843,12 +6820,12 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->target->player->kartstuff[k_itemheld]) { if (leveltime & 1) - mobj->tracer->flags2 &= ~MF2_DONTDRAW; + mobj->tracer->drawflags &= ~MFD_DONTDRAW; else - mobj->tracer->flags2 |= MF2_DONTDRAW; + mobj->tracer->drawflags |= MFD_DONTDRAW; } else - mobj->tracer->flags2 &= ~MF2_DONTDRAW; + mobj->tracer->drawflags &= ~MFD_DONTDRAW; } else { @@ -6889,7 +6866,7 @@ void P_MobjThinker(mobj_t *mobj) mobj->movecount = 0; } else - mobj->tracer->flags2 |= MF2_DONTDRAW; + mobj->tracer->drawflags |= MFD_DONTDRAW; } else if (mobj->health > 0) { @@ -6912,10 +6889,10 @@ void P_MobjThinker(mobj_t *mobj) return; } - if (mobj->tracer->flags2 & MF2_DONTDRAW) - mobj->flags2 |= MF2_DONTDRAW; + if (mobj->tracer->drawflags & MFD_DONTDRAW) + mobj->drawflags |= MFD_DONTDRAW; else - mobj->flags2 &= ~MF2_DONTDRAW; + mobj->drawflags &= ~MFD_DONTDRAW; P_UnsetThingPosition(mobj); mobj->x = mobj->target->x; @@ -7015,9 +6992,10 @@ void P_MobjThinker(mobj_t *mobj) mobj->z = mobj->target->z + (mobj->target->height) + FixedMul(8*FRACUNIT, mobj->target->scale); // Adjust height for height changes if (mobj->threshold <= 35) - mobj->flags2 |= MF2_DONTDRAW; + mobj->drawflags |= MFD_DONTDRAW; else - mobj->flags2 &= ~MF2_DONTDRAW; + mobj->drawflags &= ~MFD_DONTDRAW; + if (mobj->threshold <= 30) mobj->threshold = 40; mobj->threshold--; @@ -7302,14 +7280,15 @@ void P_MobjThinker(mobj_t *mobj) break; case MT_PLAYER: /// \todo Have the player's dead body completely finish its animation even if they've already respawned. - if (!(mobj->flags2 & MF2_DONTDRAW)) + // This feels like it has some serious potential for breakage. Is there anything else we can base this off of instead of a drawing flag? + if (!(mobj->drawflags & MFD_DONTDRAW)) { if (!mobj->fuse) { // Go away. /// \todo Actually go ahead and remove mobj completely, and fix any bugs and crashes doing this creates. Chasecam should stop moving, and F12 should never return to it. mobj->momz = 0; if (mobj->player) - mobj->flags2 |= MF2_DONTDRAW; + mobj->drawflags |= MFD_DONTDRAW; else // safe to remove, nobody's going to complain! { P_RemoveMobj(mobj); @@ -7338,7 +7317,7 @@ void P_MobjThinker(mobj_t *mobj) case MT_ORBINAUT_SHIELD: case MT_BANANA_SHIELD: case MT_EGGMANITEM_SHIELD: - mobj->flags2 ^= MF2_DONTDRAW; + mobj->drawflags ^= MFD_DONTDRAW; break; case MT_JAWZ: case MT_JAWZ_DUD: @@ -7346,7 +7325,7 @@ void P_MobjThinker(mobj_t *mobj) P_SetMobjState(mobj, mobj->info->xdeathstate); // fallthru case MT_JAWZ_SHIELD: - mobj->flags2 ^= MF2_DONTDRAW; + mobj->drawflags ^= MFD_DONTDRAW; break; case MT_SSMINE: case MT_SPBEXPLOSION: @@ -7366,7 +7345,7 @@ void P_MobjThinker(mobj_t *mobj) return; case MT_CDUFO: if (mobj->fuse > TICRATE) - mobj->flags2 ^= MF2_DONTDRAW; // only by good fortune does this end with it having MF2_DONTDRAW... don't touch! + mobj->drawflags ^= MFD_DONTDRAW; // only by good fortune does this end with it having MFD_DONTDRAW... don't touch! break; case MT_SMK_PIPE: if (mobj->flags2 & MF2_AMBUSH) @@ -7375,7 +7354,7 @@ void P_MobjThinker(mobj_t *mobj) P_SetMobjStateNF(mobj, mobj->info->spawnstate); /* FALLTHRU */ case MT_SMK_MOLE: - mobj->flags2 ^= MF2_DONTDRAW; + mobj->drawflags ^= MFD_DONTDRAW; if (P_IsObjectOnGround(mobj)) { P_RemoveMobj(mobj); @@ -7396,7 +7375,7 @@ void P_MobjThinker(mobj_t *mobj) mobj->frame &= (~FF_FULLBRIGHT); } - mobj->flags2 ^= MF2_DONTDRAW; + mobj->drawflags ^= MFD_DONTDRAW; if (P_IsObjectOnGround(mobj)) { P_RemoveMobj(mobj); @@ -7675,7 +7654,7 @@ void P_MobjThinker(mobj_t *mobj) case MT_NIGHTSDRONE: if (mobj->state >= &states[S_NIGHTSDRONE_SPARKLING1] && mobj->state <= &states[S_NIGHTSDRONE_SPARKLING16]) { - mobj->flags2 &= ~MF2_DONTDRAW; + mobj->drawflags &= ~MFD_DONTDRAW; mobj->z = mobj->floorz + mobj->height + (mobj->spawnpoint->options >> ZSHIFT) * FRACUNIT; mobj->angle = 0; @@ -7701,7 +7680,7 @@ void P_MobjThinker(mobj_t *mobj) { mobj->flags &= ~MF_NOGRAVITY; P_SetMobjState(mobj, S_NIGHTSDRONE1); - mobj->flags2 |= MF2_DONTDRAW; + mobj->drawflags |= MFD_DONTDRAW; } } else if (mobj->tracer && mobj->tracer->player) @@ -7709,7 +7688,7 @@ void P_MobjThinker(mobj_t *mobj) if (!(mobj->tracer->player->pflags & PF_NIGHTSMODE)) { mobj->flags &= ~MF_NOGRAVITY; - mobj->flags2 &= ~MF2_DONTDRAW; + mobj->drawflags &= ~MFD_DONTDRAW; P_SetMobjState(mobj, S_NIGHTSDRONE1); } else if (!mobj->tracer->player->bonustime) @@ -7746,7 +7725,7 @@ void P_MobjThinker(mobj_t *mobj) P_RemoveMobj(mobj->target); P_SetTarget(&mobj->target, NULL); } - mobj->flags2 |= MF2_DONTDRAW; + mobj->drawflags |= MFD_DONTDRAW; } } else if (mobj->tracer && mobj->tracer->player) @@ -7766,10 +7745,10 @@ void P_MobjThinker(mobj_t *mobj) mobj->flags |= MF_NOGRAVITY; } else - mobj->flags2 |= MF2_DONTDRAW; + mobj->drawflags |= MFD_DONTDRAW; } else // Not NiGHTS - mobj->flags2 &= ~MF2_DONTDRAW; + mobj->drawflags &= ~MFD_DONTDRAW; } mobj->angle += ANG10; if (mobj->z <= mobj->floorz) @@ -8293,7 +8272,7 @@ void P_MobjThinker(mobj_t *mobj) K_MatchGenericExtraFlags(mobj, mobj->target); if (leveltime & 1) - mobj->flags2 |= MF2_DONTDRAW; + mobj->drawflags |= MFD_DONTDRAW; } break; case MT_PLAYERRETICULE: @@ -8305,7 +8284,7 @@ void P_MobjThinker(mobj_t *mobj) P_TeleportMove(mobj, mobj->target->x, mobj->target->y, mobj->target->z); break; case MT_INSTASHIELDB: - mobj->flags2 ^= MF2_DONTDRAW; + mobj->drawflags ^= MFD_DONTDRAW; K_MatchGenericExtraFlags(mobj, mobj->target); /* FALLTHRU */ case MT_INSTASHIELDA: @@ -8459,9 +8438,9 @@ void P_MobjThinker(mobj_t *mobj) if (state < mobj->info->spawnstate || state > mobj->info->spawnstate+19) P_SetMobjState(mobj, mobj->info->spawnstate); if (mobj->target->player->kartstuff[k_comebacktimer] < TICRATE && (leveltime & 1)) - mobj->flags2 &= ~MF2_DONTDRAW; + mobj->drawflags &= ~MFD_DONTDRAW; else - mobj->flags2 |= MF2_DONTDRAW; + mobj->drawflags |= MFD_DONTDRAW; } else { @@ -8476,9 +8455,9 @@ void P_MobjThinker(mobj_t *mobj) P_SetMobjState(mobj, mobj->info->painstate); if (mobj->target->player->powers[pw_flashing] && (leveltime & 1)) - mobj->flags2 |= MF2_DONTDRAW; + mobj->drawflags |= MFD_DONTDRAW; else - mobj->flags2 &= ~MF2_DONTDRAW; + mobj->drawflags &= ~MFD_DONTDRAW; } // Update mobj antigravity status: @@ -8508,10 +8487,10 @@ void P_MobjThinker(mobj_t *mobj) cur->colorized = true; K_FlipFromObject(cur, mobj->target); - if (mobj->flags2 & MF2_DONTDRAW) - cur->flags2 |= MF2_DONTDRAW; + if (mobj->drawflags & MFD_DONTDRAW) + cur->drawflags |= MFD_DONTDRAW; else - cur->flags2 &= ~MF2_DONTDRAW; + cur->drawflags &= ~MFD_DONTDRAW; cur = cur->hnext; } @@ -9357,7 +9336,7 @@ for (i = ((mobj->flags2 & MF2_STRONGBOX) ? strongboxamt : weakboxamt); i; --i) s newmobj = P_SpawnMobj(mobj->x, mobj->y, mobj->z, mobj->type); // Transfer flags2 (strongbox, objectflip) - newmobj->flags2 = mobj->flags2 & ~MF2_DONTDRAW; + newmobj->flags2 = mobj->flags2; } P_RemoveMobj(mobj); // make sure they disappear return; @@ -9407,7 +9386,7 @@ for (i = ((mobj->flags2 & MF2_STRONGBOX) ? strongboxamt : weakboxamt); i; --i) s return; } else if (((mobj->type == MT_RANDOMITEM && mobj->threshold == 69) || mobj->type == MT_EGGMANITEM || mobj->type == MT_FALLINGROCK) && mobj->fuse <= TICRATE) - mobj->flags2 ^= MF2_DONTDRAW; + mobj->drawflags ^= MFD_DONTDRAW; } I_Assert(mobj != NULL); @@ -9629,13 +9608,13 @@ void P_SceneryThinker(mobj_t *mobj) && mobj->extravalue1 > 0 && mobj->extravalue2 >= 2) { if (mobj->extravalue2 == 2) // I don't know why the normal logic doesn't work for this. - mobj->flags2 ^= MF2_DONTDRAW; + mobj->drawflags ^= MFD_DONTDRAW; else { if (mobj->fuse == mobj->extravalue2) - mobj->flags2 &= ~MF2_DONTDRAW; + mobj->drawflags &= ~MFD_DONTDRAW; else - mobj->flags2 |= MF2_DONTDRAW; + mobj->drawflags |= MFD_DONTDRAW; } } @@ -10188,10 +10167,18 @@ mobj_t *P_SpawnShadowMobj(mobj_t * caster) // do not set the state with P_SetMobjState, // because action routines can not be called yet - if (caster->frame & FF_FULLBRIGHT) - st = &states[S_WHITESHADOW]; + st = &states[info->spawnstate]; + + if (caster->drawflags & MFD_BRIGHTMASK) + { + if (caster->drawflags & MFD_FULLBRIGHT) + st = &states[S_WHITESHADOW]; + } else - st = &states[info->spawnstate]; + { + if (caster->frame & FF_FULLBRIGHT) + st = &states[S_WHITESHADOW]; + } mobj->state = st; mobj->tics = st->tics; @@ -10980,7 +10967,7 @@ void P_SpawnPlayer(INT32 playernum) { mobj_t *overheadarrow = P_SpawnMobj(mobj->x, mobj->y, mobj->z + P_GetPlayerHeight(p)+16*FRACUNIT, MT_PLAYERARROW); P_SetTarget(&overheadarrow->target, mobj); - overheadarrow->flags2 |= MF2_DONTDRAW; + overheadarrow->drawflags |= MFD_DONTDRAW; P_SetScale(overheadarrow, mobj->destscale); if (p->spectator && pcount > 1) // HEY! No being cheap... @@ -11006,10 +10993,10 @@ void P_SpawnPlayer(INT32 playernum) P_SetTarget(&mo->target, mobj); mo->angle = (diff * (i-1)); mo->color = mobj->color; - if (mobj->flags2 & MF2_DONTDRAW) - mo->flags2 |= MF2_DONTDRAW; + if (mobj->drawflags & MFD_DONTDRAW) + mo->drawflags |= MFD_DONTDRAW; else - mo->flags2 &= ~MF2_DONTDRAW; + mo->drawflags &= ~MFD_DONTDRAW; } } } diff --git a/src/p_mobj.h b/src/p_mobj.h index dfc8fc738..f82dd5e14 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -108,7 +108,7 @@ typedef enum // Don't use the blocklinks (inert but displayable) MF_NOBLOCKMAP = 1<<4, // Thin, paper-like collision bound (for visual equivalent, see FF_PAPERSPRITE) - MF_PAPERCOLLISION = 1<<5, + MF_PAPERCOLLISION = 1<<5, // You can push this object. It can activate switches and things by pushing it on top. MF_PUSHABLE = 1<<6, // Object is a boss. @@ -160,7 +160,7 @@ typedef enum MF_GRENADEBOUNCE = 1<<28, // Run the action thinker on spawn. MF_RUNSPAWNFUNC = 1<<29, - // Don't remap in Encore mode. + // Don't remap in Encore mode. (Not a drawflag so that it's settable by mobjinfo.) MF_DONTENCOREMAP = 1<<30, // free: 1<<31 } mobjflag_t; @@ -170,7 +170,7 @@ typedef enum MF2_AXIS = 1, // It's a NiGHTS axis! (For faster checking) MF2_TWOD = 1<<1, // Moves like it's in a 2D level MF2_DONTRESPAWN = 1<<2, // Don't respawn this object! - MF2_DONTDRAW = 1<<3, // Don't generate a vissprite + // free: 1<<3 MF2_AUTOMATIC = 1<<4, // Thrown ring has automatic properties MF2_RAILRING = 1<<5, // Thrown ring has rail properties MF2_BOUNCERING = 1<<6, // Thrown ring has bounce properties @@ -187,7 +187,7 @@ typedef enum MF2_JUSTATTACKED = 1<<17, // can be pushed by other moving mobjs MF2_FIRING = 1<<18, // turret fire MF2_SUPERFIRE = 1<<19, // Firing something with Super Sonic-stopping properties. Or, if mobj has MF_MISSILE, this is the actual fire from it. - MF2_SHADOW = 1<<20, // Fuzzy draw, makes targeting harder. + // free: 1<<20 MF2_STRONGBOX = 1<<21, // Flag used for "strong" random monitors. MF2_OBJECTFLIP = 1<<22, // Flag for objects that always have flipped gravity. MF2_SKULLFLY = 1<<23, // Special handling: skull in flight. @@ -241,14 +241,42 @@ typedef enum MFE_SPRUNG = 1<<8, // Platform movement MFE_APPLYPMOMZ = 1<<9, - // SRB2Kart: Splitscreen sprite display; very wasteful but I couldn't think of another way to do it... - MFE_DRAWONLYFORP1 = 1<<10, - MFE_DRAWONLYFORP2 = 1<<11, - MFE_DRAWONLYFORP3 = 1<<12, - MFE_DRAWONLYFORP4 = 1<<13, // free: to and including 1<<15 } mobjeflag_t; +// +// Mobj drawing flags +// Set by hex, to make masking shenanigans easier to keep track of. +// +typedef enum +{ + // Don't generate a vissprite for individual screens + MFD_DONTDRAWP1 = 0x0001, + MFD_DONTDRAWP2 = 0x0002, + MFD_DONTDRAWP3 = 0x0004, + MFD_DONTDRAWP4 = 0x0008, + // Transparency override flags + MFD_TRANS10 = 0x0010, + MFD_TRANS20 = 0x0020, + MFD_TRANS30 = 0x0030, + MFD_TRANS40 = 0x0040, + MFD_TRANS50 = 0x0050, + MFD_TRANS60 = 0x0060, + MFD_TRANS70 = 0x0070, + MFD_TRANS80 = 0x0080, + MFD_TRANS90 = 0x0090, + MFD_TRANSMASK = 0x00F0, + // Brightness override flags + MFD_FULLBRIGHT = 0x0100, + MFD_SEMIBRIGHT = 0x0200, + MFD_NOBRIGHT = 0x0300, + MFD_BRIGHTMASK = 0x0F00, + // Shortcuts + MFD_DONTDRAW = MFD_DONTDRAWP1|MFD_DONTDRAWP2|MFD_DONTDRAWP3|MFD_DONTDRAWP4, + MFD_SHADOW = MFD_TRANS80|MFD_FULLBRIGHT, + // free: to and including 0x8000 +} mobjdflag_t; + // // PRECIPITATION flags ?! ?! ?! // @@ -266,6 +294,7 @@ typedef enum { // Ran the thinker this tic. PCF_THUNK = 32, } precipflag_t; + // Map Object definition. typedef struct mobj_s { @@ -306,6 +335,7 @@ typedef struct mobj_s UINT32 flags; // flags from mobjinfo tables UINT32 flags2; // MF2_ flags UINT16 eflags; // extra flags + UINT16 drawflags; // Rendering-related flags. These are not synched. void *skin; // overrides 'sprite' when non-NULL (for player bodies to 'remember' the skin) // Player and mobj sprites in multiplayer modes are modified diff --git a/src/p_user.c b/src/p_user.c index afa0966cf..d1551e3f1 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -650,7 +650,7 @@ static void P_DeNightserizePlayer(player_t *player) player->mo->flags &= ~MF_NOGRAVITY; - player->mo->flags2 &= ~MF2_DONTDRAW; + player->mo->drawflags &= ~MFD_DONTDRAW; // Restore aiming angle if (player == &players[consoleplayer]) @@ -729,7 +729,7 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime) player->mo->flags |= MF_NOGRAVITY; - player->mo->flags2 |= MF2_DONTDRAW; + player->mo->drawflags |= MFD_DONTDRAW; player->nightstime = player->startedtime = nighttime*TICRATE; player->bonustime = false; @@ -1605,7 +1605,7 @@ void P_SpawnShieldOrb(player_t *player) if (shieldobj->info->painstate) P_SetMobjState(shieldobj,shieldobj->info->painstate); else - shieldobj->flags2 |= MF2_SHADOW; + shieldobj->drawflags |= MFD_SHADOW; } } } @@ -3361,7 +3361,7 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd) // SRB2kart - unused. return; P_SetWeaponDelay(player, (3*TICRATE)/2); - mo = P_SpawnPlayerMissile(player->mo, MT_REDRING, MF2_RAILRING|MF2_DONTDRAW); + mo = P_SpawnPlayerMissile(player->mo, MT_REDRING, MF2_RAILRING); // Rail has no unique thrown object, therefore its sound plays here. S_StartSound(player->mo, sfx_rail1); @@ -4282,7 +4282,7 @@ static void P_SpectatorMovement(player_t *player) if (mo) { mo->flags2 |= MF2_RAILRING; - mo->flags2 |= MF2_DONTDRAW; + mo->drawflags |= MFD_DONTDRAW; mo->flags |= MF_NOCLIPHEIGHT; mo->flags |= MF_NOCLIP; mo->flags &= ~MF_MISSILE; @@ -5025,7 +5025,7 @@ static void P_NiGHTSMovement(player_t *player) radius = player->mo->target->radius; player->mo->flags |= MF_NOGRAVITY; - player->mo->flags2 |= MF2_DONTDRAW; + player->mo->drawflags |= MFD_DONTDRAW; P_SetScale(player->mo->tracer, player->mo->scale); if (player->mo->eflags & MFE_VERTICALFLIP) @@ -7042,7 +7042,7 @@ static void P_DeathThink(player_t *player) if (player->mo) { player->mo->flags |= (MF_NOGRAVITY|MF_NOCLIP); - player->mo->flags2 |= MF2_DONTDRAW; + player->mo->drawflags |= MFD_DONTDRAW; } } else @@ -8250,9 +8250,9 @@ void P_PlayerThink(player_t *player) if (player->playerstate == PST_DEAD) { if (player->spectator) - player->mo->flags2 |= MF2_SHADOW; + player->mo->drawflags |= MFD_SHADOW; else - player->mo->flags2 &= ~MF2_SHADOW; + player->mo->drawflags &= ~(MFD_TRANSMASK|MFD_BRIGHTMASK); P_DeathThink(player); return; @@ -8431,7 +8431,7 @@ void P_PlayerThink(player_t *player) { if (player == &players[displayplayers[i]] && !camera[i].chase) { - gmobj->flags2 |= MF2_DONTDRAW; + gmobj->drawflags |= MFD_DONTDRAW; break; } } @@ -8571,16 +8571,16 @@ void P_PlayerThink(player_t *player) { if (player->powers[pw_flashing] > 0 && player->powers[pw_flashing] < K_GetKartFlashing(player) && (leveltime & 1)) - player->mo->flags2 |= MF2_DONTDRAW; + player->mo->drawflags |= MFD_DONTDRAW; else - player->mo->flags2 &= ~MF2_DONTDRAW; + player->mo->drawflags &= ~MFD_DONTDRAW; } /*else if (player->mo->tracer) { if (player->powers[pw_flashing] & 1) - player->mo->tracer->flags2 |= MF2_DONTDRAW; + player->mo->tracer->drawflags |= MFD_DONTDRAW; else - player->mo->tracer->flags2 &= ~MF2_DONTDRAW; + player->mo->tracer->drawflags &= ~MFD_DONTDRAW; }*/ player->pflags &= ~PF_SLIDING; @@ -8958,7 +8958,7 @@ void P_PlayerAfterThink(player_t *player) // spectator invisibility and nogravity. if ((netgame || multiplayer) && player->spectator) { - player->mo->flags2 |= MF2_DONTDRAW; + player->mo->drawflags |= MFD_DONTDRAW; player->mo->flags |= MF_NOGRAVITY; } diff --git a/src/r_main.c b/src/r_main.c index 0d14bed73..9bdaceae6 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -176,7 +176,6 @@ consvar_t cv_allowmlook = {"allowmlook", "Yes", CV_NETVAR, CV_YesNo, NULL, 0, NU consvar_t cv_showhud = {"showhud", "Yes", CV_CALL, CV_YesNo, R_SetViewSize, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_translucenthud = {"translucenthud", "10", CV_SAVE, translucenthud_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_translucency = {"translucency", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_drawdist = {"drawdist", "Infinite", CV_SAVE, drawdist_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; //consvar_t cv_drawdist_nights = {"drawdist_nights", "2048", CV_SAVE, drawdist_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_drawdist_precip = {"drawdist_precip", "1024", CV_SAVE, drawdist_precip_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -1494,7 +1493,6 @@ void R_RegisterEngineStuff(void) return; //CV_RegisterVar(&cv_precipdensity); - CV_RegisterVar(&cv_translucency); CV_RegisterVar(&cv_drawdist); //CV_RegisterVar(&cv_drawdist_nights); CV_RegisterVar(&cv_drawdist_precip); diff --git a/src/r_main.h b/src/r_main.h index 38a589682..7ec27e5d2 100644 --- a/src/r_main.h +++ b/src/r_main.h @@ -77,7 +77,6 @@ extern consvar_t cv_homremoval; extern consvar_t cv_chasecam, cv_chasecam2, cv_chasecam3, cv_chasecam4; extern consvar_t cv_flipcam, cv_flipcam2, cv_flipcam3, cv_flipcam4; extern consvar_t cv_shadow, cv_shadowoffs; -extern consvar_t cv_translucency; extern consvar_t /*cv_precipdensity,*/ cv_drawdist, /*cv_drawdist_nights,*/ cv_drawdist_precip; extern consvar_t cv_fov; extern consvar_t cv_skybox; diff --git a/src/r_segs.c b/src/r_segs.c index 399f514bc..f3fd34eb5 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -179,14 +179,8 @@ static void R_DrawWallSplats(void) colfunc = basecolfunc; break; case SPLATDRAWMODE_TRANS: - if (!cv_translucency.value) - colfunc = basecolfunc; - else - { - dc_transmap = transtables + ((tr_trans50 - 1)<extra_colormap = sector->lightlist[i].extra_colormap; -/* - if (thing->frame & FF_TRANSMASK) - ; - else if (thing->flags2 & MF2_SHADOW) - ; - else -*/ if (!((newsprite->cut & SC_FULLBRIGHT) && (!newsprite->extra_colormap || !(newsprite->extra_colormap->fog & 1)))) { @@ -1499,19 +1492,27 @@ static void R_ProjectSprite(mobj_t *thing) vis->transmap = NULL; // specific translucency - if (!cv_translucency.value) - ; // no translucency - else if (thing->flags2 & MF2_SHADOW) // actually only the player should use this (temporary invisibility) - vis->transmap = transtables + ((tr_trans80-1)<drawflags & MFD_TRANSMASK) // Object is forcing transparency to a specific value + vis->transmap = transtables + ((thing->drawflags & MFD_TRANSMASK) - MFD_TRANS10); else if (thing->frame & FF_TRANSMASK) - vis->transmap = transtables + (thing->frame & FF_TRANSMASK) - 0x10000; + vis->transmap = transtables + ((thing->frame & FF_TRANSMASK) - FF_TRANS10); - if (thing->frame & FF_FULLBRIGHT || thing->flags2 & MF2_SHADOW) - vis->cut |= SC_FULLBRIGHT; - else if (thing->frame & FF_SEMIBRIGHT) - vis->cut |= SC_SEMIBRIGHT; + if (thing->drawflags & MFD_BRIGHTMASK) + { + if (thing->drawflags & MFD_FULLBRIGHT) + vis->cut |= SC_FULLBRIGHT; + else if (thing->drawflags & MFD_SEMIBRIGHT) + vis->cut |= SC_SEMIBRIGHT; + } + else + { + if (thing->frame & FF_FULLBRIGHT) + vis->cut |= SC_FULLBRIGHT; + else if (thing->frame & FF_SEMIBRIGHT) + vis->cut |= SC_SEMIBRIGHT; + } - if (vis->cut & SC_FULLBRIGHT + if ((vis->cut & SC_FULLBRIGHT) && (!vis->extra_colormap || !(vis->extra_colormap->fog & 1))) { // full bright: goggles @@ -1702,7 +1703,7 @@ static void R_ProjectPrecipitationSprite(precipmobj_t *thing) // specific translucency if (thing->frame & FF_TRANSMASK) - vis->transmap = (thing->frame & FF_TRANSMASK) - 0x10000 + transtables; + vis->transmap = ((thing->frame & FF_TRANSMASK) - FF_TRANS10) + transtables; else vis->transmap = NULL; @@ -1758,27 +1759,14 @@ void R_AddSprites(sector_t *sec, INT32 lightlevel) { for (thing = sec->thinglist; thing; thing = thing->snext) { - if (thing->sprite == SPR_NULL || thing->flags2 & MF2_DONTDRAW) + if (thing->sprite == SPR_NULL) continue; - if (splitscreen) - { - if (thing->eflags & MFE_DRAWONLYFORP1) - if (viewssnum != 0) - continue; - - if (thing->eflags & MFE_DRAWONLYFORP2) - if (viewssnum != 1) - continue; - - if (thing->eflags & MFE_DRAWONLYFORP3 && splitscreen > 1) - if (viewssnum != 2) - continue; - - if (thing->eflags & MFE_DRAWONLYFORP4 && splitscreen > 2) - if (viewssnum != 3) - continue; - } + if ((viewssnum == 0 && (thing->drawflags & MFD_DONTDRAWP1)) + || (viewssnum == 1 && (thing->drawflags & MFD_DONTDRAWP2)) + || (viewssnum == 2 && (thing->drawflags & MFD_DONTDRAWP3)) + || (viewssnum == 3 && (thing->drawflags & MFD_DONTDRAWP4))) + continue; approx_dist = P_AproxDistance(viewx-thing->x, viewy-thing->y); @@ -1793,27 +1781,14 @@ void R_AddSprites(sector_t *sec, INT32 lightlevel) // Draw everything in sector, no checks for (thing = sec->thinglist; thing; thing = thing->snext) { - if (thing->sprite == SPR_NULL || thing->flags2 & MF2_DONTDRAW) + if (thing->sprite == SPR_NULL) continue; - if (splitscreen) - { - if (thing->eflags & MFE_DRAWONLYFORP1) - if (viewssnum != 0) - continue; - - if (thing->eflags & MFE_DRAWONLYFORP2) - if (viewssnum != 1) - continue; - - if (thing->eflags & MFE_DRAWONLYFORP3 && splitscreen > 1) - if (viewssnum != 2) - continue; - - if (thing->eflags & MFE_DRAWONLYFORP4 && splitscreen > 2) - if (viewssnum != 3) - continue; - } + if ((viewssnum == 0 && (thing->drawflags & MFD_DONTDRAWP1)) + || (viewssnum == 1 && (thing->drawflags & MFD_DONTDRAWP2)) + || (viewssnum == 2 && (thing->drawflags & MFD_DONTDRAWP3)) + || (viewssnum == 3 && (thing->drawflags & MFD_DONTDRAWP4))) + continue; R_ProjectSprite(thing); } diff --git a/src/r_things.h b/src/r_things.h index 4837b4aee..1632303af 100644 --- a/src/r_things.h +++ b/src/r_things.h @@ -147,7 +147,7 @@ typedef struct vissprite_s lighttable_t *colormap; // for color translation and shadow draw // maxbright frames as well - UINT8 *transmap; // for MF2_SHADOW sprites, which translucency table to use + UINT8 *transmap; // which translucency table to use INT32 mobjflags; From 40b21a60f68f9ab487899c26ee440c7563424448 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Mon, 24 Feb 2020 01:07:12 -0500 Subject: [PATCH 2/8] Fix merge --- src/p_mobj.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index b754dda24..297132099 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8766,10 +8766,10 @@ void P_MobjThinker(mobj_t *mobj) mobj->angle = ang; if (leveltime & 1) - mobj->flags2 |= MF2_DONTDRAW; + mobj->drawflags |= MFD_DONTDRAW; if (trans >= NUMTRANSMAPS) - mobj->flags2 |= MF2_DONTDRAW; + mobj->drawflags |= MFD_DONTDRAW; else if (trans == 0) mobj->frame = (mobj->frame & ~FF_TRANSMASK); else From 643a63e1e65937374b30a992fae2f6e0d1fe845b Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Mon, 20 Jul 2020 13:39:05 -0400 Subject: [PATCH 3/8] Finish merge --- src/k_battle.c | 2 +- src/p_mobj.h | 41 +++++++++++++++++++++-------------------- src/p_setup.c | 4 +--- src/p_user.c | 16 +++++++--------- 4 files changed, 30 insertions(+), 33 deletions(-) diff --git a/src/k_battle.c b/src/k_battle.c index fc1141581..aac0dc8e5 100644 --- a/src/k_battle.c +++ b/src/k_battle.c @@ -394,7 +394,7 @@ static void K_SpawnOvertimeParticles(fixed_t x, fixed_t y, fixed_t scale, mobjty //mo->destscale = mo->scale/4; mo->frame += ((leveltime/4) % 8); /*if (battleovertime.enabled < 10*TICRATE) - mo->flags2 |= MF2_SHADOW;*/ + mo->drawflags |= MFD_SHADOW;*/ mo->angle = R_PointToAngle2(mo->x, mo->y, battleovertime.x, battleovertime.y) + ANGLE_90; mo->z += P_RandomRange(0,48) * mo->scale; break; diff --git a/src/p_mobj.h b/src/p_mobj.h index a7bfbcf72..dd4d1706e 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -251,29 +251,30 @@ typedef enum typedef enum { // Don't generate a vissprite for individual screens - MFD_DONTDRAWP1 = 0x0001, - MFD_DONTDRAWP2 = 0x0002, - MFD_DONTDRAWP3 = 0x0004, - MFD_DONTDRAWP4 = 0x0008, + MFD_DONTDRAWP1 = 0x0001, + MFD_DONTDRAWP2 = 0x0002, + MFD_DONTDRAWP3 = 0x0004, + MFD_DONTDRAWP4 = 0x0008, // Transparency override flags - MFD_TRANS10 = 0x0010, - MFD_TRANS20 = 0x0020, - MFD_TRANS30 = 0x0030, - MFD_TRANS40 = 0x0040, - MFD_TRANS50 = 0x0050, - MFD_TRANS60 = 0x0060, - MFD_TRANS70 = 0x0070, - MFD_TRANS80 = 0x0080, - MFD_TRANS90 = 0x0090, - MFD_TRANSMASK = 0x00F0, + MFD_TRANS10 = 0x0010, + MFD_TRANS20 = 0x0020, + MFD_TRANS30 = 0x0030, + MFD_TRANS40 = 0x0040, + MFD_TRANS50 = 0x0050, + MFD_TRANS60 = 0x0060, + MFD_TRANS70 = 0x0070, + MFD_TRANS80 = 0x0080, + MFD_TRANS90 = 0x0090, + MFD_TRANSMASK = 0x00F0, // Brightness override flags - MFD_FULLBRIGHT = 0x0100, - MFD_SEMIBRIGHT = 0x0200, - MFD_NOBRIGHT = 0x0300, - MFD_BRIGHTMASK = 0x0F00, + MFD_FULLBRIGHT = 0x0100, + MFD_SEMIBRIGHT = 0x0200, + MFD_NOBRIGHT = 0x0300, + MFD_BRIGHTMASK = 0x0F00, // Shortcuts - MFD_DONTDRAW = MFD_DONTDRAWP1|MFD_DONTDRAWP2|MFD_DONTDRAWP3|MFD_DONTDRAWP4, - MFD_SHADOW = MFD_TRANS80|MFD_FULLBRIGHT, + MFD_DONTDRAW = MFD_DONTDRAWP1|MFD_DONTDRAWP2|MFD_DONTDRAWP3|MFD_DONTDRAWP4, + MFD_SHADOW = MFD_TRANS80|MFD_FULLBRIGHT, + MFD_TRANSSHIFT = 4, // free: to and including 0x8000 } mobjdflag_t; diff --git a/src/p_setup.c b/src/p_setup.c index 7d2f8ab0f..0f9e98702 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1159,11 +1159,9 @@ static inline void P_SpawnEmblems(void) emblemmobj->flags |= MF_NOCLIP; emblemmobj->flags &= ~MF_SPECIAL; emblemmobj->flags |= MF_NOBLOCKMAP; - emblemmobj->frame |= (tr_trans50<drawflags |= (tr_trans50 << MFD_TRANSSHIFT); P_SetThingPosition(emblemmobj); } - else - emblemmobj->frame &= ~FF_TRANSMASK; } } diff --git a/src/p_user.c b/src/p_user.c index 5d2bd92ec..f6674644e 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1659,8 +1659,7 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj) ghost->sprite = mobj->sprite; ghost->frame = mobj->frame; ghost->tics = -1; - ghost->frame &= ~FF_TRANSMASK; - ghost->frame |= tr_trans50<drawflags |= tr_trans50 << MFD_TRANSSHIFT; ghost->fuse = ghost->info->damage; ghost->skin = mobj->skin; ghost->standingslope = mobj->standingslope; @@ -7467,7 +7466,7 @@ void P_DemoCameraMovement(camera_t *cam) awayviewmobj_hack = P_SpawnMobj(cam->x, cam->y, cam->z, MT_THOK); awayviewmobj_hack->tics = 2; - awayviewmobj_hack->flags2 |= MF2_DONTDRAW; + awayviewmobj_hack->drawflags |= MFD_DONTDRAW; democam.soundmobj = awayviewmobj_hack; @@ -8581,13 +8580,13 @@ static void P_HandleFollower(player_t *player) P_SetScale(player->follower, FixedMul(fl.scale, player->mo->scale)); K_GenericExtraFlagsNoZAdjust(player->follower, player->mo); // Not K_MatchGenericExtraFlag because the Z adjust it has only works properly if master & mo have the same Z height. - // For comeback in battle. - player->follower->flags2 = (player->follower->flags2 & ~MF2_SHADOW)|(player->mo->flags2 & MF2_SHADOW); + // Match how the player is being drawn + player->follower->drawflags = player->mo->drawflags; // Make the follower invisible if we no contest'd rather than removing it. No one will notice the diff seriously. // Also make the follower invisible if we choose not to have it displayed because it isn't ours. (also quick hacky check for f12) if (player->pflags & PF_TIMEOVER || (!cv_showfollowers.value && (!P_IsDisplayPlayer(player) || displayplayers[0] != consoleplayer) )) - player->follower->flags2 |= MF2_DONTDRAW; + player->follower->drawflags |= MFD_DONTDRAW; if (player->speed && (player->follower->momx || player->follower->momy)) player->follower->angle = R_PointToAngle2(0, 0, player->follower->momx, player->follower->momy); @@ -8608,7 +8607,7 @@ static void P_HandleFollower(player_t *player) P_SetScale(bmobj, FixedMul(bubble, player->mo->scale)); K_GenericExtraFlagsNoZAdjust(bmobj, player->follower); - bmobj->flags2 = (player->follower->flags2 & ~MF2_SHADOW)|(player->mo->flags2 & MF2_SHADOW); + bmobj->drawflags = player->mo->drawflags; if (player->follower->threshold) // threshold means the follower was "despawned" with S_NULL (is actually just set to S_INVISIBLE) P_SetMobjState(bmobj, S_INVISIBLE); // sooooo... let's do the same! @@ -9016,8 +9015,7 @@ void P_PlayerThink(player_t *player) gmobj->fuse = 2; if (leveltime & 1) { - gmobj->frame &= ~FF_TRANSMASK; - gmobj->frame |= tr_trans70<drawflags |= tr_trans70 << MFD_TRANSSHIFT; } // Hide the mobj from our sights if we're the displayplayer and chasecam is off. From 5e4be346d4ea4cf45fd14b7a5bd37e0c7fd3a8ac Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Mon, 20 Jul 2020 16:16:56 -0400 Subject: [PATCH 4/8] Ring sting debt indicator properly supports splitscreen --- src/k_kart.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index b37238e52..9737fa3a1 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5467,8 +5467,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) debtflag->frame += 4; debtflag->color = player->skincolor; debtflag->fuse = 2; - if (P_IsDisplayPlayer(player)) - debtflag->drawflags |= MFD_DONTDRAW; + debtflag->drawflags = K_GetPlayerDontDrawFlag(player); } if (player->kartstuff[k_springstars] && (leveltime & 1)) From d649be455474ab7f7c5e29a4f37be1d03e623f7a Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Mon, 20 Jul 2020 16:57:25 -0400 Subject: [PATCH 5/8] revert back to master yay i get to MANUALLY redo everything. --- src/k_kart.c | 109 ++++++++++++++++++++++++++++----------------------- 1 file changed, 61 insertions(+), 48 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 9737fa3a1..fa5be8c53 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -182,24 +182,6 @@ void K_RegisterKartStuff(void) //} -// Not sure what's a good place for this function -// I'll get around to splitting *everything* in this file into better places soon... -UINT16 K_GetPlayerDontDrawFlag(player_t *player) -{ - UINT16 flag = 0; - - if (player == &players[displayplayers[0]]) - flag = MFD_DONTDRAWP1; - else if (r_splitscreen >= 1 && player == &players[displayplayers[1]]) - flag = MFD_DONTDRAWP2; - else if (r_splitscreen >= 2 && player == &players[displayplayers[2]]) - flag = MFD_DONTDRAWP3; - else if (r_splitscreen >= 3 && player == &players[displayplayers[3]]) - flag = MFD_DONTDRAWP4; - - return flag; -} - boolean K_IsPlayerLosing(player_t *player) { INT32 winningpos = 1; @@ -1354,9 +1336,9 @@ static void K_DrawDraftCombiring(player_t *player, player_t *victim, fixed_t cur band->colorized = true; band->fuse = 2; if (transparent) - band->drawflags |= MFD_SHADOW; - - band->drawflags |= MFD_DONTDRAW & ~(K_GetPlayerDontDrawFlag(player) | K_GetPlayerDontDrawFlag(victim)); + band->flags2 |= MF2_SHADOW; + if (!P_IsDisplayPlayer(player) && !P_IsDisplayPlayer(victim)) + band->flags2 |= MF2_DONTDRAW; } curx += stepx; @@ -1584,7 +1566,11 @@ void K_MatchGenericExtraFlags(mobj_t *mo, mobj_t *master) K_FlipFromObject(mo, master); // visibility (usually for hyudoro) - mo->drawflags = (master->drawflags & MFD_DONTDRAW); + mo->flags2 = (mo->flags2 & ~MF2_DONTDRAW)|(master->flags2 & MF2_DONTDRAW); + mo->eflags = (mo->eflags & ~MFE_DRAWONLYFORP1)|(master->eflags & MFE_DRAWONLYFORP1); + mo->eflags = (mo->eflags & ~MFE_DRAWONLYFORP2)|(master->eflags & MFE_DRAWONLYFORP2); + mo->eflags = (mo->eflags & ~MFE_DRAWONLYFORP3)|(master->eflags & MFE_DRAWONLYFORP3); + mo->eflags = (mo->eflags & ~MFE_DRAWONLYFORP4)|(master->eflags & MFE_DRAWONLYFORP4); } // same as above, but does not adjust Z height when flipping @@ -1595,7 +1581,11 @@ void K_GenericExtraFlagsNoZAdjust(mobj_t *mo, mobj_t *master) mo->flags2 = (mo->flags2 & ~MF2_OBJECTFLIP)|(master->flags2 & MF2_OBJECTFLIP); // visibility (usually for hyudoro) - mo->drawflags = (master->drawflags & MFD_DONTDRAW); + mo->flags2 = (mo->flags2 & ~MF2_DONTDRAW)|(master->flags2 & MF2_DONTDRAW); + mo->eflags = (mo->eflags & ~MFE_DRAWONLYFORP1)|(master->eflags & MFE_DRAWONLYFORP1); + mo->eflags = (mo->eflags & ~MFE_DRAWONLYFORP2)|(master->eflags & MFE_DRAWONLYFORP2); + mo->eflags = (mo->eflags & ~MFE_DRAWONLYFORP3)|(master->eflags & MFE_DRAWONLYFORP3); + mo->eflags = (mo->eflags & ~MFE_DRAWONLYFORP4)|(master->eflags & MFE_DRAWONLYFORP4); } @@ -1655,7 +1645,7 @@ static void K_SpawnBrakeDriftSparks(player_t *player) // Be sure to update the m P_SetTarget(&sparks->target, player->mo); P_SetScale(sparks, (sparks->destscale = player->mo->scale)); K_MatchGenericExtraFlags(sparks, player->mo); - sparks->drawflags |= MFD_DONTDRAW; + sparks->flags2 |= MF2_DONTDRAW; } static fixed_t K_RandomFlip(fixed_t f) @@ -3405,7 +3395,7 @@ void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent) } if (translucent) - dust->drawflags |= MFD_SHADOW; + dust->flags2 |= MF2_SHADOW; } void K_SpawnDraftDust(mobj_t *mo) @@ -4881,9 +4871,9 @@ static void K_MoveHeldObjects(player_t *player) cur->flags &= ~MF_NOCLIPTHING; if (player->kartstuff[k_rocketsneakertimer] <= TICRATE && (leveltime & 1)) - cur->drawflags |= MFD_DONTDRAW; + cur->flags2 |= MF2_DONTDRAW; else - cur->drawflags &= ~MFD_DONTDRAW; + cur->flags2 &= ~MF2_DONTDRAW; if (num & 1) P_SetMobjStateNF(cur, (vibrate ? S_ROCKETSNEAKER_LVIBRATE : S_ROCKETSNEAKER_L)); @@ -5432,7 +5422,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) //ghost->momy = (3*player->mo->momy)/4; //ghost->momz = (3*player->mo->momz)/4; if (leveltime & 1) - ghost->drawflags |= MFD_DONTDRAW; + ghost->flags2 |= MF2_DONTDRAW; } if (P_IsObjectOnGround(player->mo)) @@ -5467,7 +5457,8 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) debtflag->frame += 4; debtflag->color = player->skincolor; debtflag->fuse = 2; - debtflag->drawflags = K_GetPlayerDontDrawFlag(player); + if (P_IsDisplayPlayer(player)) + debtflag->flags2 |= MF2_DONTDRAW; } if (player->kartstuff[k_springstars] && (leveltime & 1)) @@ -7435,35 +7426,61 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (G_RaceGametype()) hyu *= 2; // double in race - if (leveltime & 1) + if (r_splitscreen) { - player->mo->drawflags |= MFD_DONTDRAW; + if (leveltime & 1) + player->mo->flags2 |= MF2_DONTDRAW; + else + player->mo->flags2 &= ~MF2_DONTDRAW; + + if (player->kartstuff[k_hyudorotimer] >= (TICRATE/2) && player->kartstuff[k_hyudorotimer] <= hyu-(TICRATE/2)) + { + if (player == &players[displayplayers[1]]) + player->mo->eflags |= MFE_DRAWONLYFORP2; + else if (player == &players[displayplayers[2]] && r_splitscreen > 1) + player->mo->eflags |= MFE_DRAWONLYFORP3; + else if (player == &players[displayplayers[3]] && r_splitscreen > 2) + player->mo->eflags |= MFE_DRAWONLYFORP4; + else if (player == &players[displayplayers[0]]) + player->mo->eflags |= MFE_DRAWONLYFORP1; + else + player->mo->flags2 |= MF2_DONTDRAW; + } + else + player->mo->eflags &= ~(MFE_DRAWONLYFORP1|MFE_DRAWONLYFORP2|MFE_DRAWONLYFORP3|MFE_DRAWONLYFORP4); } else { - if (player->kartstuff[k_hyudorotimer] >= (TICRATE/2) && player->kartstuff[k_hyudorotimer] <= hyu-(TICRATE/2)) - player->mo->drawflags &= ~K_GetPlayerDontDrawFlag(player); + if (P_IsDisplayPlayer(player) + || (!P_IsDisplayPlayer(player) && (player->kartstuff[k_hyudorotimer] < (TICRATE/2) || player->kartstuff[k_hyudorotimer] > hyu-(TICRATE/2)))) + { + if (leveltime & 1) + player->mo->flags2 |= MF2_DONTDRAW; + else + player->mo->flags2 &= ~MF2_DONTDRAW; + } else - player->mo->drawflags &= ~MFD_DONTDRAW; + player->mo->flags2 |= MF2_DONTDRAW; } player->powers[pw_flashing] = player->kartstuff[k_hyudorotimer]; // We'll do this for now, let's people know about the invisible people through subtle hints } - else + else if (player->kartstuff[k_hyudorotimer] == 0) { - player->mo->drawflags &= ~MFD_DONTDRAW; + player->mo->flags2 &= ~MF2_DONTDRAW; + player->mo->eflags &= ~(MFE_DRAWONLYFORP1|MFE_DRAWONLYFORP2|MFE_DRAWONLYFORP3|MFE_DRAWONLYFORP4); } if (G_BattleGametype() && player->kartstuff[k_bumper] <= 0) // dead in match? you da bomb { K_DropItems(player); //K_StripItems(player); K_StripOther(player); - player->mo->drawflags |= MFD_SHADOW; + player->mo->flags2 |= MF2_SHADOW; player->powers[pw_flashing] = player->kartstuff[k_comebacktimer]; } else if (G_RaceGametype() || player->kartstuff[k_bumper] > 0) { - player->mo->drawflags &= ~(MFD_TRANSMASK|MFD_BRIGHTMASK); + player->mo->flags2 &= ~MF2_SHADOW; } } @@ -10203,7 +10220,6 @@ static void K_drawKartMinimap(void) UINT8 *colormap = NULL; SINT8 localplayers[4]; SINT8 numlocalplayers = 0; - INT32 hyu = hyudorotime; mobj_t *mobj, *next; // for SPB drawing (or any other item(s) we may wanna draw, I dunno!) // Draw the HUD only when playing in a level. @@ -10272,9 +10288,6 @@ static void K_drawKartMinimap(void) } } - if (G_RaceGametype()) - hyu *= 2; // double in race - // initialize for (i = 0; i < 4; i++) localplayers[i] = -1; @@ -10324,8 +10337,8 @@ static void K_drawKartMinimap(void) if (players[i].kartstuff[k_hyudorotimer] > 0) { - if (!((players[i].kartstuff[k_hyudorotimer] < TICRATE/2 - || players[i].kartstuff[k_hyudorotimer] > hyu-(1*TICRATE/2)) + if (!((players[i].kartstuff[k_hyudorotimer] < 1*TICRATE/2 + || players[i].kartstuff[k_hyudorotimer] > hyudorotime-(1*TICRATE/2)) && !(leveltime & 1))) continue; } @@ -10607,7 +10620,7 @@ static void K_drawKartFirstPerson(void) UINT8 *colmap = NULL; ticcmd_t *cmd = &stplyr->cmd; - if (stplyr->spectator || !stplyr->mo || (stplyr->mo->drawflags & MFD_DONTDRAW)) + if (stplyr->spectator || !stplyr->mo || (stplyr->mo->flags2 & MF2_DONTDRAW)) return; if (stplyr == &players[displayplayers[1]] && r_splitscreen) @@ -10629,9 +10642,9 @@ static void K_drawKartFirstPerson(void) { if (stplyr->speed < (20*stplyr->mo->scale) && (leveltime & 1) && !r_splitscreen) y++; - - if (stplyr->mo->drawflags & MFD_TRANSMASK) - splitflags |= ((stplyr->mo->drawflags & MFD_TRANSMASK) >> MFD_TRANSSHIFT) << FF_TRANSSHIFT; + // the following isn't EXPLICITLY right, it just gets the result we want, but i'm too lazy to look up the right way to do it + if (stplyr->mo->flags2 & MF2_SHADOW) + splitflags |= FF_TRANS80; else if (stplyr->mo->frame & FF_TRANSMASK) splitflags |= (stplyr->mo->frame & FF_TRANSMASK); } From 509f085d46f4dee9c27efcfa56bbd580fb98452d Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Mon, 20 Jul 2020 17:22:07 -0400 Subject: [PATCH 6/8] This should be a proper diff for k_kart's drawflags stuff --- src/k_kart.c | 114 ++++++++++++++++++++++++--------------------------- 1 file changed, 54 insertions(+), 60 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index fa5be8c53..7816e4f8f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -40,6 +40,22 @@ // indirectitemcooldown is timer before anyone's allowed another Shrink/SPB // mapreset is set when enough players fill an empty server +UINT16 K_GetPlayerDontDrawFlag(player_t *player) +{ + UINT16 flag = 0; + + if (player == &players[displayplayers[0]]) + flag = MFD_DONTDRAWP1; + else if (r_splitscreen >= 1 && player == &players[displayplayers[1]]) + flag = MFD_DONTDRAWP2; + else if (r_splitscreen >= 2 && player == &players[displayplayers[2]]) + flag = MFD_DONTDRAWP3; + else if (r_splitscreen >= 3 && player == &players[displayplayers[3]]) + flag = MFD_DONTDRAWP4; + + return flag; +} + player_t *K_GetItemBoxPlayer(mobj_t *mobj) { fixed_t closest = INT32_MAX; @@ -1330,15 +1346,19 @@ static void K_DrawDraftCombiring(player_t *player, player_t *victim, fixed_t cur cury + (P_RandomRange(-12,12)*mapobjectscale), curz + (P_RandomRange(24,48)*mapobjectscale), MT_SIGNSPARKLE); + P_SetMobjState(band, S_SIGNSPARK1 + (leveltime % 11)); P_SetScale(band, (band->destscale = (3*player->mo->scale)/2)); + band->color = colors[c]; band->colorized = true; + band->fuse = 2; + if (transparent) - band->flags2 |= MF2_SHADOW; - if (!P_IsDisplayPlayer(player) && !P_IsDisplayPlayer(victim)) - band->flags2 |= MF2_DONTDRAW; + band->drawflags |= MFD_SHADOW; + + band->drawflags |= MFD_DONTDRAW & ~(K_GetPlayerDontDrawFlag(player) | K_GetPlayerDontDrawFlag(victim)); } curx += stepx; @@ -1566,11 +1586,7 @@ void K_MatchGenericExtraFlags(mobj_t *mo, mobj_t *master) K_FlipFromObject(mo, master); // visibility (usually for hyudoro) - mo->flags2 = (mo->flags2 & ~MF2_DONTDRAW)|(master->flags2 & MF2_DONTDRAW); - mo->eflags = (mo->eflags & ~MFE_DRAWONLYFORP1)|(master->eflags & MFE_DRAWONLYFORP1); - mo->eflags = (mo->eflags & ~MFE_DRAWONLYFORP2)|(master->eflags & MFE_DRAWONLYFORP2); - mo->eflags = (mo->eflags & ~MFE_DRAWONLYFORP3)|(master->eflags & MFE_DRAWONLYFORP3); - mo->eflags = (mo->eflags & ~MFE_DRAWONLYFORP4)|(master->eflags & MFE_DRAWONLYFORP4); + mo->drawflags = (master->drawflags & MFD_DONTDRAW); } // same as above, but does not adjust Z height when flipping @@ -1581,11 +1597,7 @@ void K_GenericExtraFlagsNoZAdjust(mobj_t *mo, mobj_t *master) mo->flags2 = (mo->flags2 & ~MF2_OBJECTFLIP)|(master->flags2 & MF2_OBJECTFLIP); // visibility (usually for hyudoro) - mo->flags2 = (mo->flags2 & ~MF2_DONTDRAW)|(master->flags2 & MF2_DONTDRAW); - mo->eflags = (mo->eflags & ~MFE_DRAWONLYFORP1)|(master->eflags & MFE_DRAWONLYFORP1); - mo->eflags = (mo->eflags & ~MFE_DRAWONLYFORP2)|(master->eflags & MFE_DRAWONLYFORP2); - mo->eflags = (mo->eflags & ~MFE_DRAWONLYFORP3)|(master->eflags & MFE_DRAWONLYFORP3); - mo->eflags = (mo->eflags & ~MFE_DRAWONLYFORP4)|(master->eflags & MFE_DRAWONLYFORP4); + mo->drawflags = (master->drawflags & MFD_DONTDRAW); } @@ -1645,7 +1657,7 @@ static void K_SpawnBrakeDriftSparks(player_t *player) // Be sure to update the m P_SetTarget(&sparks->target, player->mo); P_SetScale(sparks, (sparks->destscale = player->mo->scale)); K_MatchGenericExtraFlags(sparks, player->mo); - sparks->flags2 |= MF2_DONTDRAW; + sparks->drawflags |= MFD_DONTDRAW; } static fixed_t K_RandomFlip(fixed_t f) @@ -3395,7 +3407,7 @@ void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent) } if (translucent) - dust->flags2 |= MF2_SHADOW; + dust->drawflags |= MFD_SHADOW; } void K_SpawnDraftDust(mobj_t *mo) @@ -4871,9 +4883,9 @@ static void K_MoveHeldObjects(player_t *player) cur->flags &= ~MF_NOCLIPTHING; if (player->kartstuff[k_rocketsneakertimer] <= TICRATE && (leveltime & 1)) - cur->flags2 |= MF2_DONTDRAW; + cur->drawflags |= MFD_DONTDRAW; else - cur->flags2 &= ~MF2_DONTDRAW; + cur->drawflags &= ~MFD_DONTDRAW; if (num & 1) P_SetMobjStateNF(cur, (vibrate ? S_ROCKETSNEAKER_LVIBRATE : S_ROCKETSNEAKER_L)); @@ -5422,7 +5434,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) //ghost->momy = (3*player->mo->momy)/4; //ghost->momz = (3*player->mo->momz)/4; if (leveltime & 1) - ghost->flags2 |= MF2_DONTDRAW; + ghost->drawflags |= MFD_DONTDRAW; } if (P_IsObjectOnGround(player->mo)) @@ -5449,16 +5461,20 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) { mobj_t *debtflag = P_SpawnMobj(player->mo->x + player->mo->momx, player->mo->y + player->mo->momy, player->mo->z + player->mo->momz + player->mo->height + (24*player->mo->scale), MT_THOK); + P_SetMobjState(debtflag, S_RINGDEBT); P_SetScale(debtflag, (debtflag->destscale = player->mo->scale)); + K_MatchGenericExtraFlags(debtflag, player->mo); debtflag->frame += (leveltime % 4); + if ((leveltime/12) & 1) debtflag->frame += 4; + debtflag->color = player->skincolor; debtflag->fuse = 2; - if (P_IsDisplayPlayer(player)) - debtflag->flags2 |= MF2_DONTDRAW; + + debtflag->drawflags = K_GetPlayerDontDrawFlag(player); } if (player->kartstuff[k_springstars] && (leveltime & 1)) @@ -7426,61 +7442,35 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (G_RaceGametype()) hyu *= 2; // double in race - if (r_splitscreen) + if (leveltime & 1) { - if (leveltime & 1) - player->mo->flags2 |= MF2_DONTDRAW; - else - player->mo->flags2 &= ~MF2_DONTDRAW; - - if (player->kartstuff[k_hyudorotimer] >= (TICRATE/2) && player->kartstuff[k_hyudorotimer] <= hyu-(TICRATE/2)) - { - if (player == &players[displayplayers[1]]) - player->mo->eflags |= MFE_DRAWONLYFORP2; - else if (player == &players[displayplayers[2]] && r_splitscreen > 1) - player->mo->eflags |= MFE_DRAWONLYFORP3; - else if (player == &players[displayplayers[3]] && r_splitscreen > 2) - player->mo->eflags |= MFE_DRAWONLYFORP4; - else if (player == &players[displayplayers[0]]) - player->mo->eflags |= MFE_DRAWONLYFORP1; - else - player->mo->flags2 |= MF2_DONTDRAW; - } - else - player->mo->eflags &= ~(MFE_DRAWONLYFORP1|MFE_DRAWONLYFORP2|MFE_DRAWONLYFORP3|MFE_DRAWONLYFORP4); + player->mo->drawflags |= MFD_DONTDRAW; } else { - if (P_IsDisplayPlayer(player) - || (!P_IsDisplayPlayer(player) && (player->kartstuff[k_hyudorotimer] < (TICRATE/2) || player->kartstuff[k_hyudorotimer] > hyu-(TICRATE/2)))) - { - if (leveltime & 1) - player->mo->flags2 |= MF2_DONTDRAW; - else - player->mo->flags2 &= ~MF2_DONTDRAW; - } + if (player->kartstuff[k_hyudorotimer] >= (TICRATE/2) && player->kartstuff[k_hyudorotimer] <= hyu-(TICRATE/2)) + player->mo->drawflags &= ~K_GetPlayerDontDrawFlag(player); else - player->mo->flags2 |= MF2_DONTDRAW; + player->mo->drawflags &= ~MFD_DONTDRAW; } player->powers[pw_flashing] = player->kartstuff[k_hyudorotimer]; // We'll do this for now, let's people know about the invisible people through subtle hints } else if (player->kartstuff[k_hyudorotimer] == 0) { - player->mo->flags2 &= ~MF2_DONTDRAW; - player->mo->eflags &= ~(MFE_DRAWONLYFORP1|MFE_DRAWONLYFORP2|MFE_DRAWONLYFORP3|MFE_DRAWONLYFORP4); + player->mo->drawflags &= ~MFD_DONTDRAW; } if (G_BattleGametype() && player->kartstuff[k_bumper] <= 0) // dead in match? you da bomb { K_DropItems(player); //K_StripItems(player); K_StripOther(player); - player->mo->flags2 |= MF2_SHADOW; + player->mo->drawflags |= MFD_SHADOW; player->powers[pw_flashing] = player->kartstuff[k_comebacktimer]; } else if (G_RaceGametype() || player->kartstuff[k_bumper] > 0) { - player->mo->flags2 &= ~MF2_SHADOW; + player->mo->drawflags &= ~(MFD_TRANSMASK|MFD_BRIGHTMASK); } } @@ -10220,6 +10210,7 @@ static void K_drawKartMinimap(void) UINT8 *colormap = NULL; SINT8 localplayers[4]; SINT8 numlocalplayers = 0; + INT32 hyu = hyudorotime; mobj_t *mobj, *next; // for SPB drawing (or any other item(s) we may wanna draw, I dunno!) // Draw the HUD only when playing in a level. @@ -10292,6 +10283,9 @@ static void K_drawKartMinimap(void) for (i = 0; i < 4; i++) localplayers[i] = -1; + if (G_RaceGametype()) + hyu *= 2; // double in race + // Player's tiny icons on the Automap. (drawn opposite direction so player 1 is drawn last in splitscreen) if (ghosts) { @@ -10337,8 +10331,8 @@ static void K_drawKartMinimap(void) if (players[i].kartstuff[k_hyudorotimer] > 0) { - if (!((players[i].kartstuff[k_hyudorotimer] < 1*TICRATE/2 - || players[i].kartstuff[k_hyudorotimer] > hyudorotime-(1*TICRATE/2)) + if (!((players[i].kartstuff[k_hyudorotimer] < TICRATE/2 + || players[i].kartstuff[k_hyudorotimer] > hyu-(TICRATE/2)) && !(leveltime & 1))) continue; } @@ -10620,7 +10614,7 @@ static void K_drawKartFirstPerson(void) UINT8 *colmap = NULL; ticcmd_t *cmd = &stplyr->cmd; - if (stplyr->spectator || !stplyr->mo || (stplyr->mo->flags2 & MF2_DONTDRAW)) + if (stplyr->spectator || !stplyr->mo || (stplyr->mo->drawflags & MFD_DONTDRAW)) return; if (stplyr == &players[displayplayers[1]] && r_splitscreen) @@ -10642,9 +10636,9 @@ static void K_drawKartFirstPerson(void) { if (stplyr->speed < (20*stplyr->mo->scale) && (leveltime & 1) && !r_splitscreen) y++; - // the following isn't EXPLICITLY right, it just gets the result we want, but i'm too lazy to look up the right way to do it - if (stplyr->mo->flags2 & MF2_SHADOW) - splitflags |= FF_TRANS80; + + if (stplyr->mo->drawflags & MFD_TRANSMASK) + splitflags |= ((stplyr->mo->drawflags & MFD_TRANSMASK) >> MFD_TRANSSHIFT) << FF_TRANSSHIFT; else if (stplyr->mo->frame & FF_TRANSMASK) splitflags |= (stplyr->mo->frame & FF_TRANSMASK); } From ca6ccca5945ae29e5db375227680fd4999a41d59 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Mon, 20 Jul 2020 17:33:13 -0400 Subject: [PATCH 7/8] Add drawflags to Lua --- src/dehacked.c | 23 +++++++++++++++++++++++ src/lua_mobjlib.c | 10 +++++++++- src/p_mobj.h | 2 +- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 9b4082c72..e803094ad 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -9432,6 +9432,29 @@ struct { {"TC_ALLWHITE",TC_ALLWHITE}, {"TC_RAINBOW",TC_RAINBOW}, {"TC_BLINK",TC_BLINK}, + + // MFD_ draw flag enum + {"MFD_DONTDRAWP1",MFD_DONTDRAWP1}, + {"MFD_DONTDRAWP2",MFD_DONTDRAWP2}, + {"MFD_DONTDRAWP3",MFD_DONTDRAWP3}, + {"MFD_DONTDRAWP4",MFD_DONTDRAWP4}, + {"MFD_TRANS10",MFD_TRANS10}, + {"MFD_TRANS20",MFD_TRANS20}, + {"MFD_TRANS30",MFD_TRANS30}, + {"MFD_TRANS40",MFD_TRANS40}, + {"MFD_TRANS50",MFD_TRANS50}, + {"MFD_TRANS60",MFD_TRANS60}, + {"MFD_TRANS70",MFD_TRANS70}, + {"MFD_TRANS80",MFD_TRANS80}, + {"MFD_TRANS90",MFD_TRANS90}, + {"MFD_TRANSMASK",MFD_TRANSMASK}, + {"MFD_FULLBRIGHT",MFD_FULLBRIGHT}, + {"MFD_SEMIBRIGHT",MFD_SEMIBRIGHT}, + {"MFD_NOBRIGHT",MFD_NOBRIGHT}, + {"MFD_BRIGHTMASK",MFD_BRIGHTMASK}, + {"MFD_DONTDRAW",MFD_DONTDRAW}, + {"MFD_SHADOW",MFD_SHADOW}, + {"MFD_TRANSSHIFT",MFD_TRANSSHIFT}, #endif {NULL,0} diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index cd5f4d267..3c85c358b 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -51,6 +51,7 @@ enum mobj_e { mobj_flags, mobj_flags2, mobj_eflags, + mobj_drawflags, mobj_skin, mobj_color, mobj_bnext, @@ -119,6 +120,7 @@ static const char *const mobj_opt[] = { "flags", "flags2", "eflags", + "drawflags", "skin", "color", "bnext", @@ -255,6 +257,9 @@ static int mobj_get(lua_State *L) case mobj_eflags: lua_pushinteger(L, mo->eflags); break; + case mobj_drawflags: + lua_pushinteger(L, mo->drawflags); + break; case mobj_skin: // skin name or nil, not struct if (!mo->skin) return 0; @@ -541,7 +546,10 @@ static int mobj_set(lua_State *L) mo->flags2 = (UINT32)luaL_checkinteger(L, 3); break; case mobj_eflags: - mo->eflags = (UINT32)luaL_checkinteger(L, 3); + mo->eflags = (UINT16)luaL_checkinteger(L, 3); + break; + case mobj_drawflags: + mo->drawflags = (UINT16)luaL_checkinteger(L, 3); break; case mobj_skin: // set skin by name { diff --git a/src/p_mobj.h b/src/p_mobj.h index dd4d1706e..dbb3f4d58 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -333,7 +333,7 @@ typedef struct mobj_s UINT32 flags; // flags from mobjinfo tables UINT32 flags2; // MF2_ flags UINT16 eflags; // extra flags - UINT16 drawflags; // Rendering-related flags. These are not synched. + UINT16 drawflags; // Rendering-related flags. These should not be used for game logic. void *skin; // overrides 'sprite' when non-NULL (for player bodies to 'remember' the skin) // Player and mobj sprites in multiplayer modes are modified From c7f19a4b83161817b4f1a1af63d72c3bef6df576 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Mon, 20 Jul 2020 17:49:56 -0400 Subject: [PATCH 8/8] Lazy synch drawflags on join --- src/p_saveg.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/p_saveg.c b/src/p_saveg.c index 16863ae33..5239837b4 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -999,6 +999,7 @@ typedef enum MD2_SLOPE = 1<<13, #endif MD2_SHADOWSCALE = 1<<14, + MD2_DRAWFLAGS = 1<<15, } mobj_diff2_t; typedef enum @@ -1197,6 +1198,8 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) #endif if (mobj->shadowscale) diff2 |= MD2_SHADOWSCALE; + if (mobj->drawflags) + diff2 |= MD2_DRAWFLAGS; if (mobj->colorized) diff2 |= MD2_COLORIZED; if (mobj == waypointcap) @@ -1328,6 +1331,17 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) WRITEUINT8(save_p, mobj->colorized); if (diff2 & MD2_SHADOWSCALE) WRITEFIXED(save_p, mobj->shadowscale); + if (diff2 & MD2_DRAWFLAGS) + { + UINT16 df = mobj->drawflags; + + if ((mobj->drawflags & MFD_DONTDRAW) != MFD_DONTDRAW) + { + df = (mobj->drawflags & ~MFD_DONTDRAW); + } + + WRITEUINT16(save_p, df); + } WRITEUINT32(save_p, mobj->mobjnum); }