mirror of https://github.com/zeldaret/botw.git
mapObject work
This commit is contained in:
parent
dc4e48523b
commit
6118d22c20
|
|
@ -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,
|
||||
|
|
|
|||
|
Can't render this file because it is too large.
|
|
|
@ -119,6 +119,8 @@ public:
|
|||
f32 getHorseAvoidOffset() const;
|
||||
bool horseTargetedIsCircularMoveAlways() const;
|
||||
|
||||
void setActor687();
|
||||
|
||||
private:
|
||||
Actor* getActor() const;
|
||||
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue