]> git.localhorst.tv Git - blobs.git/blobdiff - src/app/app.cpp
read (basic) tile information from file
[blobs.git] / src / app / app.cpp
index 8c0f8e13521547cd16624e3d793926064ed50b90..a67d1a8286527d582de03627a7bbef6516c2f828 100644 (file)
@@ -4,10 +4,15 @@
 
 #include "init.hpp"
 #include "../graphics/Viewport.hpp"
+#include "../io/Token.hpp"
+#include "../io/TokenStreamReader.hpp"
 
+#include <fstream>
 #include <SDL.h>
 #include <SDL_image.h>
 
+using std::string;
+
 
 namespace blobs {
 namespace app {
@@ -167,26 +172,133 @@ void State::OnQuit() {
 
 Assets::Assets()
 : path("assets/")
+, data_path(path + "data/")
+, skin_path(path + "skins/")
 , tile_path(path + "tiles/") {
+       data.resources.Add({ "air", "Air", 0 });
+       data.resources.Add({ "biomass", "Biomass", 0 });
+       data.resources.Add({ "dirt", "Dirt", 0 });
+       data.resources.Add({ "ice", "Ice", 0 });
+       data.resources.Add({ "rock", "Rock", 0 });
+       data.resources.Add({ "sand", "Sand", 0 });
+       data.resources.Add({ "water", "Water", 0 });
+       data.resources.Add({ "wood", "Wood", 0 });
+
+       {
+               std::ifstream tile_file(data_path + "tiles");
+               io::TokenStreamReader tile_reader(tile_file);
+               ReadTileTypes(tile_reader);
+       }
+
+       data.tiles["algae"]   .resources.push_back({ data.resources["water"].id,   1.0  });
+       data.tiles["algae"]   .resources.push_back({ data.resources["biomass"].id, 0.5  });
+       data.tiles["desert"]  .resources.push_back({ data.resources["sand"].id,    1.0  });
+       data.tiles["forest"]  .resources.push_back({ data.resources["wood"].id,    1.0  });
+       data.tiles["forest"]  .resources.push_back({ data.resources["dirt"].id,    0.5  });
+       data.tiles["grass"]   .resources.push_back({ data.resources["dirt"].id,    0.5  });
+       data.tiles["grass"]   .resources.push_back({ data.resources["biomass"].id, 0.25 });
+       data.tiles["grass"]   .resources.push_back({ data.resources["water"].id,   0.25 });
+       data.tiles["ice"]     .resources.push_back({ data.resources["ice"].id,     1.0  });
+       data.tiles["ice"]     .resources.push_back({ data.resources["water"].id,   0.25 });
+       data.tiles["jungle"]  .resources.push_back({ data.resources["wood"].id,    0.5  });
+       data.tiles["jungle"]  .resources.push_back({ data.resources["biomass"].id, 0.5  });
+       data.tiles["mountain"].resources.push_back({ data.resources["rock"].id,    1.0  });
+       data.tiles["ocean"]   .resources.push_back({ data.resources["water"].id,   1.0  });
+       data.tiles["rock"]    .resources.push_back({ data.resources["rock"].id,    1.0  });
+       data.tiles["sand"]    .resources.push_back({ data.resources["sand"].id,    1.0  });
+       data.tiles["taiga"]   .resources.push_back({ data.resources["wood"].id,    1.0  });
+       data.tiles["taiga"]   .resources.push_back({ data.resources["water"].id,   0.5  });
+       data.tiles["tundra"]  .resources.push_back({ data.resources["rock"].id,    1.0  });
+       data.tiles["tundra"]  .resources.push_back({ data.resources["ice"].id,     0.5  });
+       data.tiles["water"]   .resources.push_back({ data.resources["water"].id,   1.0  });
+       data.tiles["water"]   .resources.push_back({ data.resources["biomass"].id, 0.25 });
+       data.tiles["wheat"]   .resources.push_back({ data.resources["biomass"].id, 1.0  });
+       data.tiles["wheat"]   .resources.push_back({ data.resources["water"].id,   0.25 });
+
        graphics::Format format;
        textures.tiles.Bind();
-       textures.tiles.Reserve(256, 256, 9, format);
-       LoadTileTexture("1", textures.tiles, 0);
-       LoadTileTexture("2", textures.tiles, 1);
-       LoadTileTexture("3", textures.tiles, 2);
-       LoadTileTexture("4", textures.tiles, 3);
-       LoadTileTexture("5", textures.tiles, 4);
-       LoadTileTexture("6", textures.tiles, 5);
-       LoadTileTexture("7", textures.tiles, 6);
-       LoadTileTexture("8", textures.tiles, 7);
-       LoadTileTexture("9", textures.tiles, 8);
+       textures.tiles.Reserve(256, 256, 14, format);
+       LoadTileTexture("algae",    textures.tiles,  0);
+       LoadTileTexture("desert",   textures.tiles,  1);
+       LoadTileTexture("forest",   textures.tiles,  2);
+       LoadTileTexture("grass",    textures.tiles,  3);
+       LoadTileTexture("ice",      textures.tiles,  4);
+       LoadTileTexture("jungle",   textures.tiles,  5);
+       LoadTileTexture("mountain", textures.tiles,  6);
+       LoadTileTexture("ocean",    textures.tiles,  7);
+       LoadTileTexture("rock",     textures.tiles,  8);
+       LoadTileTexture("sand",     textures.tiles,  9);
+       LoadTileTexture("taiga",    textures.tiles, 10);
+       LoadTileTexture("tundra",   textures.tiles, 11);
+       LoadTileTexture("water",    textures.tiles, 12);
+       LoadTileTexture("wheat",    textures.tiles, 13);
+
+       textures.skins.Bind();
+       textures.skins.Reserve(256, 256, 9, format);
+       LoadSkinTexture("1", textures.skins, 0);
+       LoadSkinTexture("2", textures.skins, 1);
+       LoadSkinTexture("3", textures.skins, 2);
+       LoadSkinTexture("4", textures.skins, 3);
+       LoadSkinTexture("5", textures.skins, 4);
+       LoadSkinTexture("6", textures.skins, 5);
+       LoadSkinTexture("7", textures.skins, 6);
+       LoadSkinTexture("8", textures.skins, 7);
+       LoadSkinTexture("9", textures.skins, 8);
 }
 
 Assets::~Assets() {
 }
 
-void Assets::LoadTileTexture(const std::string &name, graphics::ArrayTexture &tex, int layer) const {
-       std::string path = tile_path + name + ".png";
+void Assets::ReadTileTypes(io::TokenStreamReader &in) {
+       while (in.HasMore()) {
+               string name;
+               in.ReadIdentifier(name);
+               in.Skip(io::Token::EQUALS);
+
+               int id = 0;
+               if (data.tiles.Has(name)) {
+                       id = data.tiles[name].id;
+               } else {
+                       world::TileType type;
+                       type.name = name;
+                       id = data.tiles.Add(type);
+               }
+
+               in.Skip(io::Token::ANGLE_BRACKET_OPEN);
+               while (in.Peek().type != io::Token::ANGLE_BRACKET_CLOSE) {
+                       in.ReadIdentifier(name);
+                       in.Skip(io::Token::EQUALS);
+                       if (name == "label") {
+                               in.ReadString(data.tiles[id].label);
+                       } else if (name == "texture") {
+                               data.tiles[id].texture = in.GetInt();
+                       } else {
+                               throw std::runtime_error("unknown tile type property '" + name + "'");
+                       }
+                       in.Skip(io::Token::SEMICOLON);
+               }
+               in.Skip(io::Token::ANGLE_BRACKET_CLOSE);
+               in.Skip(io::Token::SEMICOLON);
+       }
+}
+
+void Assets::LoadTileTexture(const string &name, graphics::ArrayTexture &tex, int layer) const {
+       string path = tile_path + name + ".png";
+       SDL_Surface *srf = IMG_Load(path.c_str());
+       if (!srf) {
+               throw SDLError("IMG_Load");
+       }
+       try {
+               tex.Data(layer, *srf);
+       } catch (...) {
+               SDL_FreeSurface(srf);
+               throw;
+       }
+       SDL_FreeSurface(srf);
+}
+
+void Assets::LoadSkinTexture(const string &name, graphics::ArrayTexture &tex, int layer) const {
+       string path = skin_path + name + ".png";
        SDL_Surface *srf = IMG_Load(path.c_str());
        if (!srf) {
                throw SDLError("IMG_Load");