Cereal works pretty well so I may use it, but there's one more library I want to try first called tser.
This commit is contained in:
parent
ddf1ba955c
commit
713d400d17
9 changed files with 95 additions and 21 deletions
|
@ -6,8 +6,8 @@
|
|||
"ENEMY_TILE": "Ω",
|
||||
"BG_TILE": "█"
|
||||
},
|
||||
"enemies": {
|
||||
|
||||
"enemy": {
|
||||
"HEARING_DISTANCE": 8
|
||||
},
|
||||
"player": {
|
||||
|
||||
|
|
|
@ -25,4 +25,16 @@ namespace Components {
|
|||
struct Tile {
|
||||
std::string chr = "!";
|
||||
};
|
||||
|
||||
struct MapConfig {
|
||||
std::string WALL_TILE;
|
||||
std::string FLOOR_TILE;
|
||||
std::string PLAYER_TILE;
|
||||
std::string ENEMY_TILE;
|
||||
std::string BG_TILE;
|
||||
};
|
||||
|
||||
struct EnemyConfig {
|
||||
int HEARING_DISTANCE;
|
||||
};
|
||||
}
|
||||
|
|
19
main.cpp
19
main.cpp
|
@ -17,6 +17,7 @@ using namespace ftxui;
|
|||
* system.
|
||||
*/
|
||||
void configure_world(DinkyECS::World &world, Map &game_map) {
|
||||
const auto &config = world.get_the<MapConfig>();
|
||||
// this sets up the gui event system
|
||||
world.set_the<Events::GUI>(Events::GUI::START);
|
||||
|
||||
|
@ -30,13 +31,13 @@ void configure_world(DinkyECS::World &world, Map &game_map) {
|
|||
world.set<Position>(player.entity, {game_map.place_entity(0)});
|
||||
world.set<Motion>(player.entity, {0, 0});
|
||||
world.set<Combat>(player.entity, {100, 10});
|
||||
world.set<Tile>(player.entity, {PLAYER_TILE});
|
||||
world.set<Tile>(player.entity, {config.PLAYER_TILE});
|
||||
|
||||
auto enemy = world.entity();
|
||||
world.set<Position>(enemy, {game_map.place_entity(1)});
|
||||
world.set<Motion>(enemy, {0,0});
|
||||
world.set<Combat>(enemy, {20, 10});
|
||||
world.set<Tile>(enemy, {ENEMY_TILE});
|
||||
world.set<Tile>(enemy, {config.ENEMY_TILE});
|
||||
|
||||
auto enemy2 = world.entity();
|
||||
world.set<Position>(enemy2, {game_map.place_entity(2)});
|
||||
|
@ -57,6 +58,20 @@ int main() {
|
|||
Config config("./assets/config.json");
|
||||
world.set_the<Config>(config);
|
||||
|
||||
auto map = config["map"];
|
||||
world.set_the<MapConfig>({
|
||||
map["WALL_TILE"],
|
||||
map["FLOOR_TILE"],
|
||||
map["PLAYER_TILE"],
|
||||
map["ENEMY_TILE"],
|
||||
map["BG_TILE"]
|
||||
});
|
||||
|
||||
auto enemy = config["enemy"];
|
||||
world.set_the<EnemyConfig>({
|
||||
enemy["HEARING_DISTANCE"]
|
||||
});
|
||||
|
||||
Map game_map(GAME_MAP_X, GAME_MAP_Y);
|
||||
game_map.generate();
|
||||
|
||||
|
|
1
map.cpp
1
map.cpp
|
@ -6,7 +6,6 @@
|
|||
#include "rand.hpp"
|
||||
#include <utility>
|
||||
|
||||
|
||||
using std::vector, std::pair;
|
||||
using namespace fmt;
|
||||
|
||||
|
|
5
map.hpp
5
map.hpp
|
@ -11,11 +11,6 @@
|
|||
#define INV_SPACE 1
|
||||
#define WALL_VALUE 1
|
||||
#define SPACE_VALUE 0
|
||||
#define WALL_TILE "█"
|
||||
#define FLOOR_TILE "\u2849"
|
||||
#define PLAYER_TILE "♣"
|
||||
#define ENEMY_TILE "Ω"
|
||||
#define BG_TILE L'█'
|
||||
|
||||
struct Room {
|
||||
size_t x = 0;
|
||||
|
|
|
@ -8,10 +8,11 @@ ftxui_screen = dependency('ftxui-screen')
|
|||
ftxui_dom = dependency('ftxui-dom')
|
||||
ftxui_component = dependency('ftxui-component')
|
||||
sfml = dependency('sfml')
|
||||
cereal = dependency('cereal')
|
||||
|
||||
dependencies = [catch2, fmt,
|
||||
ftxui_screen, ftxui_dom, ftxui_component,
|
||||
json, sfml]
|
||||
json, sfml, cereal]
|
||||
|
||||
runtests = executable('runtests', [
|
||||
'dbc.cpp',
|
||||
|
@ -48,9 +49,4 @@ roguish = executable('roguish', [
|
|||
],
|
||||
dependencies: dependencies)
|
||||
|
||||
collider = executable('collider', [
|
||||
'./scratchpad/collider.cpp'
|
||||
],
|
||||
dependencies: dependencies)
|
||||
|
||||
test('tests', runtests)
|
||||
|
|
11
systems.cpp
11
systems.cpp
|
@ -13,9 +13,9 @@ using namespace fmt;
|
|||
using namespace Components;
|
||||
using ftxui::Color;
|
||||
|
||||
#define HEARING_DISTANCE 8
|
||||
|
||||
void System::enemy_pathing(DinkyECS::World &world, Map &game_map, Player &player) {
|
||||
// TODO: this will be on each enemy not a global thing
|
||||
const auto &config = world.get_the<EnemyConfig>();
|
||||
const auto &player_position = world.get<Position>(player.entity);
|
||||
game_map.set_target(player_position.location);
|
||||
game_map.make_paths();
|
||||
|
@ -23,7 +23,7 @@ void System::enemy_pathing(DinkyECS::World &world, Map &game_map, Player &player
|
|||
world.query<Position, Motion>([&](const auto &ent, auto &position, auto &motion) {
|
||||
if(ent != player.entity) {
|
||||
Point out = position.location; // copy
|
||||
if(game_map.distance(out) < HEARING_DISTANCE) {
|
||||
if(game_map.distance(out) < config.HEARING_DISTANCE) {
|
||||
game_map.neighbors(out, false);
|
||||
motion = { int(out.x - position.location.x), int(out.y - position.location.y)};
|
||||
}
|
||||
|
@ -133,6 +133,7 @@ void System::draw_entities(DinkyECS::World &world, Map &game_map, ftxui::Canvas
|
|||
}
|
||||
|
||||
void System::draw_map(DinkyECS::World &world, Map &game_map, ftxui::Canvas &canvas, size_t view_x, size_t view_y) {
|
||||
const auto& config = world.get_the<MapConfig>();
|
||||
const auto& player = world.get_the<Player>();
|
||||
const auto& player_position = world.get<Position>(player.entity);
|
||||
Point start = game_map.center_camera(player_position.location, view_x, view_y);
|
||||
|
@ -143,9 +144,9 @@ void System::draw_map(DinkyECS::World &world, Map &game_map, ftxui::Canvas &canv
|
|||
|
||||
for(size_t x = 0; x < end_x; ++x) {
|
||||
for(size_t y = 0; y < end_y; ++y) {
|
||||
string tile = walls[start.y+y][start.x+x] == 1 ? WALL_TILE : FLOOR_TILE;
|
||||
string tile = walls[start.y+y][start.x+x] == 1 ? config.WALL_TILE : config.FLOOR_TILE;
|
||||
// the 2 and 4 are from ftxui::Canvas since it does a kind of "subpixel" drawing
|
||||
if(tile == WALL_TILE) {
|
||||
if(tile == config.WALL_TILE) {
|
||||
canvas.DrawText(x * 2, y * 4, tile, Color::RGB(70, 70, 70));
|
||||
} else {
|
||||
canvas.DrawText(x * 2, y * 4, tile, Color::RGB(20, 20, 20));
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include "config.hpp"
|
||||
#include <any>
|
||||
#include "dinkyecs.hpp"
|
||||
#include "components.hpp"
|
||||
|
||||
using namespace fmt;
|
||||
using std::string;
|
||||
|
@ -60,3 +61,46 @@ TEST_CASE("can go into a world", "[config]") {
|
|||
Config &cfg = world.get_the<Config>();
|
||||
REQUIRE(cfg["types"]["NUMBER"] == 1234);
|
||||
}
|
||||
|
||||
#include <cereal/types/unordered_map.hpp>
|
||||
#include <cereal/types/memory.hpp>
|
||||
#include <cereal/archives/json.hpp>
|
||||
#include <cereal/archives/binary.hpp>
|
||||
#include <cereal/archives/portable_binary.hpp>
|
||||
#include <fstream>
|
||||
|
||||
struct MyData
|
||||
{
|
||||
int x, y, z;
|
||||
std::string tiles;
|
||||
|
||||
template<class Archive>
|
||||
serialize(Archive &ar) { ar(x, y, z, tiles); }
|
||||
};
|
||||
|
||||
|
||||
TEST_CASE("test using serialization", "[config]") {
|
||||
{
|
||||
std::ofstream os("cereal.json", std::ios::binary);
|
||||
cereal::JSONOutputArchive oarchive(os);
|
||||
|
||||
MyData m1{1,2,3, "\u2849█Ω♣"};
|
||||
MyData m2{5,6,7, "\u2849█Ω♣"};
|
||||
MyData m3{8,9,10, "\u2849█Ω♣"};
|
||||
|
||||
oarchive(m1, m2, m3);
|
||||
}
|
||||
|
||||
{
|
||||
std::ifstream is("cereal.json", std::ios::binary);
|
||||
cereal::JSONInputArchive iarchive(is);
|
||||
|
||||
MyData m1, m2, m3;
|
||||
|
||||
iarchive(m1, m2, m3);
|
||||
|
||||
REQUIRE(m1.tiles == "\u2849█Ω♣");
|
||||
REQUIRE(m2.tiles == "\u2849█Ω♣");
|
||||
REQUIRE(m3.tiles == "\u2849█Ω♣");
|
||||
}
|
||||
}
|
||||
|
|
12
wraps/cereal.wrap
Normal file
12
wraps/cereal.wrap
Normal file
|
@ -0,0 +1,12 @@
|
|||
[wrap-file]
|
||||
directory = cereal-1.3.2
|
||||
source_url = https://github.com/USCiLab/cereal/archive/v1.3.2.tar.gz
|
||||
source_filename = cereal-1.3.2.tar.gz
|
||||
source_hash = 16a7ad9b31ba5880dac55d62b5d6f243c3ebc8d46a3514149e56b5e7ea81f85f
|
||||
patch_filename = cereal_1.3.2-1_patch.zip
|
||||
patch_url = https://wrapdb.mesonbuild.com/v2/cereal_1.3.2-1/get_patch
|
||||
patch_hash = fd2f047a40a0d291c643fdafe4ce743f0eadbef667b6afe43a332e1ba0862603
|
||||
|
||||
[provide]
|
||||
cereal = cereal_dep
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue