diff --git a/source/build/src/defs.cpp b/source/build/src/defs.cpp index 50b74a38d..9780286a9 100644 --- a/source/build/src/defs.cpp +++ b/source/build/src/defs.cpp @@ -389,90 +389,20 @@ static int32_t defsparser(scriptfile *script) parseCopyTile(*script, pos); break; case T_IMPORTTILE: - { - int32_t tile; - FString fn; - - if (scriptfile_getsymbol(script,&tile)) break; - if (scriptfile_getstring(script,&fn)) break; - - if (check_tile("importtile", tile, script, pos)) - break; - - int32_t const texstatus = tileImportFromTexture(fn, tile, 255, 0); - if (texstatus < 0) - break; - - picanm[tile] = {}; - + parseImportTile(*script, pos); break; - } case T_DUMMYTILE: - { - int32_t tile, xsiz, ysiz; - - if (scriptfile_getsymbol(script,&tile)) break; - if (scriptfile_getsymbol(script,&xsiz)) break; - if (scriptfile_getsymbol(script,&ysiz)) break; - - if (check_tile("dummytile", tile, script, pos)) - break; - - tileSetDummy(tile, xsiz, ysiz); - + parseDummyTile(*script, pos); break; - } case T_DUMMYTILERANGE: - { - int32_t tile1,tile2,xsiz,ysiz,i; - - if (scriptfile_getsymbol(script,&tile1)) break; - if (scriptfile_getsymbol(script,&tile2)) break; - if (scriptfile_getnumber(script,&xsiz)) break; - if (scriptfile_getnumber(script,&ysiz)) break; - - if (check_tile_range("dummytilerange", &tile1, &tile2, script, pos)) - break; - - if (xsiz < 0 || ysiz < 0) - break; // TODO: message - - for (i=tile1; i<=tile2; i++) - { - tileSetDummy(i, xsiz, ysiz); - } - + parseDummyTileRange(*script, pos); break; - } - case T_UNDEFINETILE: - { - int32_t tile; - - if (scriptfile_getsymbol(script,&tile)) break; - - if (check_tile("undefinetile", tile, script, pos)) - break; - - tileDelete(tile); - + parseUndefineTile(*script, pos); break; - } case T_UNDEFINETILERANGE: - { - int32_t tile1, tile2; - - if (scriptfile_getsymbol(script,&tile1)) break; - if (scriptfile_getsymbol(script,&tile2)) break; - - if (check_tile_range("undefinetilerange", &tile1, &tile2, script, pos)) - break; - - for (bssize_t i = tile1; i <= tile2; i++) - tileDelete(i); - + parseUndefineTileRange(*script, pos); break; - } case T_DEFINEMODEL: { diff --git a/source/core/mapinfo.cpp b/source/core/mapinfo.cpp index 609081f7f..5cdd2ee1d 100644 --- a/source/core/mapinfo.cpp +++ b/source/core/mapinfo.cpp @@ -46,7 +46,7 @@ FString gVolumeSubtitles[MAXVOLUMES]; int32_t gVolumeFlags[MAXVOLUMES]; int gDefaultVolume = 0, gDefaultSkill = 1; -MapRecord mapList[512]; // Due to how this gets used it needs to be static. EDuke defines 7 episode plus one spare episode with 64 potential levels each and relies on the static array which is freely accessible by scripts. +MapRecord mapList[512]; MapRecord *currentLevel; // level that is currently played. (The real level, not what script hacks modfifying the current level index can pretend.) MapRecord* lastLevel; // Same here, for the last level. unsigned int numUsedSlots; diff --git a/source/core/parsefuncs.h b/source/core/parsefuncs.h index a25527026..eedcf7fa4 100644 --- a/source/core/parsefuncs.h +++ b/source/core/parsefuncs.h @@ -317,6 +317,93 @@ void parseCopyTile(FScanner& sc, FScriptPosition& pos) // //=========================================================================== +void parseImportTile(FScanner& sc, FScriptPosition& pos) +{ + int tile; + + if (!sc.GetNumber(tile, true)) return; + if (!sc.GetString()) return; + if (!ValidateTilenum("importtile", tile, pos)) return; + + int texstatus = tileImportFromTexture(sc.String, tile, 255, 0); + if (texstatus >= 0) TileFiles.tiledata[tile].picanm = {}; +} + +//=========================================================================== +// +// +// +//=========================================================================== + +void parseDummyTile(FScanner& sc, FScriptPosition& pos) +{ + int tile, xsiz, ysiz; + + if (!sc.GetNumber(tile, true)) return; + if (!sc.GetNumber(xsiz, true)) return; + if (!sc.GetNumber(ysiz, true)) return; + if (!ValidateTilenum("dummytile", tile, pos)) return; + tileSetDummy(tile, xsiz, ysiz); +} + +//=========================================================================== +// +// +// +//=========================================================================== + +void parseDummyTileRange(FScanner& sc, FScriptPosition& pos) +{ + int tile1, tile2, xsiz, ysiz; + + if (!sc.GetNumber(tile1, true)) return; + if (!sc.GetNumber(tile2, true)) return; + if (!sc.GetNumber(xsiz, true)) return; + if (!sc.GetNumber(ysiz, true)) return; + if (!ValidateTileRange("dummytilerange", tile1, tile2, pos)) return; + if (xsiz < 0 || ysiz < 0) return; + + for (int i = tile1; i <= tile2; i++) tileSetDummy(i, xsiz, ysiz); +} + +//=========================================================================== +// +// +// +//=========================================================================== + +void parseUndefineTile(FScanner& sc, FScriptPosition& pos) +{ + int tile; + + if (!sc.GetNumber(tile, true)) return; + if (ValidateTilenum("undefinetile", tile, pos)) + tileDelete(tile); +} + +//=========================================================================== +// +// +// +//=========================================================================== + +void parseUndefineTileRange(FScanner& sc, FScriptPosition& pos) +{ + int tile1, tile2; + + if (!sc.GetNumber(tile1, true)) return; + if (!sc.GetNumber(tile2, true)) return; + if (!ValidateTileRange("undefinetilerange", tile1, tile2, pos)) return; + + for (int i = tile1; i <= tile2; i++) tileDelete(i); +} + +//=========================================================================== +// +// +// +//=========================================================================== + void parseDefineSkybox(FScanner& sc, FScriptPosition& pos) { int tile, palette;