neptools

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

collection_link.hpp (3434B)


      1 #ifndef UUID_51AA015D_E824_48D3_8BB4_37BC559302DA
      2 #define UUID_51AA015D_E824_48D3_8BB4_37BC559302DA
      3 #pragma once
      4 
      5 #include "../item.hpp"
      6 #include "../../source.hpp"
      7 
      8 #include <libshit/lua/auto_table.hpp>
      9 #include <libshit/lua/value_object.hpp>
     10 #include <boost/endian/arithmetic.hpp>
     11 
     12 namespace Neptools::Stcm
     13 {
     14 
     15   class CollectionLinkHeaderItem final : public Item
     16   {
     17     LIBSHIT_DYNAMIC_OBJECT;
     18   public:
     19     struct Header
     20     {
     21       boost::endian::little_uint32_t field_00;
     22       boost::endian::little_uint32_t offset;
     23       boost::endian::little_uint32_t count;
     24       boost::endian::little_uint32_t field_0c;
     25       boost::endian::little_uint32_t field_10;
     26       boost::endian::little_uint32_t field_14;
     27       boost::endian::little_uint32_t field_18;
     28       boost::endian::little_uint32_t field_1c;
     29       boost::endian::little_uint32_t field_20;
     30       boost::endian::little_uint32_t field_24;
     31       boost::endian::little_uint32_t field_28;
     32       boost::endian::little_uint32_t field_2c;
     33       boost::endian::little_uint32_t field_30;
     34       boost::endian::little_uint32_t field_34;
     35       boost::endian::little_uint32_t field_38;
     36       boost::endian::little_uint32_t field_3c;
     37 
     38       void Validate(FilePosition file_size) const;
     39     };
     40     static_assert(sizeof(Header) == 0x40);
     41 
     42     CollectionLinkHeaderItem(
     43       Key k, Context& ctx, Libshit::NotNull<LabelPtr> data)
     44       : Item{k, ctx}, data{std::move(data)} {}
     45 
     46     LIBSHIT_NOLUA
     47     CollectionLinkHeaderItem(Key k, Context& ctx, const Header& s);
     48     static CollectionLinkHeaderItem& CreateAndInsert(ItemPointer ptr);
     49 
     50     FilePosition GetSize() const noexcept override
     51     { return sizeof(Header); }
     52 
     53     Libshit::NotNull<LabelPtr> data;
     54 
     55   private:
     56     void Dump_(Sink& sink) const override;
     57     void Inspect_(std::ostream& os, unsigned indent) const override;
     58   };
     59 
     60   class CollectionLinkItem final : public Item
     61   {
     62     LIBSHIT_DYNAMIC_OBJECT;
     63   public:
     64     struct Entry
     65     {
     66       boost::endian::little_uint32_t name_0;
     67       boost::endian::little_uint32_t name_1;
     68       boost::endian::little_uint32_t ptr; // filled by engine
     69       boost::endian::little_uint32_t field_0c;
     70       boost::endian::little_uint32_t field_10;
     71       boost::endian::little_uint32_t field_14;
     72       boost::endian::little_uint32_t field_18;
     73       boost::endian::little_uint32_t field_1c;
     74 
     75       void Validate(FilePosition file_size) const;
     76     };
     77     static_assert(sizeof(Entry) == 0x20);
     78 
     79     struct LinkEntry;
     80     CollectionLinkItem(Key k, Context& ctx) : Item{k, ctx} {}
     81     CollectionLinkItem(Key k, Context& ctx, Source src, uint32_t count);
     82     CollectionLinkItem(
     83       Key k, Context& ctx, Libshit::AT<std::vector<LinkEntry>> entries)
     84       : Item{k, ctx}, entries{std::move(entries.Get())} {}
     85 
     86     FilePosition GetSize() const noexcept override
     87     { return entries.size() * sizeof(Entry); }
     88 
     89     struct LinkEntry : public Libshit::Lua::ValueObject
     90     {
     91       LabelPtr name_0;
     92       LabelPtr name_1;
     93 
     94       LinkEntry(LabelPtr name_0, LabelPtr name_1)
     95         : name_0{std::move(name_0)}, name_1{std::move(name_1)} {}
     96       LIBSHIT_LUA_CLASS;
     97     };
     98     LIBSHIT_LUAGEN(get: "::Libshit::Lua::GetSmartOwnedMember")
     99     std::vector<LinkEntry> entries;
    100 
    101     void Dispose() noexcept override;
    102 
    103   private:
    104     void Dump_(Sink& sink) const override;
    105     void Inspect_(std::ostream& os, unsigned indent) const override;
    106     void Parse_(Context& ctx, Source& src, uint32_t count);
    107   };
    108 
    109 }
    110 #endif