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