diff --git a/Airport.vcxproj b/Airport.vcxproj index b0f1a77..2e76442 100644 --- a/Airport.vcxproj +++ b/Airport.vcxproj @@ -132,9 +132,6 @@ xcopy "$(SDL2ImageDir)\lib\x64\SDL2_image.dll" "$(OutDir)" /Y /I /E xcopy "$(SDL2MixerDir)\lib\x64\SDL2_mixer.dll" "$(OutDir)" /Y /I /E xcopy "$(SDL2TTFDir)\lib\x64\SDL2_ttf.dll" "$(OutDir)" /Y /I /E -del "$(OutDir)$(ProjectName).exp" -del "$(OutDir)$(ProjectName).pdb" -rmdir "$(OutDir)optional" xcopy "$(ProjectDir)assets" "$(Outdir)assets" /Y /I /E @@ -168,9 +165,6 @@ xcopy "$(ProjectDir)assets" "$(Outdir)assets" /Y /I /E xcopy "$(SDL2ImageDir)\lib\x64\SDL2_image.dll" "$(OutDir)" /Y /I /E xcopy "$(SDL2MixerDir)\lib\x64\SDL2_mixer.dll" "$(OutDir)" /Y /I /E xcopy "$(SDL2TTFDir)\lib\x64\SDL2_ttf.dll" "$(OutDir)" /Y /I /E -del "$(OutDir)$(ProjectName).exp" -del "$(OutDir)$(ProjectName).pdb" -rmdir "$(OutDir)optional" xcopy "$(ProjectDir)assets" "$(Outdir)assets" /Y /I /E diff --git a/Box b/Box index 4297e15..cdfc42c 160000 --- a/Box +++ b/Box @@ -1 +1 @@ -Subproject commit 4297e1595974bc5b83565ce970147dd7decf6e4c +Subproject commit cdfc42cf8499c6c5441a58c8248624949bbf0b4d diff --git a/assets/scripts/tilemap/generator.toy b/assets/scripts/tilemap/generator.toy index 5b4ca82..aec4fed 100644 --- a/assets/scripts/tilemap/generator.toy +++ b/assets/scripts/tilemap/generator.toy @@ -61,8 +61,8 @@ fn generateTilemapData(rng: opaque) { //generate a grid filled with only empty tiles, as a starting point tilemap = []; - for (var j: int = 0; j < CELL_COUNT_Y * CELL_HEIGHT; j++) { - for (var i: int = 0; i < CELL_COUNT_X * CELL_WIDTH; i++) { + for (var j: int = 0; j < MAP_GRID_HEIGHT; j++) { + for (var i: int = 0; i < MAP_GRID_WIDTH; i++) { tilemap.push(-1); //x tilemap.push(-1); //y tilemap.push(0); //collision @@ -148,10 +148,12 @@ fn etchRoom(rng: opaque, metadata: [string: any]) { //etch the floor-space for (var j: int = y; j < y + h; j++) { for (var i: int = x; i < x + w; i++) { - var floorIndex = rng.generateRandomNumber() % 4; //NOTE: there might not always be only 4 floor sprites - tilemap[j * CELL_WIDTH * CELL_COUNT_X * 3 + i * 3 + 0] = tileset[theme + "-floor-" + string floorIndex][0]; - tilemap[j * CELL_WIDTH * CELL_COUNT_X * 3 + i * 3 + 1] = tileset[theme + "-floor-" + string floorIndex][1]; - tilemap[j * CELL_WIDTH * CELL_COUNT_X * 3 + i * 3 + 2] = tileset[theme + "-floor-" + string floorIndex][2]; + var ITERATION: int const = j * MAP_GRID_WIDTH * 3 + i * 3; + var r = rng.generateRandomNumber() % 4; //BUG: see Toy#67 + var floorIndex: string const = theme + "-floor-" + string r; //NOTE: there might not always be only 4 floor sprites + tilemap[ITERATION + 0] = tileset[floorIndex][0]; + tilemap[ITERATION + 1] = tileset[floorIndex][1]; + tilemap[ITERATION + 2] = tileset[floorIndex][2]; } } } @@ -356,10 +358,12 @@ fn etchLine(x: int, y: int, xLength: int, yLength: int, theme: string, rng: opaq //lengths can be negative, so handle it while (abs(xLength) > 0 || abs(yLength) > 0) { //etch floor at this position - var floorIndex = rng.generateRandomNumber() % 4; //NOTE: there might not always be only 4 floor sprites - tilemap[y * CELL_WIDTH * CELL_COUNT_X * 3 + x * 3 + 0] = tileset[theme + "-floor-" + string floorIndex][0]; - tilemap[y * CELL_WIDTH * CELL_COUNT_X * 3 + x * 3 + 1] = tileset[theme + "-floor-" + string floorIndex][1]; - tilemap[y * CELL_WIDTH * CELL_COUNT_X * 3 + x * 3 + 2] = tileset[theme + "-floor-" + string floorIndex][2]; + var ITERATION: int const = y * MAP_GRID_WIDTH * 3 + x * 3; + var r = rng.generateRandomNumber() % 4; + var floorIndex: string const = theme + "-floor-" + string r; //NOTE: there might not always be only 4 floor sprites + tilemap[ITERATION + 0] = tileset[floorIndex][0]; + tilemap[ITERATION + 1] = tileset[floorIndex][1]; + tilemap[ITERATION + 2] = tileset[floorIndex][2]; //tick down if (abs(xLength) > 0) { @@ -398,10 +402,13 @@ fn etchWalls(roomData) { continue; } + var ITERATION: int const = j * MAP_GRID_WIDTH * 3 + i * 3; var theme = roomData[floor(i / CELL_WIDTH)][floor(j / CELL_HEIGHT)]["theme"]; - tilemap[j * CELL_WIDTH * CELL_COUNT_X * 3 + i * 3 + 0] = tileset[theme + "-" + signals[j * MAP_GRID_WIDTH + i]][0]; - tilemap[j * CELL_WIDTH * CELL_COUNT_X * 3 + i * 3 + 1] = tileset[theme + "-" + signals[j * MAP_GRID_WIDTH + i]][1]; - tilemap[j * CELL_WIDTH * CELL_COUNT_X * 3 + i * 3 + 2] = tileset[theme + "-" + signals[j * MAP_GRID_WIDTH + i]][2]; + var index: string const = theme + "-" + signals[j * MAP_GRID_WIDTH + i]; + + tilemap[ITERATION + 0] = tileset[index][0]; + tilemap[ITERATION + 1] = tileset[index][1]; + tilemap[ITERATION + 2] = tileset[index][2]; } } } @@ -499,7 +506,7 @@ var marchingFilterResult: [string] const = [ //if walkable is below, then return top, etc. fn parseTilemapAt(x: int, y: int) { //parse based on walkability, for now - if (tilemap[y * CELL_WIDTH * CELL_COUNT_X * 3 + x * 3 + 2] != 0) { + if (tilemap[y * MAP_GRID_WIDTH * 3 + x * 3 + 2] != 0) { return ""; //empty } @@ -510,9 +517,9 @@ fn parseTilemapAt(x: int, y: int) { for (var i: int = 0; i < 12 -2; i++) { for (var j: int = 0; j < 12 -2; j++) { if ( - marchingFilter[(j + 0) * 12 + (i + 0)] == snapshot[0 * 3 + 0] && - marchingFilter[(j + 0) * 12 + (i + 1)] == snapshot[0 * 3 + 1] && - marchingFilter[(j + 0) * 12 + (i + 2)] == snapshot[0 * 3 + 2] && + marchingFilter[j * 12 + (i + 0)] == snapshot[0 * 3 + 0] && + marchingFilter[j * 12 + (i + 1)] == snapshot[0 * 3 + 1] && + marchingFilter[j * 12 + (i + 2)] == snapshot[0 * 3 + 2] && marchingFilter[(j + 1) * 12 + (i + 0)] == snapshot[1 * 3 + 0] && marchingFilter[(j + 1) * 12 + (i + 1)] == snapshot[1 * 3 + 1] && @@ -540,6 +547,7 @@ fn parseTilemapAt(x: int, y: int) { return ""; } +//TODO: can this be optimized out? fn generateSnapshotAt(x: int, y: int) { var result: [int] = []; @@ -549,7 +557,7 @@ fn generateSnapshotAt(x: int, y: int) { result.push(0); } else { - result.push(tilemap[(y+j) * CELL_WIDTH * CELL_COUNT_X * 3 + (x+i) * 3 + 2] != 0 ? 1 : 0); //walkable + result.push(tilemap[(y+j) * MAP_GRID_WIDTH * 3 + (x+i) * 3 + 2] != 0 ? 1 : 0); //walkable } } } diff --git a/assets/scripts/tilemap/renderer.toy b/assets/scripts/tilemap/renderer.toy index dd74f9a..0a1d7ef 100644 --- a/assets/scripts/tilemap/renderer.toy +++ b/assets/scripts/tilemap/renderer.toy @@ -19,6 +19,9 @@ var CELL_HEIGHT: int const = 16; var CELL_COUNT_X: int const = 3; var CELL_COUNT_Y: int const = 3; +var MAP_GRID_WIDTH: int const = CELL_WIDTH * CELL_COUNT_X; +var MAP_GRID_HEIGHT: int const = CELL_HEIGHT * CELL_COUNT_Y; + //lifecycle functions fn onLoad(node: opaque) { @@ -27,29 +30,31 @@ fn onLoad(node: opaque) { //create a child as a render target var child: opaque = node.loadChildNode("scripts:/tilemap/renderer-child.toy"); - child.createNodeTexture(CELL_WIDTH * CELL_COUNT_X * TILE_PIXEL_WIDTH, CELL_HEIGHT * CELL_COUNT_Y * TILE_PIXEL_HEIGHT); + child.createNodeTexture(MAP_GRID_WIDTH * TILE_PIXEL_WIDTH, MAP_GRID_HEIGHT * TILE_PIXEL_HEIGHT); } +//TODO: lazily render fn setTilemap(node: opaque, tilemap: [int]) { assert tilemap, "provided tilemap is null (in setTilemap)"; - print "start setting tilemap"; - var child: opaque = node.getChildNode(0); setRenderTarget(child); //draw the tilemap to the child - for (var j = 0; j < CELL_HEIGHT * CELL_COUNT_Y; j++) { - for (var i = 0; i < CELL_WIDTH * CELL_COUNT_X; i++) { + for (var j = 0; j < MAP_GRID_HEIGHT; j++) { + for (var i = 0; i < MAP_GRID_WIDTH; i++) { + //don't recalculate this every time + var ITERATION: int const = j * MAP_GRID_WIDTH * 3 + i * 3; + //don't render empty tiles - if (tilemap[j * CELL_WIDTH * CELL_COUNT_X * 3 + i * 3] < 0) { + if (tilemap[ITERATION] < 0 || tilemap[ITERATION + 1] < 0) { continue; } //set the rect of the node on the tilesheet - the "tilemap" var is a single blob of data node.setNodeRect( - tilemap[j * CELL_WIDTH * CELL_COUNT_X * 3 + i * 3] * TILE_PIXEL_WIDTH, - tilemap[j * CELL_WIDTH * CELL_COUNT_X * 3 + i * 3 + 1] * TILE_PIXEL_HEIGHT, + tilemap[ITERATION] * TILE_PIXEL_WIDTH, + tilemap[ITERATION + 1] * TILE_PIXEL_HEIGHT, TILE_PIXEL_WIDTH, TILE_PIXEL_HEIGHT ); @@ -65,6 +70,4 @@ fn setTilemap(node: opaque, tilemap: [int]) { //reset the render target to the screen setRenderTarget(null); - - print "finished setting tilemap"; } diff --git a/source/main.c b/source/main.c index e7e8889..4077502 100644 --- a/source/main.c +++ b/source/main.c @@ -2,6 +2,13 @@ #include "drive_system.h" +#include "toy_memory.h" + +//modified allocator +void* speedyMemoryAllocator(void* pointer, size_t oldSize, size_t newSize) { + return realloc(pointer, newSize); +} + int main(int argc, char* argv[]) { //debugging tools #ifdef _DEBUG @@ -9,6 +16,9 @@ int main(int argc, char* argv[]) { _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); #endif//win32 && debug + //set the memory allocator + Toy_setMemoryAllocator(speedyMemoryAllocator); + //the drive system maps filepaths to "drives", which specifies which folders can be accessed by the scripts Toy_initDriveSystem();