mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Merge branch 'netarchive-cleanup' into 'next'
Netgame $$$.sav code cleanup See merge request STJr/SRB2!894
This commit is contained in:
commit
405d5e1fc6
4 changed files with 326 additions and 329 deletions
|
|
@ -1010,16 +1010,8 @@ static UINT8 ArchiveValue(int TABLESINDEX, int myindex)
|
||||||
if (!rover)
|
if (!rover)
|
||||||
WRITEUINT8(save_p, ARCH_NULL);
|
WRITEUINT8(save_p, ARCH_NULL);
|
||||||
else {
|
else {
|
||||||
ffloor_t *r2;
|
UINT16 i = P_GetFFloorID(rover);
|
||||||
UINT16 i = 0;
|
if (i == UINT16_MAX) // invalid ID
|
||||||
// search for id
|
|
||||||
for (r2 = rover->target->ffloors; r2; r2 = r2->next)
|
|
||||||
{
|
|
||||||
if (r2 == rover)
|
|
||||||
break;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if (!r2)
|
|
||||||
WRITEUINT8(save_p, ARCH_NULL);
|
WRITEUINT8(save_p, ARCH_NULL);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
||||||
611
src/p_saveg.c
611
src/p_saveg.c
|
|
@ -772,29 +772,102 @@ static void P_NetUnArchiveColormaps(void)
|
||||||
#define LD_S2BOTTEX 0x04
|
#define LD_S2BOTTEX 0x04
|
||||||
#define LD_S2MIDTEX 0x08
|
#define LD_S2MIDTEX 0x08
|
||||||
|
|
||||||
//
|
#define FD_FLAGS 0x01
|
||||||
// P_NetArchiveWorld
|
#define FD_ALPHA 0x02
|
||||||
//
|
|
||||||
static void P_NetArchiveWorld(void)
|
// Check if any of the sector's FOFs differ from how they spawned
|
||||||
|
static boolean CheckFFloorDiff(const sector_t *ss)
|
||||||
|
{
|
||||||
|
ffloor_t *rover;
|
||||||
|
|
||||||
|
for (rover = ss->ffloors; rover; rover = rover->next)
|
||||||
|
{
|
||||||
|
if (rover->flags != rover->spawnflags
|
||||||
|
|| rover->alpha != rover->spawnalpha)
|
||||||
|
{
|
||||||
|
return true; // we found an FOF that changed!
|
||||||
|
// don't bother checking for more, we do that later
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Special case: save the stats of all modified ffloors along with their ffloor "number"s
|
||||||
|
// we don't bother with ffloors that haven't changed, that would just add to savegame even more than is really needed
|
||||||
|
static void ArchiveFFloors(const sector_t *ss)
|
||||||
|
{
|
||||||
|
size_t j = 0; // ss->ffloors is saved as ffloor #0, ss->ffloors->next is #1, etc
|
||||||
|
ffloor_t *rover;
|
||||||
|
UINT8 fflr_diff;
|
||||||
|
for (rover = ss->ffloors; rover; rover = rover->next)
|
||||||
|
{
|
||||||
|
fflr_diff = 0; // reset diff flags
|
||||||
|
if (rover->flags != rover->spawnflags)
|
||||||
|
fflr_diff |= FD_FLAGS;
|
||||||
|
if (rover->alpha != rover->spawnalpha)
|
||||||
|
fflr_diff |= FD_ALPHA;
|
||||||
|
|
||||||
|
if (fflr_diff)
|
||||||
|
{
|
||||||
|
WRITEUINT16(save_p, j); // save ffloor "number"
|
||||||
|
WRITEUINT8(save_p, fflr_diff);
|
||||||
|
if (fflr_diff & FD_FLAGS)
|
||||||
|
WRITEUINT32(save_p, rover->flags);
|
||||||
|
if (fflr_diff & FD_ALPHA)
|
||||||
|
WRITEINT16(save_p, rover->alpha);
|
||||||
|
}
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
WRITEUINT16(save_p, 0xffff);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void UnArchiveFFloors(const sector_t *ss)
|
||||||
|
{
|
||||||
|
UINT16 j = 0; // number of current ffloor in loop
|
||||||
|
UINT16 fflr_i; // saved ffloor "number" of next modified ffloor
|
||||||
|
UINT16 fflr_diff; // saved ffloor diff
|
||||||
|
ffloor_t *rover;
|
||||||
|
|
||||||
|
rover = ss->ffloors;
|
||||||
|
if (!rover) // it is assumed sectors[i].ffloors actually exists, but just in case...
|
||||||
|
I_Error("Sector does not have any ffloors!");
|
||||||
|
|
||||||
|
fflr_i = READUINT16(save_p); // get first modified ffloor's number ready
|
||||||
|
for (;;) // for some reason the usual for (rover = x; ...) thing doesn't work here?
|
||||||
|
{
|
||||||
|
if (fflr_i == 0xffff) // end of modified ffloors list, let's stop already
|
||||||
|
break;
|
||||||
|
// should NEVER need to be checked
|
||||||
|
//if (rover == NULL)
|
||||||
|
//break;
|
||||||
|
if (j != fflr_i) // this ffloor was not modified
|
||||||
|
{
|
||||||
|
j++;
|
||||||
|
rover = rover->next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
fflr_diff = READUINT8(save_p);
|
||||||
|
|
||||||
|
if (fflr_diff & FD_FLAGS)
|
||||||
|
rover->flags = READUINT32(save_p);
|
||||||
|
if (fflr_diff & FD_ALPHA)
|
||||||
|
rover->alpha = READINT16(save_p);
|
||||||
|
|
||||||
|
fflr_i = READUINT16(save_p); // get next ffloor "number" ready
|
||||||
|
|
||||||
|
j++;
|
||||||
|
rover = rover->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ArchiveSectors(void)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
INT32 statsec = 0, statline = 0;
|
|
||||||
const line_t *li = lines;
|
|
||||||
const line_t *spawnli = spawnlines;
|
|
||||||
const side_t *si;
|
|
||||||
const side_t *spawnsi;
|
|
||||||
UINT8 *put;
|
|
||||||
|
|
||||||
const sector_t *ss = sectors;
|
const sector_t *ss = sectors;
|
||||||
const sector_t *spawnss = spawnsectors;
|
const sector_t *spawnss = spawnsectors;
|
||||||
UINT8 diff, diff2, diff3;
|
UINT8 diff, diff2, diff3;
|
||||||
|
|
||||||
// initialize colormap vars because paranoia
|
|
||||||
ClearNetColormaps();
|
|
||||||
|
|
||||||
WRITEUINT32(save_p, ARCHIVEBLOCK_WORLD);
|
|
||||||
put = save_p;
|
|
||||||
|
|
||||||
for (i = 0; i < numsectors; i++, ss++, spawnss++)
|
for (i = 0; i < numsectors; i++, ss++, spawnss++)
|
||||||
{
|
{
|
||||||
diff = diff2 = diff3 = 0;
|
diff = diff2 = diff3 = 0;
|
||||||
|
|
@ -838,20 +911,8 @@ static void P_NetArchiveWorld(void)
|
||||||
if (ss->crumblestate)
|
if (ss->crumblestate)
|
||||||
diff3 |= SD_CRUMBLESTATE;
|
diff3 |= SD_CRUMBLESTATE;
|
||||||
|
|
||||||
// Check if any of the sector's FOFs differ from how they spawned
|
if (ss->ffloors && CheckFFloorDiff(ss))
|
||||||
if (ss->ffloors)
|
diff |= SD_FFLOORS;
|
||||||
{
|
|
||||||
ffloor_t *rover;
|
|
||||||
for (rover = ss->ffloors; rover; rover = rover->next)
|
|
||||||
{
|
|
||||||
if (rover->flags != rover->spawnflags
|
|
||||||
|| rover->alpha != rover->spawnalpha)
|
|
||||||
{
|
|
||||||
diff |= SD_FFLOORS; // we found an FOF that changed!
|
|
||||||
break; // don't bother checking for more, we do that later
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (diff3)
|
if (diff3)
|
||||||
diff2 |= SD_DIFF3;
|
diff2 |= SD_DIFF3;
|
||||||
|
|
@ -861,89 +922,142 @@ static void P_NetArchiveWorld(void)
|
||||||
|
|
||||||
if (diff)
|
if (diff)
|
||||||
{
|
{
|
||||||
statsec++;
|
WRITEUINT16(save_p, i);
|
||||||
|
WRITEUINT8(save_p, diff);
|
||||||
WRITEUINT16(put, i);
|
|
||||||
WRITEUINT8(put, diff);
|
|
||||||
if (diff & SD_DIFF2)
|
if (diff & SD_DIFF2)
|
||||||
WRITEUINT8(put, diff2);
|
WRITEUINT8(save_p, diff2);
|
||||||
if (diff2 & SD_DIFF3)
|
if (diff2 & SD_DIFF3)
|
||||||
WRITEUINT8(put, diff3);
|
WRITEUINT8(save_p, diff3);
|
||||||
if (diff & SD_FLOORHT)
|
if (diff & SD_FLOORHT)
|
||||||
WRITEFIXED(put, ss->floorheight);
|
WRITEFIXED(save_p, ss->floorheight);
|
||||||
if (diff & SD_CEILHT)
|
if (diff & SD_CEILHT)
|
||||||
WRITEFIXED(put, ss->ceilingheight);
|
WRITEFIXED(save_p, ss->ceilingheight);
|
||||||
if (diff & SD_FLOORPIC)
|
if (diff & SD_FLOORPIC)
|
||||||
WRITEMEM(put, levelflats[ss->floorpic].name, 8);
|
WRITEMEM(save_p, levelflats[ss->floorpic].name, 8);
|
||||||
if (diff & SD_CEILPIC)
|
if (diff & SD_CEILPIC)
|
||||||
WRITEMEM(put, levelflats[ss->ceilingpic].name, 8);
|
WRITEMEM(save_p, levelflats[ss->ceilingpic].name, 8);
|
||||||
if (diff & SD_LIGHT)
|
if (diff & SD_LIGHT)
|
||||||
WRITEINT16(put, ss->lightlevel);
|
WRITEINT16(save_p, ss->lightlevel);
|
||||||
if (diff & SD_SPECIAL)
|
if (diff & SD_SPECIAL)
|
||||||
WRITEINT16(put, ss->special);
|
WRITEINT16(save_p, ss->special);
|
||||||
if (diff2 & SD_FXOFFS)
|
if (diff2 & SD_FXOFFS)
|
||||||
WRITEFIXED(put, ss->floor_xoffs);
|
WRITEFIXED(save_p, ss->floor_xoffs);
|
||||||
if (diff2 & SD_FYOFFS)
|
if (diff2 & SD_FYOFFS)
|
||||||
WRITEFIXED(put, ss->floor_yoffs);
|
WRITEFIXED(save_p, ss->floor_yoffs);
|
||||||
if (diff2 & SD_CXOFFS)
|
if (diff2 & SD_CXOFFS)
|
||||||
WRITEFIXED(put, ss->ceiling_xoffs);
|
WRITEFIXED(save_p, ss->ceiling_xoffs);
|
||||||
if (diff2 & SD_CYOFFS)
|
if (diff2 & SD_CYOFFS)
|
||||||
WRITEFIXED(put, ss->ceiling_yoffs);
|
WRITEFIXED(save_p, ss->ceiling_yoffs);
|
||||||
if (diff2 & SD_FLOORANG)
|
if (diff2 & SD_FLOORANG)
|
||||||
WRITEANGLE(put, ss->floorpic_angle);
|
WRITEANGLE(save_p, ss->floorpic_angle);
|
||||||
if (diff2 & SD_CEILANG)
|
if (diff2 & SD_CEILANG)
|
||||||
WRITEANGLE(put, ss->ceilingpic_angle);
|
WRITEANGLE(save_p, ss->ceilingpic_angle);
|
||||||
if (diff2 & SD_TAG) // save only the tag
|
if (diff2 & SD_TAG) // save only the tag
|
||||||
WRITEINT16(put, ss->tag);
|
WRITEINT16(save_p, ss->tag);
|
||||||
if (diff3 & SD_TAGLIST) // save both firsttag and nexttag
|
if (diff3 & SD_TAGLIST) // save both firsttag and nexttag
|
||||||
{ // either of these could be changed even if tag isn't
|
{ // either of these could be changed even if tag isn't
|
||||||
WRITEINT32(put, ss->firsttag);
|
WRITEINT32(save_p, ss->firsttag);
|
||||||
WRITEINT32(put, ss->nexttag);
|
WRITEINT32(save_p, ss->nexttag);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (diff3 & SD_COLORMAP)
|
if (diff3 & SD_COLORMAP)
|
||||||
WRITEUINT32(put, CheckAddNetColormapToList(ss->extra_colormap));
|
WRITEUINT32(save_p, CheckAddNetColormapToList(ss->extra_colormap));
|
||||||
// returns existing index if already added, or appends to net_colormaps and returns new index
|
// returns existing index if already added, or appends to net_colormaps and returns new index
|
||||||
if (diff3 & SD_CRUMBLESTATE)
|
if (diff3 & SD_CRUMBLESTATE)
|
||||||
WRITEINT32(put, ss->crumblestate);
|
WRITEINT32(save_p, ss->crumblestate);
|
||||||
|
|
||||||
// Special case: save the stats of all modified ffloors along with their ffloor "number"s
|
|
||||||
// we don't bother with ffloors that haven't changed, that would just add to savegame even more than is really needed
|
|
||||||
if (diff & SD_FFLOORS)
|
if (diff & SD_FFLOORS)
|
||||||
{
|
ArchiveFFloors(ss);
|
||||||
size_t j = 0; // ss->ffloors is saved as ffloor #0, ss->ffloors->next is #1, etc
|
|
||||||
ffloor_t *rover;
|
|
||||||
UINT8 fflr_diff;
|
|
||||||
for (rover = ss->ffloors; rover; rover = rover->next)
|
|
||||||
{
|
|
||||||
fflr_diff = 0; // reset diff flags
|
|
||||||
if (rover->flags != rover->spawnflags)
|
|
||||||
fflr_diff |= 1;
|
|
||||||
if (rover->alpha != rover->spawnalpha)
|
|
||||||
fflr_diff |= 2;
|
|
||||||
|
|
||||||
if (fflr_diff)
|
|
||||||
{
|
|
||||||
WRITEUINT16(put, j); // save ffloor "number"
|
|
||||||
WRITEUINT8(put, fflr_diff);
|
|
||||||
if (fflr_diff & 1)
|
|
||||||
WRITEUINT32(put, rover->flags);
|
|
||||||
if (fflr_diff & 2)
|
|
||||||
WRITEINT16(put, rover->alpha);
|
|
||||||
}
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
WRITEUINT16(put, 0xffff);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITEUINT16(put, 0xffff);
|
WRITEUINT16(save_p, 0xffff);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void UnArchiveSectors(void)
|
||||||
|
{
|
||||||
|
UINT16 i;
|
||||||
|
UINT8 diff, diff2, diff3;
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
i = READUINT16(save_p);
|
||||||
|
|
||||||
|
if (i == 0xffff)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (i > numsectors)
|
||||||
|
I_Error("Invalid sector number %u from server (expected end at %s)", i, sizeu1(numsectors));
|
||||||
|
|
||||||
|
diff = READUINT8(save_p);
|
||||||
|
if (diff & SD_DIFF2)
|
||||||
|
diff2 = READUINT8(save_p);
|
||||||
|
else
|
||||||
|
diff2 = 0;
|
||||||
|
if (diff2 & SD_DIFF3)
|
||||||
|
diff3 = READUINT8(save_p);
|
||||||
|
else
|
||||||
|
diff3 = 0;
|
||||||
|
|
||||||
|
if (diff & SD_FLOORHT)
|
||||||
|
sectors[i].floorheight = READFIXED(save_p);
|
||||||
|
if (diff & SD_CEILHT)
|
||||||
|
sectors[i].ceilingheight = READFIXED(save_p);
|
||||||
|
if (diff & SD_FLOORPIC)
|
||||||
|
{
|
||||||
|
sectors[i].floorpic = P_AddLevelFlatRuntime((char *)save_p);
|
||||||
|
save_p += 8;
|
||||||
|
}
|
||||||
|
if (diff & SD_CEILPIC)
|
||||||
|
{
|
||||||
|
sectors[i].ceilingpic = P_AddLevelFlatRuntime((char *)save_p);
|
||||||
|
save_p += 8;
|
||||||
|
}
|
||||||
|
if (diff & SD_LIGHT)
|
||||||
|
sectors[i].lightlevel = READINT16(save_p);
|
||||||
|
if (diff & SD_SPECIAL)
|
||||||
|
sectors[i].special = READINT16(save_p);
|
||||||
|
|
||||||
|
if (diff2 & SD_FXOFFS)
|
||||||
|
sectors[i].floor_xoffs = READFIXED(save_p);
|
||||||
|
if (diff2 & SD_FYOFFS)
|
||||||
|
sectors[i].floor_yoffs = READFIXED(save_p);
|
||||||
|
if (diff2 & SD_CXOFFS)
|
||||||
|
sectors[i].ceiling_xoffs = READFIXED(save_p);
|
||||||
|
if (diff2 & SD_CYOFFS)
|
||||||
|
sectors[i].ceiling_yoffs = READFIXED(save_p);
|
||||||
|
if (diff2 & SD_FLOORANG)
|
||||||
|
sectors[i].floorpic_angle = READANGLE(save_p);
|
||||||
|
if (diff2 & SD_CEILANG)
|
||||||
|
sectors[i].ceilingpic_angle = READANGLE(save_p);
|
||||||
|
if (diff2 & SD_TAG)
|
||||||
|
sectors[i].tag = READINT16(save_p); // DON'T use P_ChangeSectorTag
|
||||||
|
if (diff3 & SD_TAGLIST)
|
||||||
|
{
|
||||||
|
sectors[i].firsttag = READINT32(save_p);
|
||||||
|
sectors[i].nexttag = READINT32(save_p);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (diff3 & SD_COLORMAP)
|
||||||
|
sectors[i].extra_colormap = GetNetColormapFromList(READUINT32(save_p));
|
||||||
|
if (diff3 & SD_CRUMBLESTATE)
|
||||||
|
sectors[i].crumblestate = READINT32(save_p);
|
||||||
|
|
||||||
|
if (diff & SD_FFLOORS)
|
||||||
|
UnArchiveFFloors(§ors[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ArchiveLines(void)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
const line_t *li = lines;
|
||||||
|
const line_t *spawnli = spawnlines;
|
||||||
|
const side_t *si;
|
||||||
|
const side_t *spawnsi;
|
||||||
|
UINT8 diff, diff2; // no diff3
|
||||||
|
|
||||||
// do lines
|
|
||||||
for (i = 0; i < numlines; i++, spawnli++, li++)
|
for (i = 0; i < numlines; i++, spawnli++, li++)
|
||||||
{
|
{
|
||||||
diff = diff2 = diff3 = 0;
|
diff = diff2 = 0;
|
||||||
|
|
||||||
if (li->special != spawnli->special)
|
if (li->special != spawnli->special)
|
||||||
diff |= LD_SPECIAL;
|
diff |= LD_SPECIAL;
|
||||||
|
|
@ -983,43 +1097,107 @@ static void P_NetArchiveWorld(void)
|
||||||
|
|
||||||
if (diff)
|
if (diff)
|
||||||
{
|
{
|
||||||
statline++;
|
WRITEINT16(save_p, i);
|
||||||
WRITEINT16(put, i);
|
WRITEUINT8(save_p, diff);
|
||||||
WRITEUINT8(put, diff);
|
|
||||||
if (diff & LD_DIFF2)
|
if (diff & LD_DIFF2)
|
||||||
WRITEUINT8(put, diff2);
|
WRITEUINT8(save_p, diff2);
|
||||||
if (diff & LD_FLAG)
|
if (diff & LD_FLAG)
|
||||||
WRITEINT16(put, li->flags);
|
WRITEINT16(save_p, li->flags);
|
||||||
if (diff & LD_SPECIAL)
|
if (diff & LD_SPECIAL)
|
||||||
WRITEINT16(put, li->special);
|
WRITEINT16(save_p, li->special);
|
||||||
if (diff & LD_CLLCOUNT)
|
if (diff & LD_CLLCOUNT)
|
||||||
WRITEINT16(put, li->callcount);
|
WRITEINT16(save_p, li->callcount);
|
||||||
|
|
||||||
si = &sides[li->sidenum[0]];
|
si = &sides[li->sidenum[0]];
|
||||||
if (diff & LD_S1TEXOFF)
|
if (diff & LD_S1TEXOFF)
|
||||||
WRITEFIXED(put, si->textureoffset);
|
WRITEFIXED(save_p, si->textureoffset);
|
||||||
if (diff & LD_S1TOPTEX)
|
if (diff & LD_S1TOPTEX)
|
||||||
WRITEINT32(put, si->toptexture);
|
WRITEINT32(save_p, si->toptexture);
|
||||||
if (diff & LD_S1BOTTEX)
|
if (diff & LD_S1BOTTEX)
|
||||||
WRITEINT32(put, si->bottomtexture);
|
WRITEINT32(save_p, si->bottomtexture);
|
||||||
if (diff & LD_S1MIDTEX)
|
if (diff & LD_S1MIDTEX)
|
||||||
WRITEINT32(put, si->midtexture);
|
WRITEINT32(save_p, si->midtexture);
|
||||||
|
|
||||||
si = &sides[li->sidenum[1]];
|
si = &sides[li->sidenum[1]];
|
||||||
if (diff2 & LD_S2TEXOFF)
|
if (diff2 & LD_S2TEXOFF)
|
||||||
WRITEFIXED(put, si->textureoffset);
|
WRITEFIXED(save_p, si->textureoffset);
|
||||||
if (diff2 & LD_S2TOPTEX)
|
if (diff2 & LD_S2TOPTEX)
|
||||||
WRITEINT32(put, si->toptexture);
|
WRITEINT32(save_p, si->toptexture);
|
||||||
if (diff2 & LD_S2BOTTEX)
|
if (diff2 & LD_S2BOTTEX)
|
||||||
WRITEINT32(put, si->bottomtexture);
|
WRITEINT32(save_p, si->bottomtexture);
|
||||||
if (diff2 & LD_S2MIDTEX)
|
if (diff2 & LD_S2MIDTEX)
|
||||||
WRITEINT32(put, si->midtexture);
|
WRITEINT32(save_p, si->midtexture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
WRITEUINT16(put, 0xffff);
|
WRITEUINT16(save_p, 0xffff);
|
||||||
R_ClearTextureNumCache(false);
|
}
|
||||||
|
|
||||||
save_p = put;
|
static void UnArchiveLines(void)
|
||||||
|
{
|
||||||
|
UINT16 i;
|
||||||
|
line_t *li;
|
||||||
|
side_t *si;
|
||||||
|
UINT8 diff, diff2; // no diff3
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
i = READUINT16(save_p);
|
||||||
|
|
||||||
|
if (i == 0xffff)
|
||||||
|
break;
|
||||||
|
if (i > numlines)
|
||||||
|
I_Error("Invalid line number %u from server", i);
|
||||||
|
|
||||||
|
diff = READUINT8(save_p);
|
||||||
|
li = &lines[i];
|
||||||
|
|
||||||
|
if (diff & LD_DIFF2)
|
||||||
|
diff2 = READUINT8(save_p);
|
||||||
|
else
|
||||||
|
diff2 = 0;
|
||||||
|
|
||||||
|
if (diff & LD_FLAG)
|
||||||
|
li->flags = READINT16(save_p);
|
||||||
|
if (diff & LD_SPECIAL)
|
||||||
|
li->special = READINT16(save_p);
|
||||||
|
if (diff & LD_CLLCOUNT)
|
||||||
|
li->callcount = READINT16(save_p);
|
||||||
|
|
||||||
|
si = &sides[li->sidenum[0]];
|
||||||
|
if (diff & LD_S1TEXOFF)
|
||||||
|
si->textureoffset = READFIXED(save_p);
|
||||||
|
if (diff & LD_S1TOPTEX)
|
||||||
|
si->toptexture = READINT32(save_p);
|
||||||
|
if (diff & LD_S1BOTTEX)
|
||||||
|
si->bottomtexture = READINT32(save_p);
|
||||||
|
if (diff & LD_S1MIDTEX)
|
||||||
|
si->midtexture = READINT32(save_p);
|
||||||
|
|
||||||
|
si = &sides[li->sidenum[1]];
|
||||||
|
if (diff2 & LD_S2TEXOFF)
|
||||||
|
si->textureoffset = READFIXED(save_p);
|
||||||
|
if (diff2 & LD_S2TOPTEX)
|
||||||
|
si->toptexture = READINT32(save_p);
|
||||||
|
if (diff2 & LD_S2BOTTEX)
|
||||||
|
si->bottomtexture = READINT32(save_p);
|
||||||
|
if (diff2 & LD_S2MIDTEX)
|
||||||
|
si->midtexture = READINT32(save_p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// P_NetArchiveWorld
|
||||||
|
//
|
||||||
|
static void P_NetArchiveWorld(void)
|
||||||
|
{
|
||||||
|
// initialize colormap vars because paranoia
|
||||||
|
ClearNetColormaps();
|
||||||
|
|
||||||
|
WRITEUINT32(save_p, ARCHIVEBLOCK_WORLD);
|
||||||
|
|
||||||
|
ArchiveSectors();
|
||||||
|
ArchiveLines();
|
||||||
|
R_ClearTextureNumCache(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
@ -1028,10 +1206,6 @@ static void P_NetArchiveWorld(void)
|
||||||
static void P_NetUnArchiveWorld(void)
|
static void P_NetUnArchiveWorld(void)
|
||||||
{
|
{
|
||||||
UINT16 i;
|
UINT16 i;
|
||||||
line_t *li;
|
|
||||||
side_t *si;
|
|
||||||
UINT8 *get;
|
|
||||||
UINT8 diff, diff2, diff3;
|
|
||||||
|
|
||||||
if (READUINT32(save_p) != ARCHIVEBLOCK_WORLD)
|
if (READUINT32(save_p) != ARCHIVEBLOCK_WORLD)
|
||||||
I_Error("Bad $$$.sav at archive block World");
|
I_Error("Bad $$$.sav at archive block World");
|
||||||
|
|
@ -1047,161 +1221,8 @@ static void P_NetUnArchiveWorld(void)
|
||||||
num_ffloors++;
|
num_ffloors++;
|
||||||
}
|
}
|
||||||
|
|
||||||
get = save_p;
|
UnArchiveSectors();
|
||||||
|
UnArchiveLines();
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
i = READUINT16(get);
|
|
||||||
|
|
||||||
if (i == 0xffff)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (i > numsectors)
|
|
||||||
I_Error("Invalid sector number %u from server (expected end at %s)", i, sizeu1(numsectors));
|
|
||||||
|
|
||||||
diff = READUINT8(get);
|
|
||||||
if (diff & SD_DIFF2)
|
|
||||||
diff2 = READUINT8(get);
|
|
||||||
else
|
|
||||||
diff2 = 0;
|
|
||||||
if (diff2 & SD_DIFF3)
|
|
||||||
diff3 = READUINT8(get);
|
|
||||||
else
|
|
||||||
diff3 = 0;
|
|
||||||
|
|
||||||
if (diff & SD_FLOORHT)
|
|
||||||
sectors[i].floorheight = READFIXED(get);
|
|
||||||
if (diff & SD_CEILHT)
|
|
||||||
sectors[i].ceilingheight = READFIXED(get);
|
|
||||||
if (diff & SD_FLOORPIC)
|
|
||||||
{
|
|
||||||
sectors[i].floorpic = P_AddLevelFlatRuntime((char *)get);
|
|
||||||
get += 8;
|
|
||||||
}
|
|
||||||
if (diff & SD_CEILPIC)
|
|
||||||
{
|
|
||||||
sectors[i].ceilingpic = P_AddLevelFlatRuntime((char *)get);
|
|
||||||
get += 8;
|
|
||||||
}
|
|
||||||
if (diff & SD_LIGHT)
|
|
||||||
sectors[i].lightlevel = READINT16(get);
|
|
||||||
if (diff & SD_SPECIAL)
|
|
||||||
sectors[i].special = READINT16(get);
|
|
||||||
|
|
||||||
if (diff2 & SD_FXOFFS)
|
|
||||||
sectors[i].floor_xoffs = READFIXED(get);
|
|
||||||
if (diff2 & SD_FYOFFS)
|
|
||||||
sectors[i].floor_yoffs = READFIXED(get);
|
|
||||||
if (diff2 & SD_CXOFFS)
|
|
||||||
sectors[i].ceiling_xoffs = READFIXED(get);
|
|
||||||
if (diff2 & SD_CYOFFS)
|
|
||||||
sectors[i].ceiling_yoffs = READFIXED(get);
|
|
||||||
if (diff2 & SD_FLOORANG)
|
|
||||||
sectors[i].floorpic_angle = READANGLE(get);
|
|
||||||
if (diff2 & SD_CEILANG)
|
|
||||||
sectors[i].ceilingpic_angle = READANGLE(get);
|
|
||||||
if (diff2 & SD_TAG)
|
|
||||||
sectors[i].tag = READINT16(get); // DON'T use P_ChangeSectorTag
|
|
||||||
if (diff3 & SD_TAGLIST)
|
|
||||||
{
|
|
||||||
sectors[i].firsttag = READINT32(get);
|
|
||||||
sectors[i].nexttag = READINT32(get);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (diff3 & SD_COLORMAP)
|
|
||||||
sectors[i].extra_colormap = GetNetColormapFromList(READUINT32(get));
|
|
||||||
if (diff3 & SD_CRUMBLESTATE)
|
|
||||||
sectors[i].crumblestate = READINT32(get);
|
|
||||||
|
|
||||||
if (diff & SD_FFLOORS)
|
|
||||||
{
|
|
||||||
UINT16 j = 0; // number of current ffloor in loop
|
|
||||||
UINT16 fflr_i; // saved ffloor "number" of next modified ffloor
|
|
||||||
UINT16 fflr_diff; // saved ffloor diff
|
|
||||||
ffloor_t *rover;
|
|
||||||
|
|
||||||
rover = sectors[i].ffloors;
|
|
||||||
if (!rover) // it is assumed sectors[i].ffloors actually exists, but just in case...
|
|
||||||
I_Error("Sector does not have any ffloors!");
|
|
||||||
|
|
||||||
fflr_i = READUINT16(get); // get first modified ffloor's number ready
|
|
||||||
for (;;) // for some reason the usual for (rover = x; ...) thing doesn't work here?
|
|
||||||
{
|
|
||||||
if (fflr_i == 0xffff) // end of modified ffloors list, let's stop already
|
|
||||||
break;
|
|
||||||
// should NEVER need to be checked
|
|
||||||
//if (rover == NULL)
|
|
||||||
//break;
|
|
||||||
if (j != fflr_i) // this ffloor was not modified
|
|
||||||
{
|
|
||||||
j++;
|
|
||||||
rover = rover->next;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
fflr_diff = READUINT8(get);
|
|
||||||
|
|
||||||
if (fflr_diff & 1)
|
|
||||||
rover->flags = READUINT32(get);
|
|
||||||
if (fflr_diff & 2)
|
|
||||||
rover->alpha = READINT16(get);
|
|
||||||
|
|
||||||
fflr_i = READUINT16(get); // get next ffloor "number" ready
|
|
||||||
|
|
||||||
j++;
|
|
||||||
rover = rover->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
i = READUINT16(get);
|
|
||||||
|
|
||||||
if (i == 0xffff)
|
|
||||||
break;
|
|
||||||
if (i > numlines)
|
|
||||||
I_Error("Invalid line number %u from server", i);
|
|
||||||
|
|
||||||
diff = READUINT8(get);
|
|
||||||
li = &lines[i];
|
|
||||||
|
|
||||||
if (diff & LD_DIFF2)
|
|
||||||
diff2 = READUINT8(get);
|
|
||||||
else
|
|
||||||
diff2 = 0;
|
|
||||||
|
|
||||||
diff3 = 0;
|
|
||||||
|
|
||||||
if (diff & LD_FLAG)
|
|
||||||
li->flags = READINT16(get);
|
|
||||||
if (diff & LD_SPECIAL)
|
|
||||||
li->special = READINT16(get);
|
|
||||||
if (diff & LD_CLLCOUNT)
|
|
||||||
li->callcount = READINT16(get);
|
|
||||||
|
|
||||||
si = &sides[li->sidenum[0]];
|
|
||||||
if (diff & LD_S1TEXOFF)
|
|
||||||
si->textureoffset = READFIXED(get);
|
|
||||||
if (diff & LD_S1TOPTEX)
|
|
||||||
si->toptexture = READINT32(get);
|
|
||||||
if (diff & LD_S1BOTTEX)
|
|
||||||
si->bottomtexture = READINT32(get);
|
|
||||||
if (diff & LD_S1MIDTEX)
|
|
||||||
si->midtexture = READINT32(get);
|
|
||||||
|
|
||||||
si = &sides[li->sidenum[1]];
|
|
||||||
if (diff2 & LD_S2TEXOFF)
|
|
||||||
si->textureoffset = READFIXED(get);
|
|
||||||
if (diff2 & LD_S2TOPTEX)
|
|
||||||
si->toptexture = READINT32(get);
|
|
||||||
if (diff2 & LD_S2BOTTEX)
|
|
||||||
si->bottomtexture = READINT32(get);
|
|
||||||
if (diff2 & LD_S2MIDTEX)
|
|
||||||
si->midtexture = READINT32(get);
|
|
||||||
}
|
|
||||||
|
|
||||||
save_p = get;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
@ -1497,42 +1518,14 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type)
|
||||||
|
|
||||||
if (diff2 & MD2_FLOORROVER)
|
if (diff2 & MD2_FLOORROVER)
|
||||||
{
|
{
|
||||||
ffloor_t *rover;
|
WRITEUINT32(save_p, SaveSector(mobj->floorrover->target));
|
||||||
size_t i = 0;
|
WRITEUINT16(save_p, P_GetFFloorID(mobj->floorrover));
|
||||||
UINT32 roverindex = 0;
|
|
||||||
|
|
||||||
for (rover = mobj->floorrover->target->ffloors; rover; rover = rover->next)
|
|
||||||
{
|
|
||||||
if (rover == mobj->floorrover)
|
|
||||||
{
|
|
||||||
roverindex = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
WRITEUINT32(save_p, (UINT32)(mobj->floorrover->target - sectors));
|
|
||||||
WRITEUINT32(save_p, rover ? roverindex : i); // store max index to denote invalid ffloor ref
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (diff2 & MD2_CEILINGROVER)
|
if (diff2 & MD2_CEILINGROVER)
|
||||||
{
|
{
|
||||||
ffloor_t *rover;
|
WRITEUINT32(save_p, SaveSector(mobj->ceilingrover->target));
|
||||||
size_t i = 0;
|
WRITEUINT16(save_p, P_GetFFloorID(mobj->ceilingrover));
|
||||||
UINT32 roverindex = 0;
|
|
||||||
|
|
||||||
for (rover = mobj->ceilingrover->target->ffloors; rover; rover = rover->next)
|
|
||||||
{
|
|
||||||
if (rover == mobj->ceilingrover)
|
|
||||||
{
|
|
||||||
roverindex = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
WRITEUINT32(save_p, (UINT32)(mobj->ceilingrover->target - sectors));
|
|
||||||
WRITEUINT32(save_p, rover ? roverindex : i); // store max index to denote invalid ffloor ref
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (diff & MD_SPAWNPOINT)
|
if (diff & MD_SPAWNPOINT)
|
||||||
|
|
@ -2613,34 +2606,16 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
|
||||||
|
|
||||||
if (diff2 & MD2_FLOORROVER)
|
if (diff2 & MD2_FLOORROVER)
|
||||||
{
|
{
|
||||||
size_t floor_sectornum = (size_t)READUINT32(save_p);
|
sector_t *sec = LoadSector(READUINT32(save_p));
|
||||||
size_t floor_rovernum = (size_t)READUINT32(save_p);
|
UINT16 id = READUINT16(save_p);
|
||||||
ffloor_t *rover = NULL;
|
floorrover = P_GetFFloorByID(sec, id);
|
||||||
size_t rovernum = 0;
|
|
||||||
|
|
||||||
for (rover = sectors[floor_sectornum].ffloors; rover; rover = rover->next)
|
|
||||||
{
|
|
||||||
if (rovernum == floor_rovernum)
|
|
||||||
break;
|
|
||||||
rovernum++;
|
|
||||||
}
|
|
||||||
floorrover = rover;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (diff2 & MD2_CEILINGROVER)
|
if (diff2 & MD2_CEILINGROVER)
|
||||||
{
|
{
|
||||||
size_t ceiling_sectornum = (size_t)READUINT32(save_p);
|
sector_t *sec = LoadSector(READUINT32(save_p));
|
||||||
size_t ceiling_rovernum = (size_t)READUINT32(save_p);
|
UINT16 id = READUINT16(save_p);
|
||||||
ffloor_t *rover = NULL;
|
ceilingrover = P_GetFFloorByID(sec, id);
|
||||||
size_t rovernum = 0;
|
|
||||||
|
|
||||||
for (rover = sectors[ceiling_sectornum].ffloors; rover; rover = rover->next)
|
|
||||||
{
|
|
||||||
if (rovernum == ceiling_rovernum)
|
|
||||||
break;
|
|
||||||
rovernum++;
|
|
||||||
}
|
|
||||||
ceilingrover = rover;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (diff & MD_SPAWNPOINT)
|
if (diff & MD_SPAWNPOINT)
|
||||||
|
|
|
||||||
31
src/p_spec.c
31
src/p_spec.c
|
|
@ -5678,6 +5678,35 @@ void P_UpdateSpecials(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Floor over floors (FOFs), 3Dfloors, 3Dblocks, fake floors (ffloors), rovers, or whatever you want to call them
|
||||||
|
//
|
||||||
|
|
||||||
|
/** Gets the ID number for a 3Dfloor in its target sector.
|
||||||
|
*
|
||||||
|
* \param fflr The 3Dfloor we want an ID for.
|
||||||
|
* \return ID of 3Dfloor in target sector. Note that the first FOF's ID is 0. UINT16_MAX is given if invalid.
|
||||||
|
* \sa P_GetFFloorByID
|
||||||
|
*/
|
||||||
|
UINT16 P_GetFFloorID(ffloor_t *fflr)
|
||||||
|
{
|
||||||
|
ffloor_t *rover;
|
||||||
|
sector_t *sec;
|
||||||
|
UINT16 i = 0;
|
||||||
|
|
||||||
|
if (!fflr)
|
||||||
|
return UINT16_MAX;
|
||||||
|
|
||||||
|
sec = fflr->target;
|
||||||
|
|
||||||
|
if (!sec->ffloors)
|
||||||
|
return UINT16_MAX;
|
||||||
|
for (rover = sec->ffloors; rover; rover = rover->next, i++)
|
||||||
|
if (rover == fflr)
|
||||||
|
return i;
|
||||||
|
return UINT16_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
/** Gets a 3Dfloor by control sector.
|
/** Gets a 3Dfloor by control sector.
|
||||||
*
|
*
|
||||||
* \param sec Target sector.
|
* \param sec Target sector.
|
||||||
|
|
@ -5702,7 +5731,7 @@ static inline ffloor_t *P_GetFFloorBySec(sector_t *sec, sector_t *sec2)
|
||||||
* \param sec Target sector.
|
* \param sec Target sector.
|
||||||
* \param id ID of 3Dfloor in target sector. Note that the first FOF's ID is 0.
|
* \param id ID of 3Dfloor in target sector. Note that the first FOF's ID is 0.
|
||||||
* \return Pointer to found 3Dfloor, or NULL.
|
* \return Pointer to found 3Dfloor, or NULL.
|
||||||
* \sa P_GetFFloorBySec
|
* \sa P_GetFFloorBySec, P_GetFFloorID
|
||||||
*/
|
*/
|
||||||
ffloor_t *P_GetFFloorByID(sector_t *sec, UINT16 id)
|
ffloor_t *P_GetFFloorByID(sector_t *sec, UINT16 id)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -74,6 +74,7 @@ void P_RunDeNightserizeExecutors(mobj_t *actor);
|
||||||
void P_RunNightsLapExecutors(mobj_t *actor);
|
void P_RunNightsLapExecutors(mobj_t *actor);
|
||||||
void P_RunNightsCapsuleTouchExecutors(mobj_t *actor, boolean entering, boolean enoughspheres);
|
void P_RunNightsCapsuleTouchExecutors(mobj_t *actor, boolean entering, boolean enoughspheres);
|
||||||
|
|
||||||
|
UINT16 P_GetFFloorID(ffloor_t *fflr);
|
||||||
ffloor_t *P_GetFFloorByID(sector_t *sec, UINT16 id);
|
ffloor_t *P_GetFFloorByID(sector_t *sec, UINT16 id);
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue