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:
parent
1e678f660f
commit
4b1324da69
28 changed files with 205 additions and 838 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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"))
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
14
src/g_demo.c
14
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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
};
|
||||
|
||||
//
|
||||
|
|
|
|||
96
src/info.c
96
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<<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
|
||||
|
|
|
|||
19
src/info.h
19
src/info.h
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
57
src/k_hud.c
57
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<<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();
|
||||
}
|
||||
|
|
|
|||
31
src/k_kart.c
31
src/k_kart.c
|
|
@ -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--;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
53
src/m_menu.c
53
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)
|
||||
|
|
|
|||
122
src/p_inter.c
122
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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
432
src/p_mobj.c
432
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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in a new issue