commit ab2994a9
Now has an overlay layer for "water"
Changed files
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<map version="1.4" tiledversion="1.4.2" orientation="orthogonal" renderorder="right-down" compressionlevel="0" width="100" height="100" tilewidth="32" tileheight="32" infinite="0" nextlayerid="7" nextobjectid="12">
+ <tileset firstgid="1" source="terrain.tsx"/>
+ <tileset firstgid="1025" source="city_outside.tsx"/>
+ <layer id="1" name="ground_1" width="100" height="100">
+ <data encoding="base64" compression="zlib">
+ eAHt2zEKACAIAEB7q/3/DfUAxwSDG1wcJOIGBc0VkcIfMMAAAwwwwAADDDDAAAMMMMAAAwwwwAADDDDAAAMMMMAAAwwwwAADDDDAAAMMMMAAAwwwwAADDDDAAAMMXAObAw4YYIABBhhggIHvDVQ9XZVzY+zOmgEGGGCAAQYYYIABBhhggAEGGGCAAQYYYIABBhhggAEGGGCAAQYYYIABBqYYsOPE4hSL3sEiAwwwwAADDDDAAAMMdBswAzPWbUx9xhhggAEGGGCAAQYYYIABBhhggAEGGGCAAQYYYIABBhhggAEGGGCAAQYYYIABBhhggIG3Bg4x3kMn
+ </data>
+ </layer>
+ <layer id="2" name="ground_2" width="100" height="100">
+ <data encoding="base64" compression="zlib">
+ eAHt07EJgDAQBVArN3ETdRJ1EnUSB/WnsBHbiOA7+E0IufCOaxpFgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABArUF+jQYkrF2I+8/Ctz919xqk+XxtsPaAlMazEmXXHtRZrIn6n2BYr8lZSeOxF4E4QN1zcVefGAYvkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECvxQ4AcQZCLo=
+ </data>
+ </layer>
+ <layer id="5" name="ground_2_overlay_1" width="100" height="100">
+ <data encoding="base64" compression="zlib">
+ eAHt0DEBAAAAwqD1T+1lC4hAYcCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMDABwacQAAB
+ </data>
+ </layer>
+ <layer id="3" name="blocking" width="100" height="100">
+ <data encoding="base64" compression="zlib">
+ eAHt1eEJgzAQBtAuUjdpJ2mdRJykOontbP0OGpAOoCgv8EHwzyXvuHi5WAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDinwCPXeib9Oa93uFsNOfGSjIc7+bkOXHNRM/FKpmROrP0Eai5uiXdqvx6sK5uLtcZ++3qn6v/tH75fD9aV6536/OK9Wstss/+fh/ZOdSn/TsZtjqFKBKoX96TmYUlqHto71foy55u1jcCQMtWH6kfNwjXpkupLn1jbCrQZmFK2UrPQvtXeIkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECRxX4AhvdHa4=
+ </data>
+ </layer>
+ <layer id="6" name="blocking_overlay_1" width="100" height="100">
+ <data encoding="base64" compression="zlib">
+ eAHt0MENwCAMBEEKDVQSpRKgk/SWayB/JI+l+3unNUeAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhUEbgS2rNRJfjwzjv/vdlz+J9V3psJXdmuEqyTAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ+BX4AN11BKY=
+ </data>
+ </layer>
+ <objectgroup id="4" name="object1">
+ <object id="9" name="Player" type="playerStart" x="1894.29" y="1207.01"/>
+ </objectgroup>
+</map>
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 <string>
#include <sstream>
+#include <cstring>
#include <vector>
#include <map>
#include <zlib.h>
@@ -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 <sstream>
#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<sago::tiled::TileObjectGroup>& 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 <vector>
struct MonsterDef {
@@ -45,6 +46,7 @@ public:
std::shared_ptr<b2World> 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<b2World>& world) {
void World::init(std::shared_ptr<b2World>& 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<b2World>& 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<b2Body*> managed_bodies;
std::vector<bool> protected_tiles;
std::vector<bool> 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<uint32_t> tiles;
std::map<std::string, uint32_t> 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);