queuemap: Add "-clear" parameter

- Can be used to clear all entries in the round queue
- Stores the special state in the gametype field
- Returns a message if the queue is already empty
This commit is contained in:
toaster 2023-05-03 23:46:09 +01:00
parent 80ed8b81b9
commit 9aeebe44e9
2 changed files with 69 additions and 14 deletions

View file

@ -3299,6 +3299,7 @@ static void Handle_MapQueueSend(UINT16 newmapnum, UINT16 newgametype, boolean ne
static char *buf_p = buf; static char *buf_p = buf;
UINT8 flags = 0; UINT8 flags = 0;
boolean doclear = (newgametype == ROUNDQUEUE_CLEAR);
CONS_Debug(DBG_GAMELOGIC, "Map queue: mapnum=%d newgametype=%d newencoremode=%d\n", CONS_Debug(DBG_GAMELOGIC, "Map queue: mapnum=%d newgametype=%d newencoremode=%d\n",
newmapnum, newgametype, newencoremode); newmapnum, newgametype, newencoremode);
@ -3319,9 +3320,17 @@ static void Handle_MapQueueSend(UINT16 newmapnum, UINT16 newgametype, boolean ne
} }
WRITEUINT8(buf_p, roundqueue.size); WRITEUINT8(buf_p, roundqueue.size);
SendNetXCmd(XD_MAPQUEUE, buf, buf_p - buf);
G_MapIntoRoundQueue(newmapnum, newgametype, newencoremode, false); if (doclear == true)
{
memset(&roundqueue, 0, sizeof(struct roundqueue));
}
else
{
G_MapIntoRoundQueue(newmapnum, newgametype, newencoremode, false);
}
SendNetXCmd(XD_MAPQUEUE, buf, buf_p - buf);
} }
static void Command_QueueMap_f(void) static void Command_QueueMap_f(void)
@ -3330,6 +3339,7 @@ static void Command_QueueMap_f(void)
size_t option_force; size_t option_force;
size_t option_gametype; size_t option_gametype;
size_t option_encore; size_t option_encore;
size_t option_clear;
boolean usingcheats; boolean usingcheats;
boolean ischeating; boolean ischeating;
@ -3354,6 +3364,29 @@ static void Command_QueueMap_f(void)
return; return;
} }
usingcheats = CV_CheatsEnabled();
ischeating = (!(netgame || multiplayer) || !K_CanChangeRules(false));
option_clear = COM_CheckParm("-clear");
if (option_clear)
{
if (ischeating && !usingcheats)
{
CONS_Printf(M_GetText("Cheats must be enabled.\n"));
return;
}
if (roundqueue.size == 0)
{
CONS_Printf(M_GetText("Round queue is already empty!\n"));
return;
}
Handle_MapQueueSend(0, ROUNDQUEUE_CLEAR, false);
return;
}
if (roundqueue.size >= ROUNDQUEUE_MAX) if (roundqueue.size >= ROUNDQUEUE_MAX)
{ {
CONS_Printf(M_GetText("Round queue is currently full.\n")); CONS_Printf(M_GetText("Round queue is currently full.\n"));
@ -3364,16 +3397,13 @@ static void Command_QueueMap_f(void)
option_gametype = COM_CheckPartialParm("-g"); option_gametype = COM_CheckPartialParm("-g");
option_encore = COM_CheckPartialParm("-e"); option_encore = COM_CheckPartialParm("-e");
usingcheats = CV_CheatsEnabled();
ischeating = (!(netgame || multiplayer));
if (!( first_option = COM_FirstOption() )) if (!( first_option = COM_FirstOption() ))
first_option = COM_Argc(); first_option = COM_Argc();
if (first_option < 2) if (first_option < 2)
{ {
/* I'm going over the fucking lines and I DON'T CAREEEEE */ /* I'm going over the fucking lines and I DON'T CAREEEEE */
CONS_Printf("queuemap <name / number> [-gametype <type>] [-force]:\n"); CONS_Printf("queuemap <name / number> [-gametype <type>] [-force] / [-clear]:\n");
CONS_Printf(M_GetText( CONS_Printf(M_GetText(
"Queue up a map by its name, or by its number (though why would you).\n" "Queue up a map by its name, or by its number (though why would you).\n"
"All parameters are case-insensitive and may be abbreviated.\n")); "All parameters are case-insensitive and may be abbreviated.\n"));
@ -3391,7 +3421,7 @@ static void Command_QueueMap_f(void)
return; return;
} }
if (!K_CanChangeRules(false) || (/*newmapnum != 1 &&*/ M_MapLocked(newmapnum))) if ((/*newmapnum != 1 &&*/ M_MapLocked(newmapnum)))
{ {
ischeating = true; ischeating = true;
} }
@ -3462,6 +3492,7 @@ static void Got_RequestMapQueuecmd(UINT8 **cp, INT32 playernum)
UINT8 flags; UINT8 flags;
boolean setencore; boolean setencore;
UINT16 mapnumber, setgametype; UINT16 mapnumber, setgametype;
boolean doclear = false;
flags = READUINT8(*cp); flags = READUINT8(*cp);
@ -3479,7 +3510,17 @@ static void Got_RequestMapQueuecmd(UINT8 **cp, INT32 playernum)
return; return;
} }
if (roundqueue.size >= ROUNDQUEUE_MAX) doclear = (setgametype == ROUNDQUEUE_CLEAR);
if (doclear == true)
{
if (roundqueue.size == 0)
{
CONS_Alert(CONS_ERROR, "queuemap: Queue is already empty!\n");
return;
}
}
else if (roundqueue.size >= ROUNDQUEUE_MAX)
{ {
CONS_Alert(CONS_ERROR, "queuemap: Unable to add map beyond %u\n", roundqueue.size); CONS_Alert(CONS_ERROR, "queuemap: Unable to add map beyond %u\n", roundqueue.size);
return; return;
@ -3496,6 +3537,7 @@ static void Got_MapQueuecmd(UINT8 **cp, INT32 playernum)
UINT8 flags, queueposition, i; UINT8 flags, queueposition, i;
boolean setencore; boolean setencore;
UINT16 setgametype; UINT16 setgametype;
boolean doclear = false;
flags = READUINT8(*cp); flags = READUINT8(*cp);
@ -3513,7 +3555,9 @@ static void Got_MapQueuecmd(UINT8 **cp, INT32 playernum)
return; return;
} }
if (queueposition >= ROUNDQUEUE_MAX) doclear = (setgametype == ROUNDQUEUE_CLEAR);
if (doclear == false && queueposition >= ROUNDQUEUE_MAX)
{ {
CONS_Alert(CONS_ERROR, "queuemap: Unable to add map beyond %u\n", roundqueue.size); CONS_Alert(CONS_ERROR, "queuemap: Unable to add map beyond %u\n", roundqueue.size);
return; return;
@ -3521,13 +3565,20 @@ static void Got_MapQueuecmd(UINT8 **cp, INT32 playernum)
if (!server) if (!server)
{ {
while (roundqueue.size <= queueposition) if (doclear == true)
{ {
memset(&roundqueue.entries[roundqueue.size], 0, sizeof(roundentry_t)); memset(&roundqueue, 0, sizeof(struct roundqueue));
roundqueue.size++;
} }
else
{
while (roundqueue.size <= queueposition)
{
memset(&roundqueue.entries[roundqueue.size], 0, sizeof(roundentry_t));
roundqueue.size++;
}
G_MapSlipIntoRoundQueue(queueposition, 0, setgametype, setencore, false); G_MapSlipIntoRoundQueue(queueposition, 0, setgametype, setencore, false);
}
for (i = 0; i <= splitscreen; i++) for (i = 0; i <= splitscreen; i++)
{ {
@ -3540,7 +3591,10 @@ static void Got_MapQueuecmd(UINT8 **cp, INT32 playernum)
return; return;
} }
CONS_Printf("queuemap: A map was added to the round queue (pos. %u)\n", queueposition+1); if (doclear)
CONS_Printf("queuemap: The round queue was cleared.\n");
else
CONS_Printf("queuemap: A map was added to the round queue (pos. %u)\n", queueposition+1);
} }
static void Command_Pause(void) static void Command_Pause(void)

View file

@ -54,6 +54,7 @@ typedef enum
} nextmapspecial_t; } nextmapspecial_t;
#define ROUNDQUEUE_MAX 10 // sane max? maybe make dynamically allocated later #define ROUNDQUEUE_MAX 10 // sane max? maybe make dynamically allocated later
#define ROUNDQUEUE_CLEAR UINT16_MAX // lives in gametype field of packets
struct roundentry_t struct roundentry_t
{ {