Remove Battle capsule stuff and turn it into Item Breaker

You have to smash every itembox in a map as fast as you can. When you mash you get a pogospring and waiting gives a sneaker
This commit is contained in:
NepDisk 2024-12-16 17:10:36 -05:00
parent 1e678f660f
commit 4b1324da69
28 changed files with 205 additions and 838 deletions

View file

@ -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;
}

View file

@ -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);

View file

@ -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));

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}
}

View file

@ -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;

View file

@ -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"))

View file

@ -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",

View file

@ -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;

View file

@ -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

View file

@ -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

View file

@ -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
};
//

View file

@ -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<<FRACBITS, // radius
112<<FRACBITS, // height
0, // display offset
100, // mass
0, // damage
sfx_None, // activesound
MF_SOLID|MF_SHOOTABLE|MF_DONTENCOREMAP, // flags
S_NULL // raisestate
},
{ // MT_BATTLECAPSULE_PIECE
-1, // doomednum
S_INVISIBLE, // spawnstate
1000, // 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_NULL, // deathstate
S_NULL, // xdeathstate
sfx_None, // deathsound
0, // speed
8<<FRACBITS, // radius
8<<FRACBITS, // height
0, // display offset
100, // mass
0, // damage
sfx_None, // activesound
MF_SCENERY|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOBLOCKMAP|MF_DONTENCOREMAP, // flags
S_NULL // raisestate
},
{ // MT_FOLLOWER
-1, // doomednum
S_INVISIBLE, // spawnstate

View file

@ -941,7 +941,6 @@ typedef enum sprite
SPR_SSWR, // Red Horizontal Spring
SPR_SSWB, // Blue Horizontal Spring
SPR_SSWG, // Grey Horizontal Spring
SPR_POGS, // Pogo Spring
SPR_BSTY, // Yellow Booster
SPR_BSTR, // Red Booster
@ -3762,13 +3761,6 @@ typedef enum state
S_INVISSPRING,
// Orange Spring (Pogo)
S_POGOSPRING1,
S_POGOSPRING2,
S_POGOSPRING2B,
S_POGOSPRING3,
S_POGOSPRING4,
// Yellow Diagonal Spring
S_YDIAG1,
S_YDIAG2,
@ -5582,13 +5574,6 @@ typedef enum state
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,
@ -5794,7 +5779,6 @@ typedef enum mobj_type
MT_BLUESPRING,
MT_GREYSPRING,
MT_INVISSPRING,
MT_POGOSPRING,
MT_YELLOWDIAG, // Yellow Diagonal Spring
MT_REDDIAG, // Red Diagonal Spring
MT_BLUEDIAG, // Blue Diagonal Spring
@ -6691,9 +6675,6 @@ typedef enum mobj_type
MT_OVERTIME_PARTICLE,
MT_OVERTIME_CENTER,
MT_BATTLECAPSULE,
MT_BATTLECAPSULE_PIECE,
MT_FOLLOWER,
MT_FOLLOWERBUBBLE_FRONT,
MT_FOLLOWERBUBBLE_BACK,

View file

@ -23,21 +23,20 @@
// Battle overtime info
struct battleovertime battleovertime;
// Capsules mode enabled for this map?
boolean battlecapsules = false;
// Item Breaker mode enabled for this map?
boolean itembreaker = false;
// box respawning in battle mode
INT32 nummapboxes = 0;
INT32 numgotboxes = 0;
// Capsule counters
UINT8 maptargets = 0; // Capsules in map
UINT8 numtargets = 0; // Capsules busted
// Item Breaker counters
UINT8 numtargets = 0; // Itemboxes busted
INT32 K_StartingBumperCount(void)
{
if (battlecapsules)
return 1; // always 1 hit in Break the Capsules
if (itembreaker)
return 1; // always 1 hit in Item Breaker
return cv_kartbumpers.value;
}
@ -142,7 +141,7 @@ void K_CheckBumpers(void)
}
else if (numingame <= 1)
{
if (!battlecapsules)
if (!itembreaker)
{
// Reset map to turn on battle capsules
D_MapChange(gamemap, gametype, encoremode, true, 0, false, false);
@ -332,7 +331,7 @@ void K_RunPaperItemSpawners(void)
const boolean overtime = (battleovertime.enabled >= 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)
{

View file

@ -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);

View file

@ -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<<FRACBITS, y<<FRACBITS, scale, splitflags, p, NULL);
@ -4594,7 +4601,7 @@ void K_drawKartHUD(void)
}
else if (gametype == GT_BATTLE) // Battle-only (ditto)
{
if (!freecam && !battlecapsules)
if (!freecam && !itembreaker)
{
K_drawKartEmeralds();
}

View file

@ -89,7 +89,7 @@ void K_TimerInit(void)
}
}
// NOW you can try to spawn in the Battle capsules, if there's not enough players for a match
// NOW you can try to setup Item Breaker, if there's not enough players for a match
K_BattleInit();
timelimitintics = extratimeintics = secretextratime = 0;
@ -108,7 +108,7 @@ void K_TimerInit(void)
}
else
#ifndef TESTOVERTIMEINFREEPLAY
if (!battlecapsules)
if (!itembreaker)
#endif
{
timelimitintics = cv_timelimit.value * (60*TICRATE);
@ -212,6 +212,7 @@ void K_RegisterKartStuff(void)
CV_RegisterVar(&cv_kartcheck);
CV_RegisterVar(&cv_kartinvinsfx);
CV_RegisterVar(&cv_kartspeed);
CV_RegisterVar(&cv_kartbattlespeed);
CV_RegisterVar(&cv_kartbumpers);
CV_RegisterVar(&cv_kartfrantic);
CV_RegisterVar(&cv_kartcomeback);
@ -255,10 +256,10 @@ boolean K_IsPlayerLosing(player_t *player)
INT32 winningpos = 1;
UINT8 i, pcount = 0;
if (battlecapsules && numtargets == 0)
if (itembreaker && numtargets == 0)
return true; // Didn't even TRY?
if (battlecapsules || bossinfo.boss)
if (itembreaker || bossinfo.boss)
return (player->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<<FRACBITS, 2);
P_SpawnMobjFromMobj(player->mo, 0, 0, 0, MT_POGOSPRING);
player->pogospring = 1;
player->itemamount--;
}

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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;

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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)
{

View file

@ -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,