neptools

Modding tools to Neptunia games
git clone https://git.neptards.moe/neptards/neptools.git
Log | Files | Refs | Submodules | README | LICENSE

header.hpp (2548B)


      1 #ifndef UUID_F87DF453_742A_4C38_8660_ABC81ACB04B8
      2 #define UUID_F87DF453_742A_4C38_8660_ABC81ACB04B8
      3 #pragma once
      4 
      5 #include "file.hpp"
      6 #include "../../source.hpp"
      7 #include "../item.hpp"
      8 
      9 #include <boost/endian/arithmetic.hpp>
     10 
     11 #include <optional>
     12 
     13 namespace Neptools::Stsc
     14 {
     15 
     16   class HeaderItem final : public Item
     17   {
     18     LIBSHIT_DYNAMIC_OBJECT;
     19   public:
     20     struct Header
     21     {
     22       char magic[4];
     23       boost::endian::little_uint32_t entry_point;
     24       boost::endian::little_uint32_t flags;
     25 
     26       void Validate(FilePosition size) const;
     27     };
     28     static_assert(sizeof(Header) == 12);
     29 
     30     struct ExtraHeader2Ser
     31     {
     32       boost::endian::little_uint16_t field_0;
     33       boost::endian::little_uint16_t field_2;
     34       boost::endian::little_uint16_t field_4;
     35       boost::endian::little_uint16_t field_6;
     36       boost::endian::little_uint16_t field_8;
     37       boost::endian::little_uint16_t field_a;
     38       boost::endian::little_uint16_t field_c;
     39     };
     40     static_assert(sizeof(ExtraHeader2Ser) == 14);
     41 
     42     class LIBSHIT_LUAGEN(name: "extra_headers_2") ExtraHeaders2
     43       : public Libshit::Lua::ValueObject
     44     {
     45       LIBSHIT_LUA_CLASS;
     46 
     47     public:
     48       std::uint16_t field_0;
     49       std::uint16_t field_2;
     50       std::uint16_t field_4;
     51       std::uint16_t field_6;
     52       std::uint16_t field_8;
     53       std::uint16_t field_a;
     54       std::uint16_t field_c;
     55 
     56       ExtraHeaders2(
     57         std::uint16_t field_0, std::uint16_t field_2, std::uint16_t field_4,
     58         std::uint16_t field_6, std::uint16_t field_8, std::uint16_t field_a,
     59         std::uint16_t field_c) noexcept
     60         : field_0{field_0}, field_2{field_2}, field_4{field_4},
     61           field_6{field_6}, field_8{field_8}, field_a{field_a},
     62           field_c{field_c} {}
     63     };
     64 
     65     HeaderItem(Key k, Context& ctx, Source src);
     66     HeaderItem(
     67       Key k, Context& ctx, Libshit::NotNull<LabelPtr> entry_point,
     68       std::optional<Libshit::StringView> extra_headers_1,
     69       std::optional<ExtraHeaders2> extra_headers_2,
     70       std::optional<uint16_t> extra_headers_4);
     71     static HeaderItem& CreateAndInsert(ItemPointer ptr, Flavor flavor);
     72 
     73     FilePosition GetSize() const noexcept override;
     74 
     75     Libshit::NotNull<LabelPtr> entry_point;
     76 
     77     std::optional<std::array<std::uint8_t, 32>> extra_headers_1;
     78     std::optional<ExtraHeaders2> extra_headers_2;
     79     std::optional<std::uint16_t> extra_headers_4;
     80 
     81   private:
     82     void Parse_(Context& ctx, Source& src);
     83     void Dump_(Sink& sink) const override;
     84     void Inspect_(std::ostream& os, unsigned indent) const override;
     85   };
     86 
     87 }
     88 
     89 #endif