mirror of
https://github.com/isledecomp/isle-portable.git
synced 2026-05-01 18:13:57 +00:00
Some checks failed
CI / clang-format (push) Has been cancelled
CI / ${{ matrix.name }} (false, --toolchain /usr/local/vitasdk/share/vita.toolchain.cmake, false, false, Ninja, Vita, ubuntu-latest, true, true) (push) Has been cancelled
CI / ${{ matrix.name }} (false, -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0.26100.0, false, false, Visual Studio 17 2022, true, Xbox One, windows-latest, amd64, false, true) (push) Has been cancelled
CI / ${{ matrix.name }} (false, -DCMAKE_TOOLCHAIN_FILE=/opt/devkitpro/cmake/3DS.cmake, false, devkitpro/devkitarm:latest, false, Ninja, true, Nintendo 3DS, ubuntu-latest, true) (push) Has been cancelled
CI / ${{ matrix.name }} (false, -DCMAKE_TOOLCHAIN_FILE=/opt/devkitpro/cmake/Switch.cmake, false, devkitpro/devkita64:latest, false, Ninja, Nintendo Switch, true, ubuntu-latest, true) (push) Has been cancelled
CI / ${{ matrix.name }} (false, emcmake, false, false, true, Ninja, Emscripten, ubuntu-latest, true) (push) Has been cancelled
CI / ${{ matrix.name }} (false, false, false, Ninja, true, MSVC (arm64), windows-latest, amd64_arm64, false) (push) Has been cancelled
CI / ${{ matrix.name }} (false, false, true, Ninja, true, MSVC (x86), windows-latest, amd64_x86, false) (push) Has been cancelled
CI / ${{ matrix.name }} (false, true, false, Ninja, true, MSVC (x64), windows-latest, amd64, false) (push) Has been cancelled
CI / ${{ matrix.name }} (false, true, true, false, Ninja, true, MSVC (x64 Debug), windows-latest, amd64, false) (push) Has been cancelled
CI / ${{ matrix.name }} (true, false, -DCMAKE_SYSTEM_NAME=iOS, false, false, Xcode, true, iOS, macos-15, true) (push) Has been cancelled
CI / ${{ matrix.name }} (true, false, false, false, Ninja, Android, ubuntu-latest, true) (push) Has been cancelled
CI / ${{ matrix.name }} (true, false, true, false, Ninja, macOS, macos-latest, true) (push) Has been cancelled
CI / ${{ matrix.name }} (true, true, false, Ninja, true, mingw-w64-x86_64, mingw64, msys2 mingw64, windows-latest, msys2 {0}, true) (push) Has been cancelled
CI / ${{ matrix.name }} (true, true, true, false, Ninja, true, Linux (Debug), ubuntu-latest, true) (push) Has been cancelled
CI / ${{ matrix.name }} (true, true, true, false, Ninja, true, Linux, ubuntu-latest, true) (push) Has been cancelled
CI / Flatpak (${{ matrix.arch }}) (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Flatpak (${{ matrix.arch }}) (x86_64, ubuntu-latest) (push) Has been cancelled
CI / C++ (push) Has been cancelled
Docker / Publish web port (push) Has been cancelled
CI / Release (push) Has been cancelled
Introduces a third person camera system with orbit camera, input handling (mouse/keyboard/touch/gamepad), display actor cloning, and camera-relative movement. Includes shared character utilities (animator, cloner, customizer) and an IExtraAnimHandler interface for optional animation extensions. Also includes generic base game fixes and extension system improvements.
161 lines
6.1 KiB
C++
161 lines
6.1 KiB
C++
#ifndef LEGOCHARACTERMANAGER_H
|
|
#define LEGOCHARACTERMANAGER_H
|
|
|
|
#include "decomp.h"
|
|
#include "extensions/fwd.h"
|
|
#include "mxstl/stlcompat.h"
|
|
#include "mxtypes.h"
|
|
#include "mxvariable.h"
|
|
#include "roi/legoroi.h"
|
|
|
|
#include <SDL3/SDL_stdinc.h>
|
|
|
|
class LegoActor;
|
|
class LegoExtraActor;
|
|
class LegoStorage;
|
|
class LegoROI;
|
|
|
|
#pragma warning(disable : 4237)
|
|
|
|
struct LegoCharacterComparator {
|
|
MxBool operator()(const char* const& p_a, const char* const& p_b) const { return SDL_strcasecmp(p_a, p_b) < 0; }
|
|
};
|
|
|
|
// SIZE 0x08
|
|
struct LegoCharacter {
|
|
LegoCharacter(LegoROI* p_roi)
|
|
{
|
|
m_roi = p_roi;
|
|
m_refCount = 1;
|
|
}
|
|
~LegoCharacter() { delete m_roi; }
|
|
|
|
void AddRef() { m_refCount++; }
|
|
MxU32 RemoveRef()
|
|
{
|
|
if (m_refCount != 0) {
|
|
m_refCount--;
|
|
}
|
|
|
|
return m_refCount;
|
|
}
|
|
|
|
LegoROI* m_roi; // 0x00
|
|
MxU32 m_refCount; // 0x04
|
|
};
|
|
|
|
struct LegoActorInfo;
|
|
|
|
typedef map<char*, LegoCharacter*, LegoCharacterComparator> LegoCharacterMap;
|
|
|
|
// VTABLE: LEGO1 0x100da878
|
|
// VTABLE: BETA10 0x101bc028
|
|
// SIZE 0x24
|
|
class CustomizeAnimFileVariable : public MxVariable {
|
|
public:
|
|
CustomizeAnimFileVariable(const char* p_key);
|
|
|
|
void SetValue(const char* p_value) override; // vtable+0x04
|
|
};
|
|
|
|
// SIZE 0x08
|
|
class LegoCharacterManager {
|
|
public:
|
|
LegoCharacterManager();
|
|
~LegoCharacterManager();
|
|
|
|
MxResult Write(LegoStorage* p_storage);
|
|
MxResult Read(LegoStorage* p_storage);
|
|
const char* GetActorName(MxS32 p_index);
|
|
MxU32 GetNumActors();
|
|
LegoROI* GetActorROI(const char* p_name, MxBool p_createEntity);
|
|
|
|
void Init();
|
|
static void SetCustomizeAnimFile(const char* p_value);
|
|
static MxBool IsActor(const char* p_name);
|
|
|
|
void ReleaseAllActors();
|
|
MxBool Exists(const char* p_name);
|
|
MxU32 GetRefCount(LegoROI* p_roi);
|
|
void ReleaseActor(const char* p_name);
|
|
void ReleaseActor(LegoROI* p_roi);
|
|
void ReleaseAutoROI(LegoROI* p_roi);
|
|
MxBool SetHeadTexture(LegoROI* p_roi, LegoTextureInfo* p_texture);
|
|
LegoExtraActor* GetExtraActor(const char* p_name);
|
|
LegoActorInfo* GetActorInfo(const char* p_name);
|
|
LegoActorInfo* GetActorInfo(LegoROI* p_roi);
|
|
MxBool SwitchColor(LegoROI* p_roi, LegoROI* p_targetROI);
|
|
MxBool SwitchVariant(LegoROI* p_roi);
|
|
MxBool SwitchSound(LegoROI* p_roi);
|
|
MxBool SwitchMove(LegoROI* p_roi);
|
|
MxBool SwitchMood(LegoROI* p_roi);
|
|
MxU32 GetAnimationId(LegoROI* p_roi);
|
|
MxU32 GetSoundId(LegoROI* p_roi, MxBool p_basedOnMood);
|
|
MxU8 GetMood(LegoROI* p_roi);
|
|
LegoROI* CreateAutoROI(const char* p_name, const char* p_lodName, MxBool p_createEntity);
|
|
MxResult UpdateBoundingSphereAndBox(LegoROI* p_roi);
|
|
LegoROI* FUN_10085a80(const char* p_name, const char* p_lodName, MxBool p_createEntity);
|
|
|
|
static const char* GetCustomizeAnimFile() { return g_customizeAnimFile; }
|
|
|
|
private:
|
|
friend class Extensions::Common::CharacterCloner;
|
|
|
|
LegoROI* CreateActorROI(const char* p_key);
|
|
void RemoveROI(LegoROI* p_roi);
|
|
LegoROI* FindChildROI(LegoROI* p_roi, const char* p_name);
|
|
|
|
static char* g_customizeAnimFile;
|
|
static MxU32 g_maxMove;
|
|
static MxU32 g_maxSound;
|
|
|
|
LegoCharacterMap* m_characters; // 0x00
|
|
CustomizeAnimFileVariable* m_customizeAnimFile; // 0x04
|
|
};
|
|
|
|
// clang-format off
|
|
// TEMPLATE: LEGO1 0x1001a690
|
|
// list<ROI *,allocator<ROI *> >::_Buynode
|
|
|
|
// TEMPLATE: LEGO1 0x10035790
|
|
// ?_Construct@@YAXPAPAVROI@@ABQAV1@@Z
|
|
|
|
// TEMPLATE: LEGO1 0x10082b90
|
|
// _Tree<char *,pair<char * const,LegoCharacter *>,map<char *,LegoCharacter *,LegoCharacterComparator,allocator<LegoCharacter *> >::_Kfn,LegoCharacterComparator,allocator<LegoCharacter *> >::~_Tree<char *,pair<char * const,LegoCharacter *>,map<char *,LegoCharacter *,LegoCharacterComparator,allocator<LegoCharacter *> >::_Kfn,LegoCharacterComparator,allocator<LegoCharacter *> >
|
|
|
|
// TEMPLATE: LEGO1 0x10082c60
|
|
// _Tree<char *,pair<char * const,LegoCharacter *>,map<char *,LegoCharacter *,LegoCharacterComparator,allocator<LegoCharacter *> >::_Kfn,LegoCharacterComparator,allocator<LegoCharacter *> >::iterator::_Inc
|
|
|
|
// TEMPLATE: LEGO1 0x10082ca0
|
|
// _Tree<char *,pair<char * const,LegoCharacter *>,map<char *,LegoCharacter *,LegoCharacterComparator,allocator<LegoCharacter *> >::_Kfn,LegoCharacterComparator,allocator<LegoCharacter *> >::erase
|
|
|
|
// TEMPLATE: LEGO1 0x100830f0
|
|
// _Tree<char *,pair<char * const,LegoCharacter *>,map<char *,LegoCharacter *,LegoCharacterComparator,allocator<LegoCharacter *> >::_Kfn,LegoCharacterComparator,allocator<LegoCharacter *> >::_Erase
|
|
|
|
// TEMPLATE: LEGO1 0x10083130
|
|
// map<char *,LegoCharacter *,LegoCharacterComparator,allocator<LegoCharacter *> >::~map<char *,LegoCharacter *,LegoCharacterComparator,allocator<LegoCharacter *> >
|
|
|
|
// TEMPLATE: LEGO1 0x10083840
|
|
// _Tree<char *,pair<char * const,LegoCharacter *>,map<char *,LegoCharacter *,LegoCharacterComparator,allocator<LegoCharacter *> >::_Kfn,LegoCharacterComparator,allocator<LegoCharacter *> >::iterator::_Dec
|
|
|
|
// TEMPLATE: LEGO1 0x10083890
|
|
// _Tree<char *,pair<char * const,LegoCharacter *>,map<char *,LegoCharacter *,LegoCharacterComparator,allocator<LegoCharacter *> >::_Kfn,LegoCharacterComparator,allocator<LegoCharacter *> >::_Insert
|
|
|
|
// TEMPLATE: LEGO1 0x10085500
|
|
// _Tree<char *,pair<char * const,LegoCharacter *>,map<char *,LegoCharacter *,LegoCharacterComparator,allocator<LegoCharacter *> >::_Kfn,LegoCharacterComparator,allocator<LegoCharacter *> >::insert
|
|
|
|
// TEMPLATE: LEGO1 0x10085790
|
|
// _Tree<char *,pair<char * const,LegoCharacter *>,map<char *,LegoCharacter *,LegoCharacterComparator,allocator<LegoCharacter *> >::_Kfn,LegoCharacterComparator,allocator<LegoCharacter *> >::_Buynode
|
|
|
|
// TEMPLATE: LEGO1 0x100857b0
|
|
// _Tree<char *,pair<char * const,LegoCharacter *>,map<char *,LegoCharacter *,LegoCharacterComparator,allocator<LegoCharacter *> >::_Kfn,LegoCharacterComparator,allocator<LegoCharacter *> >::_Lrotate
|
|
|
|
// TEMPLATE: LEGO1 0x10085810
|
|
// _Tree<char *,pair<char * const,LegoCharacter *>,map<char *,LegoCharacter *,LegoCharacterComparator,allocator<LegoCharacter *> >::_Kfn,LegoCharacterComparator,allocator<LegoCharacter *> >::_Rrotate
|
|
|
|
// GLOBAL: LEGO1 0x100fc508
|
|
// _Tree<char *,pair<char * const,LegoCharacter *>,map<char *,LegoCharacter *,LegoCharacterComparator,allocator<LegoCharacter *> >::_Kfn,LegoCharacterComparator,allocator<LegoCharacter *> >::_Nil
|
|
// clang-format on
|
|
|
|
#endif // LEGOCHARACTERMANAGER_H
|