mirror of https://github.com/zeldaret/botw.git
179 lines
4.0 KiB
C++
179 lines
4.0 KiB
C++
#pragma once
|
|
|
|
#include <math/seadVector.h>
|
|
#include <prim/seadDelegate.h>
|
|
#include <prim/seadSafeString.h>
|
|
#include <prim/seadTypedBitFlag.h>
|
|
#include <thread/seadCriticalSection.h>
|
|
#include "KingSystem/Map/mapObject.h"
|
|
#include "KingSystem/Map/mapObjectLink.h"
|
|
#include "KingSystem/Physics/physMaterialMask.h"
|
|
#include "KingSystem/Utils/Types.h"
|
|
|
|
namespace ksys::phys {
|
|
class RayCastForRequest;
|
|
class RigidBody;
|
|
} // namespace ksys::phys
|
|
|
|
namespace ksys::map {
|
|
|
|
class AutoPlacement;
|
|
struct AutoPlacementFlowRes;
|
|
class PlacementThing;
|
|
|
|
struct PlacementGroup {
|
|
sead::SafeString a;
|
|
u32 _10;
|
|
u32 _14;
|
|
u8 _18;
|
|
u8 _19;
|
|
u8 _1a;
|
|
u8 _1b;
|
|
u8 _1c;
|
|
u8 _1d;
|
|
u8 _1e;
|
|
u8 _1f{};
|
|
s16 _20;
|
|
u16 _22{};
|
|
u8 _24;
|
|
u8 _25{};
|
|
void* _28;
|
|
void* _30;
|
|
void* _38;
|
|
void* _40;
|
|
void* _48;
|
|
void* _50;
|
|
void* _58;
|
|
void* _60;
|
|
void* _68;
|
|
sead::SafeString b;
|
|
u32 _80{};
|
|
};
|
|
KSYS_CHECK_SIZE_NX150(PlacementGroup, 0x88);
|
|
|
|
class PlacementThing {
|
|
public:
|
|
enum class State : u32 {
|
|
Invalid,
|
|
Uninitialized,
|
|
Initialized,
|
|
LayersDone,
|
|
RaycastDone,
|
|
PlacementDone,
|
|
};
|
|
|
|
explicit PlacementThing(bool set)
|
|
: mDelegate{this, &PlacementThing::sub_7100650C28}, _8944(set) {}
|
|
|
|
bool invoke();
|
|
void stepRaycast();
|
|
void sub_7100650C28(phys::RigidBody*);
|
|
const char* getCurrentGroundMat() const;
|
|
const char* getCurrentWaterSubMat() const;
|
|
|
|
private:
|
|
friend class AutoPlacement;
|
|
|
|
phys::RayCastForRequest* mRaycast{};
|
|
u8 _8880{};
|
|
u8 mUnderwater{};
|
|
sead::Vector3f mVec1{};
|
|
sead::Vector3f mQueryVec{};
|
|
u32 _889c{};
|
|
f32 _88a0 = 1.0f;
|
|
phys::MaterialMask mMask1;
|
|
phys::MaterialMask mMask2;
|
|
f32 mWaterQuery = -1.0f;
|
|
sead::Delegate1<PlacementThing, phys::RigidBody*> mDelegate;
|
|
sead::CriticalSection mCS{};
|
|
State mState;
|
|
u8 _8944{};
|
|
u8 _8945{};
|
|
};
|
|
|
|
struct ActorSpawnInfo {
|
|
enum class SpawnLocation : u16 {
|
|
CheckBirdSafetyArea = 1,
|
|
|
|
// exclusive
|
|
TrunkOrGlowStoneLocator = 2,
|
|
_4 = 4,
|
|
TrunkLocatorRandom = 8,
|
|
_10 = 0x10,
|
|
BranchLocatorRandom = 0x20,
|
|
OnTreeLocator = 0x40,
|
|
OnTreeLocatorRandom = 0x80,
|
|
|
|
IsSnowBall = 0x100,
|
|
};
|
|
|
|
void calcSpawnLocations();
|
|
|
|
sead::SafeString name{};
|
|
AutoPlacementFlowRes* flow;
|
|
u8 _18;
|
|
u8 _19;
|
|
sead::TypedBitFlag<SpawnLocation> spawn_location{};
|
|
u16 _1c;
|
|
u16 _1e;
|
|
};
|
|
|
|
class AutoPlacement {
|
|
public:
|
|
AutoPlacement();
|
|
~AutoPlacement();
|
|
|
|
bool sub_710064CBFC(sead::Heap* heap, u8 flag, s32 num_spawn, s32 num_obj);
|
|
u32 sub_710064CD80(u32, u32);
|
|
void sub_710064CF60(bool force);
|
|
|
|
bool sub_710064ED60(const sead::SafeString& name, const sead::Vector3f& distance);
|
|
|
|
void setSpawnInfo(const sead::SafeString& name, s32 count);
|
|
void sub_710064DA54();
|
|
|
|
bool sub_710064E178(const sead::SafeString& name, u32 placement_type,
|
|
const sead::Vector3f& pos);
|
|
bool sub_710064EF24(ActorSpawnInfo* info, const sead::Vector3f& pos);
|
|
void sub_710064F744(u8 a1, u8 a2);
|
|
void incrementGroup();
|
|
bool sub_7100650144(PlacementGroup* grp, bool check_exposure);
|
|
s32 placeGroup(AutoPlacementFlowRes* res);
|
|
s32 sub_7100650908();
|
|
void stepAllRaycasts();
|
|
void sub_7100650C28(phys::RigidBody* rb);
|
|
|
|
private:
|
|
struct ObjectRef {
|
|
Object* obj;
|
|
void* _8;
|
|
};
|
|
|
|
s16 _0 = 0;
|
|
s16 mGroupIdx = -1;
|
|
u8 _4 = 0xFF;
|
|
u8 _5 = 0xFF;
|
|
s16 _6 = 0;
|
|
u8 _8 = 0;
|
|
u8 _9 = 2;
|
|
sead::BitFlag<u8> mNearFlag{};
|
|
sead::BitFlag<u8> _b{};
|
|
u8 _c = 0;
|
|
u8 _d = 0;
|
|
u8 _e = 0;
|
|
u8 _f = 0;
|
|
u8 _10 = 0;
|
|
s32 _14 = 0;
|
|
sead::Buffer<ActorSpawnInfo> mSpawnInfo;
|
|
sead::CriticalSection mCS{};
|
|
sead::SafeArray<PlacementGroup, 0x100> mGroups{};
|
|
sead::SafeString _8868{};
|
|
PlacementThing mThing1{false};
|
|
PlacementThing mThing2{false};
|
|
PlacementThing mThing3{true};
|
|
void* mX;
|
|
sead::Buffer<ObjectRef> mObjectRefs;
|
|
};
|
|
|
|
} // namespace ksys::map
|