diff --git a/data/maps/template_forrest2.tmx b/data/maps/template_forrest2.tmx new file mode 100644 index 0000000..e627692 --- /dev/null +++ b/data/maps/template_forrest2.tmx @@ -0,0 +1,33 @@ + + + + + + + eAHt2zEKACAIAEB7q/3/DfUAxwSDG1wcJOIGBc0VkcIfMMAAAwwwwAADDDDAAAMMMMAAAwwwwAADDDDAAAMMMMAAAwwwwAADDDDAAAMMMMAAAwwwwAADDDDAAAMMXAObAw4YYIABBhhggIHvDVQ9XZVzY+zOmgEGGGCAAQYYYIABBhhggAEGGGCAAQYYYIABBhhggAEGGGCAAQYYYIABBqYYsOPE4hSL3sEiAwwwwAADDDDAAAMMdBswAzPWbUx9xhhggAEGGGCAAQYYYIABBhhggAEGGGCAAQYYYIABBhhggAEGGGCAAQYYYIABBhhggIG3Bg4x3kMn + + + + + eAHt07EJgDAQBVArN3ETdRJ1EnUSB/WnsBHbiOA7+E0IufCOaxpFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABArUF+jQYkrF2I+8/Ctz919xqk+XxtsPaAlMazEmXXHtRZrIn6n2BYr8lZSeOxF4E4QN1zcVefGAYvkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECvxQ4AcQZCLo= + + + + + eAHt0DEBAAAAwqD1T+1lC4hAYcCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMDABwacQAAB + + + + + eAHt1eEJgzAQBtAuUjdpJ2mdRJykOontbP0OGpAOoCgv8EHwzyXvuHi5WAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDinwCPXeib9Oa93uFsNOfGSjIc7+bkOXHNRM/FKpmROrP0Eai5uiXdqvx6sK5uLtcZ++3qn6v/tH75fD9aV6536/OK9Wstss/+fh/ZOdSn/TsZtjqFKBKoX96TmYUlqHto71foy55u1jcCQMtWH6kfNwjXpkupLn1jbCrQZmFK2UrPQvtXeIkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECRxX4AhvdHa4= + + + + + eAHt0MENwCAMBEEKDVQSpRKgk/SWayB/JI+l+3unNUeAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhUEbgS2rNRJfjwzjv/vdlz+J9V3psJXdmuEqyTAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ+BX4AN11BKY= + + + + + + diff --git a/src/sagotmx/tmx_struct.h b/src/sagotmx/tmx_struct.h index 4401f99..406010b 100644 --- a/src/sagotmx/tmx_struct.h +++ b/src/sagotmx/tmx_struct.h @@ -46,6 +46,7 @@ SOFTWARE. #include #include +#include #include #include #include @@ -229,8 +230,8 @@ struct TileSet { }; struct TileLayerData { - std::string encoding; - std::string compression; + std::string encoding = "base64"; + std::string compression = "zlib"; std::string payload; }; @@ -637,6 +638,16 @@ inline uint32_t getTileFromLayer(const TileMap& m, const TileLayer& l, int x, in return global_tile_id; } +inline TileLayer createEmptyLayerForMap(const TileMap& tm) { + TileLayer t; + t.width = tm.width; + t.height = tm.height; + t.data.payload.resize(t.width*t.height*sizeof(u_int32_t)); + std::string& data = t.data.payload; + memset(&data[0], 0, data.size()); + return t; +} + inline void setTileOnLayerNumber(TileMap& m, int layer_number, int x, int y, uint32_t tile) { size_t tile_index = (m.height*y+x)*sizeof(uint32_t); TileLayer& l = m.layers.at(layer_number); diff --git a/src/saland/Game.cpp b/src/saland/Game.cpp index 7121cf3..c887803 100644 --- a/src/saland/Game.cpp +++ b/src/saland/Game.cpp @@ -44,7 +44,6 @@ https://github.com/sago007/saland #include #include "console/Console.hpp" #include "GameConsoleCommand.hpp" -#include "../terrain/WaterHandler.hpp" int32 velocityIterations = 6; int32 positionIterations = 2; @@ -432,8 +431,7 @@ void Game::ProcessInput(const SDL_Event& event, bool& processed) { int layer_number = 2; // Do not hardcode uint32_t tile = data->drawTile; sago::tiled::setTileOnLayerNumber(data->gameRegion.world.tm, layer_number, tile_x, tile_y, tile); - WaterHandler wh; - wh.updateFirstTile(data->gameRegion.world.tm, tile_x, tile_y); + data->gameRegion.wh.updateFirstTile(data->gameRegion.world.tm, tile_x, tile_y); data->gameRegion.world.init_physics(data->gameRegion.physicsBox); } if (event.key.keysym.sym == globalData.playerControls.block_delete @@ -442,8 +440,7 @@ void Game::ProcessInput(const SDL_Event& event, bool& processed) { int layer_number = 2; // Do not hardcode uint32_t tile = 0; sago::tiled::setTileOnLayerNumber(data->gameRegion.world.tm, layer_number, tile_x, tile_y, tile); - WaterHandler wh; - wh.updateFirstTile(data->gameRegion.world.tm, tile_x, tile_y); + data->gameRegion.wh.updateFirstTile(data->gameRegion.world.tm, tile_x, tile_y); data->gameRegion.world.init_physics(data->gameRegion.physicsBox); } if (event.key.keysym.sym == SDLK_1 || event.key.keysym.sym == SDLK_KP_1) { @@ -661,8 +658,7 @@ void Game::Update() { && !(data->gameRegion.world.tile_protected(tile_x, tile_y)) ) { int layer_number = 2; // Do not hardcode sago::tiled::setTileOnLayerNumber(data->gameRegion.world.tm, layer_number, tile_x, tile_y, tile); - WaterHandler wh; - wh.updateFirstTile(data->gameRegion.world.tm, tile_x, tile_y); + data->gameRegion.wh.updateFirstTile(data->gameRegion.world.tm, tile_x, tile_y); data->gameRegion.world.init_physics(data->gameRegion.physicsBox); } } @@ -677,8 +673,7 @@ void Game::Update() { int layer_number = 2; // Do not hardcode uint32_t tile = 0; sago::tiled::setTileOnLayerNumber(data->gameRegion.world.tm, layer_number, tile_x, tile_y, tile); - WaterHandler wh; - wh.updateFirstTile(data->gameRegion.world.tm, tile_x, tile_y); + data->gameRegion.wh.updateFirstTile(data->gameRegion.world.tm, tile_x, tile_y); data->gameRegion.world.init_physics(data->gameRegion.physicsBox); } } diff --git a/src/saland/GameRegion.cpp b/src/saland/GameRegion.cpp index 3d5e5b7..7dab503 100644 --- a/src/saland/GameRegion.cpp +++ b/src/saland/GameRegion.cpp @@ -147,12 +147,18 @@ void GameRegion::Init(int x, int y, const std::string& worldName, bool forceRese if (region_x == 0 && region_y == -2) { loadMap = "maps/city_0x-2.tmx"; } + if (region_x == 3 && region_y == 3) { + loadMap = "maps/template_forrest2.tmx"; + } } b2Vec2 gravity(0.0f, 0.0f); placeables.clear(); physicsBox.reset(new b2World(gravity)); world.managed_bodies.clear(); world.init(physicsBox, loadMap); + wh.blockingLayer = world.blockingLayer; + wh.blockingLayer_overlay_1 = world.blockingLayer_overlay_1; + const std::vector& object_groups = world.tm.object_groups; diff --git a/src/saland/GameRegion.hpp b/src/saland/GameRegion.hpp index 5b793ae..c757fc6 100644 --- a/src/saland/GameRegion.hpp +++ b/src/saland/GameRegion.hpp @@ -28,6 +28,7 @@ https://github.com/sago007/saland #include "model/placeables.hpp" #include "GameItems.hpp" #include "../sagotmx/tmx_struct.h" +#include "../terrain/WaterHandler.hpp" #include struct MonsterDef { @@ -45,6 +46,7 @@ public: std::shared_ptr physicsBox; void SaveRegion(); World world; + WaterHandler wh; uint32_t outerTile = 485; int GetRegionX() const { return region_x; diff --git a/src/saland/model/World.cpp b/src/saland/model/World.cpp index f5d34a7..0c64397 100644 --- a/src/saland/model/World.cpp +++ b/src/saland/model/World.cpp @@ -159,6 +159,8 @@ void World::init_physics(std::shared_ptr& world) { void World::init(std::shared_ptr& world, const std::string& mapFileName) { + blockingLayer = -1; + blockingLayer_overlay_1 = -1; this->physicsWorld = world; std::string tmx_file = sago::GetFileContent(mapFileName); tm = sago::tiled::string2tilemap(tmx_file); @@ -170,6 +172,26 @@ void World::init(std::shared_ptr& world, const std::string& mapFileName tm.tileset[i].alternativeSource = &ts.back(); } } + for (size_t i=0;i < tm.layers.size(); ++i) { + if (tm.layers[i].name == "blocking") { + blockingLayer = i; + } + if (tm.layers[i].name == "blocking_overlay_1") { + blockingLayer_overlay_1 = i; + } + } + if (blockingLayer == -1) { + sago::tiled::TileLayer t = createEmptyLayerForMap(tm); + t.name = "blocking"; + tm.layers.push_back(t); + blockingLayer = tm.layers.size()-1; + } + if (blockingLayer_overlay_1 == -1) { + sago::tiled::TileLayer t = createEmptyLayerForMap(tm); + t.name = "blocking_overlay_1"; + tm.layers.push_back(t); + blockingLayer_overlay_1 = tm.layers.size()-1; + } init_physics(world); protected_tiles.resize(tm.height*tm.width); for (int x=0; x < tm.width; ++x) { diff --git a/src/saland/model/World.hpp b/src/saland/model/World.hpp index 5c1b5a2..263a09a 100644 --- a/src/saland/model/World.hpp +++ b/src/saland/model/World.hpp @@ -44,6 +44,8 @@ public: std::vector managed_bodies; std::vector protected_tiles; std::vector blocking_tiles; + int blockingLayer = -1; + int blockingLayer_overlay_1 = -1; }; #endif /* WORLD_HPP */ diff --git a/src/terrain/WaterHandler.cpp b/src/terrain/WaterHandler.cpp index 3b687b8..772dd4a 100644 --- a/src/terrain/WaterHandler.cpp +++ b/src/terrain/WaterHandler.cpp @@ -49,9 +49,10 @@ void WaterHandler::setupTiles(uint32_t start_tile) { tiles = {28, 29, 30, 60, 61, 62, 92, 93, 94, 124, 125, 126, 156, 157, 158, 188, 189, 190}; } -uint32_t WaterHandler::getTile(sago::tiled::TileMap& tm, int x, int y) { +uint32_t WaterHandler::getTile(sago::tiled::TileMap& tm, int x, int y, uint32_t& overlay_tile) { std::string theString = stringForTileSurrounding(tm, x, y); uint32_t tile = tile_map[theString]; + overlay_tile = 0; if (tile > 0) { return tile; } @@ -69,9 +70,15 @@ uint32_t WaterHandler::getTile(sago::tiled::TileMap& tm, int x, int y) { } if (theString[1] == '1' && theString[2] == '1' && theString[4] == '1') { + if (theString[3] == '1' && theString[5] == '1' && theString[6] == '1') { + overlay_tile = tile_map["00010110"]; + } return tile_map["01101000"]; } if (theString[0] == '1' && theString[1] == '1' && theString[3] == '1') { + if (theString[4] == '1' && theString[6] == '1' && theString[7] == '1') { + overlay_tile = tile_map["00001011"]; + } return tile_map["11010000"]; } @@ -85,6 +92,10 @@ uint32_t WaterHandler::getTile(sago::tiled::TileMap& tm, int x, int y) { } void WaterHandler::updateFirstTile(sago::tiled::TileMap& tm, int x, int y) { + if (blockingLayer_overlay_1 < 0 || blockingLayer < 0) { + std::cerr << "blocking layers not set on WaterHandler\n"; + return; + } if (isWater(tm, x, y)) { updateTile(tm, x, y); } @@ -105,13 +116,15 @@ void WaterHandler::updateTile(sago::tiled::TileMap& tm, int x, int y) { //Out of bound. Do nothing return; } - int layer_number = 2; // Do not hardcode + int layer_number = blockingLayer; uint32_t current_tile = sago::tiled::getTileFromLayer(tm, tm.layers.at(layer_number), x, y); std::cout << "tile: " << current_tile << ", surrounding: " << stringForTileSurrounding(tm, x, y) << "\n"; if (isWaterTile(current_tile)) { - uint32_t tile = getTile(tm, x, y); + uint32_t overlay_tile; + uint32_t tile = getTile(tm, x, y, overlay_tile); if (tile != current_tile) { sago::tiled::setTileOnLayerNumber(tm, layer_number, x, y, tile); + sago::tiled::setTileOnLayerNumber(tm, blockingLayer_overlay_1, x, y, overlay_tile); updateTile(tm, x-1, y-1); updateTile(tm, x, y-1); updateTile(tm, x+1, y-1); diff --git a/src/terrain/WaterHandler.hpp b/src/terrain/WaterHandler.hpp index 1c10c29..3780df6 100644 --- a/src/terrain/WaterHandler.hpp +++ b/src/terrain/WaterHandler.hpp @@ -31,12 +31,14 @@ struct WaterHandler { std::unordered_set tiles; std::map tile_map; uint32_t default_tile = 28; + int blockingLayer = -1; + int blockingLayer_overlay_1 = -1; WaterHandler(); void setupTiles(uint32_t start_tile); - uint32_t getTile(sago::tiled::TileMap& tm, int x, int y); + uint32_t getTile(sago::tiled::TileMap& tm, int x, int y, uint32_t& overlay_tile); void updateFirstTile(sago::tiled::TileMap& tm, int x, int y);