diff --git a/src/d_clisrv.c b/src/d_clisrv.c index d9d686d9c..b3d6b1c6d 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -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(); diff --git a/src/deh_tables.c b/src/deh_tables.c index 82658ee99..74d457e9f 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -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} }; diff --git a/src/g_demo.c b/src/g_demo.c index c0ce6774a..65d347c32 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -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) diff --git a/src/g_game.c b/src/g_game.c index ef8b57d69..98feb0e4c 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -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); } } diff --git a/src/g_game.h b/src/g_game.h index 4cebfe969..6a42a0fee 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -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); diff --git a/src/k_kart.c b/src/k_kart.c index 892c6e137..5f5a94adb 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -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); } diff --git a/src/k_kart.h b/src/k_kart.h index 1892b0342..de666f39a 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -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) diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 565f40f4c..1b3b63307 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -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}, diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c index fa0eee598..1a9202f57 100644 --- a/src/lua_hudlib.c +++ b/src/lua_hudlib.c @@ -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; } diff --git a/src/p_mobj.c b/src/p_mobj.c index c7c226b14..f6a032e3c 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -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; } diff --git a/src/r_main.cpp b/src/r_main.cpp index f857dcb2e..2805e54c3 100644 --- a/src/r_main.cpp +++ b/src/r_main.cpp @@ -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; diff --git a/src/sdl/i_system.cpp b/src/sdl/i_system.cpp index fd33b0f89..342125e28 100644 --- a/src/sdl/i_system.cpp +++ b/src/sdl/i_system.cpp @@ -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);