The oft-promised buffer fixes. Also, making it so the gametype switch for "Sometimes" is every 10 maps, not a full buffer round (now that it doesn't add to the buffer when you first see it).

Unfortunately, the code didn't turn out nearly as nice as I'd desired, but things don't always work out.

In addition: For some reason, I rolled Tinkerer's Arena twice within three hits of the Dice voting option, so something's wrong and this branch needs proper, rigorous investigative testing but I don't know what and I'm way too tired (both physically and metaphysically) to investigate any further.
This commit is contained in:
toaster 2018-11-22 17:10:36 +00:00
parent 5c67e22c22
commit c6268253eb
3 changed files with 41 additions and 11 deletions

View file

@ -2066,7 +2066,6 @@ void D_MapChange(INT32 mapnum, INT32 newgametype, boolean pencoremode, boolean r
chmappending++; chmappending++;
if (netgame) if (netgame)
WRITEUINT32(buf_p, M_RandomizedSeed()); // random seed WRITEUINT32(buf_p, M_RandomizedSeed()); // random seed
G_AddMapToBuffer(mapnum-1);
SendNetXCmd(XD_MAP, buf, buf_p - buf); SendNetXCmd(XD_MAP, buf, buf_p - buf);
} }
} }

View file

@ -3137,8 +3137,7 @@ INT16 G_SometimesGetDifferentGametype(void)
if (randmapbuffer[NUMMAPS] > 0 && (encorepossible || cv_kartvoterulechanges.value != 3)) if (randmapbuffer[NUMMAPS] > 0 && (encorepossible || cv_kartvoterulechanges.value != 3))
{ {
if (cv_kartvoterulechanges.value != 1) randmapbuffer[NUMMAPS]--;
randmapbuffer[NUMMAPS]--;
if (encorepossible) if (encorepossible)
{ {
switch (cv_kartvoterulechanges.value) switch (cv_kartvoterulechanges.value)
@ -3166,6 +3165,8 @@ INT16 G_SometimesGetDifferentGametype(void)
randmapbuffer[NUMMAPS] = 1; // every other vote (or always if !encorepossible) randmapbuffer[NUMMAPS] = 1; // every other vote (or always if !encorepossible)
break; break;
case 1: // sometimes case 1: // sometimes
randmapbuffer[NUMMAPS] = 10; // ...every two cups?
break;
default: default:
// fallthrough - happens when clearing buffer, but needs a reasonable countdown if cvar is modified // fallthrough - happens when clearing buffer, but needs a reasonable countdown if cvar is modified
case 2: // frequent case 2: // frequent
@ -3268,6 +3269,7 @@ static INT32 TOLMaps(INT16 tolflags)
* \author Graue <graue@oceanbase.org> * \author Graue <graue@oceanbase.org>
*/ */
static INT16 *okmaps = NULL; static INT16 *okmaps = NULL;
static INT16 votebuffer[3] = {-1, -1, -1};
INT16 G_RandMap(INT16 tolflags, INT16 pprevmap, boolean ignorebuffer, UINT8 maphell, boolean callagainsoon) INT16 G_RandMap(INT16 tolflags, INT16 pprevmap, boolean ignorebuffer, UINT8 maphell, boolean callagainsoon)
{ {
INT32 numokmaps = 0; INT32 numokmaps = 0;
@ -3297,6 +3299,26 @@ tryagain:
if (!ignorebuffer) if (!ignorebuffer)
{ {
if (votebuffer[0] != -1)
{
if (ix == votebuffer[0])
continue;
for (bufx = 1; bufx < 3; bufx++)
{
if (votebuffer[bufx] == -1) // Rest of buffer SHOULD be empty
break;
if (ix == votebuffer[bufx])
{
isokmap = false;
break;
}
}
if (!isokmap)
continue;
}
for (bufx = 0; bufx < (maphell ? 3 : NUMMAPS); bufx++) for (bufx = 0; bufx < (maphell ? 3 : NUMMAPS); bufx++)
{ {
if (randmapbuffer[bufx] == -1) // Rest of buffer SHOULD be empty if (randmapbuffer[bufx] == -1) // Rest of buffer SHOULD be empty
@ -3307,12 +3329,12 @@ tryagain:
break; break;
} }
} }
if (!isokmap)
continue;
} }
if (!isokmap) if (pprevmap == -2) // title demo hack
continue;
if (pprevmap == -2) // title demos
{ {
lumpnum_t l; lumpnum_t l;
if ((l = W_CheckNumForName(va("%sS01",G_BuildMapName(ix+1)))) == LUMPERROR) if ((l = W_CheckNumForName(va("%sS01",G_BuildMapName(ix+1)))) == LUMPERROR)
@ -3334,8 +3356,6 @@ tryagain:
for (bufx = 3; bufx < NUMMAPS; bufx++) // Let's clear all but the three most recent maps... for (bufx = 3; bufx < NUMMAPS; bufx++) // Let's clear all but the three most recent maps...
randmapbuffer[bufx] = -1; randmapbuffer[bufx] = -1;
if (cv_kartvoterulechanges.value == 1) // sometimes
randmapbuffer[NUMMAPS] = 0;
goto tryagain; //return G_RandMap(tolflags, pprevmap, ignorebuffer, maphell, callagainsoon); goto tryagain; //return G_RandMap(tolflags, pprevmap, ignorebuffer, maphell, callagainsoon);
} }
@ -3356,6 +3376,17 @@ tryagain:
{ {
Z_Free(okmaps); Z_Free(okmaps);
okmaps = NULL; okmaps = NULL;
for (bufx = 0; bufx < 3; bufx++)
votebuffer[bufx] = -1;
}
else if (votebuffer[2] == -1)
{
for (bufx = 0; bufx < 3; bufx++)
if (votebuffer[bufx] == -1)
{
votebuffer[bufx] = ix;
break;
}
} }
return ix; return ix;
@ -3509,8 +3540,6 @@ static void G_DoCompleted(void)
{ {
for (i = 3; i < NUMMAPS; i++) // Let's clear all but the three most recent maps... for (i = 3; i < NUMMAPS; i++) // Let's clear all but the three most recent maps...
randmapbuffer[i] = -1; randmapbuffer[i] = -1;
if (cv_kartvoterulechanges.value == 1) // sometimes
randmapbuffer[NUMMAPS] = 0;
} }
#endif #endif

View file

@ -3113,6 +3113,8 @@ boolean P_SetupLevel(boolean skipprecip)
#endif #endif
} }
G_AddMapToBuffer(gamemap-1);
return true; return true;
} }