diff --git a/src/acs/call-funcs.cpp b/src/acs/call-funcs.cpp index 759869eec..b84b3126b 100644 --- a/src/acs/call-funcs.cpp +++ b/src/acs/call-funcs.cpp @@ -2866,16 +2866,16 @@ bool CallFunc_EncoreMode(ACSVM::Thread *thread, const ACSVM::Word *argV, ACSVM:: } /*-------------------------------------------------- - bool CallFunc_BreakTheCapsules(ACSVM::Thread *thread, const ACSVM::Word *argV, ACSVM::Word argC) + bool CallFunc_ItemBreaker(ACSVM::Thread *thread, const ACSVM::Word *argV, ACSVM::Word argC) - Returns if the map is in Break the Capsules. + Returns if the map is in Item Breaker. --------------------------------------------------*/ -bool CallFunc_BreakTheCapsules(ACSVM::Thread *thread, const ACSVM::Word *argV, ACSVM::Word argC) +bool CallFunc_ItemBreaker(ACSVM::Thread *thread, const ACSVM::Word *argV, ACSVM::Word argC) { (void)argV; (void)argC; - thread->dataStk.push(battlecapsules); + thread->dataStk.push(itembreaker); return false; } diff --git a/src/acs/call-funcs.hpp b/src/acs/call-funcs.hpp index 107a814b9..735c39343 100644 --- a/src/acs/call-funcs.hpp +++ b/src/acs/call-funcs.hpp @@ -117,7 +117,7 @@ bool CallFunc_PlayerEmeralds(ACSVM::Thread *thread, const ACSVM::Word *argV, ACS bool CallFunc_PlayerLap(ACSVM::Thread *thread, const ACSVM::Word *argV, ACSVM::Word argC); bool CallFunc_LowestLap(ACSVM::Thread *thread, const ACSVM::Word *argV, ACSVM::Word argC); bool CallFunc_EncoreMode(ACSVM::Thread *thread, const ACSVM::Word *argV, ACSVM::Word argC); -bool CallFunc_BreakTheCapsules(ACSVM::Thread *thread, const ACSVM::Word *argV, ACSVM::Word argC); +bool CallFunc_ItemBreaker(ACSVM::Thread *thread, const ACSVM::Word *argV, ACSVM::Word argC); bool CallFunc_TimeAttack(ACSVM::Thread *thread, const ACSVM::Word *argV, ACSVM::Word argC); bool CallFunc_FreePlay(ACSVM::Thread *thread, const ACSVM::Word *argV, ACSVM::Word argC); bool CallFunc_GrandPrix(ACSVM::Thread *thread, const ACSVM::Word *argV, ACSVM::Word argC); diff --git a/src/acs/environment.cpp b/src/acs/environment.cpp index 7a5da83fc..5c8abb046 100644 --- a/src/acs/environment.cpp +++ b/src/acs/environment.cpp @@ -198,7 +198,7 @@ Environment::Environment() addFuncDataACS0( 307, addCallFunc(CallFunc_PlayerLap)); addFuncDataACS0( 308, addCallFunc(CallFunc_LowestLap)); addFuncDataACS0( 309, addCallFunc(CallFunc_EncoreMode)); - addFuncDataACS0( 310, addCallFunc(CallFunc_BreakTheCapsules)); + addFuncDataACS0( 310, addCallFunc(CallFunc_ItemBreaker)); addFuncDataACS0( 311, addCallFunc(CallFunc_TimeAttack)); addFuncDataACS0( 312, addCallFunc(CallFunc_ThingCount)); addFuncDataACS0( 313, addCallFunc(CallFunc_GrandPrix)); diff --git a/src/command.c b/src/command.c index bd5a41bb4..580a71e39 100644 --- a/src/command.c +++ b/src/command.c @@ -2090,7 +2090,7 @@ void CV_AddValue(consvar_t *var, INT32 increment) return; } } - else if (var == &cv_kartspeed) + if ((var == &cv_kartspeed || var == &cv_kartbattlespeed) && !M_SecretUnlocked(SECRET_HARDSPEED)) { max = (M_SecretUnlocked(SECRET_HARDSPEED) ? 4 : 3); } diff --git a/src/d_clisrv.c b/src/d_clisrv.c index f2ebe04bf..67a719702 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -3926,7 +3926,7 @@ void SV_StartSinglePlayerServer(void) netgame = false; multiplayer = false; - if ((modeattacking == ATTACKING_CAPSULES) || (bossinfo.boss == true)) + if ((modeattacking == ATTACKING_ITEMBREAK) || (bossinfo.boss == true)) { G_SetGametype(GT_BATTLE); } diff --git a/src/d_netcmd.c b/src/d_netcmd.c index e464bba6a..45c22139d 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -147,6 +147,7 @@ static void SoundTest_OnChange(void); static void KartFrantic_OnChange(void); static void KartSpeed_OnChange(void); +static void KartBattleSpeed_OnChange(void); static void KartEncore_OnChange(void); static void KartComeback_OnChange(void); static void KartEliminateLast_OnChange(void); @@ -397,6 +398,7 @@ consvar_t cv_kartcheck = CVAR_INIT ("kartcheck", "Yes", CV_SAVE, CV_YesNo, NULL) static CV_PossibleValue_t kartinvinsfx_cons_t[] = {{0, "Music"}, {1, "SFX"}, {0, NULL}}; consvar_t cv_kartinvinsfx = CVAR_INIT ("kartinvinsfx", "SFX", CV_SAVE, kartinvinsfx_cons_t, NULL); consvar_t cv_kartspeed = CVAR_INIT ("kartspeed", "Auto", CV_NETVAR|CV_CALL|CV_NOINIT, kartspeed_cons_t, KartSpeed_OnChange); +consvar_t cv_kartbattlespeed = CVAR_INIT ("kartbattlespeed", "Auto", CV_NETVAR|CV_CALL|CV_NOINIT, kartspeed_cons_t, KartBattleSpeed_OnChange); static CV_PossibleValue_t kartbumpers_cons_t[] = {{1, "MIN"}, {12, "MAX"}, {0, NULL}}; consvar_t cv_kartbumpers = CVAR_INIT ("kartbumpers", "3", CV_NETVAR|CV_CHEAT, kartbumpers_cons_t, NULL); consvar_t cv_kartfrantic = CVAR_INIT ("kartfrantic", "Off", CV_NETVAR|CV_CHEAT|CV_CALL|CV_NOINIT, CV_OnOff, KartFrantic_OnChange); @@ -6428,12 +6430,37 @@ static void KartSpeed_OnChange(void) if (leveltime < starttime && cv_kartspeed.value != KARTSPEED_AUTO) { - CONS_Printf(M_GetText("Game speed has been changed to \"%s\".\n"), cv_kartspeed.string); + CONS_Printf(M_GetText("Race speed has been changed to \"%s\".\n"), cv_kartspeed.string); gamespeed = (UINT8)cv_kartspeed.value; } else { - CONS_Printf(M_GetText("Game speed will be changed to \"%s\" next round.\n"), cv_kartspeed.string); + CONS_Printf(M_GetText("Race speed will be changed to \"%s\" next round.\n"), cv_kartspeed.string); + } +} + +static void KartBattleSpeed_OnChange(void) +{ + if (!M_SecretUnlocked(SECRET_HARDSPEED) && cv_kartbattlespeed.value == KARTSPEED_HARD) + { + CONS_Printf(M_GetText("You haven't earned this yet.\n")); + CV_StealthSet(&cv_kartspeed, cv_kartspeed.defaultvalue); + return; + } + + if (K_CanChangeRules() == false) + { + return; + } + + if (leveltime < starttime && cv_kartbattlespeed.value != KARTSPEED_AUTO) + { + CONS_Printf(M_GetText("Battle speed has been changed to \"%s\".\n"), cv_kartbattlespeed.string); + gamespeed = (UINT8)cv_kartbattlespeed.value; + } + else + { + CONS_Printf(M_GetText("Battle speed will be changed to \"%s\" next round.\n"), cv_kartbattlespeed.string); } } diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 62763e720..4d0bb713f 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -76,7 +76,7 @@ extern consvar_t cv_tripleorbinaut, cv_quadorbinaut, cv_dualjawz; extern consvar_t cv_kartminimap; extern consvar_t cv_kartcheck; extern consvar_t cv_kartinvinsfx; -extern consvar_t cv_kartspeed; +extern consvar_t cv_kartspeed, cv_kartbattlespeed; extern consvar_t cv_kartbumpers; extern consvar_t cv_kartfrantic; extern consvar_t cv_kartcomeback; diff --git a/src/deh_soc.c b/src/deh_soc.c index 0e7ca8857..98ca70a72 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -2750,8 +2750,8 @@ void readunlockable(MYFILE *f, INT32 num) unlockables[num].type = SECRET_LEVELSELECT; else if (fastcmp(word2, "TIMEATTACK")) unlockables[num].type = SECRET_TIMEATTACK; - else if (fastcmp(word2, "BREAKTHECAPSULES")) - unlockables[num].type = SECRET_BREAKTHECAPSULES; + else if (fastcmp(word2, "ITEMBREAKER")) + unlockables[num].type = SECRET_ITEMBREAKER; else if (fastcmp(word2, "SOUNDTEST")) unlockables[num].type = SECRET_SOUNDTEST; else if (fastcmp(word2, "CREDITS")) diff --git a/src/deh_tables.c b/src/deh_tables.c index b2d3f13dc..e4625110b 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -2789,13 +2789,6 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi // Invis-spring - this is used just for the sproing sound. "S_INVISSPRING", - // Orange Spring (Pogo) - "S_POGOSPRING1", - "S_POGOSPRING2", - "S_POGOSPRING2B", - "S_POGOSPRING3", - "S_POGOSPRING4", - // Yellow Diagonal Spring "S_YDIAG1", "S_YDIAG2", @@ -4588,13 +4581,6 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_OVERTIME_LASER", "S_OVERTIME_CENTER", - "S_BATTLECAPSULE_SIDE1", - "S_BATTLECAPSULE_SIDE2", - "S_BATTLECAPSULE_TOP", - "S_BATTLECAPSULE_BUTTON", - "S_BATTLECAPSULE_SUPPORT", - "S_BATTLECAPSULE_SUPPORTFLY", - "S_WAYPOINTORB", "S_WAYPOINTSPLAT", "S_EGOORB", @@ -4780,7 +4766,6 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_BLUESPRING", "MT_GREYSPRING", "MT_INVISSPRING", - "MT_POGOSPRING", "MT_YELLOWDIAG", // Yellow Diagonal Spring "MT_REDDIAG", // Red Diagonal Spring "MT_BLUEDIAG", // Blue Diagonal Spring @@ -5677,9 +5662,6 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_OVERTIME_PARTICLE", "MT_OVERTIME_CENTER", - "MT_BATTLECAPSULE", - "MT_BATTLECAPSULE_PIECE", - "MT_FOLLOWER", "MT_FOLLOWERBUBBLE_FRONT", "MT_FOLLOWERBUBBLE_BACK", diff --git a/src/discord.c b/src/discord.c index 0aed0f4f7..c26cc6fca 100644 --- a/src/discord.c +++ b/src/discord.c @@ -498,7 +498,7 @@ void DRPC_UpdatePresence(void) { snprintf(detailstr, 48, "%s%s%s", gametype_cons_t[gametype].strvalue, - (gametype == GT_RACE) ? va(" | %s", kartspeed_cons_t[gamespeed].strvalue) : "", + va(" | %s", kartspeed_cons_t[gamespeed].strvalue), (encoremode == true) ? " | Encore" : "" ); discordPresence.details = detailstr; diff --git a/src/doomstat.h b/src/doomstat.h index 9b0656584..808a724f4 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -117,7 +117,7 @@ extern boolean metalrecording; #define ATTACKING_NONE 0 #define ATTACKING_TIME 1 -#define ATTACKING_CAPSULES 2 +#define ATTACKING_ITEMBREAK 2 extern UINT8 modeattacking; // menu demo things @@ -496,10 +496,10 @@ enum GameTypeRules GTR_BUMPERS = 1<<3, // Enables the bumper health system GTR_SPHERES = 1<<4, // Replaces rings with blue spheres GTR_PAPERITEMS = 1<<5, // Replaces item boxes with paper item spawners - GTR_WANTED = 1<<6, // unused + GTR_WANTED = 1<<6, // Enables the wanted anti-camping system GTR_KARMA = 1<<7, // Enables the Karma system if you're out of bumpers GTR_ITEMARROWS = 1<<8, // Show item box arrows above players - GTR_CAPSULES = 1<<9, // Enables the wanted anti-camping system + GTR_ITEMBREAKER = 1<<9, // Enables the use of Item Breaker in this Gamemode GTR_BATTLESTARTS = 1<<10, // Use Battle Mode start positions. GTR_POINTLIMIT = 1<<11, // Reaching point limit ends the round diff --git a/src/g_demo.c b/src/g_demo.c index 33ea2a84d..6482d1e46 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -110,7 +110,7 @@ demoghost *ghosts = NULL; #define DF_GHOST 0x01 // This demo contains ghost data too! #define DF_TIMEATTACK 0x02 // This demo is from Time Attack and contains its final completion time & best lap! -#define DF_BREAKTHECAPSULES 0x04 // This demo is from Break the Capsules and contains its final completion time! +#define DF_ITEMBREAKER 0x04 // This demo is from Item Breaker and contains its final completion time! #define DF_ATTACKMASK 0x06 // This demo is from ??? attack and contains ??? // 0x08 free @@ -2031,7 +2031,7 @@ void G_BeginRecording(void) WRITEUINT32(demobuf.p,UINT32_MAX); // time WRITEUINT32(demobuf.p,UINT32_MAX); // lap break; - case ATTACKING_CAPSULES: // 2 + case ATTACKING_ITEMBREAK: // 2 demotime_p = demobuf.p; WRITEUINT32(demobuf.p,UINT32_MAX); // time break; @@ -2231,7 +2231,7 @@ void G_SetDemoTime(UINT32 ptime, UINT32 plap) WRITEUINT32(demotime_p, plap); demotime_p = NULL; } - else if (demoflags & DF_BREAKTHECAPSULES) + else if (demoflags & DF_ITEMBREAKER) { WRITEUINT32(demotime_p, ptime); (void)plap; @@ -2440,7 +2440,7 @@ UINT8 G_CmpDemoTime(char *oldname, char *newname) p++; // numlaps G_SkipDemoExtraFiles(&p); - aflags = flags & (DF_TIMEATTACK|DF_BREAKTHECAPSULES); + aflags = flags & (DF_TIMEATTACK|DF_ITEMBREAKER); I_Assert(aflags); if (flags & DF_TIMEATTACK) @@ -2912,7 +2912,7 @@ void G_DoPlayDemo(char *defdemoname) hu_demotime = READUINT32(demobuf.p); hu_demolap = READUINT32(demobuf.p); break; - case ATTACKING_CAPSULES: // 2 + case ATTACKING_ITEMBREAK: // 2 hu_demotime = READUINT32(demobuf.p); break; default: // 3 @@ -3273,7 +3273,7 @@ void G_AddGhost(char *defdemoname) case ATTACKING_TIME: // 1 p += 8; // demo time, lap break; - case ATTACKING_CAPSULES: // 2 + case ATTACKING_ITEMBREAK: // 2 p += 4; // demo time break; default: // 3 @@ -3491,7 +3491,7 @@ void G_UpdateStaffGhostName(lumpnum_t l) case ATTACKING_TIME: // 1 p += 8; // demo time, lap break; - case ATTACKING_CAPSULES: // 2 + case ATTACKING_ITEMBREAK: // 2 p += 4; // demo time break; default: // 3 diff --git a/src/g_game.c b/src/g_game.c index bd15f454f..9d0131d68 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -3069,7 +3069,7 @@ UINT32 gametypedefaultrules[NUMGAMETYPES] = // Race GTR_CIRCUIT|GTR_BOTS, // Battle - GTR_BUMPERS|GTR_KARMA|GTR_ITEMARROWS|GTR_CAPSULES|GTR_BATTLESTARTS|GTR_TIMELIMIT + GTR_BUMPERS|GTR_KARMA|GTR_ITEMARROWS|GTR_ITEMBREAKER|GTR_BATTLESTARTS|GTR_TIMELIMIT }; // diff --git a/src/info.c b/src/info.c index bd2c3f859..f436b1f54 100644 --- a/src/info.c +++ b/src/info.c @@ -385,7 +385,6 @@ char sprnames[NUMSPRITES + 1][5] = "SSWR", // Red Horizontal Spring "SSWB", // Blue Horizontal Spring "SSWG", // Grey Horizontal Spring - "POGS", // Pogo Spring "BSTY", // Yellow Booster "BSTR", // Red Booster @@ -3301,13 +3300,6 @@ state_t states[NUMSTATES] = {SPR_NULL, 0, 1, {A_Pain}, 0, 0, S_INVISIBLE}, // S_INVISSPRING - // Orange Spring (Pogo) - {SPR_POGS, 0, -1, {NULL}, 0, 0, S_NULL}, // S_POGOSPRING1 - {SPR_POGS, 1, 2, {A_Pain}, 0, 0, S_POGOSPRING3}, // S_POGOSPRING2 - {SPR_POGS, 1, 2, {A_PlaySeeSound}, 0, 0, S_POGOSPRING3}, // S_POGOSPRING2B - {SPR_POGS, 0, 1, {NULL}, 0, 0, S_POGOSPRING4}, // S_POGOSPRING3 - {SPR_POGS, 2, 4, {NULL}, 0, 0, S_POGOSPRING1}, // S_POGOSPRING4 - // Yellow Diagonal Spring {SPR_YSPR, 0, -1, {NULL}, 0, 0, S_NULL}, // S_YDIAG1 {SPR_YSPR, 1, 1, {A_Pain}, 0, 0, S_YDIAG3}, // S_YDIAG2 @@ -5156,13 +5148,6 @@ state_t states[NUMSTATES] = {SPR_OTLS, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_NULL}, // S_OVERTIME_LASER {SPR_OTCP, 0, -1, {NULL}, 0, 0, S_NULL}, // S_OVERTIME_CENTER - {SPR_CAPS, FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_NULL}, // S_BATTLECAPSULE_SIDE1 - {SPR_CAPS, FF_PAPERSPRITE|1, -1, {NULL}, 0, 0, S_NULL}, // S_BATTLECAPSULE_SIDE2 - {SPR_CAPS, 2, -1, {NULL}, 0, 0, S_NULL}, // S_BATTLECAPSULE_TOP - {SPR_CAPS, 3, -1, {NULL}, 0, 0, S_NULL}, // S_BATTLECAPSULE_BUTTON - {SPR_CAPS, 4, -1, {NULL}, 0, 0, S_NULL}, // S_BATTLECAPSULE_SUPPORT - {SPR_CAPS, FF_ANIMATE|5, -1, {NULL}, 3, 1, S_NULL}, // S_BATTLECAPSULE_SUPPORTFLY - {SPR_WAYP, 0, 1, {NULL}, 0, 0, S_NULL}, // S_WAYPOINTORB {SPR_WAYP, 1|FF_FLOORSPRITE, 1, {NULL}, 0, 0, S_NULL}, // S_WAYPOINTSPLAT {SPR_EGOO, 0, 1, {NULL}, 0, 0, S_NULL}, // S_EGOORB @@ -8779,33 +8764,6 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_INVISSPRING // raisestate }, - { // MT_POGOSPRING - -1, // doomednum - S_POGOSPRING1, // spawnstate - 1000, // spawnhealth - S_POGOSPRING2B, // seestate - sfx_eggspr, // seesound - 0, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - SKINCOLOR_SUNSET, // painchance - sfx_s3kb1, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 0, // speed - 48*FRACUNIT, // radius - 32*FRACUNIT, // height - 0, // display offset - 32*FRACUNIT, // mass - 0, // damage - sfx_None, // activesound - MF_SOLID|MF_SPRING|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags - S_POGOSPRING2 // raisestate - }, - { // MT_YELLOWDIAG 555, // doomednum S_YDIAG1, // spawnstate @@ -28336,60 +28294,6 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, - { // MT_BATTLECAPSULE - 2333, // doomednum - S_INVISIBLE, // spawnstate - 1, // spawnhealth - S_NULL, // seestate - sfx_None, // seesound - 8, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 0, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_INVISIBLE, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 0, // speed - 28<= 10*TICRATE); tic_t interval = 8*TICRATE; - const boolean canmakeemeralds = true; //(!(battlecapsules || bossinfo.boss)); + const boolean canmakeemeralds = true; //(!(itembreaker || bossinfo.boss)); UINT32 emeraldsSpawned = 0; UINT32 firstUnspawnedEmerald = 0; @@ -343,7 +342,7 @@ void K_RunPaperItemSpawners(void) UINT8 pcount = 0; INT16 i; - if (battlecapsules || bossinfo.boss) + if (itembreaker || bossinfo.boss) { // Gametype uses paper items, but this specific expression doesn't return; @@ -704,48 +703,6 @@ void K_RunBattleOvertime(void) } } -void K_SetupMovingCapsule(mapthing_t *mt, mobj_t *mobj) -{ - UINT8 sequence = mt->args[0] - 1; - fixed_t speed = (FRACUNIT >> 3) * mt->args[1]; - boolean backandforth = (mt->args[2] & TMBCF_BACKANDFORTH); - boolean reverse = (mt->args[2] & TMBCF_REVERSE); - mobj_t *target = NULL; - - // Find the inital target - if (reverse) - { - target = P_GetLastTubeWaypoint(sequence); - } - else - { - target = P_GetFirstTubeWaypoint(sequence); - } - - if (!target) - { - CONS_Alert(CONS_WARNING, "No target waypoint found for moving capsule (seq: #%d)\n", sequence); - return; - } - - P_SetTarget(&mobj->target, target); - mobj->lastlook = sequence; - mobj->movecount = target->health; - mobj->movefactor = speed; - - if (backandforth) { - mobj->flags2 |= MF2_AMBUSH; - } else { - mobj->flags2 &= ~MF2_AMBUSH; - } - - if (reverse) { - mobj->cvmem = -1; - } else { - mobj->cvmem = 1; - } -} - void K_SpawnPlayerBattleBumpers(player_t *p) { if (!p->mo || p->bumper <= 0) @@ -780,10 +737,9 @@ void K_BattleInit(void) { size_t i; - if ((gametyperules & GTR_CAPSULES) && !battlecapsules && !bossinfo.boss) + if ((gametyperules & GTR_ITEMBREAKER) && !itembreaker && !bossinfo.boss) { - mapthing_t *mt; - if (modeattacking != ATTACKING_CAPSULES) + if (modeattacking != ATTACKING_ITEMBREAK) { UINT8 n = 0; @@ -795,19 +751,12 @@ void K_BattleInit(void) } if (n > 1) - goto aftercapsules; + goto afteritembreaker; } - mt = mapthings; - for (i = 0; i < nummapthings; i++, mt++) - { - if (mt->type == mobjinfo[MT_BATTLECAPSULE].doomednum) - P_SpawnMapThing(mt); - } - - battlecapsules = true; + itembreaker = true; } -aftercapsules: +afteritembreaker: if (gametyperules & GTR_BUMPERS) { diff --git a/src/k_battle.h b/src/k_battle.h index aaccec8d4..75760d3d5 100644 --- a/src/k_battle.h +++ b/src/k_battle.h @@ -15,9 +15,9 @@ extern struct battleovertime fixed_t x, y, z; ///< Position to center on } battleovertime; -extern boolean battlecapsules; +extern boolean itembreaker; extern INT32 nummapboxes, numgotboxes; // keep track of spawned battle mode items -extern UINT8 maptargets, numtargets; +extern UINT8 numtargets; INT32 K_StartingBumperCount(void); boolean K_IsPlayerWanted(player_t *player); @@ -31,7 +31,6 @@ void K_DropEmeraldsFromPlayer(player_t *player, UINT32 emeraldType); UINT8 K_NumEmeralds(player_t *player); void K_RunPaperItemSpawners(void); void K_RunBattleOvertime(void); -void K_SetupMovingCapsule(mapthing_t *mt, mobj_t *mobj); void K_SpawnPlayerBattleBumpers(player_t *p); void K_BattleInit(void); diff --git a/src/k_hud.c b/src/k_hud.c index 9c06a316d..95cac530b 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -10,6 +10,7 @@ /// \brief HUD drawing functions exclusive to Kart #include "k_hud.h" +#include "info.h" #include "k_kart.h" #include "k_battle.h" #include "k_grandprix.h" @@ -60,8 +61,6 @@ static patch_t *kp_lapstickernarrow; static patch_t *kp_splitlapflag; static patch_t *kp_bumpersticker; static patch_t *kp_bumperstickerwide; -static patch_t *kp_capsulesticker; -static patch_t *kp_capsulestickerwide; static patch_t *kp_karmasticker; static patch_t *kp_spheresticker; static patch_t *kp_splitspheresticker; @@ -79,7 +78,7 @@ static patch_t *kp_facehighlight[8]; static patch_t *kp_nocontestminimap; static patch_t *kp_spbminimap; -static patch_t *kp_capsuleminimap[2]; +static patch_t *kp_itemboxminimap; static patch_t *kp_ringsticker[2]; static patch_t *kp_ringstickersplit[4]; @@ -192,8 +191,6 @@ void K_LoadKartHUDGraphics(void) HU_UpdatePatch(&kp_splitlapflag, "K_SPTLAP"); HU_UpdatePatch(&kp_bumpersticker, "K_STBALN"); HU_UpdatePatch(&kp_bumperstickerwide, "K_STBALW"); - HU_UpdatePatch(&kp_capsulesticker, "K_STCAPN"); - HU_UpdatePatch(&kp_capsulestickerwide, "K_STCAPW"); HU_UpdatePatch(&kp_karmasticker, "K_STKARM"); HU_UpdatePatch(&kp_spheresticker, "K_STBSMT"); HU_UpdatePatch(&kp_splitspheresticker, "K_SPBSMT"); @@ -270,9 +267,8 @@ void K_LoadKartHUDGraphics(void) // Special minimap icons HU_UpdatePatch(&kp_nocontestminimap, "MINIDEAD"); - HU_UpdatePatch(&kp_spbminimap, "SPBMMAP"); - HU_UpdatePatch(&kp_capsuleminimap[0], "MINICAP1"); - HU_UpdatePatch(&kp_capsuleminimap[1], "MINICAP2"); + HU_UpdatePatch(&kp_spbminimap, "K_SPTKRM"); + HU_UpdatePatch(&kp_itemboxminimap, "K_ITMMM"); // Rings & Lives HU_UpdatePatch(&kp_ringsticker[0], "RNGBACKA"); @@ -1422,7 +1418,7 @@ void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT16 emblemmap, UI splitflags = V_HUDTRANS|V_SNAPTOTOP|V_SNAPTORIGHT|V_SPLITSCREEN; #ifndef TESTOVERTIMEINFREEPLAY - if (battlecapsules) // capsules override any time limit settings + if (itembreaker) // capsules override any time limit settings ; else #endif @@ -2668,11 +2664,11 @@ static void K_drawKartBumpersOrKarma(void) V_DrawScaledPatch(fx-2 + (flipflag ? (SHORT(kp_ringstickersplit[1]->width) - 3) : 0), fy, V_HUDTRANS|splitflags|flipflag, kp_ringstickersplit[0]); V_DrawScaledPatch(fx+22, fy, V_HUDTRANS|splitflags, frameslash); - if (battlecapsules) + if (itembreaker) { V_DrawMappedPatch(fx+1, fy-2, V_HUDTRANS|splitflags, kp_rankcapsule, NULL); - if (numtargets > 9 || maptargets > 9) + if (numtargets > 9 || nummapboxes > 9) { UINT8 ln[2]; ln[0] = ((numtargets / 10) % 10); @@ -2681,8 +2677,8 @@ static void K_drawKartBumpersOrKarma(void) V_DrawScaledPatch(fx+13, fy, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[ln[0]]); V_DrawScaledPatch(fx+17, fy, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[ln[1]]); - ln[0] = ((maptargets / 10) % 10); - ln[1] = (maptargets % 10); + ln[0] = ((nummapboxes / 10) % 10); + ln[1] = (nummapboxes % 10); V_DrawScaledPatch(fx+27, fy, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[ln[0]]); V_DrawScaledPatch(fx+31, fy, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[ln[1]]); @@ -2690,7 +2686,7 @@ static void K_drawKartBumpersOrKarma(void) else { V_DrawScaledPatch(fx+13, fy, V_HUDTRANS|splitflags, kp_facenum[numtargets % 10]); - V_DrawScaledPatch(fx+27, fy, V_HUDTRANS|splitflags, kp_facenum[maptargets % 10]); + V_DrawScaledPatch(fx+27, fy, V_HUDTRANS|splitflags, kp_facenum[nummapboxes % 10]); } } else @@ -2722,13 +2718,14 @@ static void K_drawKartBumpersOrKarma(void) } else { - if (battlecapsules) + if (itembreaker) { - if (numtargets > 9 && maptargets > 9) - V_DrawMappedPatch(LAPS_X, LAPS_Y, V_HUDTRANS|splitflags, kp_capsulestickerwide, NULL); - else - V_DrawMappedPatch(LAPS_X, LAPS_Y, V_HUDTRANS|splitflags, kp_capsulesticker, NULL); - V_DrawKartString(LAPS_X+47, LAPS_Y+3, V_HUDTRANS|splitflags, va("%d/%d", numtargets, maptargets)); + patch_t *item = W_CachePatchName("RNDMA0", PU_PATCH); + UINT8 *itemcolormap = R_GetTranslationColormap(TC_BLINK, SKINCOLOR_BLACK, GTC_CACHE); + V_DrawMappedPatch(LAPS_X, LAPS_Y, V_HUDTRANS|splitflags, kp_timesticker, NULL); + V_DrawStretchyFixedPatch((29 + item->width/2/4)*FRACUNIT, 193*FRACUNIT, FRACUNIT/2, FRACUNIT/2, V_HUDTRANS|splitflags, item, itemcolormap); + V_DrawStretchyFixedPatch((29 + item->width/2/4)*FRACUNIT, 192*FRACUNIT, FRACUNIT/2, FRACUNIT/2, V_HUDTRANS|splitflags, item, NULL); + V_DrawKartString(LAPS_X+47, LAPS_Y+3, V_HUDTRANS|splitflags, va("%d/%d", numtargets, nummapboxes)); } else { @@ -3611,12 +3608,22 @@ static void K_drawKartMinimap(void) #endif if (mobj->color) { - colormap = R_GetTranslationColormap(TC_RAINBOW, mobj->color, GTC_CACHE); + colormap = R_GetTranslationColormap(TC_DEFAULT, mobj->color, GTC_CACHE); + } + else + { + colormap = R_GetTranslationColormap(TC_DEFAULT, SKINCOLOR_RED, GTC_CACHE); } break; - case MT_BATTLECAPSULE: - workingPic = kp_capsuleminimap[(mobj->extravalue1 != 0 ? 1 : 0)]; + case MT_RANDOMITEM: + if (itembreaker && (mobj->flags2 & MF2_BOSSNOTRAP) && !(mobj->flags2 & MF2_BOSSFLEE)) + { + workingPic = kp_itemboxminimap; + colormap = R_GetTranslationColormap(TC_DEFAULT, SKINCOLOR_YELLOW, GTC_CACHE); + } + else + workingPic = NULL; break; default: break; @@ -3850,7 +3857,7 @@ static void K_drawBattleFullscreen(void) if (K_IsPlayerLosing(stplyr)) p = kp_battlelose; - else if (stplyr->position == 1 && (!battlecapsules || numtargets >= maptargets)) + else if (stplyr->position == 1 && (!itembreaker || numtargets >= nummapboxes)) p = kp_battlewin; V_DrawFixedPatch(x<bumper <= 0); // anything short of DNF is COOL if (player->position == 1) @@ -1017,7 +1018,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) } else if (gametype == GT_BATTLE) { - if (mashed && (modeattacking || bossinfo.boss || cv_banana.value)) // ANY mashed value? You get a banana. + if (mashed && (bossinfo.boss || cv_banana.value) && !itembreaker) // ANY mashed value? You get a banana. { K_KartGetItemResult(player, KITEM_BANANA); player->karthud[khud_itemblinkmode] = 1; @@ -1031,6 +1032,25 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) if (P_IsDisplayPlayer(player)) S_StartSound(NULL, sfx_itrolf); } + else if (itembreaker) + { + if (mashed) + { + K_KartGetItemResult(player, KITEM_POGOSPRING); + player->karthud[khud_itemblinkmode] = 1; + if (P_IsDisplayPlayer(player)) + S_StartSound(NULL, sfx_itrolm); + } + else + { + K_KartGetItemResult(player, KITEM_SNEAKER); + player->karthud[khud_itemblinkmode] = 0; + if (P_IsDisplayPlayer(player)) + S_StartSound(NULL, sfx_itrolf); + + } + + } else { if (modeattacking || cv_tripleorbinaut.value) // Waited patiently? You get Orbinaut x3! @@ -8848,7 +8868,6 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { K_PlayBoostTaunt(player->mo); K_DoPogoSpring(player->mo, 32<mo, 0, 0, 0, MT_POGOSPRING); player->pogospring = 1; player->itemamount--; } diff --git a/src/m_cond.c b/src/m_cond.c index 8320607e0..fdad03069 100644 --- a/src/m_cond.c +++ b/src/m_cond.c @@ -173,7 +173,7 @@ unlockable_t unlockables[MAXUNLOCKABLES] = /* 06 */ {"Hell Attack", "", 6, 6, SECRET_HELLATTACK, 0, false, false, 0}, /* 07 */ {"Record Attack", "", -1, -1, SECRET_TIMEATTACK, 0, true, true, 0}, - /* 08 */ {"Capsule Attack", "", -1, -1, SECRET_BREAKTHECAPSULES, 0, true, true, 0}, + /* 08 */ {"Capsule Attack", "", -1, -1, SECRET_ITEMBREAKER, 0, true, true, 0}, }; // Number of emblems and extra emblems diff --git a/src/m_cond.h b/src/m_cond.h index d2b0d370c..c23d8ff72 100644 --- a/src/m_cond.h +++ b/src/m_cond.h @@ -120,7 +120,7 @@ struct unlockable_t #define SECRET_LEVELSELECT 4 // Selectable level select #define SECRET_TIMEATTACK 5 // Enables Time Attack on the main menu -#define SECRET_BREAKTHECAPSULES 6 // Enables Break the Capsules on the main menu +#define SECRET_ITEMBREAKER 6 // Enables Item Breaker on the main menu #define SECRET_SOUNDTEST 7 // Sound Test #define SECRET_CREDITS 8 // Enables Credits diff --git a/src/m_menu.c b/src/m_menu.c index 25832dfdb..ace135d2f 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -160,7 +160,7 @@ typedef enum LLM_CREATESERVER, LLM_LEVELSELECT, LLM_TIMEATTACK, - LLM_BREAKTHECAPSULES, + LLM_ITEMBREAKER, LLM_BOSS } levellist_mode_t; @@ -260,7 +260,7 @@ static void M_GrandPrixTemp(INT32 choice); static void M_StartGrandPrix(INT32 choice); static void M_TimeAttack(INT32 choice); static boolean M_QuitTimeAttackMenu(void); -static void M_BreakTheCapsules(INT32 choice); +static void M_ItemBreaker(INT32 choice); static void M_Statistics(INT32 choice); static void M_HandleStaffReplay(INT32 choice); static void M_ReplayTimeAttack(INT32 choice); @@ -843,14 +843,14 @@ static menuitem_t SP_MainMenu[] = { {IT_STRING|IT_CALL, NULL, "Grand Prix", {.routine = M_GrandPrixTemp}, 92}, {IT_SECRET, NULL, "Time Attack", {.routine = M_TimeAttack}, 100}, - {IT_SECRET, NULL, "Break the Capsules", {.routine = M_BreakTheCapsules}, 108}, + {IT_SECRET, NULL, "Item Breaker", {.routine = M_ItemBreaker}, 108}, }; enum { spgrandprix, sptimeattack, - spbreakthecapsules, + spitembreaker, }; // Single Player Load Game @@ -1478,18 +1478,19 @@ static menuitem_t OP_GameOptionsMenu[] = { {IT_STRING | IT_SUBMENU, NULL, "Random Item Toggles...", {.submenu = &OP_MonitorToggleDef}, 10}, - {IT_STRING | IT_CVAR, NULL, "Game Speed", {.cvar = &cv_kartspeed}, 30}, - {IT_STRING | IT_CVAR, NULL, "Frantic Items", {.cvar = &cv_kartfrantic}, 40}, - {IT_SECRET, NULL, "Encore Mode", {.cvar = &cv_kartencore}, 50}, + {IT_STRING | IT_CVAR, NULL, "Race Game Speed", {.cvar = &cv_kartspeed}, 30}, + {IT_STRING | IT_CVAR, NULL, "Battle Game Speed", {.cvar = &cv_kartbattlespeed}, 40}, + {IT_STRING | IT_CVAR, NULL, "Frantic Items", {.cvar = &cv_kartfrantic}, 50}, + {IT_SECRET, NULL, "Encore Mode", {.cvar = &cv_kartencore}, 60}, - {IT_STRING | IT_CVAR, NULL, "Number of Laps", {.cvar = &cv_numlaps}, 70}, - {IT_STRING | IT_CVAR, NULL, "Exit Countdown Timer", {.cvar = &cv_countdowntime}, 80}, + {IT_STRING | IT_CVAR, NULL, "Number of Laps", {.cvar = &cv_numlaps}, 80}, + {IT_STRING | IT_CVAR, NULL, "Exit Countdown Timer", {.cvar = &cv_countdowntime}, 90}, - {IT_STRING | IT_CVAR, NULL, "Time Limit", {.cvar = &cv_timelimit}, 100}, - {IT_STRING | IT_CVAR, NULL, "Starting Bumpers", {.cvar = &cv_kartbumpers}, 110}, - {IT_STRING | IT_CVAR, NULL, "Karma Comeback", {.cvar = &cv_kartcomeback}, 120}, + {IT_STRING | IT_CVAR, NULL, "Time Limit", {.cvar = &cv_timelimit}, 110}, + {IT_STRING | IT_CVAR, NULL, "Starting Bumpers", {.cvar = &cv_kartbumpers}, 120}, + {IT_STRING | IT_CVAR, NULL, "Karma Comeback", {.cvar = &cv_kartcomeback}, 130}, - {IT_STRING | IT_CVAR, NULL, "Track Power Levels", {.cvar = &cv_kartusepwrlv}, 140}, + {IT_STRING | IT_CVAR, NULL, "Track Power Levels", {.cvar = &cv_kartusepwrlv}, 150}, }; static menuitem_t OP_ServerOptionsMenu[] = @@ -2147,7 +2148,7 @@ void Nextmap_OnChange(void) active |= 3; } - if (levellistmode != LLM_BREAKTHECAPSULES) { + if (levellistmode != LLM_ITEMBREAKER) { if (FIL_FileExists(va("%s-%s-lap-best.lmp", gpath, cv_chooseskin.string))) { SP_ReplayMenu[1].status = IT_WHITESTRING|IT_CALL; SP_GuestReplayMenu[1].status = IT_WHITESTRING|IT_CALL; @@ -4486,12 +4487,12 @@ boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt) return true;*/ case LLM_TIMEATTACK: - case LLM_BREAKTHECAPSULES: + case LLM_ITEMBREAKER: if (mapheaderinfo[mapnum]->menuflags & LF2_NOTIMEATTACK) return false; if ((levellistmode == LLM_TIMEATTACK && !(mapheaderinfo[mapnum]->typeoflevel & TOL_RACE)) - || (levellistmode == LLM_BREAKTHECAPSULES && !(mapheaderinfo[mapnum]->typeoflevel & TOL_BATTLE))) + || (levellistmode == LLM_ITEMBREAKER && !(mapheaderinfo[mapnum]->typeoflevel & TOL_BATTLE))) return false; if (M_MapLocked(mapnum+1)) @@ -6364,7 +6365,7 @@ static void M_Options(INT32 choice) OP_DataOptionsMenu[3].status = (Playing()) ? (IT_GRAYEDOUT) : (IT_STRING|IT_SUBMENU); // Erase data #endif - OP_GameOptionsMenu[3].status = + OP_GameOptionsMenu[4].status = (M_SecretUnlocked(SECRET_ENCORE)) ? (IT_CVAR|IT_STRING) : IT_SECRET; // cv_kartencore OP_MainDef.prevMenu = currentMenu; @@ -6878,8 +6879,8 @@ static void M_SinglePlayerMenu(INT32 choice) SP_MainMenu[spgrandprix].status = IT_CALL|IT_STRING; SP_MainMenu[sptimeattack].status = (M_SecretUnlocked(SECRET_TIMEATTACK)) ? IT_CALL|IT_STRING : IT_SECRET; - SP_MainMenu[spbreakthecapsules].status = - (M_SecretUnlocked(SECRET_BREAKTHECAPSULES)) ? IT_CALL|IT_STRING : IT_SECRET; + SP_MainMenu[spitembreaker].status = + (M_SecretUnlocked(SECRET_ITEMBREAKER)) ? IT_CALL|IT_STRING : IT_SECRET; M_SetupNextMenu(&SP_MainDef); } @@ -7943,7 +7944,7 @@ void M_DrawTimeAttackMenu(void) V_DrawFill((BASEVIDWIDTH - dupadjust)>>1, 78, dupadjust, 36, 239); - if (levellistmode != LLM_BREAKTHECAPSULES) + if (levellistmode != LLM_ITEMBREAKER) { V_DrawRightAlignedString(149, 80, highlightflags, "BEST LAP:"); K_drawKartTimestamp(lap, 19, 86, 0, 2); @@ -8063,17 +8064,17 @@ static void M_TimeAttack(INT32 choice) } // Same as above, but sets a different levellistmode. Should probably be merged... -static void M_BreakTheCapsules(INT32 choice) +static void M_ItemBreaker(INT32 choice) { (void)choice; memset(skins_cons_t, 0, sizeof (skins_cons_t)); - levellistmode = LLM_BREAKTHECAPSULES; // Don't be dependent on cv_newgametype + levellistmode = LLM_ITEMBREAKER; // Don't be dependent on cv_newgametype if (M_CountLevelsToShowInList() == 0) { - M_StartMessage(M_GetText("No levels found for Break the Capsules.\n"),NULL,MM_NOTHING); + M_StartMessage(M_GetText("No levels found for Item Breaker.\n"),NULL,MM_NOTHING); return; } @@ -8111,7 +8112,7 @@ static void M_ChooseTimeAttack(INT32 choice) (void)choice; emeralds = 0; M_ClearMenus(true); - modeattacking = (levellistmode == LLM_BREAKTHECAPSULES ? ATTACKING_CAPSULES : ATTACKING_TIME); + modeattacking = (levellistmode == LLM_ITEMBREAKER ? ATTACKING_ITEMBREAK : ATTACKING_TIME); gpath = va("%s"PATHSEP"media"PATHSEP"replay"PATHSEP"%s", srb2home, timeattackfolder); @@ -8162,7 +8163,7 @@ static void M_HandleStaffReplay(INT32 choice) if (l == LUMPERROR) break; M_ClearMenus(true); - modeattacking = (levellistmode == LLM_BREAKTHECAPSULES ? ATTACKING_CAPSULES : ATTACKING_TIME); + modeattacking = (levellistmode == LLM_ITEMBREAKER ? ATTACKING_ITEMBREAK : ATTACKING_TIME); demo.loadfiles = false; demo.ignorefiles = true; // Just assume that record attack replays have the files needed G_DoPlayDemo(va("%sS%02u",G_BuildMapName(cv_nextmap.value),cv_dummystaff.value)); break; @@ -8183,7 +8184,7 @@ static void M_ReplayTimeAttack(INT32 choice) { const char *which; M_ClearMenus(true); - modeattacking = (levellistmode == LLM_BREAKTHECAPSULES ? ATTACKING_CAPSULES : ATTACKING_TIME); // set modeattacking before G_DoPlayDemo so the map loader knows + modeattacking = (levellistmode == LLM_ITEMBREAKER ? ATTACKING_ITEMBREAK : ATTACKING_TIME); // set modeattacking before G_DoPlayDemo so the map loader knows demo.loadfiles = false; demo.ignorefiles = true; // Just assume that record attack replays have the files needed if (currentMenu == &SP_ReplayDef) diff --git a/src/p_inter.c b/src/p_inter.c index 2ca39b6c6..0f702c91d 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -682,7 +682,7 @@ void P_CheckTimeLimit(void) INT32 i; #ifndef TESTOVERTIMEINFREEPLAY - if (battlecapsules) // capsules override any time limit settings + if (itembreaker) // Item Breaker overrides any time limit settings return; #endif @@ -826,7 +826,7 @@ void P_CheckPointLimit(void) if (!(gametyperules & GTR_POINTLIMIT)) return; - if (battlecapsules) + if (itembreaker) return; // pointlimit is nonzero, check if it's been reached by this player @@ -1119,7 +1119,34 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget { P_SetTarget(&target->target, source); //source->player->numboxes++; - if (cv_itemrespawn.value && (netgame || multiplayer)) + + if (itembreaker) + { + target->flags2 |= MF2_BOSSFLEE; + target->flags2 |= MF2_DONTRESPAWN; + K_SpawnBattlePoints(source->player, NULL, 1); + // All targets busted! + if (++numtargets >= nummapboxes) + { + boolean givelife = false; + for (int i = 0; i < MAXPLAYERS; i++) + { + if (!playeringame[i] || players[i].spectator) + continue; + P_DoPlayerExit(&players[i]); + if (!grandprixinfo.gp) + continue; + P_GivePlayerLives(&players[i], 1); + givelife = true; + } + + if (givelife) + S_StartSound(NULL, sfx_cdfm73); + } + + } + + if (cv_itemrespawn.value && (netgame || multiplayer) && !itembreaker) { target->fuse = cv_itemrespawntime.value*TICRATE + 2; // Random box generation } @@ -1471,95 +1498,6 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget break; } - case MT_BATTLECAPSULE: - { - UINT8 i; - mobj_t *cur; - angle_t dir = 0; - - target->fuse = 16; - target->flags |= MF_NOCLIP|MF_NOCLIPTHING; - - if (inflictor) - { - dir = R_PointToAngle2(inflictor->x, inflictor->y, target->x, target->y); - P_Thrust(target, dir, P_AproxDistance(inflictor->momx, inflictor->momy)/12); - } - else if (source) - dir = R_PointToAngle2(source->x, source->y, target->x, target->y); - - target->momz += 8 * target->scale * P_MobjFlip(target); - target->flags &= ~MF_NOGRAVITY; - - cur = target->hnext; - - while (cur && !P_MobjWasRemoved(cur)) - { - // Shoot every piece outward - if (!(cur->x == target->x && cur->y == target->y)) - { - P_InstaThrust(cur, - R_PointToAngle2(target->x, target->y, cur->x, cur->y), - R_PointToDist2(target->x, target->y, cur->x, cur->y) / 12 - ); - } - - cur->momz = 8 * target->scale * P_MobjFlip(target); - - cur->flags &= ~MF_NOGRAVITY; - cur->tics = TICRATE; - cur->frame &= ~FF_ANIMATE; // Stop animating the propellers - - cur = cur->hnext; - } - - S_StartSound(target, sfx_mbs60); - - if ((gametyperules & GTR_POINTLIMIT) && (source && source->player)) - { - /*mobj_t * ring; - for (i = 0; i < 2; i++) - { - dir += (ANGLE_MAX/3); - ring = P_SpawnMobj(target->x, target->y, target->z, MT_RING); - ring->angle = dir; - P_InstaThrust(ring, dir, 16*ring->scale); - ring->momz = 8 * target->scale * P_MobjFlip(target); - P_SetTarget(&ring->tracer, source); - source->player->pickuprings++; - }*/ - - P_AddPlayerScore(source->player, 1); - K_SpawnBattlePoints(source->player, NULL, 1); - } - - // All targets busted! - if (++numtargets >= maptargets) - { - boolean givelife = false; - for (i = 0; i < MAXPLAYERS; i++) - { - if (!playeringame[i] || players[i].spectator) - continue; - P_DoPlayerExit(&players[i]); - if (!grandprixinfo.gp) - continue; - P_GivePlayerLives(&players[i], 1); - givelife = true; - } - - if (givelife) - S_StartSound(NULL, sfx_cdfm73); - } - else if (timelimitintics) - { - S_StartSound(NULL, sfx_s221); - extratimeintics += 10*TICRATE; - secretextratime = TICRATE/2; - } - } - break; - case MT_BATTLEBUMPER: { mobj_t *owner = target->target; diff --git a/src/p_local.h b/src/p_local.h index a479e8c99..a38228168 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -288,7 +288,6 @@ extern tic_t itemrespawntime[ITEMQUESIZE]; extern size_t iquehead, iquetail; extern consvar_t cv_gravity, cv_movebob; -void P_RespawnBattleBoxes(void); mobjtype_t P_GetMobjtype(UINT16 mthingtype); void P_RespawnSpecials(void); diff --git a/src/p_mobj.c b/src/p_mobj.c index 7ce3e35c8..08012ddf8 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -4974,7 +4974,6 @@ boolean P_IsKartFieldItem(INT32 type) case MT_LANDMINE: case MT_BALLHOG: case MT_BUBBLESHIELDTRAP: - case MT_POGOSPRING: case MT_SINK: case MT_DROPTARGET: return true; @@ -4999,9 +4998,13 @@ boolean P_IsKartItem(INT32 type) // Primarily for minimap data, handle with care case MT_SPB: - case MT_BATTLECAPSULE: return true; + case MT_RANDOMITEM: + if (itembreaker) + return true; + // FALLTHRU + default: return P_IsKartFieldItem(type); } @@ -6289,18 +6292,6 @@ static void P_MobjSceneryThink(mobj_t *mobj) case MT_ITEMCAPSULE_PART: P_ItemCapsulePartThinker(mobj); break; - case MT_BATTLECAPSULE_PIECE: - if (mobj->extravalue2) - mobj->frame |= FF_VERTICALFLIP; - else - mobj->frame &= ~FF_VERTICALFLIP; - - if (mobj->flags2 & MF2_OBJECTFLIP) - mobj->eflags |= MFE_VERTICALFLIP; - - if (mobj->tics > 0) - mobj->renderflags ^= RF_DONTDRAW; - break; case MT_SCRIPT_THING: { if (mobj->spawnpoint->args[2] != 0) @@ -6539,27 +6530,6 @@ static boolean P_MobjDeadThink(mobj_t *mobj) return false; } break; - case MT_BATTLECAPSULE: - if (!(mobj->fuse & 1)) - { - const SINT8 amt = 96; - mobj_t *dust; - UINT8 i; - - for (i = 0; i < 2; i++) - { - fixed_t xoffset = P_RandomRange(-amt, amt) * mobj->scale; - fixed_t yoffset = P_RandomRange(-amt, amt) * mobj->scale; - fixed_t zoffset = P_RandomRange(-(amt >> 1), (amt >> 1)) * mobj->scale; - - dust = P_SpawnMobj(mobj->x + xoffset, mobj->y + yoffset, - mobj->z + (mobj->height >> 1) + zoffset, MT_EXPLODE); - } - - if (dust && !P_MobjWasRemoved(dust)) // Only do for 1 explosion - S_StartSound(dust, sfx_s3k3d); - } - break; default: break; } @@ -8431,206 +8401,6 @@ static boolean P_MobjRegularThink(mobj_t *mobj) trail->color = mobj->color; } break; - case MT_BATTLECAPSULE: - { - SINT8 realflip = P_MobjFlip(mobj); - SINT8 flip = realflip; // Flying capsules needs flipped sprites, but not flipped gravity - fixed_t bottom; - mobj_t *cur; - - if (mobj->extravalue1) - { - const INT32 speed = 6*TICRATE; // longer is slower - fixed_t sine = FINESINE((((M_TAU_FIXED * speed) * leveltime) >> ANGLETOFINESHIFT) & FINEMASK) * flip; - - // Flying capsules are flipped upside-down, like S3K - flip = -flip; - - // ALL CAPSULE MOVEMENT NEEDS TO HAPPEN AFTER THIS & ADD TO MOMENTUM FOR BOBBING TO BE ACCURATE - mobj->momz = sine/2; - } - - // Moving capsules - if (mobj->target && !P_MobjWasRemoved(mobj->target)) - { - fixed_t speed = mobj->movefactor; - UINT8 sequence = mobj->lastlook; - boolean backandforth = (mobj->flags2 & MF2_AMBUSH); - SINT8 direction = mobj->cvmem; - mobj_t *next = NULL; - fixed_t dist, momx, momy, momz; - - dist = P_AproxDistance(mobj->target->x - mobj->x, mobj->target->y - mobj->y); - if (mobj->extravalue1) - dist = P_AproxDistance(dist, mobj->target->z - mobj->z); - if (dist < 1) - dist = 1; - - if (speed <= dist) - { - momx = FixedMul(FixedDiv(mobj->target->x - mobj->x, dist), speed); - momy = FixedMul(FixedDiv(mobj->target->y - mobj->y, dist), speed); - if (mobj->extravalue1) - momz = mobj->momz + FixedMul(FixedDiv(mobj->target->z - mobj->z, dist), speed); - - mobj->momx = momx; - mobj->momy = momy; - if (mobj->extravalue1) - mobj->momz = momz; - } - else - { - speed -= dist; - - P_UnsetThingPosition(mobj); - mobj->x = mobj->target->x; - mobj->y = mobj->target->y; - mobj->z = mobj->target->z; - P_SetThingPosition(mobj); - - mobj->floorz = mobj->subsector->sector->floorheight; - mobj->ceilingz = mobj->subsector->sector->ceilingheight; - - // Onto the next waypoint! - next = (direction < 0) ? P_GetPreviousTubeWaypoint(mobj->target, false) : P_GetNextTubeWaypoint(mobj->target, false); - - // Are we at the end of the waypoint chain? - // If so, search again for the first/previous waypoint (depending on settings) - if (next == NULL) - { - if (backandforth) - { - // Back and forth movement. - mobj->cvmem = -mobj->cvmem; - direction = mobj->cvmem; - - next = (direction < 0) ? P_GetPreviousTubeWaypoint(mobj->target, false) : P_GetNextTubeWaypoint(mobj->target, false); - } - else - { - // Looping circular movement. - next = (direction < 0) ? P_GetLastTubeWaypoint(sequence) : P_GetFirstTubeWaypoint(sequence); - } - } - - if (next && !P_MobjWasRemoved(next)) - { - P_SetTarget(&mobj->target, next); - mobj->movecount = next->health; - - dist = P_AproxDistance(mobj->target->x - mobj->x, mobj->target->y - mobj->y); - if (mobj->extravalue1) - dist = P_AproxDistance(dist, mobj->target->z - mobj->z); - if (dist < 1) - dist = 1; - - momx = FixedMul(FixedDiv(mobj->target->x - mobj->x, dist), speed); - momy = FixedMul(FixedDiv(mobj->target->y - mobj->y, dist), speed); - if (mobj->extravalue1) - momz = mobj->momz + FixedMul(FixedDiv(mobj->target->z - mobj->z, dist), speed); - - mobj->momx = momx; - mobj->momy = momy; - if (mobj->extravalue1) - mobj->momz = momz; - } - else - { - CONS_Alert(CONS_WARNING, "Moving capsule could not find next waypoint! (seq: %d)\n", sequence); - P_SetTarget(&mobj->target, NULL); - } - } - } - - if (flip == -1) - bottom = mobj->z + mobj->height; - else - bottom = mobj->z; - - cur = mobj->hnext; - - // Move each piece to the proper position - while (cur && !P_MobjWasRemoved(cur)) - { - fixed_t newx = mobj->x; - fixed_t newy = mobj->y; - fixed_t newz = bottom; - statenum_t state = (statenum_t)(cur->state-states); - - cur->scale = mobj->scale; - cur->destscale = mobj->destscale; - cur->scalespeed = mobj->scalespeed; - - cur->extravalue2 = mobj->extravalue1; - - cur->flags2 = (cur->flags2 & ~MF2_OBJECTFLIP)|(mobj->flags2 & MF2_OBJECTFLIP); - - if (state == S_BATTLECAPSULE_TOP) - newz += (80 * mobj->scale * flip); - else if (state == S_BATTLECAPSULE_BUTTON) - newz += (108 * mobj->scale * flip); - else if (state == S_BATTLECAPSULE_SUPPORT - || state == S_BATTLECAPSULE_SUPPORTFLY - || state == S_KARMAWHEEL) - { - fixed_t offx = mobj->radius; - fixed_t offy = mobj->radius; - - if (cur->extravalue1 & 1) - offx = -offx; - - if (cur->extravalue1 > 1) - offy = -offy; - - newx += offx; - newy += offy; - } - else if (state == S_BATTLECAPSULE_SIDE1 - || state == S_BATTLECAPSULE_SIDE2) - { - fixed_t offset = 48 * mobj->scale; - angle_t angle = (ANGLE_45 * cur->extravalue1); - - newx += FixedMul(offset, FINECOSINE(angle >> ANGLETOFINESHIFT)); - newy += FixedMul(offset, FINESINE(angle >> ANGLETOFINESHIFT)); - newz += (12 * mobj->scale * flip); - - cur->angle = angle + ANGLE_90; - } - - P_MoveOrigin(cur, newx, newy, newz); - - cur = cur->hnext; - } - } - break; - case MT_RANDOMITEM: - if ((leveltime == starttime) && !(gametyperules & GTR_CIRCUIT) && (mobj->flags2 & MF2_BOSSNOTRAP)) // here on map start? - { - if (gametyperules & GTR_PAPERITEMS) - { - if (battlecapsules == true || bossinfo.boss == true) - { - ; - } - else - { - mobj_t *paperspawner = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_PAPERITEMSPOT); - paperspawner->spawnpoint = mobj->spawnpoint; - mobj->spawnpoint->mobj = paperspawner; - P_RemoveMobj(mobj); - return false; - } - } - // poof into existance - P_UnsetThingPosition(mobj); - mobj->flags &= ~(MF_NOCLIPTHING|MF_NOBLOCKMAP); - mobj->renderflags &= ~RF_DONTDRAW; - P_SetThingPosition(mobj); - P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_EXPLODE); - nummapboxes++; - } - // FALLTHRU case MT_SPHEREBOX: if (gametype == GT_BATTLE && mobj->threshold == 70) { @@ -9412,9 +9182,6 @@ static void P_DefaultMobjShadowScale(mobj_t *thing) case MT_BLUESPHERE: case MT_EMERALD: case MT_ITEMCAPSULE: - case MT_POGOSPRING: - thing->shadowscale = FRACUNIT/2; - break; default: if (thing->flags & (MF_ENEMY|MF_BOSS)) thing->shadowscale = FRACUNIT; @@ -9699,9 +9466,6 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) mobj->color = BALLOONCOLORS[P_RandomKey(sizeof(BALLOONCOLORS))]; } break; - case MT_POGOSPRING: - P_SetScale(mobj, (mobj->destscale = 3 * mobj->destscale / 2)); - break; case MT_KART_LEFTOVER: mobj->color = SKINCOLOR_RED; break; @@ -10629,50 +10393,6 @@ void P_PrecipitationEffects(void) } } -void P_RespawnBattleBoxes(void) -{ - thinker_t *th; - - if (!(gametyperules & GTR_BUMPERS)) - return; - - for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) - { - mobj_t *box; - mobj_t *newmobj; - - if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) - continue; - - box = (mobj_t *)th; - - if (box->type != MT_RANDOMITEM - || (box->flags2 & MF2_DONTRESPAWN) - || box->threshold != 68 - || box->fuse - || ((tic_t)box->cvmem+1 >= leveltime)) - continue; // only popped items - - // Respawn from mapthing if you have one! - if (box->spawnpoint) - { - P_SpawnMapThing(box->spawnpoint); - newmobj = box->spawnpoint->mobj; // this is set to the new mobj in P_SpawnMapThing - } - else - { - newmobj = P_SpawnMobj(box->x, box->y, box->z, box->type); - } - - // Transfer flags2 (strongbox, objectflip, bossnotrap) - newmobj->flags2 = box->flags2; - P_RemoveMobj(box); // make sure they disappear - - if (numgotboxes > 0) - numgotboxes--; // you've restored a box, remove it from the count - } -} - /** Returns corresponding mobj type from mapthing number. * \param mthingtype Mapthing number in question. * \return Mobj type; MT_UNKNOWN if nothing found. @@ -10695,9 +10415,6 @@ void P_RespawnSpecials(void) INT32 time = 30*TICRATE; // Respawn things in empty dedicated servers mapthing_t *mthing = NULL; - if (!(gametyperules & GTR_CIRCUIT) && nummapboxes && (numgotboxes >= (4*nummapboxes/5))) // Battle Mode respawns all boxes in a different way - P_RespawnBattleBoxes(); - // wait time depends on player count for (p = 0; p < MAXPLAYERS; p++) { @@ -12264,22 +11981,11 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean } case MT_RANDOMITEM: { - boolean delayed = !(gametyperules & GTR_CIRCUIT); - if (leveltime < (delayed ? starttime : 3)) + if (leveltime < 3) { mobj->flags2 |= MF2_BOSSNOTRAP; // mark as here on map start - if (delayed) - { - P_UnsetThingPosition(mobj); - mobj->flags |= (MF_NOCLIPTHING|MF_NOBLOCKMAP); - mobj->renderflags |= RF_DONTDRAW; - P_SetThingPosition(mobj); - } - } - else - { - P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_EXPLODE); } + nummapboxes++; break; } case MT_ITEMCAPSULE: @@ -12362,130 +12068,6 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean return false; break; } - case MT_BATTLECAPSULE: - { - sector_t *sec = R_PointInSubsector(mobj->x, mobj->y)->sector; - mobj_t *cur, *prev = mobj; - fixed_t floorheights[MAXFFLOORS+1]; - UINT8 numfloors = 0; - boolean fly = true; - UINT8 i; - - // This floor height stuff is stupid but I couldn't get it to work any other way for whatever reason - if (mthing->options & MTF_OBJECTFLIP) - { - floorheights[numfloors] = P_GetSectorCeilingZAt(sec, mobj->x, mobj->y) - mobj->height; - } - else - { - floorheights[numfloors] = P_GetSectorFloorZAt(sec, mobj->x, mobj->y); - } - - numfloors++; - - if (sec->ffloors) - { - ffloor_t *rover; - for (rover = sec->ffloors; rover; rover = rover->next) - { - if ((rover->fofflags & FOF_EXISTS) && (rover->fofflags & FOF_BLOCKOTHERS)) - { - if (mthing->options & MTF_OBJECTFLIP) - { - floorheights[numfloors] = P_GetFFloorBottomZAt(rover, mobj->x, mobj->y) - mobj->height; - } - else - { - floorheights[numfloors] = P_GetFFloorBottomZAt(rover, mobj->x, mobj->y); - } - - numfloors++; - } - } - } - - for (i = 0; i < numfloors; i++) - { - if (mobj->z == floorheights[i]) - { - fly = false; - break; - } - } - - // Flying capsules - if (fly) - { - mobj->flags |= MF_NOGRAVITY; - mobj->extravalue1 = 1; // Set extravalue1 for later reference - } - - // Moving capsules! - if (mthing->args[0] && mthing->args[1]) - { - K_SetupMovingCapsule(mthing, mobj); - } - - // NOW FOR ALL OF THE PIECES!! - // Init hnext list - // Spherical top - cur = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_BATTLECAPSULE_PIECE); - P_SetMobjState(cur, S_BATTLECAPSULE_TOP); - - P_SetTarget(&cur->target, mobj); - P_SetTarget(&cur->hprev, prev); - P_SetTarget(&prev->hnext, cur); - prev = cur; - - // Tippity-top decorational button - cur = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_BATTLECAPSULE_PIECE); - P_SetMobjState(cur, S_BATTLECAPSULE_BUTTON); - - P_SetTarget(&cur->target, mobj); - P_SetTarget(&cur->hprev, prev); - P_SetTarget(&prev->hnext, cur); - prev = cur; - - // Supports on the bottom - for (i = 0; i < 4; i++) - { - cur = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_BATTLECAPSULE_PIECE); - cur->extravalue1 = i; - - if (mobj->extravalue1) // Flying capsule, moving or not - P_SetMobjState(cur, S_BATTLECAPSULE_SUPPORTFLY); - else if (mobj->target && !P_MobjWasRemoved(mobj->target)) // Grounded, moving capsule - P_SetMobjState(cur, S_KARMAWHEEL); - else - P_SetMobjState(cur, S_BATTLECAPSULE_SUPPORT); // Grounded, stationary capsule - - P_SetTarget(&cur->target, mobj); - P_SetTarget(&cur->hprev, prev); - P_SetTarget(&prev->hnext, cur); - prev = cur; - } - - // Side paneling - for (i = 0; i < 8; i++) - { - cur = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_BATTLECAPSULE_PIECE); - cur->extravalue1 = i; - - if (i & 1) - P_SetMobjState(cur, S_BATTLECAPSULE_SIDE2); - else - P_SetMobjState(cur, S_BATTLECAPSULE_SIDE1); - - P_SetTarget(&cur->target, mobj); - P_SetTarget(&cur->hprev, prev); - P_SetTarget(&prev->hnext, cur); - prev = cur; - } - - // Increment no. of capsules on the map counter - maptargets++; - break; - } case MT_LOOPCENTERPOINT: { Obj_InitLoopCenter(mobj); diff --git a/src/p_saveg.c b/src/p_saveg.c index 63eaa08b4..3c8a77c4d 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -4996,7 +4996,7 @@ static void P_NetArchiveMisc(savebuffer_t *save, boolean resending) // SRB2kart WRITEINT32(save->p, numgotboxes); WRITEUINT8(save->p, numtargets); - WRITEUINT8(save->p, battlecapsules); + WRITEUINT8(save->p, itembreaker); WRITEUINT8(save->p, gamespeed); WRITEUINT8(save->p, numlaps); @@ -5167,7 +5167,7 @@ FUNCINLINE static ATTRINLINE boolean P_NetUnArchiveMisc(savebuffer_t *save, bool // SRB2kart numgotboxes = READINT32(save->p); numtargets = READUINT8(save->p); - battlecapsules = (boolean)READUINT8(save->p); + itembreaker = (boolean)READUINT8(save->p); gamespeed = READUINT8(save->p); numlaps = READUINT8(save->p); diff --git a/src/p_setup.c b/src/p_setup.c index acef2bc71..84983b4a9 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -11,6 +11,7 @@ /// \file p_setup.c /// \brief Do all the WAD I/O, get map description, set up initial state and misc. LUTs +#include "d_netcmd.h" #include "doomdef.h" #include "d_main.h" #include "byteptr.h" @@ -827,10 +828,6 @@ void P_ScanThings(INT16 mapnum, INT16 wadnum, INT16 lumpnum) { nummapboxes++; } - else if (mt->type == mobjinfo[MT_BATTLECAPSULE].doomednum) - { - maptargets++; - } else if (mt->type == mobjinfo[MT_RING].doomednum) { maprings++; @@ -918,9 +915,6 @@ static void P_SpawnMapThings(boolean spawnemblems) continue; // These were already spawned } - if (mt->type == mobjinfo[MT_BATTLECAPSULE].doomednum) - continue; // This will spawn later - if (!spawnemblems && mt->type == mobjinfo[MT_EMBLEM].doomednum) continue; @@ -7407,20 +7401,6 @@ static void P_ConvertBinaryThingTypes(void) mapthings[i].args[0] = mapthings[i].extrainfo; mapthings[i].args[1] = mapthings[i].angle; break; - case 2333: // MT_BATTLECAPSULE - mapthings[i].args[0] = mapthings[i].extrainfo; - mapthings[i].args[1] = mapthings[i].angle; - - if (mapthings[i].options & MTF_OBJECTSPECIAL) - { - mapthings[i].args[2] |= TMBCF_REVERSE; - } - - if (mapthings[i].options & MTF_AMBUSH) - { - mapthings[i].args[2] |= TMBCF_BACKANDFORTH; - } - break; case 3122: // MT_MAYONAKAARROW if (mapthings[i].options & MTF_OBJECTSPECIAL) mapthings[i].args[0] = TMMA_WARN; @@ -7645,8 +7625,8 @@ static void P_InitLevelSettings(boolean reloadinggamestate) nummaprings = 0; nummapboxes = numgotboxes = 0; - maptargets = numtargets = 0; - battlecapsules = false; + numtargets = 0; + itembreaker = false; if (cv_kartrings.value) ringsdisabled = false; @@ -7729,16 +7709,21 @@ static void P_InitLevelSettings(boolean reloadinggamestate) { // Just play it safe and set everything if ((gametyperules & GTR_BUMPERS)) - gamespeed = KARTSPEED_EASY; + gamespeed = KARTSPEED_NORMAL; else gamespeed = KARTSPEED_HARD; franticitems = false; - comeback = true; + comeback = false; } else { if ((gametyperules & GTR_BUMPERS)) - gamespeed = KARTSPEED_EASY; + { + if (cv_kartbattlespeed.value == KARTSPEED_AUTO) + gamespeed = ((speedscramble == -1) ? KARTSPEED_EASY : (UINT8)speedscramble); + else + gamespeed = (UINT8)cv_kartspeed.value; + } else { if (cv_kartspeed.value == KARTSPEED_AUTO) @@ -7900,7 +7885,7 @@ static void P_LoadRecordGhosts(void) } // Best Lap ghost - if (modeattacking != ATTACKING_CAPSULES) + if (modeattacking != ATTACKING_ITEMBREAK) { if (cv_ghost_bestlap.value) { diff --git a/src/p_spec.h b/src/p_spec.h index 932095a2c..d86765a2b 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -65,12 +65,6 @@ typedef enum TMWPF_FINISHLINE = 1<<3, } textmapwaypointflags_t; -typedef enum -{ - TMBCF_BACKANDFORTH = 1, - TMBCF_REVERSE = 1<<1, -} textmapbattlecapsuleflags_t; - typedef enum { TMFF_AIMLESS = 1,