Some sort of intermission tally support.

This commit is contained in:
Jaime Passos 2019-12-18 17:13:05 -03:00
parent 9c5a3b637c
commit 52cc04ef78
5 changed files with 91 additions and 51 deletions

View file

@ -22,6 +22,7 @@
#include "m_menu.h" #include "m_menu.h"
#include "m_misc.h" #include "m_misc.h"
#include "f_finale.h" #include "f_finale.h"
#include "y_inter.h"
#include "dehacked.h" #include "dehacked.h"
#include "st_stuff.h" #include "st_stuff.h"
#include "i_system.h" #include "i_system.h"
@ -1137,7 +1138,7 @@ static void readgametype(MYFILE *f, char *gtname)
{ {
char *s = Z_Malloc(MAXLINELEN, PU_STATIC, NULL); char *s = Z_Malloc(MAXLINELEN, PU_STATIC, NULL);
char *word; char *word;
char *word2; char *word2, *word2lwr = NULL;
char *tmp; char *tmp;
INT32 i; INT32 i;
@ -1146,6 +1147,7 @@ static void readgametype(MYFILE *f, char *gtname)
UINT32 newgttol = 0; UINT32 newgttol = 0;
UINT8 newgtleftcolor = 0; UINT8 newgtleftcolor = 0;
UINT8 newgtrightcolor = 0; UINT8 newgtrightcolor = 0;
int newgtinttype = 0;
char gtdescription[441]; char gtdescription[441];
do do
@ -1201,7 +1203,12 @@ static void readgametype(MYFILE *f, char *gtname)
word2 = strtok(NULL, " = "); word2 = strtok(NULL, " = ");
if (word2) if (word2)
{
if (!word2lwr)
word2lwr = Z_Malloc(MAXLINELEN, PU_STATIC, NULL);
strcpy(word2lwr, word2);
strupr(word2); strupr(word2);
}
else else
break; break;
@ -1229,10 +1236,15 @@ static void readgametype(MYFILE *f, char *gtname)
// Level platter // Level platter
newgtrightcolor = (UINT8)get_number(word2); newgtrightcolor = (UINT8)get_number(word2);
} }
else if (fastcmp(word, "INTERMISSIONTYPE"))
{
// Case sensitive
newgtinttype = (int)get_number(word2lwr);
}
else if (fastcmp(word, "TYPEOFLEVEL")) else if (fastcmp(word, "TYPEOFLEVEL"))
{ {
if (i) // it's just a number if (i) // it's just a number
newgttol = (UINT16)i; newgttol = (UINT32)i;
else else
{ {
UINT16 tol = 0; UINT16 tol = 0;
@ -1253,11 +1265,14 @@ static void readgametype(MYFILE *f, char *gtname)
} }
} while (!myfeof(f)); // finish when the line is empty } while (!myfeof(f)); // finish when the line is empty
Z_Free(s); Z_Free(s);
if (word2lwr)
Z_Free(word2lwr);
// Add the new gametype // Add the new gametype
newgtidx = G_AddGametype(newgtrules); newgtidx = G_AddGametype(newgtrules);
G_AddGametypeTOL(newgtidx, newgttol); G_AddGametypeTOL(newgtidx, newgttol);
G_SetGametypeDescription(newgtidx, gtdescription, newgtleftcolor, newgtrightcolor); G_SetGametypeDescription(newgtidx, gtdescription, newgtleftcolor, newgtrightcolor);
intermissiontypes[newgtidx] = newgtinttype;
// Write the new gametype name. // Write the new gametype name.
Gametype_Names[newgtidx] = Z_StrDup((const char *)gtname); Gametype_Names[newgtidx] = Z_StrDup((const char *)gtname);
@ -1535,7 +1550,7 @@ static void readlevelheader(MYFILE *f, INT32 num)
else if (fastcmp(word, "TYPEOFLEVEL")) else if (fastcmp(word, "TYPEOFLEVEL"))
{ {
if (i) // it's just a number if (i) // it's just a number
mapheaderinfo[num-1]->typeoflevel = (UINT16)i; mapheaderinfo[num-1]->typeoflevel = (UINT32)i;
else else
{ {
UINT16 tol = 0; UINT16 tol = 0;
@ -8812,6 +8827,7 @@ static const char *const GAMETYPERULE_LIST[] = {
"EMERALDHUNT", "EMERALDHUNT",
"SPAWNENEMIES", "SPAWNENEMIES",
"ALLOWEXIT", "ALLOWEXIT",
"ROUNDENDMESSAGE",
NULL NULL
}; };
@ -9230,20 +9246,6 @@ struct {
{"tr_trans90",tr_trans90}, {"tr_trans90",tr_trans90},
{"NUMTRANSMAPS",NUMTRANSMAPS}, {"NUMTRANSMAPS",NUMTRANSMAPS},
// Type of levels
{"TOL_SP",TOL_SP},
{"TOL_COOP",TOL_COOP},
{"TOL_COMPETITION",TOL_COMPETITION},
{"TOL_RACE",TOL_RACE},
{"TOL_MATCH",TOL_MATCH},
{"TOL_TAG",TOL_TAG},
{"TOL_CTF",TOL_CTF},
{"TOL_2D",TOL_2D},
{"TOL_MARIO",TOL_MARIO},
{"TOL_NIGHTS",TOL_NIGHTS},
{"TOL_ERZ3",TOL_ERZ3},
{"TOL_XMAS",TOL_XMAS},
// Level flags // Level flags
{"LF_SCRIPTISFILE",LF_SCRIPTISFILE}, {"LF_SCRIPTISFILE",LF_SCRIPTISFILE},
{"LF_SPEEDMUSIC",LF_SPEEDMUSIC}, {"LF_SPEEDMUSIC",LF_SPEEDMUSIC},
@ -9426,16 +9428,16 @@ struct {
{"DMG_CANHURTSELF",DMG_CANHURTSELF}, {"DMG_CANHURTSELF",DMG_CANHURTSELF},
{"DMG_DEATHMASK",DMG_DEATHMASK}, {"DMG_DEATHMASK",DMG_DEATHMASK},
// Gametypes, for use with global var "gametype" // Intermission types
// Left them here just in case?? {"int_none",int_none},
{"GT_COOP",GT_COOP}, {"int_coop",int_coop},
{"GT_COMPETITION",GT_COMPETITION}, {"int_match",int_match},
{"GT_RACE",GT_RACE}, {"int_teammatch",int_teammatch},
{"GT_MATCH",GT_MATCH}, //{"int_tag",int_tag},
{"GT_TEAMMATCH",GT_TEAMMATCH}, {"int_ctf",int_ctf},
{"GT_TAG",GT_TAG}, {"int_spec",int_spec},
{"GT_HIDEANDSEEK",GT_HIDEANDSEEK}, {"int_race",int_race},
{"GT_CTF",GT_CTF}, {"int_comp",int_comp},
// Jingles (jingletype_t) // Jingles (jingletype_t)
{"JT_NONE",JT_NONE}, {"JT_NONE",JT_NONE},
@ -9728,7 +9730,7 @@ struct {
}; };
static mobjtype_t get_mobjtype(const char *word) static mobjtype_t get_mobjtype(const char *word)
{ // Returns the vlaue of MT_ enumerations { // Returns the value of MT_ enumerations
mobjtype_t i; mobjtype_t i;
if (*word >= '0' && *word <= '9') if (*word >= '0' && *word <= '9')
return atoi(word); return atoi(word);
@ -9895,7 +9897,7 @@ static INT16 get_gametype(const char *word)
} }
static powertype_t get_power(const char *word) static powertype_t get_power(const char *word)
{ // Returns the vlaue of pw_ enumerations { // Returns the value of pw_ enumerations
powertype_t i; powertype_t i;
if (*word >= '0' && *word <= '9') if (*word >= '0' && *word <= '9')
return atoi(word); return atoi(word);
@ -10057,19 +10059,6 @@ static fixed_t find_const(const char **rword)
free(word); free(word);
return 0; return 0;
} }
else if (fastncmp("GTR_", word, 4)) {
char *p = word+4;
for (i = 0; GAMETYPERULE_LIST[i]; i++)
if (fastcmp(p, GAMETYPERULE_LIST[i])) {
free(word);
return (1<<i);
}
// Not found error
const_warning("game type rule",word);
free(word);
return 0;
}
else if (fastncmp("S_",word,2)) { else if (fastncmp("S_",word,2)) {
r = get_state(word); r = get_state(word);
free(word); free(word);
@ -10112,6 +10101,32 @@ static fixed_t find_const(const char **rword)
free(word); free(word);
return r; return r;
} }
else if (fastncmp("GTR_", word, 4)) {
char *p = word+4;
for (i = 0; GAMETYPERULE_LIST[i]; i++)
if (fastcmp(p, GAMETYPERULE_LIST[i])) {
free(word);
return (1<<i);
}
// Not found error
const_warning("game type rule",word);
free(word);
return 0;
}
else if (fastncmp("TOL_", word, 4)) {
char *p = word+4;
for (i = 0; TYPEOFLEVEL[i].name; i++)
if (fastcmp(p, TYPEOFLEVEL[i].name)) {
free(word);
return TYPEOFLEVEL[i].flag;
}
// Not found error
const_warning("typeoflevel",word);
free(word);
return 0;
}
else if (fastncmp("HUD_",word,4)) { else if (fastncmp("HUD_",word,4)) {
r = get_huditem(word); r = get_huditem(word);
free(word); free(word);
@ -10425,6 +10440,16 @@ static inline int lib_getenum(lua_State *L)
if (mathlib) return luaL_error(L, "playerflag '%s' could not be found.\n", word); if (mathlib) return luaL_error(L, "playerflag '%s' could not be found.\n", word);
return 0; return 0;
} }
else if (fastncmp("GT_", word, 3)) {
p = word+3;
for (i = 0; Gametype_ConstantNames[i]; i++)
if (fastcmp(p, Gametype_ConstantNames[i])) {
lua_pushinteger(L, ((lua_Integer)1<<i));
return 1;
}
if (mathlib) return luaL_error(L, "mobjflag '%s' could not be found.\n", word);
return 0;
}
else if (fastncmp("GTR_", word, 4)) { else if (fastncmp("GTR_", word, 4)) {
p = word+4; p = word+4;
for (i = 0; GAMETYPERULE_LIST[i]; i++) for (i = 0; GAMETYPERULE_LIST[i]; i++)
@ -10435,6 +10460,16 @@ static inline int lib_getenum(lua_State *L)
if (mathlib) return luaL_error(L, "game type rule '%s' could not be found.\n", word); if (mathlib) return luaL_error(L, "game type rule '%s' could not be found.\n", word);
return 0; return 0;
} }
else if (fastncmp("TOL_", word, 4)) {
p = word+4;
for (i = 0; TYPEOFLEVEL[i].name; i++)
if (fastcmp(p, TYPEOFLEVEL[i].name)) {
lua_pushinteger(L, TYPEOFLEVEL[i].flag);
return 1;
}
if (mathlib) return luaL_error(L, "typeoflevel '%s' could not be found.\n", word);
return 0;
}
else if (fastncmp("ML_", word, 3)) { else if (fastncmp("ML_", word, 3)) {
p = word+3; p = word+3;
for (i = 0; i < 16; i++) for (i = 0; i < 16; i++)

View file

@ -414,6 +414,7 @@ enum GameTypeRules
GTR_EMERALDHUNT = 1<<17, // Emerald Hunt GTR_EMERALDHUNT = 1<<17, // Emerald Hunt
GTR_SPAWNENEMIES = 1<<18, // Spawn enemies GTR_SPAWNENEMIES = 1<<18, // Spawn enemies
GTR_ALLOWEXIT = 1<<19, // Allow exit sectors GTR_ALLOWEXIT = 1<<19, // Allow exit sectors
GTR_ROUNDENDMESSAGE = 1<<20, // Prints "The round has ended." into the console
}; };
// String names for gametypes // String names for gametypes

View file

@ -3026,7 +3026,7 @@ void G_ExitLevel(void)
CV_SetValue(&cv_teamscramble, cv_scrambleonchange.value); CV_SetValue(&cv_teamscramble, cv_scrambleonchange.value);
} }
if (gametype != GT_COOP) if (gametyperules & GTR_ROUNDENDMESSAGE)
CONS_Printf(M_GetText("The round has ended.\n")); CONS_Printf(M_GetText("The round has ended.\n"));
// Remove CEcho text on round end. // Remove CEcho text on round end.
@ -3080,22 +3080,22 @@ UINT32 gametypedefaultrules[NUMGAMETYPES] =
// Co-op // Co-op
GTR_PLATFORM|GTR_LIVES|GTR_CHASECAM|GTR_EMERALDHUNT|GTR_SPAWNENEMIES|GTR_ALLOWEXIT, GTR_PLATFORM|GTR_LIVES|GTR_CHASECAM|GTR_EMERALDHUNT|GTR_SPAWNENEMIES|GTR_ALLOWEXIT,
// Competition // Competition
GTR_PLATFORM|GTR_LIVES|GTR_RACE|GTR_CHASECAM|GTR_SPAWNENEMIES|GTR_ALLOWEXIT, GTR_PLATFORM|GTR_LIVES|GTR_RACE|GTR_CHASECAM|GTR_SPAWNENEMIES|GTR_ALLOWEXIT|GTR_ROUNDENDMESSAGE,
// Race // Race
GTR_PLATFORM|GTR_RACE|GTR_CHASECAM|GTR_SPAWNENEMIES|GTR_ALLOWEXIT, GTR_PLATFORM|GTR_RACE|GTR_CHASECAM|GTR_SPAWNENEMIES|GTR_ALLOWEXIT|GTR_ROUNDENDMESSAGE,
// Match // Match
GTR_RINGSLINGER|GTR_SPECTATORS|GTR_TIMELIMIT|GTR_EMERALDS|GTR_PITYSHIELD|GTR_DEATHPENALTY, GTR_RINGSLINGER|GTR_SPECTATORS|GTR_TIMELIMIT|GTR_EMERALDS|GTR_PITYSHIELD|GTR_DEATHPENALTY|GTR_ROUNDENDMESSAGE,
// Team Match // Team Match
GTR_RINGSLINGER|GTR_TEAMS|GTR_SPECTATORS|GTR_TIMELIMIT|GTR_PITYSHIELD, GTR_RINGSLINGER|GTR_TEAMS|GTR_SPECTATORS|GTR_TIMELIMIT|GTR_PITYSHIELD|GTR_ROUNDENDMESSAGE,
// Tag // Tag
GTR_RINGSLINGER|GTR_TAG|GTR_SPECTATORS|GTR_TIMELIMIT|GTR_HIDETIME|GTR_BLINDFOLDED, GTR_RINGSLINGER|GTR_TAG|GTR_SPECTATORS|GTR_TIMELIMIT|GTR_HIDETIME|GTR_BLINDFOLDED|GTR_ROUNDENDMESSAGE,
// Hide and Seek // Hide and Seek
GTR_RINGSLINGER|GTR_TAG|GTR_SPECTATORS|GTR_TIMELIMIT|GTR_HIDETIME|GTR_BLINDFOLDED, GTR_RINGSLINGER|GTR_TAG|GTR_SPECTATORS|GTR_TIMELIMIT|GTR_HIDETIME|GTR_BLINDFOLDED|GTR_ROUNDENDMESSAGE,
// CTF // CTF
GTR_RINGSLINGER|GTR_TEAMS|GTR_SPECTATORS|GTR_TIMELIMIT|GTR_EMERALDS|GTR_TEAMFLAGS|GTR_PITYSHIELD, GTR_RINGSLINGER|GTR_TEAMS|GTR_SPECTATORS|GTR_TIMELIMIT|GTR_EMERALDS|GTR_TEAMFLAGS|GTR_PITYSHIELD|GTR_ROUNDENDMESSAGE,
}; };
// //

View file

@ -164,6 +164,7 @@ static INT32 tallydonetic = -1;
static INT32 endtic = -1; static INT32 endtic = -1;
intertype_t intertype = int_none; intertype_t intertype = int_none;
intertype_t intermissiontypes[NUMGAMETYPES];
static void Y_RescaleScreenBuffer(void); static void Y_RescaleScreenBuffer(void);
static void Y_AwardCoopBonuses(void); static void Y_AwardCoopBonuses(void);
@ -1187,7 +1188,9 @@ void Y_StartIntermission(void)
timer = 1; timer = 1;
} }
if (gametype == GT_COOP) if (intermissiontypes[gametype] != int_none)
intertype = intermissiontypes[gametype];
else if (gametype == GT_COOP)
intertype = (G_IsSpecialStage(gamemap)) ? int_spec : int_coop; intertype = (G_IsSpecialStage(gamemap)) ? int_spec : int_coop;
else if (gametype == GT_TEAMMATCH) else if (gametype == GT_TEAMMATCH)
intertype = int_teammatch; intertype = int_teammatch;

View file

@ -31,3 +31,4 @@ typedef enum
int_comp, // Competition int_comp, // Competition
} intertype_t; } intertype_t;
extern intertype_t intertype; extern intertype_t intertype;
extern intertype_t intermissiontypes[NUMGAMETYPES];