From fa318825ef0404816728f733484caa1bc23afa53 Mon Sep 17 00:00:00 2001 From: hovertank3d Date: Fri, 14 Nov 2025 20:05:59 +0100 Subject: george droid --- include/file/metadata.hpp | 54 +++++++++++++++++++++++++++++++++++++++ include/file/world.hpp | 65 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 include/file/metadata.hpp create mode 100644 include/file/world.hpp (limited to 'include/file') diff --git a/include/file/metadata.hpp b/include/file/metadata.hpp new file mode 100644 index 0000000..8b9ec4f --- /dev/null +++ b/include/file/metadata.hpp @@ -0,0 +1,54 @@ +#pragma once + +#include "util/bitset.hpp" +#include "util/io.hpp" +#include +#include +#include + +namespace file { + +enum class filetype : uint8_t { + Map = 1, + World, + Player, + TOTAL, +}; + +struct metadata { + static constexpr auto magic = 27981915666277746uL; + static constexpr auto magic_mask = 0xFFFFFFFFFFFFFFuL; + static constexpr auto size = 20; + + enum class flags { + Favorite, + }; + + filetype ftype; + uint32_t revision; + bitset<64> flags; + + template + ssize_t read(io::serialized_io& io) + { + uint64_t filemagic; + auto bytes = io.read(filemagic); + if ((filemagic & magic_mask) != magic) { + throw std::runtime_error("not a relogic file"); + } + + uint8_t type = ((filemagic >> 56) & 0xFF); + if (type == 0 || type >= int(filetype::TOTAL)) { + throw std::runtime_error("unknown file type"); + } + + ftype = filetype(type); + + bytes += io.read(revision); + bytes += io.read(flags); + + return bytes; + } +}; + +} \ No newline at end of file diff --git a/include/file/world.hpp b/include/file/world.hpp new file mode 100644 index 0000000..300a3e0 --- /dev/null +++ b/include/file/world.hpp @@ -0,0 +1,65 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "file/metadata.hpp" +#include "util/bitset.hpp" +#include "util/io.hpp" +#include "version.hpp" + +namespace file { + +class world { + int32_t version; + // metadata meta; + + std::vector positions; + bitset<0> importance; + + int32_t seed; + std::array guid; + int32_t worldID; + int32_t world_left; + int32_t world_right; + int32_t world_top; + int32_t world_botton; + int32_t height; + int32_t width; + +public: + void load_header(std::ifstream& f) + { + } + + world(std::string filename) + { + if (!std::filesystem::exists(filename)) { + throw std::runtime_error("file not found"); + } + auto rw = io::serialized_io(io::file_io { filename }); + + rw.read(version); + if (version <= 88 || version > terraria_version) { + throw std::runtime_error("invalid world file version"); + } + std::cout << version << std::endl; + metadata meta; + + rw.read(meta); + + if (meta.ftype != filetype::World) { + throw std::runtime_error("expected world file"); + } + } +}; + +} \ No newline at end of file -- cgit v1.2.3