Merge remote-tracking branch 'origin/next' into subvsdub

Nep taking a sledgehammer to the codebase as refactors are happening :,)

# Conflicts:
#	src/g_demo.c
This commit is contained in:
yamamama 2025-12-01 17:05:58 -05:00
commit 74b76b8471
12 changed files with 200 additions and 66 deletions

View file

@ -2739,7 +2739,7 @@ void CL_RemovePlayer(INT32 playernum, kickreason_t reason)
LUA_InvalidatePlayer(&players[playernum]);
// don't look through someone's view who isn't there
G_ResetViews();
G_ResetViews(false);
K_CheckBumpers();
P_CheckRacers();

View file

@ -1728,5 +1728,59 @@ struct int_const_s const INT_CONST[] = {
{"PICKUPITEM_EGGMAN", PICKUPITEM_EGGMAN},
{"PICKUPITEM_FLOATING", PICKUPITEM_FLOATING},
// kart_fullturn
{"KART_FULLTURN", KART_FULLTURN},
// invin constants
{"KART_NUMINVSPARKLESANIM", KART_NUMINVSPARKLESANIM},
{"BASEINVINTIME", BASEINVINTIME},
{"MININVINTIME", MININVINTIME},
// grow/shrink scale
{"GROW_SCALE", GROW_SCALE},
{"SHRINK_SCALE", SHRINK_SCALE},
// auto respawn
{"AUTORESPAWN_TIME", AUTORESPAWN_TIME},
{"AUTORESPAWN_THRESHOLD", AUTORESPAWN_THRESHOLD},
// flameshield
{"FLAMESTOREMAX", FLAMESTOREMAX},
// k_kart: Flipover
{"FLIPOVERDIST", FLIPOVERDIST},
{"FLIPOVERTICS", FLIPOVERTICS},
{"FLIPOVERHALFTICS", FLIPOVERHALFTICS},
{"FLIPOVER_90DEGTIME", FLIPOVER_90DEGTIME},
{"FLIPOVER_360DEGTIME", FLIPOVER_360DEGTIME},
{"FLIPOVERLIMIT", FLIPOVERLIMIT},
{"FLIPOVERANG", FLIPOVERANG},
{"FLIPOVERSPEED", FLIPOVERSPEED},
{"FLIPOVERHEIGHT", FLIPOVERHEIGHT},
// bubbleshield
//{"MAXBUBBLEHEALTH", MAXBUBBLEHEALTH},
//{"BUBBLEBUMPCHIP", BUBBLEBUMPCHIP},
//{"BUBBLEITMDAMAGE", BUBBLEITMDAMAGE},
{"BUBBLEMINWEIGHT", BUBBLEMINWEIGHT},
// ring visual/audio stuff
{"MAXRINGVOLUME", MAXRINGVOLUME},
{"MAXRINGTRANSPARENCY", MAXRINGTRANSPARENCY},
{"MINRINGVOLUME", MINRINGVOLUME},
{"MINRINGTRANSPARENCY", MINRINGTRANSPARENCY},
{"RINGVOLUMECOLLECTPENALTY", RINGVOLUMECOLLECTPENALTY},
{"RINGTRANSPARENCYCOLLECTPENALTY", RINGTRANSPARENCYCOLLECTPENALTY},
{"RINGVOLUMEUSEPENALTY", RINGVOLUMEUSEPENALTY},
{"RINGTRANSPARENCYUSEPENALTY", RINGTRANSPARENCYUSEPENALTY},
{"RINGVOLUMEREGEN", RINGVOLUMEREGEN},
{"RINGTRANSPARENCYREGEN", RINGTRANSPARENCYREGEN},
// bumpsparktype_t
{"BUMPSPARK_NONE", BUMPSPARK_NONE},
{"BUMPSPARK_NOCHARGE", BUMPSPARK_NOCHARGE},
{"BUMPSPARK_RESET100", BUMPSPARK_RESET100},
{"BUMPSPARK_ALL", BUMPSPARK_ALL},
{NULL,0}
};

View file

@ -1175,6 +1175,8 @@ void G_ReadDemoExtraData(void)
demobuf.p = G_ReadRawExtraData(&extra, demobuf.p, demo.version);
p = extra.playernum;
player_t *player = &players[p];
if (p == DW_END)
break;
@ -1199,42 +1201,42 @@ void G_ReadDemoExtraData(void)
G_AddPlayer(extra.playernum, extra.playernum);
}
players[p].bot = extra.joindata.bot;
if (players[p].bot)
player->bot = extra.joindata.bot;
if (player->bot)
{
players[p].botvars.difficulty = extra.joindata.difficulty;
players[p].botvars.diffincrease = extra.joindata.diffincrease; // needed to avoid having to duplicate logic
players[p].botvars.rival = extra.joindata.rival;
player->botvars.difficulty = extra.joindata.difficulty;
player->botvars.diffincrease = extra.joindata.diffincrease; // needed to avoid having to duplicate logic
player->botvars.rival = extra.joindata.rival;
}
}
if (extra.flags & DXD_PLAYSTATE)
{
switch (extra.playstate) {
case DXD_PST_PLAYING:
if (players[p].spectator == true)
if (player->spectator == true)
{
if (players[p].bot)
if (player->bot)
{
players[p].spectator = false;
player->spectator = false;
}
else
{
players[p].pflags |= PF_WANTSTOJOIN;
player->pflags |= PF_WANTSTOJOIN;
}
}
//CONS_Printf("player %s is despectating on tic %d\n", player_names[p], leveltime);
break;
case DXD_PST_SPECTATING:
if (players[p].spectator)
if (player->spectator)
{
players[p].pflags &= ~PF_WANTSTOJOIN;
player->pflags &= ~PF_WANTSTOJOIN;
}
else
{
if (players[p].mo)
if (player->mo)
{
P_DamageMobj(players[p].mo, NULL, NULL, 1, DMG_SPECTATOR);
P_DamageMobj(player->mo, NULL, NULL, 1, DMG_SPECTATOR);
}
P_SetPlayerSpectator(p);
}
@ -1246,7 +1248,7 @@ void G_ReadDemoExtraData(void)
break;
}
G_ResetViews();
G_ResetViews(false); // dont reset our freecam pls thx!
// maybe these are necessary?
K_CheckBumpers();
@ -1262,31 +1264,31 @@ void G_ReadDemoExtraData(void)
// Skin
SetPlayerSkin(p, extra.skinname);
if (stricmp(skins[players[p].skin].name, extra.skinname) != 0)
if (stricmp(skins[player->skin].name, extra.skinname) != 0)
FindClosestSkinForStats(p, extra.kartspeed, extra.kartweight);
// Voice
const INT32 vce = R_FindIDForVoice(&skins[players[p].skin], extra.voicename);
const INT32 vce = R_FindIDForVoice(&skins[player->skin], extra.voicename);
if (vce == MAXSKINVOICES)
{
// The above function didn't find a voice, so we'll just fall back
// to the skin's voice.
players[p].voice_id = 0;
player->voice_id = 0;
}
else
{
players[p].voice_id = (UINT16)vce;
player->voice_id = (UINT16)vce;
}
if (!P_MobjWasRemoved(players[p].mo))
if (!P_MobjWasRemoved(player->mo))
{
// This player's mobj exists. So, attach the voice to the mobj!
players[p].mo->voice = &skins[players[p].skin].voices[players[p].voice_id];
player->mo->voice = &skins[player->skin].voices[player->voice_id];
}
players[p].kartspeed = extra.kartspeed;
players[p].kartweight = extra.kartweight;
player->kartspeed = extra.kartspeed;
player->kartweight = extra.kartweight;
}
if (extra.flags & DXD_COLOR)
{
@ -1294,9 +1296,9 @@ void G_ReadDemoExtraData(void)
for (i = 0; i < numskincolors; i++)
if (!stricmp(skincolors[i].name, extra.colorname)) // SRB2kart
{
players[p].skincolor = i;
if (players[p].mo)
players[p].mo->color = i;
player->skincolor = i;
if (player->mo)
player->mo->color = i;
break;
}
}
@ -1309,16 +1311,16 @@ void G_ReadDemoExtraData(void)
for (i = 0; i < numskincolors +2; i++) // +2 because of Match and Opposite
if (!stricmp(Followercolor_cons_t[i].strvalue, extra.followercolor))
{
players[p].followercolor = i;
player->followercolor = i;
break;
}
}
if (extra.flags & DXD_RESPAWN)
{
if (players[p].mo)
if (player->mo)
{
// Is this how this should work..?
P_DamageMobj(players[p].mo, NULL, NULL, 1, DMG_INSTAKILL);
P_DamageMobj(player->mo, NULL, NULL, 1, DMG_INSTAKILL);
}
}
if (extra.flags & DXD_WEAPONPREF)
@ -2437,7 +2439,7 @@ void G_ConfirmRewind(tic_t rewindtime)
displayplayers[2] = olddp3;
displayplayers[3] = olddp4;
R_ExecuteSetViewSize();
G_ResetViews();
G_ResetViews(true);
for (i = splitscreen; i >= 0; i--)
P_ResetCamera(&players[displayplayers[i]], &camera[i]);
@ -3803,36 +3805,38 @@ void G_DoPlayDemo(char *defdemoname)
{
demoplayer_t *plr = &header.playerdata[pnum];
UINT8 p = plr->playernum;
player_t *player = &players[p];
if (!playeringame[displayplayers[0]] || players[displayplayers[0]].spectator)
displayplayers[0] = consoleplayer = serverplayer = p;
G_AddPlayer(p, p);
players[p].spectator = !!(plr->flags & DEMO_SPECTATOR);
player->spectator = !!(plr->flags & DEMO_SPECTATOR);
if (plr->flags & DEMO_KICKSTART)
players[p].pflags |= PF_KICKSTARTACCEL;
player->pflags |= PF_KICKSTARTACCEL;
else
players[p].pflags &= ~PF_KICKSTARTACCEL;
player->pflags &= ~PF_KICKSTARTACCEL;
if (plr->flags & DEMO_SHRINKME)
players[p].pflags |= PF_SHRINKME;
player->pflags |= PF_SHRINKME;
else
players[p].pflags &= ~PF_SHRINKME;
player->pflags &= ~PF_SHRINKME;
K_UpdateShrinkCheat(&players[p]);
K_UpdateShrinkCheat(player);
if ((players[p].bot = !!(plr->flags & DEMO_BOT)) == true)
if ((player->bot = !!(plr->flags & DEMO_BOT)) == true)
{
players[p].botvars.difficulty = plr->bot.difficulty;
players[p].botvars.diffincrease = plr->bot.diffincrease; // needed to avoid having to duplicate logic
players[p].botvars.rival = plr->bot.rival;
player->botvars.difficulty = plr->bot.difficulty;
player->botvars.diffincrease = plr->bot.diffincrease; // needed to avoid having to duplicate logic
player->botvars.rival = plr->bot.rival;
}
// Name
strcpy(player_names[p], plr->name);
/*if (players[p].spectator)
/*if (player->spectator)
{
CONS_Printf("player %s is spectator at start\n", player_names[p]);
}*/
@ -3844,7 +3848,7 @@ void G_DoPlayDemo(char *defdemoname)
for (i = 0; i < numskincolors; i++)
if (!stricmp(skincolors[i].name, plr->color)) // SRB2kart
{
players[p].skincolor = i;
player->skincolor = i;
break;
}
@ -3852,17 +3856,17 @@ void G_DoPlayDemo(char *defdemoname)
// We'll only assign IDs, since the actual voice assignment happens during
// player spawn.
const INT32 vce = R_FindIDForVoice(&skins[players[p].skin], plr->voice);
const INT32 vce = R_FindIDForVoice(&skins[player->skin], plr->voice);
if (vce == MAXSKINVOICES)
{
// The above function didn't find a voice, so we'll just fall back to
// the skin's voice.
players[p].voice_id = 0;
player->voice_id = 0;
}
else
{
players[p].voice_id = (UINT16)vce;
player->voice_id = (UINT16)vce;
}
// Follower
@ -3872,23 +3876,23 @@ void G_DoPlayDemo(char *defdemoname)
for (i = 0; i < numskincolors +2; i++) // +2 because of Match and Opposite
if (!stricmp(Followercolor_cons_t[i].strvalue, plr->followercolor))
{
players[p].followercolor = i;
player->followercolor = i;
break;
}
// Score, since Kart uses this to determine where you start on the map
players[p].score = plr->score;
player->score = plr->score;
// Power Levels
clientpowerlevels[p][gametype == GT_BATTLE ? PWRLV_BATTLE : PWRLV_RACE] = plr->powerlevel;
// Kart stats (set later)
if (stricmp(skins[players[p].skin].name, plr->skin) != 0)
if (stricmp(skins[player->skin].name, plr->skin) != 0)
FindClosestSkinForStats(p, plr->kartspeed, plr->kartweight);
// Followitem
players[p].followitem = plr->followitem;
player->followitem = plr->followitem;
}
// end of player read (the 0xFF marker)

View file

@ -2316,11 +2316,16 @@ void G_FixCamera(UINT8 view)
// Increment a viewpoint by offset from the current player. A negative value
// decrements.
//
void G_AdjustView(UINT8 viewnum, INT32 offset, boolean onlyactive)
void G_AdjustViewEx(UINT8 viewnum, INT32 offset, boolean onlyactive, boolean resetfreecam)
{
INT32 *displayplayerp, oldview;
displayplayerp = &displayplayers[viewnum-1];
oldview = (*displayplayerp);
// turn off the freecam
if (resetfreecam)
camera[viewnum-1].freecam = false;
G_ResetView(viewnum, ( (*displayplayerp) + offset ), onlyactive);
// If no other view could be found, go back to what we had.
@ -2333,7 +2338,7 @@ void G_AdjustView(UINT8 viewnum, INT32 offset, boolean onlyactive)
// Ensures all viewpoints are valid
// Also demotes splitscreen down to one player.
//
void G_ResetViews(void)
void G_ResetViews(boolean resetfreecam)
{
UINT8 splits;
UINT8 viewd;
@ -2357,7 +2362,7 @@ void G_ResetViews(void)
*/
for (viewd = 1; viewd <= splits; ++viewd)
{
G_AdjustView(viewd, 0, false);
G_AdjustViewEx(viewd, 0, false, resetfreecam);
}
}

View file

@ -226,9 +226,10 @@ INT32 G_FindView(INT32 startview, UINT8 viewnum, boolean onlyactive, boolean rev
INT32 G_CountPlayersPotentiallyViewable(boolean active);
void G_FixCamera(UINT8 view);
void G_ResetViews(void);
void G_ResetViews(boolean resetfreecam);
void G_ResetView(UINT8 viewnum, INT32 playernum, boolean onlyactive);
void G_AdjustView(UINT8 viewnum, INT32 offset, boolean onlyactive);
void G_AdjustViewEx(UINT8 viewnum, INT32 offset, boolean onlyactive, boolean resetfreecam);
#define G_AdjustView(v,o,oa) G_AdjustViewEx(v,o,oa, true)
void G_AddPlayer(INT32 playernum, INT32 console);

View file

@ -8970,6 +8970,9 @@ boolean K_AltShrinkArrowBulletCondition(player_t *player)
if (!player)
return false; // NULL player means there's no way we can BE an arrow bullet.
if (!K_IsAltShrunk(player)) // Not Alt. Shrunk!
return false;
// Only if you're at or above the threshold percentage!
return (K_GetSpeedPercentage(player) >= cv_kartaltshrink_arrowbulletthres.value);
}

View file

@ -28,13 +28,12 @@ If states are ever added or removed
Make sure this matches the actual number of states
*/
#define KART_NUMINVSPARKLESANIM 12
#define BASEINVINTIME (10 * TICRATE)
#define MININVINTIME (7 * TICRATE)
#define GROW_SCALE ((3*FRACUNIT)/2)
#define SHRINK_SCALE ((6*FRACUNIT)/8)
#define BASEINVINTIME (10 * TICRATE)
#define MININVINTIME (7 * TICRATE)
#define AUTORESPAWN_TIME (TICRATE/2)
#define AUTORESPAWN_THRESHOLD (TICRATE/4)

View file

@ -4520,6 +4520,17 @@ static int lib_kMomentum3D(lua_State *L)
return 1;
}
static int lib_kMissileOrKartItem(lua_State *L)
{
mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ));
if (!mo)
return LUA_ErrInvalid(L, "mobj_t");
lua_pushboolean(L, K_IsMissileOrKartItem(mo));
return 1;
}
static int lib_kAddNewScoreboardMod(lua_State *L)
{
const char *modname = luaL_checkstring(L, 1);
@ -5536,6 +5547,9 @@ static luaL_Reg lib[] = {
{"K_PlayerCanPunt", lib_kPlayerCanPunt},
{"K_Momentum3D", lib_kMomentum3D},
// kart stuff that's in other places for some reason
{"K_IsMissileOrKartItem", lib_kMissileOrKartItem},
// k_hud
{"K_AddNewScoreboardMod", lib_kAddNewScoreboardMod},
{"K_SetScoreboardModStatus", lib_kSetScoreboardModStatus},

View file

@ -152,7 +152,8 @@ enum cameraf {
camera_momz,
camera_pan,
camera_pitch,
camera_pnum
camera_pnum,
camera_freecam,
};
@ -174,6 +175,7 @@ static const char *const camera_opt[] = {
"pan",
"pitch",
"pnum",
"freecam",
NULL};
enum hudpatch {
@ -332,10 +334,43 @@ static int camera_get(lua_State *L)
case camera_pnum:
lua_pushinteger(L, camnum);
break;
case camera_freecam:
lua_pushboolean(L, cam->freecam);
break;
}
return 1;
}
static int lib_getCamera(lua_State *L)
{
// No cameras on dedicated
if (dedicated)
return 0;
if (lua_type(L, 2) == LUA_TNUMBER)
{
int i = lua_tonumber(L, 2);
if (i < 0 || i > splitscreen)
return 0;
LUA_PushUserdata(L, &camera[i], META_CAMERA);
return 1;
}
return 0;
}
static int lib_lenCamera(lua_State *L)
{
if (dedicated)
lua_pushinteger(L, 0);
else
lua_pushinteger(L, splitscreen+1); // splitscreen == 0 -> 1 active camera, splitscreen == 1 -> 2 cameras and so on
return 1;
}
//
// lib_draw
//
@ -1671,6 +1706,16 @@ int LUA_HudLib(lua_State *L)
lua_setfield(L, -2, "__index");
lua_pop(L,1);
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getCamera);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_lenCamera);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "cameras");
luaL_register(L, "hud", lib_hud);
return 0;
}

View file

@ -1112,6 +1112,7 @@ static void P_PlayerFlip(mobj_t *mo)
fixed_t P_GetMobjGravity(mobj_t *mo)
{
fixed_t gravityadd = 0;
fixed_t gravitymul = FRACUNIT;
sector_t *gravsector = NULL; // Custom gravity
boolean goopgravity = false;
boolean wasflip;
@ -1119,6 +1120,8 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
I_Assert(mo != NULL);
I_Assert(!P_MobjWasRemoved(mo));
gravitymul = mo->scale;
wasflip = (mo->eflags & MFE_VERTICALFLIP) != 0;
mo->eflags &= ~MFE_VERTICALFLIP;
@ -1179,6 +1182,11 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
{
gravityadd = 0;
}
if (K_IsAltShrunk(mo->player))
{
gravitymul = mapobjectscale;
}
}
else
{
@ -1263,7 +1271,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
if (goopgravity)
gravityadd = -gravityadd/5;
gravityadd = FixedMul(gravityadd, mo->scale);
gravityadd = FixedMul(gravityadd, gravitymul);
return gravityadd;
}

View file

@ -1216,7 +1216,8 @@ static void R_SetupAimingFrame(int s)
player_t *player = &players[displayplayers[s]];
camera_t *thiscam = &camera[s];
if (player->awayviewtics)
if (player->awayviewtics && player->awayviewmobj
&& thiscam && !thiscam->freecam) // dont force this if we wanna freecam!
{
newview->aim = player->awayviewaiming;
newview->angle = player->awayviewmobj->angle;
@ -1265,10 +1266,10 @@ void R_SetupFrame(int s, boolean skybox)
R_SetupAimingFrame(s);
if (player->awayviewtics)
if (player->awayviewtics && player->awayviewmobj // cut-away view stuff
&& thiscam && !thiscam->freecam) // dont force this when we wanna freecam!
{
// cut-away view stuff
r_viewmobj = player->awayviewmobj; // should be a MT_ALTVIEWMAN
r_viewmobj = player->awayviewmobj; // should be a MT_ALTVIEWMAN whos altview man?
I_Assert(r_viewmobj != NULL);
newview->x = r_viewmobj->x;
@ -1476,7 +1477,7 @@ static void R_PortalFrame(portal_t *portal)
}
}
static void Mask_Pre (maskcount_t* m)
static void Mask_Pre(maskcount_t* m)
{
m->drawsegs[0] = ds_p - drawsegs;
m->vissprites[0] = visspritecount;
@ -1486,7 +1487,7 @@ static void Mask_Pre (maskcount_t* m)
m->viewsector = viewsector;
}
static void Mask_Post (maskcount_t* m)
static void Mask_Post(maskcount_t* m)
{
m->drawsegs[1] = ds_p - drawsegs;
m->vissprites[1] = visspritecount;

View file

@ -2125,7 +2125,7 @@ FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...)
W_Shutdown();
#if defined (PARANOIA) || defined (DEVELOP)
*(INT32 *)0 = 4; //Alam: Debug!
*(volatile INT32 *)0 = 4; //Alam: Debug!
#endif
exit(-1);