- moved implementation of 'animtilerange' into buildtiles.cpp.

This commit is contained in:
Christoph Oelckers 2020-09-16 00:21:17 +02:00
parent 616838dd0a
commit 5c777eeb38
3 changed files with 53 additions and 45 deletions

View file

@ -607,44 +607,12 @@ static int32_t defsparser(scriptfile *script)
break;
case T_ANIMTILERANGE:
{
int32_t tile1, tile2, spd, type;
if (scriptfile_getsymbol(script,&tile1)) break;
if (scriptfile_getsymbol(script,&tile2)) break;
if (scriptfile_getsymbol(script,&spd)) break;
if (scriptfile_getsymbol(script,&type)) break;
if (check_tile("animtilerange", tile1, script, pos))
break;
if (check_tile("animtilerange", tile2, script, pos))
break;
spd = clamp(spd, 0, 15);
if (type&~3)
{
pos.Message(MSG_ERROR, "animtilerange: animation type must be 0, 1, 2 or 3");
break;
}
int32_t num = tile2-tile1;
if (type == 3 && tile1 > tile2) // PICANM_ANIMTYPE_BACK
num = -num;
if ((unsigned)num > 255)
{
pos.Message(MSG_ERROR, "animtilerange: tile difference can be at most 255");
break;
}
// set anim speed
picanm[tile1].sf &= ~PICANM_ANIMSPEED_MASK;
picanm[tile1].sf |= spd;
// set anim type
picanm[tile1].sf &= ~PICANM_ANIMTYPE_MASK;
picanm[tile1].sf |= type<<PICANM_ANIMTYPE_SHIFT;
// set anim number
picanm[tile1].num = num;
SetAnim set;
if (scriptfile_getsymbol(script,&set.tile1)) break;
if (scriptfile_getsymbol(script,&set.tile2)) break;
if (scriptfile_getsymbol(script,&set.speed)) break;
if (scriptfile_getsymbol(script,&set.type)) break;
processSetAnim("animtilerange", pos, set);
break;
}
case T_TILEFROMTEXTURE:
@ -867,10 +835,6 @@ static int32_t defsparser(scriptfile *script)
break;
int32_t const texstatus = tileImportFromTexture(fn, tile, 255, 0);
if (texstatus == -3)
pos.Message(MSG_ERROR, "No palette loaded, in importtile definition");
if (texstatus == -(3<<8))
pos.Message(MSG_ERROR, "\"%s\" has more than one tile, in importtile definition", fn.GetChars());
if (texstatus < 0)
break;

View file

@ -1081,7 +1081,7 @@ bool PickTexture(int picnum, FGameTexture* tex, int paletteid, TexturePick& pick
//
//===========================================================================
bool ValidateTileRange(const char* cmd, int &begin, int& end, FScriptPosition pos)
bool ValidateTileRange(const char* cmd, int &begin, int& end, FScriptPosition pos, bool allowswap)
{
if (end < begin)
{
@ -1142,5 +1142,30 @@ void processTileImport(const char *cmd, FScriptPosition& pos, TileImport& imp)
if (imp.extra != INT_MAX) TileFiles.tiledata[imp.tile].picanm.extra = imp.extra;
}
//===========================================================================
//
// Internal worker for tileSetAnim
//
//===========================================================================
void processSetAnim(const char* cmd, FScriptPosition& pos, SetAnim& imp)
{
if (!ValidateTilenum(cmd, imp.tile1, pos) ||
!ValidateTilenum(cmd, imp.tile2, pos))
return;
if (imp.type < 0 || imp.type > 3)
{
pos.Message(MSG_ERROR, "%s: animation type must be 0-3, got %d", cmd, imp.type);
return;
}
int count = imp.tile2 - imp.tile1;
if (imp.type == (PICANM_ANIMTYPE_BACK >> PICANM_ANIMTYPE_SHIFT) && imp.tile1 > imp.tile2)
count = -count;
TileFiles.setAnim(imp.tile1, imp.type, imp.speed, count);
}
TileSiz tilesiz;
PicAnm picanm;

View file

@ -51,7 +51,7 @@ enum class ReplacementType : int
// accordingly.
struct picanm_t
{
uint8_t num; // animate number
uint16_t num; // animate number
uint8_t sf; // anim. speed and flags
uint8_t extra;
@ -344,6 +344,15 @@ struct BuildTiles
}
}
void setAnim(int tile, int type, int speed, int frames)
{
auto& anm = tiledata[tile].picanm;
anm.sf &= ~(PICANM_ANIMTYPE_MASK | PICANM_ANIMSPEED_MASK);
anm.sf |= clamp(speed, 0, 15) | (type << PICANM_ANIMTYPE_SHIFT);
anm.num = frames;
}
FGameTexture* ValidateCustomTile(int tilenum, ReplacementType type);
int32_t artLoadFiles(const char* filename);
uint8_t* tileMakeWritable(int num);
@ -374,7 +383,6 @@ void tileRemoveReplacement(int tile);
bool tileLoad(int tileNum);
void artClearMapArt(void);
void artSetupMapArt(const char* filename);
void tileSetAnim(int tile, const picanm_t& anm);
int tileSetHightileReplacement(int picnum, int palnum, const char *filen, float alphacut, float xscale, float yscale, float specpower, float specfactor, uint8_t flags);
int tileSetSkybox(int picnum, int palnum, const char **facenames, int flags );
int tileDeleteReplacement(int picnum, int palnum);
@ -503,6 +511,10 @@ inline FGameTexture* tileGetTexture(int tile, bool animate = false)
bool PickTexture(int picnum, FGameTexture* tex, int paletteid, TexturePick& pick);
bool ValidateTileRange(const char* cmd, int& begin, int& end, FScriptPosition pos, bool allowswap = true);
bool ValidateTilenum(const char* cmd, int tile, FScriptPosition pos);
struct TileImport
{
FString fn;
@ -519,3 +531,10 @@ struct TileImport
};
void processTileImport(const char* cmd, FScriptPosition& pos, TileImport& imp);
struct SetAnim
{
int tile1, tile2, speed, type;
};
void processSetAnim(const char* cmd, FScriptPosition& pos, SetAnim& imp);