From 6118d22c20616e9c19de544ba6170b18cdd10f3e Mon Sep 17 00:00:00 2001 From: theo3 Date: Tue, 23 May 2023 15:15:24 -0700 Subject: [PATCH] mapObject work --- data/uking_functions.csv | 14 +- .../ActorSystem/actActorConstDataAccess.h | 2 + src/KingSystem/Map/mapObject.h | 12 ++ src/KingSystem/Map/mapObjectLink.cpp | 180 ++++++++++++++++++ src/KingSystem/Map/mapObjectLink.h | 7 + 5 files changed, 208 insertions(+), 7 deletions(-) diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 690f660a..9a7c8c7f 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -74001,20 +74001,20 @@ Address,Quality,Size,Name 0x0000007100d4e32c,O,000024,_ZN4ksys3map10ObjectLink27isPlacementLODOrForSaleLinkENS0_14MapLinkDefTypeE 0x0000007100d4e344,O,000044,_ZN4ksys3map14ObjectLinkDataC1Ev 0x0000007100d4e370,m,000136,_ZN4ksys3map14ObjectLinkData12deleteArraysEv -0x0000007100d4e3f8,U,000556,PlacementLinkData::allocLinks +0x0000007100d4e3f8,O,000556,_ZN4ksys3map14ObjectLinkData10allocLinksEiiiPN4sead4HeapE 0x0000007100d4e624,O,000212,_ZN4ksys3map14ObjectLinkData16allocLinksToSelfEiPN4sead4HeapE 0x0000007100d4e6f8,U,000292,PlacementLinkData::dtor 0x0000007100d4e81c,U,000256,PlacementObj::x -0x0000007100d4e91c,U,000440,PlacementLinkData::addLink +0x0000007100d4e91c,M,000440,_ZN4ksys3map14ObjectLinkData7addLinkEPNS0_6ObjectERKN4sead14SafeStringBaseIcEEbS3_PNS0_9MubinIterE 0x0000007100d4ead4,U,000364,PlacementLinkData::setupLinks -0x0000007100d4ec40,U,000328, +0x0000007100d4ec40,O,000328,_ZN4ksys3map14ObjectLinkData14sub_7100D4EC40EPNS0_6ObjectEPNS0_10ObjectLinkES3_ 0x0000007100d4ed88,O,000016,_ZN4ksys3map14ObjectLinkData11setGenGroupEPNS0_8GenGroupE -0x0000007100d4ed98,U,000052,PlacementLinkData::checkCreateLinkObjRevival -0x0000007100d4edcc,U,000020,PlacementLinkData::checkDeleteLinkObjRevival +0x0000007100d4ed98,O,000052,_ZNK4ksys3map14ObjectLinkData25checkCreateLinkObjRevivalEv +0x0000007100d4edcc,O,000020,_ZNK4ksys3map14ObjectLinkData25checkDeleteLinkObjRevivalEv 0x0000007100d4ede0,M,000280,_ZN4ksys3map15ObjectLinkArray9checkLinkENS0_14MapLinkDefTypeEb 0x0000007100d4eef8,O,000056,_ZN4ksys3map15ObjectLinkArray16findLinkWithTypeENS0_14MapLinkDefTypeE -0x0000007100d4ef30,U,000116, -0x0000007100d4efa4,U,000332,PlacementLinkData::x_2 +0x0000007100d4ef30,O,000116,_ZN4ksys3map14ObjectLinkData14sub_7100D4EF30ERNS_3act20ActorConstDataAccessE +0x0000007100d4efa4,m,000332,_ZN4ksys3map14ObjectLinkData21findObjectByActorNameERKN4sead14SafeStringBaseIcEE 0x0000007100d4f0f0,U,000224, 0x0000007100d4f1d0,U,000532, 0x0000007100d4f3e4,U,000496, diff --git a/src/KingSystem/ActorSystem/actActorConstDataAccess.h b/src/KingSystem/ActorSystem/actActorConstDataAccess.h index b78e9fbc..cf0cfb3c 100644 --- a/src/KingSystem/ActorSystem/actActorConstDataAccess.h +++ b/src/KingSystem/ActorSystem/actActorConstDataAccess.h @@ -119,6 +119,8 @@ public: f32 getHorseAvoidOffset() const; bool horseTargetedIsCircularMoveAlways() const; + void setActor687(); + private: Actor* getActor() const; diff --git a/src/KingSystem/Map/mapObject.h b/src/KingSystem/Map/mapObject.h index e3634c80..1d8fc93d 100644 --- a/src/KingSystem/Map/mapObject.h +++ b/src/KingSystem/Map/mapObject.h @@ -123,6 +123,8 @@ public: void setRevivalFlagValue(bool value); void setFieldATrue(); + bool checkRevivalMaybe(bool a1); + sead::Vector3f getScale() const; sead::Vector3f getRotate() const; void setTranslate(const sead::Vector3f& translate); @@ -185,6 +187,12 @@ public: const auto& getActorFlags8() const { return mActorFlags8; } const auto& getHardModeFlags() const { return mHardModeFlags; } + bool isLinkTag() const { return mFlags.isOn(Flag::IsLinkTag); } + bool isSetFlag8() const { return mFlags.isOn(Flag::_8); } + bool isIncrementSave() const { return mFlags.isOn(Flag::IncrementSave); } + + void setFlag8() { mFlags.set(Flag::_8); } + auto getActorDataIdx() const { return mActorDataIdx; } auto getIdx() const { return mIdx; } auto getId() const { return mId; } @@ -202,6 +210,10 @@ public: ObjectLinkData* getLinkData() const { return mLinkData; } gdt::FlagHandle getRevivalGameDataFlagHash() const { return mRevivalGameDataFlagHash; } + void setRevivalGameDataFlagHash(const gdt::FlagHandle& value) { + mRevivalGameDataFlagHash = value; + } + u32 getHashId() const { return mHashId; } const sead::Vector3f& getTranslate() const { return mTranslate; } diff --git a/src/KingSystem/Map/mapObjectLink.cpp b/src/KingSystem/Map/mapObjectLink.cpp index 700ab069..95aaf47b 100644 --- a/src/KingSystem/Map/mapObjectLink.cpp +++ b/src/KingSystem/Map/mapObjectLink.cpp @@ -150,6 +150,27 @@ void ObjectLinkData::deleteArrays() { mLinksToSelf.links.freeBuffer(); } +bool ObjectLinkData::allocLinks(s32 num_links_ref, s32 num_links_other, s32 num_links_cs, + sead::Heap* heap) { + if (num_links_ref > 0) { + if (!mObjects.allocBufferAssert(num_links_ref, heap)) { + return false; + } + mObjects.fill(nullptr); + } + if (num_links_other > 0) { + if (!mLinksOther.links.allocBufferAssert(num_links_other, heap)) { + return false; + } + } + if (num_links_cs > 0) { + if (!mLinksCs.links.allocBufferAssert(num_links_cs, heap)) { + return false; + } + } + return true; +} + bool ObjectLinkData::allocLinksToSelf(s32 num_links, sead::Heap* heap) { if (num_links >= 1) { mLinksToSelf.links.tryAllocBuffer(num_links, heap); @@ -159,6 +180,88 @@ bool ObjectLinkData::allocLinksToSelf(s32 num_links, sead::Heap* heap) { return true; } +// NON_MATCHING +bool ObjectLinkData::addLink(Object* dest, const sead::SafeString& definition_name, bool passive, + Object* src, MubinIter* iter) { + MapLinkDefType type = ObjectLink::getTypeForName(definition_name); + if (type == MapLinkDefType::Invalid) { + return false; + } + if (type == MapLinkDefType::SyncLink && passive) { + return false; + } + + if (type == MapLinkDefType::Reference) { + for (int i = 0; i < mObjects.size(); i++) { + if (mObjects[i] == nullptr) { + mObjects[i] = dest; + return false; + } + } + } + + if (dest != nullptr && passive) { + switch (type) { + case MapLinkDefType::Create: + case MapLinkDefType::Delete: + case MapLinkDefType::MtxCopyCreate: + case MapLinkDefType::SyncLink: + case MapLinkDefType::PlacementLOD: + case MapLinkDefType::Reference: + break; + case MapLinkDefType::BasicSig: + case MapLinkDefType::AxisX: + case MapLinkDefType::AxisY: + case MapLinkDefType::AxisZ: + case MapLinkDefType::NAxisX: + case MapLinkDefType::NAxisY: + case MapLinkDefType::NAxisZ: + case MapLinkDefType::GimmickSuccess: + case MapLinkDefType::VelocityControl: + case MapLinkDefType::BasicSigOnOnly: + case MapLinkDefType::Remains: + case MapLinkDefType::DeadUp: + case MapLinkDefType::LifeZero: + case MapLinkDefType::Stable: + case MapLinkDefType::ChangeAtnSig: + dest = nullptr; + break; + default: + dest = nullptr; + break; + } + } + + ObjectLinkArray* arr = &mLinksCs; + if (type == MapLinkDefType::Reference || type == MapLinkDefType::Invalid) { + arr = &mLinksOther; + } + + if (type == MapLinkDefType::CopyWaitRevival) { + if (dest != nullptr) { + if (src->isLinkTag() && !src->isSetFlag8() && !src->isIncrementSave() && + !dest->isIncrementSave()) { + src->setFlag8(); + src->setRevivalGameDataFlagHash(dest->getRevivalGameDataFlagHash()); + } + } + } + + auto& links = arr->links; + for (auto& link : links) { + if (link.other_obj == dest && link.type == type) { + return false; + } + if (link.other_obj == nullptr && link.type == MapLinkDefType::Invalid) { + link.type = type; + link.other_obj = dest; + link.iter = *iter; + return type != MapLinkDefType::Invalid; + } + } + return true; +} + ObjectLink* ObjectLinkData::findLinkWithType(MapLinkDefType t) { return findLinkWithType_0(t); } @@ -180,11 +283,70 @@ ObjectLink* ObjectLinkData::findLinkWithType_0(MapLinkDefType t) { } } +bool ObjectLinkData::sub_7100D4EC40(Object* obj, ObjectLink* link, Object* dest) { + for (auto& l : mLinksToSelf.links) { + auto type = link->type; + if (l.other_obj == obj && l.type == link->type) { + return true; + } + if (l.other_obj == nullptr) { + l.other_obj = obj; + l.type = type; + l.iter = link->iter; + + auto& iter = link->iter; + switch (type) { + default: + break; + case MapLinkDefType::BasicSig: + case MapLinkDefType::BasicSigOnOnly: { + bool no_auto_demo_member = false; + if (iter.tryGetParamBoolByKey(&no_auto_demo_member, "NoAutoDemoMember")) { + mNoAutoDemoMember = no_auto_demo_member; + } + break; + } + case MapLinkDefType::Create: + case MapLinkDefType::MtxCopyCreate: + if (obj->isLinkTag()) { + bool appear_fade = false; + if (iter.tryGetParamBoolByKey(&appear_fade, "AppearFade")) { + mAppearFade = appear_fade; + } + mCreateLinksSrcObj = obj; + } + break; + case MapLinkDefType::Delete: + if (obj->isLinkTag()) { + mDeleteLinksSrcObj = obj; + } + break; + } + return true; + } + } + return false; +} + void ObjectLinkData::setGenGroup(GenGroup* group) { if (mGenGroup == nullptr) mGenGroup = group; } +bool ObjectLinkData::checkCreateLinkObjRevival() const { + if (mCreateLinksSrcObj != nullptr) { + return !mCreateLinksSrcObj->checkRevivalMaybe(false); + } + return false; +} + +bool ObjectLinkData::checkDeleteLinkObjRevival() const { + if (mDeleteLinksSrcObj != nullptr) { + return mDeleteLinksSrcObj->checkRevivalMaybe(true); + } + return false; +} + // NON_MATCHING bool ObjectLinkArray::checkLink(MapLinkDefType t, bool b) { bool x_exists; @@ -217,6 +379,24 @@ done: return acc.checkLinkTagActivated(b, x_exists); } +bool ObjectLinkData::sub_7100D4EF30(act::ActorConstDataAccess& accessor) { + for (auto& link : mLinksOther.links) { + if (link.type == MapLinkDefType::Recreate && link.other_obj == accessor.getMapObject()) { + accessor.setActor687(); + return true; + } + } + return false; +} + +Object* ObjectLinkData::findObjectByActorName(const sead::SafeString& name) { + for (auto obj : mObjects) { + if (obj->getActorData().mActorName == name) + return obj; + } + return nullptr; +} + ObjectLink* ObjectLinkArray::findLinkWithType(MapLinkDefType type) { return findLinkWithType_0(type); } diff --git a/src/KingSystem/Map/mapObjectLink.h b/src/KingSystem/Map/mapObjectLink.h index 382aa804..b4ff79d6 100644 --- a/src/KingSystem/Map/mapObjectLink.h +++ b/src/KingSystem/Map/mapObjectLink.h @@ -8,6 +8,7 @@ namespace ksys::act { class Actor; class ActorLinkConstDataAccess; +class ActorConstDataAccess; } // namespace ksys::act namespace ksys::map { @@ -94,8 +95,12 @@ public: void deleteArrays(); void release(Object* obj, bool a1); + bool allocLinks(s32 num_links_ref, s32 num_links_other, s32 num_links_cs, sead::Heap* heap); bool allocLinksToSelf(s32 num_links, sead::Heap* heap); + bool addLink(Object* dest, const sead::SafeString& definition_name, bool passive, Object* src, + MubinIter* iter); + bool sub_7100D4EC40(Object* src, ObjectLink* link, Object* dest); void sub_7100D4FB78(Object* obj); bool checkCreateLinkObjRevival() const; @@ -103,7 +108,9 @@ public: ObjectLink* findLinkWithType(MapLinkDefType t); ObjectLink* findLinkWithType_0(MapLinkDefType t); + bool sub_7100D4EF30(act::ActorConstDataAccess& accessor); + Object* findObjectByActorName(const sead::SafeString& name); void setGenGroup(GenGroup* group); void x_1(act::Actor* actor, Object* obj);