Skip to content

Commit fb48170

Browse files
ksys/act: Add LinkTag
1 parent 90caa37 commit fb48170

File tree

6 files changed

+236
-5
lines changed

6 files changed

+236
-5
lines changed

data/uking_functions.csv

+5-5
Original file line numberDiff line numberDiff line change
@@ -73599,11 +73599,11 @@ Address,Quality,Size,Name
7359973599
0x0000007100d375e4,U,000076,LazyTraverseList::dtor
7360073600
0x0000007100d37630,U,000132,LazyTraverseList::updateFlags
7360173601
0x0000007100d376b4,U,000216,
73602-
0x0000007100d3778c,U,000204,LinkTag::construct
73602+
0x0000007100d3778c,O,000204,_ZN4ksys3act7LinkTag9constructERKNS0_8BaseProc9CreateArgEPN4sead4HeapE
7360373603
0x0000007100d37858,U,000280,LinkTag::calc
7360473604
0x0000007100d37970,U,000064,LinkTag::dtor
7360573605
0x0000007100d379b0,U,000072,LinkTag::dtorDelete
73606-
0x0000007100d379f8,U,001656,LinkTag::init2
73606+
0x0000007100d379f8,W,001656,_ZN4ksys3act7LinkTag4initEv
7360773607
0x0000007100d38070,U,000256,isLinkTagNAndOrNOr
7360873608
0x0000007100d38170,U,000308,map::isFlagSet
7360973609
0x0000007100d382a4,U,000056,LinkTag::finalizeInit
@@ -73620,7 +73620,7 @@ Address,Quality,Size,Name
7362073620
0x0000007100d3905c,U,000064,LinkTag::shouldSkipJobPush_
7362173621
0x0000007100d3909c,U,000132,LinkTag::prePushJob2
7362273622
0x0000007100d39120,U,000172,
73623-
0x0000007100d391cc,U,000596,LinkTag::updateIsFlagSetFlag
73623+
0x0000007100d391cc,W,000596,_ZN4ksys3act7LinkTag19updateIsFlagSetFlagEbbb
7362473624
0x0000007100d39420,U,000052,
7362573625
0x0000007100d39454,U,000588,isAreaOrLinkTagOrOtherTag
7362673626
0x0000007100d396a0,U,000584,LinkTag::isTriggered
@@ -73631,8 +73631,8 @@ Address,Quality,Size,Name
7363173631
0x0000007100d39d60,U,000132,
7363273632
0x0000007100d39de4,U,000072,
7363373633
0x0000007100d39e2c,U,000028,
73634-
0x0000007100d39e48,U,000204,LinkTag::rtti1
73635-
0x0000007100d39f14,U,000092,LinkTag::rtti2
73634+
0x0000007100d39e48,O,000204,_ZNK4ksys3act7LinkTag27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE
73635+
0x0000007100d39f14,O,000092,_ZNK4ksys3act7LinkTag18getRuntimeTypeInfoEv
7363673636
0x0000007100d39f70,O,000004,_ZN4ksys3act8BaseProc18onDeleteRequested_ENS1_12DeleteReasonE
7363773637
0x0000007100d39f74,O,000004,_ZN4ksys3act8BaseProc17onSleepRequested_ENS1_15SleepWakeReasonE
7363873638
0x0000007100d39f78,O,000004,_ZN4ksys3act8BaseProc18onWakeUpRequested_ENS1_15SleepWakeReasonE

src/KingSystem/ActorSystem/CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ target_sources(uking PRIVATE
9999
actInstParamPack.cpp
100100
actInstParamPack.h
101101
actLifeRecoveryInfo.h
102+
actLinkTag.cpp
103+
actLinkTag.h
102104
actPlayerInfo.cpp
103105
actPlayerInfo.h
104106
actTag.h
+155
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
#include "KingSystem/ActorSystem/actLinkTag.h"
2+
3+
#include "KingSystem/Map/mapObject.h"
4+
#include "KingSystem/Map/mapObjectLink.h"
5+
#include "KingSystem/System/SystemTimers.h"
6+
7+
namespace ksys::act {
8+
9+
LinkTag* LinkTag::construct(const BaseProc::CreateArg& arg, sead::Heap* heap) {
10+
return new (heap, std::nothrow) LinkTag(arg);
11+
}
12+
13+
LinkTag::LinkTag(const BaseProc::CreateArg& arg) : BaseProc(arg), mJob(this, &LinkTag::calc) {
14+
mJobHandlers[3] = &mJob;
15+
}
16+
17+
bool LinkTag::init() {
18+
if (mName == "LinkTagOr")
19+
mLinkTagType = Type::Or;
20+
else if (mName == "LinkTagNOr")
21+
mLinkTagType = Type::NOr;
22+
else if (mName == "LinkTagNAnd")
23+
mLinkTagType = Type::NAnd;
24+
else if (mName == "LinkTagXOr")
25+
mLinkTagType = Type::XOr;
26+
else if (mName == "LinkTagAnd")
27+
mLinkTagType = Type::And;
28+
else if (mName == "LinkTagCount")
29+
mLinkTagType = Type::Count;
30+
else if (mName == "LinkTagPulse")
31+
mLinkTagType = Type::Pulse;
32+
else if (mName == "LinkTagNone")
33+
mLinkTagType = Type::None;
34+
35+
if (mName == "LinkTagNAnd" || mName == "LinkTagNOr")
36+
mFlags.set(LinkTagFlag::_4);
37+
38+
int noChangeSignalValue = 0;
39+
mMubinIter.tryGetParamIntByKey(&noChangeSignalValue, "NoChangeSignal");
40+
if (noChangeSignalValue != 0)
41+
mFlags.set(LinkTagFlag::_40);
42+
43+
int saveFlagOnOffTypeValue = 0;
44+
if (mMubinIter.tryGetParamIntByKey(&saveFlagOnOffTypeValue, "SaveFlagOnOffType")) {
45+
if (saveFlagOnOffTypeValue == 2)
46+
mFlags.set(LinkTagFlag::_200);
47+
else if (saveFlagOnOffTypeValue == 1)
48+
mFlags.set(LinkTagFlag::_100);
49+
}
50+
51+
bool flagSet = false;
52+
isFlagSet(&flagSet, 0, mMapObj);
53+
updateIsFlagSetFlag(flagSet, 1, 1);
54+
if (flagSet) {
55+
mFlags.set(LinkTagFlag::_10);
56+
mTriggeredLinkFlags.makeAllOne();
57+
mFlags.set(LinkTagFlag::_30);
58+
} else {
59+
mFlags.reset(LinkTagFlag::_10);
60+
mTriggeredLinkFlags.makeAllZero();
61+
mFlags.reset(LinkTagFlag::_30);
62+
}
63+
return true;
64+
}
65+
66+
void LinkTag::updateIsFlagSetFlag(bool isFlagSet, bool a3, bool a4) {
67+
if (!mMapObj)
68+
return;
69+
70+
/*if (isFlagSet)
71+
mFlags.set(LinkTagFlag::_8);
72+
else
73+
mFlags.reset(LinkTagFlag::_8);*/
74+
mFlags.change(LinkTagFlag::_8, isFlagSet);
75+
76+
if (mFlags.isOff(LinkTagFlag::_40) || a3) {
77+
mMapObj->getFlags0().change(map::Object::Flag0::_100, isFlagSet);
78+
79+
if (mFlags.isOff(LinkTagFlag::_40)) {
80+
int frameCounter = SystemTimers::instance()->mFrameCounter;
81+
auto mapLinkData = mMapObj->getLinkData();
82+
if (mapLinkData) {
83+
auto mapLinks = mapLinkData->mLinksOther.links;
84+
if (isFlagSet != mMapObj->getFlags().isOn(map::Object::Flag::IsLinkTagNAndOrNOr)) {
85+
for (int i = 0; i < mapLinks.size(); i++) {
86+
auto& mapLink = mapLinks[i];
87+
if (mapLink.other_obj) {
88+
if (mapLink.type == map::MapLinkDefType::Create ||
89+
mapLink.type == map::MapLinkDefType::MtxCopyCreate) {
90+
if (_1E8 == frameCounter) {
91+
mapLink.other_obj->getFlags0().reset(
92+
map::Object::Flag0::_10000000);
93+
}
94+
} else if (mapLink.type == map::MapLinkDefType::Delete &&
95+
(mapLink.other_obj->getFlags0().isOff(
96+
map::Object::Flag0::_20000000))) {
97+
mapLink.other_obj->getFlags0().set(map::Object::Flag0::_20000000);
98+
_1E8 = frameCounter;
99+
}
100+
}
101+
}
102+
} else {
103+
for (int i = 0; i < mapLinks.size(); i++) {
104+
auto& mapLink = mapLinks[i];
105+
if (mapLink.other_obj) {
106+
switch (mapLink.type) {
107+
case map::MapLinkDefType::Create:
108+
case map::MapLinkDefType::MtxCopyCreate:
109+
if (mapLink.other_obj->getFlags0().isOff(
110+
map::Object::Flag0::_10000000)) {
111+
mapLink.other_obj->getFlags0().set(
112+
map::Object::Flag0::_10000000);
113+
_1E8 = frameCounter;
114+
}
115+
break;
116+
case map::MapLinkDefType::Delete:
117+
if (_1E8 == frameCounter)
118+
mapLink.other_obj->getFlags0().reset(
119+
map::Object::Flag0::_10000000);
120+
break;
121+
}
122+
}
123+
}
124+
}
125+
}
126+
}
127+
}
128+
129+
if (a4) {
130+
mFlags.reset(LinkTagFlag::_800);
131+
}
132+
if (isFlagSet != mMapObj->getFlags().isOn(map::Object::Flag::IsLinkTagNAndOrNOr)) {
133+
if (mFlags.isOff(LinkTagFlag::_800)) {
134+
mFlags.set(LinkTagFlag::_800);
135+
}
136+
mFlags.set(LinkTagFlag::_400);
137+
}
138+
if (mFlags.isOn(LinkTagFlag::_800)) {
139+
mFlags.set(LinkTagFlag::_C00);
140+
}
141+
142+
if (!a3) {
143+
auto mapLinkData = mMapObj->getLinkData();
144+
if (mapLinkData) {
145+
if (mapLinkData->isGenGroupInitState3() &&
146+
(mapLinkData->findLinkWithType(map::MapLinkDefType::Create) ||
147+
mapLinkData->findLinkWithType(map::MapLinkDefType::Delete) ||
148+
mapLinkData->findLinkWithType(map::MapLinkDefType::MtxCopyCreate))) {
149+
mapLinkData->sub_7100D4FA90();
150+
}
151+
}
152+
}
153+
}
154+
155+
} // namespace ksys::act
+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#pragma once
2+
3+
#include <prim/seadLongBitFlag.h>
4+
#include <prim/seadTypedBitFlag.h>
5+
#include <thread/seadAtomic.h>
6+
#include "KingSystem/ActorSystem/actBaseProc.h"
7+
#include "KingSystem/ActorSystem/actBaseProcJobHandler.h"
8+
#include "KingSystem/Map/mapMubinIter.h"
9+
#include "KingSystem/Utils/Types.h"
10+
11+
namespace ksys::map {
12+
class Object;
13+
} // namespace ksys::map
14+
15+
namespace ksys::act {
16+
17+
class LinkTag : public BaseProc {
18+
SEAD_RTTI_OVERRIDE(LinkTag, BaseProc)
19+
20+
public:
21+
enum class Type : u8 { And, Or, NAnd, NOr, XOr, Count, Pulse, None };
22+
enum class JobFlag {};
23+
enum class LinkTagFlag : u16 {
24+
_4 = 0x4,
25+
_8 = 0x8,
26+
_10 = 0x10,
27+
_20 = 0x20,
28+
_40 = 0x40,
29+
_100 = 0x100,
30+
_200 = 0x200,
31+
_400 = 0x400,
32+
_800 = 0x800,
33+
34+
_30 = _10 | _20,
35+
_C00 = _400 | _800
36+
};
37+
38+
static LinkTag* construct(const BaseProc::CreateArg& arg, sead::Heap* heap);
39+
40+
explicit LinkTag(const BaseProc::CreateArg& arg);
41+
void calc();
42+
bool init();
43+
void updateIsFlagSetFlag(bool isFlagSet, bool a3, bool a4);
44+
45+
// this doesn't even belong in this namespace, but is used as a placeholder for init()
46+
void isFlagSet(bool* isSet, int unk, map::Object* object);
47+
48+
BaseProcJobHandlerT<LinkTag> mJob;
49+
sead::LongBitFlag<96> mTriggeredLinkFlags;
50+
Type mLinkTagType = Type::And;
51+
u8 _1dd = 0xFF;
52+
sead::Atomic<u8> _1de = 0;
53+
u8 _1df = 0xFF;
54+
sead::TypedBitFlag<LinkTagFlag> mFlags;
55+
u8 mTagCount = 0;
56+
u8 _1E3 = 0;
57+
u32 mCounter = 0;
58+
int _1E8 = 0;
59+
sead::TypedBitFlag<JobFlag, sead::Atomic<u32>> mJobFlags;
60+
u32 mHashId = 0;
61+
map::MubinIter mMubinIter;
62+
map::Object* mMapObj = nullptr;
63+
};
64+
KSYS_CHECK_SIZE_NX150(LinkTag, 0x210);
65+
66+
} // namespace ksys::act

src/KingSystem/Map/mapObject.h

+3
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ class Object {
4949
_400000 = 0x400000,
5050
_2000000 = 0x2000000,
5151
_4000000 = 0x4000000,
52+
_10000000 = 0x10000000,
53+
_20000000 = 0x20000000,
5254
_40000000 = 0x40000000,
5355
_80000000 = 0x80000000,
5456
ResetOnUnlinkFailed = _100 | _2000,
@@ -176,6 +178,7 @@ class Object {
176178
Object* findSrcLODLinkObject() const;
177179

178180
const auto& getFlags0() const { return mFlags0; }
181+
auto& getFlags0() { return mFlags0; }
179182
const auto& getFlags() const { return mFlags; }
180183
const auto& getActorFlags8() const { return mActorFlags8; }
181184
const auto& getHardModeFlags() const { return mHardModeFlags; }

src/KingSystem/Map/mapObjectLink.h

+5
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,11 @@ class ObjectLinkData {
112112
return checkDeleteLinkObjRevival() || checkCreateLinkObjRevival();
113113
}
114114

115+
// TODO requires implementation: 0x7100D4FA70
116+
bool isGenGroupInitState3() const;
117+
// TODO requires implementation: 0x7100D4FA90
118+
void sub_7100D4FA90();
119+
115120
Object* mCreateLinksSrcObj = nullptr;
116121
Object* mDeleteLinksSrcObj = nullptr;
117122

0 commit comments

Comments
 (0)