mirror of
https://github.com/ZDoom/Raze.git
synced 2025-05-31 01:11:15 +00:00
- separate map loading from actor spawning for the other games, too.
It still uses the horribly messed up original spawn logic, though.
This commit is contained in:
parent
a3493048e7
commit
6600f55543
8 changed files with 38 additions and 27 deletions
|
@ -355,10 +355,12 @@ struct SpawnSpriteDef
|
||||||
TArray<spriteext_t> sprext;
|
TArray<spriteext_t> sprext;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
[[deprecated]]
|
||||||
|
void insertAllSprites(SpawnSpriteDef& sprites);
|
||||||
|
|
||||||
void allocateMapArrays(int numsprites);
|
void allocateMapArrays(int numsprites);
|
||||||
void ValidateSprite(spritetype& spr);
|
void ValidateSprite(spritetype& spr);
|
||||||
void engineLoadBoard(const char *filename, int flags, vec3_t *dapos, int16_t *daang, int *dacursectnum);
|
void engineLoadBoard(const char *filename, int flags, vec3_t *dapos, int16_t *daang, int *dacursectnum, SpawnSpriteDef& sprites);
|
||||||
void loadMapBackup(const char* filename);
|
void loadMapBackup(const char* filename);
|
||||||
void G_LoadMapHack(const char* filename, const unsigned char*, SpawnSpriteDef& sprites);
|
void G_LoadMapHack(const char* filename, const unsigned char*, SpawnSpriteDef& sprites);
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#include "printf.h"
|
#include "printf.h"
|
||||||
#include "inputstate.h"
|
#include "inputstate.h"
|
||||||
#include "md4.h"
|
#include "md4.h"
|
||||||
|
#include "coreactor.h"
|
||||||
#include "gamecontrol.h"
|
#include "gamecontrol.h"
|
||||||
#include "gamefuncs.h"
|
#include "gamefuncs.h"
|
||||||
#include "sectorgeometry.h"
|
#include "sectorgeometry.h"
|
||||||
|
@ -364,15 +365,21 @@ static void ReadSpriteV5(FileReader& fr, spritetype& spr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void insertAllSprites(const char* filename, const vec3_t* pos, int* cursectnum, int16_t numsprites)
|
void insertAllSprites(SpawnSpriteDef& sprites)
|
||||||
{
|
{
|
||||||
// This function is stupid because it exploits side effects of insertsprite and should be redone by only inserting the valid sprites.
|
// This function is stupid because it exploits side effects of insertsprite and should be redone by only inserting the valid sprites.
|
||||||
int i, realnumsprites = numsprites;
|
int i, realnumsprites = sprites.sprites.Size();
|
||||||
|
int numsprites = realnumsprites;
|
||||||
|
|
||||||
for (i = 0; i < numsprites; i++)
|
for (i = 0; i < numsprites; i++)
|
||||||
{
|
{
|
||||||
|
auto actor = actorArray[i];
|
||||||
bool removeit = false;
|
bool removeit = false;
|
||||||
auto& spr = sprite[i];
|
auto& spr = actor->s();
|
||||||
|
spr = sprites.sprites[i];
|
||||||
|
if (sprites.sprext.Size()) actor->sx() = sprites.sprext[i];
|
||||||
|
else actor->sx() = {};
|
||||||
|
actor->sm() = {};
|
||||||
|
|
||||||
if (spr.statnum == MAXSTATUS)
|
if (spr.statnum == MAXSTATUS)
|
||||||
{
|
{
|
||||||
|
@ -384,7 +391,7 @@ static void insertAllSprites(const char* filename, const vec3_t* pos, int* curse
|
||||||
|
|
||||||
if (removeit)
|
if (removeit)
|
||||||
{
|
{
|
||||||
sprite[i].statnum = MAXSTATUS;
|
spr.statnum = MAXSTATUS;
|
||||||
realnumsprites--;
|
realnumsprites--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -392,12 +399,17 @@ static void insertAllSprites(const char* filename, const vec3_t* pos, int* curse
|
||||||
if (numsprites != realnumsprites)
|
if (numsprites != realnumsprites)
|
||||||
{
|
{
|
||||||
for (i = 0; i < numsprites; i++)
|
for (i = 0; i < numsprites; i++)
|
||||||
if (sprite[i].statnum == MAXSTATUS)
|
{
|
||||||
|
auto actor = actorArray[i];
|
||||||
|
auto& spr = actor->s();
|
||||||
|
|
||||||
|
if (spr.statnum == MAXSTATUS)
|
||||||
{
|
{
|
||||||
// Now remove it for real!
|
// Now remove it for real!
|
||||||
sprite[i].statnum = 0;
|
spr.statnum = 0;
|
||||||
deletesprite(i);
|
deletesprite(i);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(realnumsprites == Numsprites);
|
assert(realnumsprites == Numsprites);
|
||||||
|
@ -427,9 +439,8 @@ void allocateMapArrays(int numsprites)
|
||||||
Polymost::Polymost_prepare_loadboard();
|
Polymost::Polymost_prepare_loadboard();
|
||||||
}
|
}
|
||||||
|
|
||||||
void engineLoadBoard(const char* filename, int flags, vec3_t* pos, int16_t* ang, int* cursectnum)
|
void engineLoadBoard(const char* filename, int flags, vec3_t* pos, int16_t* ang, int* cursectnum, SpawnSpriteDef& sprites)
|
||||||
{
|
{
|
||||||
SpawnSpriteDef sprites;
|
|
||||||
inputState.ClearAllInput();
|
inputState.ClearAllInput();
|
||||||
|
|
||||||
FileReader fr = fileSystem.OpenFileReader(filename);
|
FileReader fr = fileSystem.OpenFileReader(filename);
|
||||||
|
@ -495,19 +506,14 @@ void engineLoadBoard(const char* filename, int flags, vec3_t* pos, int16_t* ang,
|
||||||
{
|
{
|
||||||
switch (mapversion)
|
switch (mapversion)
|
||||||
{
|
{
|
||||||
case 5: ReadSpriteV5(fr, sprite[i]); break;
|
case 5: ReadSpriteV5(fr, sprites.sprites[i]); break;
|
||||||
case 6: ReadSpriteV6(fr, sprite[i]); break;
|
case 6: ReadSpriteV6(fr, sprites.sprites[i]); break;
|
||||||
default: ReadSpriteV7(fr, sprite[i]); break;
|
default: ReadSpriteV7(fr, sprites.sprites[i]); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
artSetupMapArt(filename);
|
artSetupMapArt(filename);
|
||||||
insertAllSprites(filename, pos, cursectnum, numsprites);
|
|
||||||
|
|
||||||
for (int i = 0; i < numsprites; i++)
|
|
||||||
{
|
|
||||||
if ((sprite[i].cstat & 48) == 48) sprite[i].cstat &= ~48;
|
|
||||||
}
|
|
||||||
//Must be last.
|
//Must be last.
|
||||||
updatesector(pos->x, pos->y, cursectnum);
|
updatesector(pos->x, pos->y, cursectnum);
|
||||||
guniqhudid = 0;
|
guniqhudid = 0;
|
||||||
|
@ -535,6 +541,7 @@ void loadMapBackup(const char* filename)
|
||||||
vec3_t pos;
|
vec3_t pos;
|
||||||
int16_t scratch;
|
int16_t scratch;
|
||||||
int scratch2;
|
int scratch2;
|
||||||
|
SpawnSpriteDef scratch3;
|
||||||
|
|
||||||
if (isBlood())
|
if (isBlood())
|
||||||
{
|
{
|
||||||
|
@ -542,7 +549,7 @@ void loadMapBackup(const char* filename)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
engineLoadBoard(filename, 0, &pos, &scratch, &scratch2);
|
engineLoadBoard(filename, 0, &pos, &scratch, &scratch2, scratch3);
|
||||||
initspritelists();
|
initspritelists();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -238,10 +238,6 @@ int ChangeSpriteStat(int nSprite, int nStatus)
|
||||||
void dbInit(void)
|
void dbInit(void)
|
||||||
{
|
{
|
||||||
initspritelists();
|
initspritelists();
|
||||||
for (int i = 0; i < kMaxSprites; i++)
|
|
||||||
{
|
|
||||||
sprite[i].cstat = 128;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool drawtile2048, encrypted;
|
bool drawtile2048, encrypted;
|
||||||
|
|
|
@ -945,7 +945,8 @@ static int LoadTheMap(MapRecord *mi, struct player_struct *p, int gamemode)
|
||||||
|
|
||||||
currentLevel = mi;
|
currentLevel = mi;
|
||||||
int sect;
|
int sect;
|
||||||
engineLoadBoard(mi->fileName, isShareware(), &p->pos, &lbang, §);
|
SpawnSpriteDef sprites;
|
||||||
|
engineLoadBoard(mi->fileName, isShareware(), &p->pos, &lbang, §, sprites);
|
||||||
p->cursector = §or[sect];
|
p->cursector = §or[sect];
|
||||||
|
|
||||||
SECRET_SetMapName(mi->DisplayName(), mi->name);
|
SECRET_SetMapName(mi->DisplayName(), mi->name);
|
||||||
|
@ -954,6 +955,8 @@ static int LoadTheMap(MapRecord *mi, struct player_struct *p, int gamemode)
|
||||||
p->angle.ang = buildang(lbang);
|
p->angle.ang = buildang(lbang);
|
||||||
|
|
||||||
memset(gotpic, 0, sizeof(gotpic));
|
memset(gotpic, 0, sizeof(gotpic));
|
||||||
|
|
||||||
|
insertAllSprites(sprites);
|
||||||
|
|
||||||
if (isRR()) prelevel_r(gamemode);
|
if (isRR()) prelevel_r(gamemode);
|
||||||
else prelevel_d(gamemode);
|
else prelevel_d(gamemode);
|
||||||
|
|
|
@ -118,11 +118,13 @@ uint8_t LoadLevel(MapRecord* map)
|
||||||
|
|
||||||
vec3_t startPos;
|
vec3_t startPos;
|
||||||
int initsect;
|
int initsect;
|
||||||
engineLoadBoard(currentLevel->fileName, 0, &startPos, &inita, &initsect);
|
SpawnSpriteDef spawned;
|
||||||
|
engineLoadBoard(currentLevel->fileName, 0, &startPos, &inita, &initsect, spawned);
|
||||||
initx = startPos.x;
|
initx = startPos.x;
|
||||||
inity = startPos.y;
|
inity = startPos.y;
|
||||||
initz = startPos.z;
|
initz = startPos.z;
|
||||||
initsectp = §or[initsect];
|
initsectp = §or[initsect];
|
||||||
|
insertAllSprites(spawned);
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
|
|
@ -2565,7 +2565,7 @@ void PostProcess()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ExhumedLinearSpriteIterator it;
|
ExhumedSpriteIterator it;
|
||||||
while (auto act = it.Next())
|
while (auto act = it.Next())
|
||||||
{
|
{
|
||||||
auto spr = &act->s();
|
auto spr = &act->s();
|
||||||
|
|
|
@ -328,7 +328,9 @@ void InitLevel(MapRecord *maprec)
|
||||||
int16_t ang;
|
int16_t ang;
|
||||||
currentLevel = maprec;
|
currentLevel = maprec;
|
||||||
int cursect;
|
int cursect;
|
||||||
engineLoadBoard(maprec->fileName, SW_SHAREWARE ? 1 : 0, &Player[0].pos, &ang, &cursect);
|
SpawnSpriteDef sprites;
|
||||||
|
engineLoadBoard(maprec->fileName, SW_SHAREWARE ? 1 : 0, &Player[0].pos, &ang, &cursect, sprites);
|
||||||
|
insertAllSprites(sprites);
|
||||||
Player[0].cursector = §or[cursect];
|
Player[0].cursector = §or[cursect];
|
||||||
|
|
||||||
SECRET_SetMapName(currentLevel->DisplayName(), currentLevel->name);
|
SECRET_SetMapName(currentLevel->DisplayName(), currentLevel->name);
|
||||||
|
|
|
@ -52,7 +52,6 @@ inline DSWActor* DSWActor::base() { return swActors; }
|
||||||
using SWStatIterator = TStatIterator<DSWActor>;
|
using SWStatIterator = TStatIterator<DSWActor>;
|
||||||
using SWSectIterator = TSectIterator<DSWActor>;
|
using SWSectIterator = TSectIterator<DSWActor>;
|
||||||
using SWSpriteIterator = TSpriteIterator<DSWActor>;
|
using SWSpriteIterator = TSpriteIterator<DSWActor>;
|
||||||
using SWLinearSpriteIterator = TLinearSpriteIterator<DSWActor>;
|
|
||||||
|
|
||||||
|
|
||||||
inline FSerializer& Serialize(FSerializer& arc, const char* keyname, DSWActor*& w, DSWActor** def)
|
inline FSerializer& Serialize(FSerializer& arc, const char* keyname, DSWActor*& w, DSWActor** def)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue