metaforce/Runtime/ImGuiEntitySupport.cpp

917 lines
42 KiB
C++

#include "Runtime/ImGuiEntitySupport.hpp"
#include "Runtime/World/CActor.hpp"
#include "Runtime/World/CAi.hpp"
#include "Runtime/World/CAmbientAI.hpp"
#include "Runtime/World/CDestroyableRock.hpp"
#include "Runtime/World/CEffect.hpp"
#include "Runtime/World/CEntity.hpp"
#include "Runtime/World/CExplosion.hpp"
#include "Runtime/World/CFire.hpp"
#include "Runtime/World/CFishCloud.hpp"
#include "Runtime/World/CFishCloudModifier.hpp"
#include "Runtime/World/CGameLight.hpp"
#include "Runtime/World/CHUDBillboardEffect.hpp"
#include "Runtime/World/CIceImpact.hpp"
#include "Runtime/World/CPatterned.hpp"
#include "Runtime/World/CPlayer.hpp"
#include "Runtime/World/CRepulsor.hpp"
#include "Runtime/World/CScriptActor.hpp"
#include "Runtime/World/CScriptActorKeyframe.hpp"
#include "Runtime/World/CScriptActorRotate.hpp"
#include "Runtime/World/CScriptAiJumpPoint.hpp"
#include "Runtime/World/CScriptAreaAttributes.hpp"
#include "Runtime/World/CScriptBallTrigger.hpp"
#include "Runtime/World/CScriptBeam.hpp"
#include "Runtime/World/CScriptCameraBlurKeyframe.hpp"
#include "Runtime/World/CScriptCameraFilterKeyframe.hpp"
#include "Runtime/World/CScriptCameraHint.hpp"
#include "Runtime/World/CScriptCameraHintTrigger.hpp"
#include "Runtime/World/CScriptCameraPitchVolume.hpp"
#include "Runtime/World/CScriptCameraShaker.hpp"
#include "Runtime/World/CScriptCameraWaypoint.hpp"
#include "Runtime/World/CScriptColorModulate.hpp"
#include "Runtime/World/CScriptControllerAction.hpp"
#include "Runtime/World/CScriptCounter.hpp"
#include "Runtime/World/CScriptCoverPoint.hpp"
#include "Runtime/World/CScriptDamageableTrigger.hpp"
#include "Runtime/World/CScriptDebris.hpp"
#include "Runtime/World/CScriptDebugCameraWaypoint.hpp"
#include "Runtime/World/CScriptDistanceFog.hpp"
#include "Runtime/World/CScriptDock.hpp"
#include "Runtime/World/CScriptDockAreaChange.hpp"
#include "Runtime/World/CScriptDoor.hpp"
#include "Runtime/World/CScriptEMPulse.hpp"
#include "Runtime/World/CScriptEffect.hpp"
#include "Runtime/World/CScriptGenerator.hpp"
#include "Runtime/World/CScriptGrapplePoint.hpp"
#include "Runtime/World/CScriptGunTurret.hpp"
#include "Runtime/World/CScriptHUDMemo.hpp"
#include "Runtime/World/CScriptMazeNode.hpp"
#include "Runtime/World/CScriptMemoryRelay.hpp"
#include "Runtime/World/CScriptMidi.hpp"
#include "Runtime/World/CScriptPickup.hpp"
#include "Runtime/World/CScriptPickupGenerator.hpp"
#include "Runtime/World/CScriptPlatform.hpp"
#include "Runtime/World/CScriptPlayerActor.hpp"
#include "Runtime/World/CScriptPlayerHint.hpp"
#include "Runtime/World/CScriptPlayerStateChange.hpp"
#include "Runtime/World/CScriptPointOfInterest.hpp"
#include "Runtime/World/CScriptRandomRelay.hpp"
#include "Runtime/World/CScriptRelay.hpp"
#include "Runtime/World/CScriptRipple.hpp"
#include "Runtime/World/CScriptRoomAcoustics.hpp"
#include "Runtime/World/CScriptShadowProjector.hpp"
#include "Runtime/World/CScriptSound.hpp"
#include "Runtime/World/CScriptSpawnPoint.hpp"
#include "Runtime/World/CScriptSpecialFunction.hpp"
#include "Runtime/World/CScriptSpiderBallAttractionSurface.hpp"
#include "Runtime/World/CScriptSpiderBallWaypoint.hpp"
#include "Runtime/World/CScriptSpindleCamera.hpp"
#include "Runtime/World/CScriptSteam.hpp"
#include "Runtime/World/CScriptStreamedMusic.hpp"
#include "Runtime/World/CScriptSwitch.hpp"
#include "Runtime/World/CScriptTargetingPoint.hpp"
#include "Runtime/World/CScriptTimer.hpp"
#include "Runtime/World/CScriptTrigger.hpp"
#include "Runtime/World/CScriptVisorFlare.hpp"
#include "Runtime/World/CScriptVisorGoo.hpp"
#include "Runtime/World/CScriptWater.hpp"
#include "Runtime/World/CScriptWaypoint.hpp"
#include "Runtime/World/CScriptWorldTeleporter.hpp"
#include "Runtime/World/CSnakeWeedSwarm.hpp"
#include "Runtime/World/CTeamAiMgr.hpp"
#include "Runtime/World/CWallCrawlerSwarm.hpp"
#include "Runtime/World/CWallWalker.hpp"
#include "Runtime/Camera/CGameCamera.hpp"
#include "Runtime/Camera/CCinematicCamera.hpp"
#include "Runtime/Camera/CFirstPersonCamera.hpp"
#include "Runtime/Camera/CInterpolationCamera.hpp"
#include "Runtime/Camera/CPathCamera.hpp"
#include "Runtime/Collision/CCollisionActor.hpp"
#include "Runtime/Weapon/CWeapon.hpp"
#include "Runtime/Weapon/CBeamProjectile.hpp"
#include "Runtime/Weapon/CBomb.hpp"
#include "Runtime/Weapon/CElectricBeamProjectile.hpp"
#include "Runtime/Weapon/CFlameThrower.hpp"
#include "Runtime/Weapon/CGameProjectile.hpp"
#include "Runtime/Weapon/CNewFlameThrower.hpp"
#include "Runtime/Weapon/CPlasmaProjectile.hpp"
#include "Runtime/Weapon/CPowerBomb.hpp"
#include "Runtime/Weapon/CTargetableProjectile.hpp"
#include "Runtime/Weapon/CWaveBuster.hpp"
#include "Runtime/MP1/World/CActorContraption.hpp"
#include "Runtime/MP1/World/CAtomicAlpha.hpp"
#include "Runtime/MP1/World/CAtomicBeta.hpp"
#include "Runtime/MP1/World/CBabygoth.hpp"
#include "Runtime/MP1/World/CBeetle.hpp"
#include "Runtime/MP1/World/CBloodFlower.hpp"
#include "Runtime/MP1/World/CBouncyGrenade.hpp"
#include "Runtime/MP1/World/CBurrower.hpp"
#include "Runtime/MP1/World/CChozoGhost.hpp"
#include "Runtime/MP1/World/CDrone.hpp"
#include "Runtime/MP1/World/CDroneLaser.hpp"
#include "Runtime/MP1/World/CElitePirate.hpp"
#include "Runtime/MP1/World/CEnergyBall.hpp"
#include "Runtime/MP1/World/CEyeball.hpp"
#include "Runtime/MP1/World/CFireFlea.hpp"
#include "Runtime/MP1/World/CFlaahgra.hpp"
#include "Runtime/MP1/World/CFlaahgraProjectile.hpp"
#include "Runtime/MP1/World/CFlaahgraTentacle.hpp"
#include "Runtime/MP1/World/CFlickerBat.hpp"
#include "Runtime/MP1/World/CFlyingPirate.hpp"
#include "Runtime/MP1/World/CGrenadeLauncher.hpp"
#include "Runtime/MP1/World/CIceAttackProjectile.hpp"
#include "Runtime/MP1/World/CIceSheegoth.hpp"
#include "Runtime/MP1/World/CJellyZap.hpp"
#include "Runtime/MP1/World/CMagdolite.hpp"
#include "Runtime/MP1/World/CMetaree.hpp"
#include "Runtime/MP1/World/CMetroid.hpp"
#include "Runtime/MP1/World/CMetroidBeta.hpp"
#include "Runtime/MP1/World/CMetroidPrimeEssence.hpp"
#include "Runtime/MP1/World/CMetroidPrimeExo.hpp"
#include "Runtime/MP1/World/CMetroidPrimeProjectile.hpp"
#include "Runtime/MP1/World/CMetroidPrimeRelay.hpp"
#include "Runtime/MP1/World/CNewIntroBoss.hpp"
#include "Runtime/MP1/World/COmegaPirate.hpp"
#include "Runtime/MP1/World/CParasite.hpp"
#include "Runtime/MP1/World/CPhazonHealingNodule.hpp"
#include "Runtime/MP1/World/CPhazonPool.hpp"
#include "Runtime/MP1/World/CPuddleSpore.hpp"
#include "Runtime/MP1/World/CPuddleToadGamma.hpp"
#include "Runtime/MP1/World/CPuffer.hpp"
#include "Runtime/MP1/World/CRidley.hpp"
#include "Runtime/MP1/World/CRipper.hpp"
#include "Runtime/MP1/World/CSeedling.hpp"
#include "Runtime/MP1/World/CShockWave.hpp"
#include "Runtime/MP1/World/CSpacePirate.hpp"
#include "Runtime/MP1/World/CSpankWeed.hpp"
#include "Runtime/MP1/World/CThardus.hpp"
#include "Runtime/MP1/World/CThardusRockProjectile.hpp"
#include "Runtime/MP1/World/CTryclops.hpp"
#include "Runtime/MP1/World/CWarWasp.hpp"
#include "Runtime/World/CWorld.hpp"
#include "Runtime/World/CGameArea.hpp"
#include "Runtime/GameGlobalObjects.hpp"
#include "ImGuiConsole.hpp"
#include "imgui.h"
#include "magic_enum.hpp"
#include <cinttypes>
#define IMGUI_ENTITY_INSPECT(CLS, PARENT, NAME, ...) \
std::string_view CLS::ImGuiType() { return #NAME; } \
void CLS::ImGuiInspect() { \
PARENT::ImGuiInspect(); \
if (ImGui::CollapsingHeader(#NAME)) \
__VA_ARGS__ \
}
#define BITFIELD_CHECKBOX(label, bf, ...) \
{ \
bool b = (bf); \
if (ImGui::Checkbox(label, &b)) { \
(bf) = b; \
__VA_ARGS__ \
} \
}
namespace metaforce {
bool ImGuiVector3fInput(const char* label, zeus::CVector3f& vec) {
std::array<float, 3> arr{vec.x(), vec.y(), vec.z()};
if (ImGui::DragFloat3(label, arr.data(), 0.1f)) {
vec.assign(arr[0], arr[1], arr[2]);
return true;
}
return false;
}
static bool ImGuiColorInput(const char* label, zeus::CColor& col) {
std::array<float, 4> arr{col.r(), col.g(), col.b(), col.a()};
if (ImGui::ColorEdit4(label, arr.data())) {
col = zeus::CColor{arr[0], arr[1], arr[2], arr[3]};
return true;
}
return false;
}
template <typename E>
static constexpr bool ImGuiEnumInput(const char* label, E& val) {
constexpr auto& entries = magic_enum::enum_entries<E>();
bool changed = false;
if (ImGui::BeginCombo(label, magic_enum::enum_name(val).data())) {
for (const auto& [item, name] : entries) {
if (ImGui::Selectable(name.data(), item == val)) {
val = item;
changed = true;
}
}
ImGui::EndCombo();
}
return changed;
}
void ImGuiAnimRes(const char* label, metaforce::CAnimRes& res) {
if (res.GetId().IsValid()) {
ImGui::Text("Model: 0x%08" PRIX64, res.GetId().Value());
} else {
ImGui::Text("Model: [none]");
}
// TODO: More
}
void CDamageVulnerability::ImGuiEditWindow(const char* title, bool& open) {
if (!open) {
return;
}
if (ImGui::Begin(title, &open, ImGuiWindowFlags_AlwaysAutoResize)) {
ImGuiEnumInput("Deflected", x5c_deflected);
if (ImGui::CollapsingHeader("Normal")) {
constexpr size_t max = std::tuple_size_v<decltype(x0_normal)>;
constexpr std::array<const char*, max> names{
"Power", "Ice", "Wave", "Plasma", "Bomb", "Power Bomb", "Missile", "Boost Ball",
"Phazon", "AI", "Poison Water", "Lava", "Heat", "(Unused)", "Orange Phazon"};
for (int i = 0; i < max; ++i) {
ImGuiEnumInput(names[i], x0_normal[i]);
}
}
if (ImGui::CollapsingHeader("Charged")) {
constexpr size_t max = std::tuple_size_v<decltype(x3c_charged)>;
constexpr std::array<const char*, max> names{"Power", "Ice", "Wave", "Plasma"};
for (int i = 0; i < max; ++i) {
ImGuiEnumInput(names[i], x3c_charged[i]);
}
}
if (ImGui::CollapsingHeader("Combo")) {
constexpr size_t max = std::tuple_size_v<decltype(x4c_combo)>;
constexpr std::array<const char*, max> names{"Super Missile", "Ice Spreader", "Wavebuster", "Flamethrower"};
for (int i = 0; i < max; ++i) {
ImGuiEnumInput(names[i], x4c_combo[i]);
}
}
}
ImGui::End();
}
void ImGuiUniqueId(const char* label, TUniqueId uid) {
ImGui::PushID(uid.Value());
if (uid != kInvalidUniqueId && ImGuiConsole::entities[uid.Value()].ent != nullptr) {
ImGui::Text("%s: 0x%04" PRIX16, label, uid.Value());
ImGui::SameLine();
if (ImGui::SmallButton("View")) {
ImGuiConsole::inspectingEntities.insert(uid);
}
} else {
ImGui::Text("%s: [none]", label);
}
ImGui::PopID();
}
std::string_view CEntity::ImGuiType() { return "Entity"; }
void CEntity::ImGuiInspect() {
if (!x20_conns.empty() && ImGui::CollapsingHeader("Outgoing Connections")) {
if (ImGui::BeginTable("Outgoing Connections", 6,
ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV)) {
ImGui::TableSetupColumn("ID", ImGuiTableColumnFlags_WidthFixed, 0, 'id');
ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed, 0, 'type');
ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthStretch, 0, 'name');
ImGui::TableSetupColumn("State", ImGuiTableColumnFlags_WidthFixed, 0, 'stat');
ImGui::TableSetupColumn("Message", ImGuiTableColumnFlags_WidthFixed, 0, 'msg');
ImGui::TableSetupColumn("", ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed |
ImGuiTableColumnFlags_NoResize);
ImGui::TableSetupScrollFreeze(0, 1);
ImGui::TableHeadersRow();
for (const auto& item : x20_conns) {
const auto search = g_StateManager->GetIdListForScript(item.x8_objId);
for (auto it = search.first; it != search.second; ++it) {
const auto uid = it->second;
if (uid == kInvalidUniqueId) {
continue;
}
ImGuiEntityEntry& entry = ImGuiConsole::entities[uid.Value()];
if (entry.uid == kInvalidUniqueId) {
continue;
}
ImGuiConsole::BeginEntityRow(entry);
if (ImGui::TableNextColumn()) {
ImGuiStringViewText(entry.type);
}
if (ImGui::TableNextColumn()) {
ImGuiStringViewText(entry.name);
}
if (ImGui::TableNextColumn()) {
ImGuiStringViewText(ScriptObjectStateToStr(item.x0_state));
}
if (ImGui::TableNextColumn()) {
ImGuiStringViewText(ScriptObjectMessageToStr(item.x4_msg));
}
ImGuiConsole::EndEntityRow(entry);
}
}
ImGui::EndTable();
}
}
if (m_incomingConnections != nullptr && ImGui::CollapsingHeader("Incoming Connections")) {
if (ImGui::BeginTable("Incoming Connections", 6,
ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV)) {
ImGui::TableSetupColumn("ID", ImGuiTableColumnFlags_WidthFixed, 0, 'id');
ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed, 0, 'type');
ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthStretch, 0, 'name');
ImGui::TableSetupColumn("State", ImGuiTableColumnFlags_WidthFixed, 0, 'stat');
ImGui::TableSetupColumn("Message", ImGuiTableColumnFlags_WidthFixed, 0, 'msg');
ImGui::TableSetupColumn("", ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed |
ImGuiTableColumnFlags_NoResize);
ImGui::TableSetupScrollFreeze(0, 1);
ImGui::TableHeadersRow();
for (const auto& item : *m_incomingConnections) {
const auto search = g_StateManager->GetIdListForScript(item.x8_objId);
for (auto it = search.first; it != search.second; ++it) {
auto uid = it->second;
if (uid == kInvalidUniqueId) {
continue;
}
ImGuiEntityEntry& entry = ImGuiConsole::entities[uid.Value()];
if (entry.uid == kInvalidUniqueId) {
continue;
}
ImGuiConsole::BeginEntityRow(entry);
if (ImGui::TableNextColumn()) {
ImGuiStringViewText(entry.type);
}
if (ImGui::TableNextColumn()) {
ImGuiStringViewText(entry.name);
}
if (ImGui::TableNextColumn()) {
ImGuiStringViewText(ScriptObjectStateToStr(item.x0_state));
}
if (ImGui::TableNextColumn()) {
ImGuiStringViewText(ScriptObjectMessageToStr(item.x4_msg));
}
ImGuiConsole::EndEntityRow(entry);
}
}
ImGui::EndTable();
}
}
if (ImGui::CollapsingHeader("Entity", ImGuiTreeNodeFlags_DefaultOpen)) {
ImGui::Text("ID: 0x%04" PRIX16, x8_uid.Value());
ImGui::Text("Editor ID: 0x%08" PRIX32, xc_editorId.id);
ImGui::Text("Area: %i", x4_areaId);
ImGui::Text("Name: %s", x10_name.c_str());
BITFIELD_CHECKBOX("Active", x30_24_active);
ImGui::SameLine();
ImGui::Checkbox("Highlight", &m_debugSelected);
}
}
struct EulerAngles {
float roll, pitch, yaw;
};
static EulerAngles ToEulerAngles(const zeus::CQuaternion& q) {
EulerAngles angles;
// roll (x-axis rotation)
float sinr_cosp = 2.f * (q.w() * q.x() + q.y() * q.z());
float cosr_cosp = 1.f - 2.f * (q.x() * q.x() + q.y() * q.y());
angles.roll = atan2f(sinr_cosp, cosr_cosp);
// pitch (y-axis rotation)
float sinp = 2.f * (q.w() * q.y() - q.z() * q.x());
if (std::abs(sinp) >= 1.f) {
angles.pitch = std::copysign(M_PI / 2, sinp); // use 90 degrees if out of range
} else {
angles.pitch = std::asin(sinp);
}
// yaw (z-axis rotation)
float siny_cosp = 2.f * (q.w() * q.z() + q.x() * q.y());
float cosy_cosp = 1.f - 2.f * (q.y() * q.y() + q.z() * q.z());
angles.yaw = atan2f(siny_cosp, cosy_cosp);
return angles;
}
// <- CEntity
IMGUI_ENTITY_INSPECT(CActor, CEntity, Actor, {
if (ImGuiVector3fInput("Position", x34_transform.origin)) {
SetTranslation(x34_transform.origin);
}
EulerAngles angles = ToEulerAngles(zeus::CQuaternion(GetTransform().getRotation().buildMatrix3f()));
zeus::CVector3f rotation = zeus::CVector3f(angles.roll, angles.pitch, angles.yaw) * zeus::skRadToDegVec;
if (ImGuiVector3fInput("Rotation", rotation)) {
rotation.x() = zeus::clamp(-179.999f, float(rotation.x()), 179.999f);
rotation.y() = zeus::clamp(-89.999f, float(rotation.y()), 89.999f);
rotation.z() = zeus::clamp(-179.999f, float(rotation.z()), 179.999f);
x34_transform.setRotation(zeus::CQuaternion(rotation * zeus::skDegToRadVec).toTransform().buildMatrix3f());
SetTransform(x34_transform);
}
{
int thermalVisorFlags = xe6_27_thermalVisorFlags;
if (ImGui::Combo("Thermal Visor Flags", &thermalVisorFlags, "None\0Cold\0Hot", 3)) {
xe6_27_thermalVisorFlags = u8(thermalVisorFlags);
}
}
})
IMGUI_ENTITY_INSPECT(MP1::CFireFlea::CDeathCameraEffect, CEntity, FireFleaDeathCameraEffect, {})
IMGUI_ENTITY_INSPECT(MP1::CMetroidPrimeRelay, CEntity, MetroidPrimeRelay, {})
IMGUI_ENTITY_INSPECT(CScriptActorKeyframe, CEntity, ScriptActorKeyframe, {})
IMGUI_ENTITY_INSPECT(CScriptActorRotate, CEntity, ScriptActorRotate, {})
IMGUI_ENTITY_INSPECT(CScriptAreaAttributes, CEntity, ScriptAreaAttributes, {
BITFIELD_CHECKBOX("Show Skybox", x34_24_showSkybox);
ImGui::SameLine();
ImGui::Text("(Asset: 0x%08X)", int(x4c_skybox.Value()));
ImGuiEnumInput("Env FX Type", x38_envFx);
if (ImGui::SliderFloat("Env FX Density", &x3c_envFxDensity, 0.f, 1.f)) {
g_StateManager->GetEnvFxManager()->SetFxDensity(500, x3c_envFxDensity);
}
if (ImGui::SliderFloat("Thermal Heat", &x40_thermalHeat, 0.f, 1.f)) {
CGameArea* area = g_StateManager->GetWorld()->GetArea(x4_areaId);
if (area != nullptr && area->IsPostConstructed()) {
area->GetPostConstructed()->x111c_thermalCurrent = x40_thermalHeat;
}
}
ImGui::SliderFloat("X-Ray Fog Distance", &x44_xrayFogDistance, 0.f, 1.f);
if (ImGui::SliderFloat("World Lighting Level", &x48_worldLightingLevel, 0.f, 1.f)) {
CGameArea* area = g_StateManager->GetWorld()->GetArea(x4_areaId);
if (area != nullptr && area->IsPostConstructed()) {
area->GetPostConstructed()->x1128_worldLightingLevel = x48_worldLightingLevel;
}
}
ImGuiEnumInput("Phazon Type", x50_phazon);
})
IMGUI_ENTITY_INSPECT(CScriptCameraBlurKeyframe, CEntity, ScriptCameraBlurKeyframe, {})
IMGUI_ENTITY_INSPECT(CScriptCameraFilterKeyframe, CEntity, ScriptCameraFilterKeyframe, {})
IMGUI_ENTITY_INSPECT(CScriptCameraShaker, CEntity, ScriptCameraShaker, {})
IMGUI_ENTITY_INSPECT(CScriptColorModulate, CEntity, ScriptColorModulate, {})
IMGUI_ENTITY_INSPECT(CScriptControllerAction, CEntity, ScriptControllerAction, {})
IMGUI_ENTITY_INSPECT(CScriptCounter, CEntity, ScriptCounter, {})
IMGUI_ENTITY_INSPECT(CScriptDistanceFog, CEntity, ScriptDistanceFog, {})
IMGUI_ENTITY_INSPECT(CScriptDockAreaChange, CEntity, ScriptDockAreaChange, {})
IMGUI_ENTITY_INSPECT(CScriptGenerator, CEntity, ScriptGenerator, {
int count = x34_spawnCount;
if (ImGui::SliderInt("Spawn Count", &count, 0, kMaxEntities)) {
x34_spawnCount = count;
}
BITFIELD_CHECKBOX("Don't Reuse Followers", x38_24_noReuseFollowers);
BITFIELD_CHECKBOX("Don't Inherit Transform", x38_25_noInheritTransform);
ImGuiVector3fInput("Offset", x3c_offset);
ImGui::DragFloat("Minimum Scale", &x48_minScale);
ImGui::DragFloat("Maximum Scale", &x4c_maxScale);
})
IMGUI_ENTITY_INSPECT(CScriptHUDMemo, CEntity, ScriptHUDMemo, {})
IMGUI_ENTITY_INSPECT(CScriptMemoryRelay, CEntity, ScriptMemoryRelay, {})
IMGUI_ENTITY_INSPECT(CScriptMidi, CEntity, ScriptMidi, {})
IMGUI_ENTITY_INSPECT(CScriptPickupGenerator, CEntity, ScriptPickupGenerator, {
ImGuiVector3fInput("Position", x34_position);
ImGui::DragFloat("Frequency", &x40_frequency);
ImGui::DragFloat("Delay Timer", &x44_delayTimer);
})
IMGUI_ENTITY_INSPECT(CScriptPlayerStateChange, CEntity, ScriptPlayerStateChange, {})
IMGUI_ENTITY_INSPECT(CScriptRandomRelay, CEntity, ScriptRandomRelay, {})
IMGUI_ENTITY_INSPECT(CScriptRelay, CEntity, ScriptRelay, {})
IMGUI_ENTITY_INSPECT(CScriptRipple, CEntity, ScripleRipple, {})
IMGUI_ENTITY_INSPECT(CScriptRoomAcoustics, CEntity, ScriptRoomAcoustics, {})
IMGUI_ENTITY_INSPECT(CScriptSpawnPoint, CEntity, ScriptSpawnPoint, {})
IMGUI_ENTITY_INSPECT(CScriptStreamedMusic, CEntity, ScriptStreamedMusic, {})
IMGUI_ENTITY_INSPECT(CScriptSwitch, CEntity, ScriptSwitch, {
ImGui::Checkbox("Is Open", &x34_opened);
ImGui::Checkbox("Close On Opened", &x35_closeOnOpened);
if (ImGui::Button("Open")) {
g_StateManager->SendScriptMsg(this, x8_uid, EScriptObjectMessage::Open);
}
ImGui::SameLine();
if (ImGui::Button("Close")) {
g_StateManager->SendScriptMsg(this, x8_uid, EScriptObjectMessage::Close);
}
ImGui::SameLine();
if (ImGui::Button("Toggle")) {
g_StateManager->SendScriptMsg(this, x8_uid, EScriptObjectMessage::SetToZero);
}
})
IMGUI_ENTITY_INSPECT(CScriptTimer, CEntity, ScriptTimer, {
ImGui::DragFloat("Time", &x34_time);
ImGui::DragFloat("Start Time", &x38_startTime);
ImGui::DragFloat("Max Random Delay", &x3c_maxRandDelay);
ImGui::Checkbox("Loop", &x40_loop);
ImGui::Checkbox("Auto Start", &x41_autoStart);
ImGui::Checkbox("Is Timing", &x42_isTiming);
if (ImGui::Button("Reset")) {
g_StateManager->SendScriptMsg(this, x8_uid, EScriptObjectMessage::ResetAndStart);
}
})
IMGUI_ENTITY_INSPECT(CScriptWorldTeleporter, CEntity, ScriptWorldTeleporter, {})
IMGUI_ENTITY_INSPECT(CTeamAiMgr, CEntity, TeamAiMgr, {
// TODO x34_data
// TODO x58_roles
if (!x68_meleeAttackers.empty() && ImGui::CollapsingHeader("Melee Attackers")) {
if (ImGui::BeginTable("Melee Attackers", 4,
ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV)) {
ImGui::TableSetupColumn("ID", ImGuiTableColumnFlags_WidthFixed, 0, 'id');
ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed, 0, 'type');
ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthStretch, 0, 'name');
ImGui::TableSetupColumn("", ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed |
ImGuiTableColumnFlags_NoResize);
ImGui::TableSetupScrollFreeze(0, 1);
ImGui::TableHeadersRow();
for (auto uid : x68_meleeAttackers) {
if (uid == kInvalidUniqueId) {
continue;
}
ImGuiEntityEntry& entry = ImGuiConsole::entities[uid.Value()];
if (entry.uid == kInvalidUniqueId) {
continue;
}
ImGuiConsole::BeginEntityRow(entry);
if (ImGui::TableNextColumn()) {
ImGuiStringViewText(entry.type);
}
if (ImGui::TableNextColumn()) {
ImGuiStringViewText(entry.name);
}
ImGuiConsole::EndEntityRow(entry);
}
}
ImGui::EndTable();
}
if (!x78_rangedAttackers.empty() && ImGui::CollapsingHeader("Ranged Attackers")) {
if (ImGui::BeginTable("Ranged Attackers", 4,
ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV)) {
ImGui::TableSetupColumn("ID", ImGuiTableColumnFlags_WidthFixed, 0, 'id');
ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed, 0, 'type');
ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthStretch, 0, 'name');
ImGui::TableSetupColumn("", ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed |
ImGuiTableColumnFlags_NoResize);
ImGui::TableSetupScrollFreeze(0, 1);
ImGui::TableHeadersRow();
for (auto uid : x78_rangedAttackers) {
if (uid == kInvalidUniqueId) {
continue;
}
ImGuiEntityEntry& entry = ImGuiConsole::entities[uid.Value()];
if (entry.uid == kInvalidUniqueId) {
continue;
}
ImGuiConsole::BeginEntityRow(entry);
if (ImGui::TableNextColumn()) {
ImGuiStringViewText(entry.type);
}
if (ImGui::TableNextColumn()) {
ImGuiStringViewText(entry.name);
}
ImGuiConsole::EndEntityRow(entry);
}
}
ImGui::EndTable();
}
ImGui::InputFloat("Time Dirty", &x88_timeDirty);
ImGuiUniqueId("Team Captain", x8c_teamCaptainId);
ImGui::InputFloat("Time Since Melee", &x90_timeSinceMelee);
ImGui::InputFloat("Time Since Ranged", &x94_timeSinceRanged);
})
// <- CActor
IMGUI_ENTITY_INSPECT(CPhysicsActor, CActor, PhysicsActor, {
float mass = xe8_mass;
if (ImGui::InputFloat("Mass", &mass)) {
SetMass(mass);
}
float inertiaTensor = xf0_inertiaTensor;
if (ImGui::InputFloat("Inertia tensor", &inertiaTensor)) {
SetInertiaTensorScalar(inertiaTensor);
}
if (ImGuiVector3fInput("Velocity", x138_velocity)) {
SetVelocityWR(x138_velocity);
}
if (ImGuiVector3fInput("Momentum", x150_momentum)) {
SetMomentumWR(x150_momentum);
}
zeus::CVector3f force = x15c_force;
if (ImGuiVector3fInput("Force", force)) {
ApplyForceWR(force - x15c_force, zeus::CAxisAngle());
}
zeus::CVector3f impulse = x168_impulse;
if (ImGuiVector3fInput("Impulse", x168_impulse)) {
ApplyImpulseWR(impulse - x168_impulse, zeus::CAxisAngle());
}
BITFIELD_CHECKBOX("Movable", xf8_24_movable);
BITFIELD_CHECKBOX("Angular enabled", xf8_25_angularEnabled);
BITFIELD_CHECKBOX("Standard collider", xf9_standardCollider);
})
IMGUI_ENTITY_INSPECT(MP1::CDroneLaser, CActor, DroneLaser, {})
IMGUI_ENTITY_INSPECT(CEffect, CActor, Effect, {})
IMGUI_ENTITY_INSPECT(CFire, CActor, Fire, {})
IMGUI_ENTITY_INSPECT(CFishCloud, CActor, FishCloud, {})
IMGUI_ENTITY_INSPECT(CFishCloudModifier, CActor, FishCloudModifier, {})
IMGUI_ENTITY_INSPECT(MP1::CFlaahgraPlants, CActor, FlaahgraPlants, {})
IMGUI_ENTITY_INSPECT(MP1::CFlaahgraRenderer, CActor, FlaahgraRenderer, {})
IMGUI_ENTITY_INSPECT(MP1::COmegaPirate::CFlash, CActor, OmegaPirateFlash, {})
IMGUI_ENTITY_INSPECT(CGameCamera, CActor, GameCamera, {})
IMGUI_ENTITY_INSPECT(CGameLight, CActor, GameLight, {
ImGuiVector3fInput("Position", xec_light.x0_pos);
ImGuiVector3fInput("Direction", xec_light.xc_dir);
if (ImGuiColorInput("Color", xec_light.x18_color)) {
xec_light.SetColor(xec_light.x18_color); // set dirty flags
}
ImGuiEnumInput("Type", xec_light.x1c_type);
ImGui::DragFloat("Spot cutoff", &xec_light.x20_spotCutoff, 0.1f);
{
std::array<float, 3> att{xec_light.x24_distC, xec_light.x28_distL, xec_light.x2c_distQ};
if (ImGui::DragFloat3("Attenuation", att.data())) {
xec_light.SetAttenuation(att[0], att[1], att[2]);
}
ImGui::SameLine();
ImGui::TextUnformatted("(?)");
if (ImGui::IsItemHovered()) {
ImGui::SetTooltip("Constant | Linear | Quadratic");
}
}
{
std::array<float, 3> angleAtt{xec_light.x30_angleC, xec_light.x34_angleL, xec_light.x38_angleQ};
if (ImGui::DragFloat3("Angle Atten", angleAtt.data())) {
xec_light.SetAngleAttenuation(angleAtt[0], angleAtt[1], angleAtt[2]);
}
ImGui::SameLine();
ImGui::TextUnformatted("(?)");
if (ImGui::IsItemHovered()) {
ImGui::SetTooltip("Constant | Linear | Quadratic");
}
}
ImGui::Text("Calculated radius: %.3f", xec_light.GetRadius());
ImGui::Text("Calculated intensity: %.3f", xec_light.GetIntensity());
})
IMGUI_ENTITY_INSPECT(MP1::CIceAttackProjectile, CActor, IceAttackProjectile, {})
IMGUI_ENTITY_INSPECT(CRepulsor, CActor, Repulsor, {})
IMGUI_ENTITY_INSPECT(CScriptAiJumpPoint, CActor, ScriptAIJumpPoint, {})
IMGUI_ENTITY_INSPECT(CScriptBeam, CActor, ScriptBeam, {})
IMGUI_ENTITY_INSPECT(CScriptCameraHint, CActor, ScriptCameraHint, {})
IMGUI_ENTITY_INSPECT(CScriptCameraHintTrigger, CActor, ScriptCameraHintTrigger, {})
IMGUI_ENTITY_INSPECT(CScriptCameraPitchVolume, CActor, ScriptCameraPitchVolume, {})
IMGUI_ENTITY_INSPECT(CScriptCameraWaypoint, CActor, ScriptCameraWaypoint, {})
IMGUI_ENTITY_INSPECT(CScriptCoverPoint, CActor, ScriptCoverPoint, {})
IMGUI_ENTITY_INSPECT(CScriptDamageableTrigger, CActor, ScriptDamageableTrigger, {})
IMGUI_ENTITY_INSPECT(CScriptDebugCameraWaypoint, CActor, ScriptDebugCameraWaypoint, {})
IMGUI_ENTITY_INSPECT(CScriptEffect, CActor, ScriptEffect, {
BITFIELD_CHECKBOX("Enabled", x110_24_enable);
BITFIELD_CHECKBOX("No Timer Unless Area Occluded", x110_25_noTimerUnlessAreaOccluded);
BITFIELD_CHECKBOX("Rebuild Systems On Activate", x110_26_rebuildSystemsOnActivate);
BITFIELD_CHECKBOX("Use Rate Inverse Camera Distance", x110_27_useRateInverseCamDist);
BITFIELD_CHECKBOX("Combat Visor Visible", x110_28_combatVisorVisible);
BITFIELD_CHECKBOX("Thermal Visor Visible", x110_29_thermalVisorVisible);
BITFIELD_CHECKBOX("X-Ray Visor Visible", x110_30_xrayVisorVisible);
BITFIELD_CHECKBOX("Any Visor Visible", x110_31_anyVisorVisible);
BITFIELD_CHECKBOX("Use Rate Camera Distance Range", x111_24_useRateCamDistRange);
BITFIELD_CHECKBOX("Die When Systems Done", x111_25_dieWhenSystemsDone);
BITFIELD_CHECKBOX("Can Render", x111_26_canRender);
if (ImGui::DragFloat("Rate Inverse Camera Distance", &x114_rateInverseCamDist, 0.1f)) {
x118_rateInverseCamDistSq = x114_rateInverseCamDist * x114_rateInverseCamDist;
}
ImGui::DragFloat("Rate Inverse Camera Distance Rate", &x11c_rateInverseCamDistRate, 0.1f);
ImGui::DragFloat("Rate Camera Distance Range Min", &x120_rateCamDistRangeMin, 0.1f);
ImGui::DragFloat("Rate Camera Distance Range Max", &x124_rateCamDistRangeMax, 0.1f);
ImGui::DragFloat("Rate Camera Distance Range Far Rate", &x128_rateCamDistRangeFarRate, 0.1f);
ImGui::DragFloat("Remaining Time", &x12c_remTime, 0.1f);
ImGui::DragFloat("Duration", &x130_duration, 0.1f);
ImGui::DragFloat("Duration Reset While Visible", &x134_durationResetWhileVisible, 0.1f);
ImGuiUniqueId("Trigger ID", x13c_triggerId);
ImGui::DragFloat("Destroy Delay Timer", &x140_destroyDelayTimer, 0.1f);
})
IMGUI_ENTITY_INSPECT(CScriptEMPulse, CActor, ScriptEMPulse, {})
IMGUI_ENTITY_INSPECT(CScriptGrapplePoint, CActor, ScriptGrapplePoint, {})
IMGUI_ENTITY_INSPECT(CScriptMazeNode, CActor, ScriptMazeNode, {})
IMGUI_ENTITY_INSPECT(CScriptPlayerHint, CActor, ScriptPlayerHint, {})
IMGUI_ENTITY_INSPECT(CScriptPointOfInterest, CActor, ScriptPointOfInterest, {})
IMGUI_ENTITY_INSPECT(CScriptShadowProjector, CActor, ScriptShadowProjector, {})
IMGUI_ENTITY_INSPECT(CScriptSound, CActor, ScriptSound, {})
IMGUI_ENTITY_INSPECT(CScriptSpecialFunction, CActor, ScriptSpecialFunction, {})
IMGUI_ENTITY_INSPECT(CScriptSpiderBallAttractionSurface, CActor, ScriptSpiderballAttractionSurface, {})
IMGUI_ENTITY_INSPECT(CScriptSpiderBallWaypoint, CActor, ScriptSpiderBallWaypoint, {})
IMGUI_ENTITY_INSPECT(CScriptTargetingPoint, CActor, ScriptTargetingPoint, {})
IMGUI_ENTITY_INSPECT(CScriptTrigger, CActor, ScriptTrigger, {})
IMGUI_ENTITY_INSPECT(CScriptVisorFlare, CActor, ScriptVisorFlare, {})
IMGUI_ENTITY_INSPECT(CScriptVisorGoo, CActor, ScriptVisorGoo, {})
IMGUI_ENTITY_INSPECT(CScriptWaypoint, CActor, ScriptWaypoint, {})
IMGUI_ENTITY_INSPECT(MP1::CShockWave, CActor, ShockWave, {})
IMGUI_ENTITY_INSPECT(CSnakeWeedSwarm, CActor, SnakeWeedSwarm, {})
IMGUI_ENTITY_INSPECT(CWallCrawlerSwarm, CActor, WallCrawlerSwarm, {})
IMGUI_ENTITY_INSPECT(CWeapon, CActor, Weapon, {})
// <- CEffect
IMGUI_ENTITY_INSPECT(CExplosion, CEffect, Explosion, {})
IMGUI_ENTITY_INSPECT(CHUDBillboardEffect, CEffect, HUDBillboardEffect, {})
IMGUI_ENTITY_INSPECT(CIceImpact, CEffect, IceImpact, {})
// <- CGameCamera
IMGUI_ENTITY_INSPECT(CBallCamera, CGameCamera, BallCamera, {})
IMGUI_ENTITY_INSPECT(CCinematicCamera, CGameCamera, CinematicCamera, {})
IMGUI_ENTITY_INSPECT(CFirstPersonCamera, CGameCamera, FirstPersonCamera, {})
IMGUI_ENTITY_INSPECT(CInterpolationCamera, CGameCamera, InterpolationCamera, {})
IMGUI_ENTITY_INSPECT(CPathCamera, CGameCamera, PathCamera, {})
IMGUI_ENTITY_INSPECT(CScriptSpindleCamera, CGameCamera, ScriptSpindleCamera, {})
// <- CScriptTrigger
IMGUI_ENTITY_INSPECT(MP1::CPhazonPool, CScriptTrigger, PhazonPool, {})
IMGUI_ENTITY_INSPECT(CScriptBallTrigger, CScriptTrigger, ScriptBallTrigger, {})
IMGUI_ENTITY_INSPECT(CScriptSteam, CScriptTrigger, ScriptSteam, {})
IMGUI_ENTITY_INSPECT(CScriptWater, CScriptTrigger, ScriptWater, {})
// <- CWeapon
IMGUI_ENTITY_INSPECT(CBomb, CWeapon, Bomb, {})
IMGUI_ENTITY_INSPECT(CGameProjectile, CWeapon, GameProjectile, {})
IMGUI_ENTITY_INSPECT(CPowerBomb, CWeapon, PowerBomb, {})
// <- CGameProjectile
IMGUI_ENTITY_INSPECT(CBeamProjectile, CGameProjectile, BeamProjectile, {})
IMGUI_ENTITY_INSPECT(CEnergyProjectile, CGameProjectile, EnergyProjectile, {})
IMGUI_ENTITY_INSPECT(CFlameThrower, CGameProjectile, FlameThrower, {})
IMGUI_ENTITY_INSPECT(CNewFlameThrower, CGameProjectile, NewFlameThrower, {})
IMGUI_ENTITY_INSPECT(CWaveBuster, CGameProjectile, WaveBuster, {})
// <- CBeamProjectile
IMGUI_ENTITY_INSPECT(CElectricBeamProjectile, CBeamProjectile, ElectricBeamProjectile, {})
IMGUI_ENTITY_INSPECT(CPlasmaProjectile, CBeamProjectile, PlasmaProjectile, {})
// <- CEnergyProjectile
IMGUI_ENTITY_INSPECT(MP1::CFlaahgraProjectile, CEnergyProjectile, FlaahgraProjectile, {})
IMGUI_ENTITY_INSPECT(MP1::CMetroidPrimeProjectile, CEnergyProjectile, MetroidPrimeProjectile, {})
IMGUI_ENTITY_INSPECT(CTargetableProjectile, CEnergyProjectile, TargetableProjectile, {})
// <- CPhysicsActor
IMGUI_ENTITY_INSPECT(CAi, CPhysicsActor, AI, {})
IMGUI_ENTITY_INSPECT(CAmbientAI, CPhysicsActor, AmbientAI, {})
IMGUI_ENTITY_INSPECT(MP1::CBouncyGrenade, CPhysicsActor, BouncyGrenade, {})
IMGUI_ENTITY_INSPECT(CCollisionActor, CPhysicsActor, CollisionActor, {})
IMGUI_ENTITY_INSPECT(MP1::CGrenadeLauncher, CPhysicsActor, GrenadeLauncher, {})
IMGUI_ENTITY_INSPECT(MP1::CMetroidPrimeExo::CPhysicsDummy, CPhysicsActor, MetroidPrimeExoPhysicsDummy, {})
IMGUI_ENTITY_INSPECT(CPlayer, CPhysicsActor, Player, {
if (ImGui::CollapsingHeader("Player Gun")) {
auto* gun = GetPlayerGun();
ImGui::Text("Last Fire Button States: 0x%08X", gun->x2ec_lastFireButtonStates);
ImGui::Text("Pressed Fire Button States: 0x%08X", gun->x2f0_pressedFireButtonStates);
ImGui::Text("Fire Button States: 0x%08X", gun->x2f4_fireButtonStates);
ImGui::Text("State Flags: 0x%08X", gun->x2f8_stateFlags);
ImGui::Text("Fidget Anim Bits: 0x%08X", gun->x2fc_fidgetAnimBits);
ImGui::Text("Remaining Missiles: %i", gun->x300_remainingMissiles);
ImGui::Text("Bomb Count: %i", gun->x308_bombCount);
ImGui::Text("Current Beam: %s", magic_enum::enum_name(gun->x310_currentBeam).data());
ImGui::Text("Next Beam: %s", magic_enum::enum_name(gun->x314_nextBeam).data());
}
})
IMGUI_ENTITY_INSPECT(CScriptActor, CPhysicsActor, ScriptActor, {
if (ImGui::Button("Edit Damage Vulnerability")) {
m_editingDamageVulnerability = true;
}
x268_damageVulnerability.ImGuiEditWindow("Damage Vulnerability - Script Actor", m_editingDamageVulnerability);
bool modelFlagsChanged = false;
ImGui::DragFloat("Fade In Time", &x2d0_fadeInTime, 0.1f);
ImGui::DragFloat("Fade Out Time", &x2d4_fadeOutTime, 0.1f);
ImGui::SliderFloat("X-Ray Alpha", &x2dc_xrayAlpha, 0.0f, 1.f);
ImGui::SameLine();
BITFIELD_CHECKBOX("Enabled", x2e2_27_xrayAlphaEnabled, { modelFlagsChanged = true; });
BITFIELD_CHECKBOX("Disable Thermal Hot Z-test", x2e2_24_noThermalHotZ, { modelFlagsChanged = true; });
BITFIELD_CHECKBOX("Dead", x2e2_25_dead); // onclick -> EScriptObjectMessage::Reset?
BITFIELD_CHECKBOX("Animating", x2e2_26_animating);
BITFIELD_CHECKBOX("Scale Advancement Delta", x2e2_30_scaleAdvancementDelta);
BITFIELD_CHECKBOX("Material Flag 54", x2e2_31_materialFlag54);
BITFIELD_CHECKBOX("Is Player Actor", x2e3_24_isPlayerActor);
ImGuiUniqueId("Trigger ID", x2e0_triggerId);
x2e2_29_processModelFlags =
modelFlagsChanged || x2e2_27_xrayAlphaEnabled || x2e2_24_noThermalHotZ || x2d8_shaderIdx != 0;
})
IMGUI_ENTITY_INSPECT(CScriptDebris, CPhysicsActor, ScriptDebris, {})
IMGUI_ENTITY_INSPECT(CScriptDock, CPhysicsActor, ScriptDock, {
if (x260_area != kInvalidAreaId) {
const auto* dock = g_StateManager->GetWorld()->GetArea(x260_area)->GetDock(x25c_dock);
if (dock != nullptr) {
auto areaId = dock->GetConnectedAreaId(dock->GetReferenceCount());
if (areaId != kInvalidAreaId) {
CAssetId stringId = g_StateManager->GetWorld()->GetArea(areaId)->IGetStringTableAssetId();
ImGuiStringViewText(fmt::format(FMT_STRING("Connected Area: {}"), ImGuiLoadStringTable(stringId, 0)));
}
}
}
ImGuiEnumInput("Dock State", x264_dockState);
BITFIELD_CHECKBOX("Dock Referenced", x268_24_dockReferenced);
BITFIELD_CHECKBOX("Load Connected", x268_25_loadConnected);
BITFIELD_CHECKBOX("Area Post Constructed", x268_26_areaPostConstructed);
});
IMGUI_ENTITY_INSPECT(CScriptDoor, CPhysicsActor, ScriptDoor, {
ImGui::DragFloat("Animation Length", &x258_animLen, 0.1f);
ImGui::DragFloat("Animation Time", &x25c_animTime, 0.1f);
ImGuiEnumInput("Door State", x260_doorAnimState);
// TODO: AABox
ImGuiUniqueId("Partner1", x27c_partner1);
ImGuiUniqueId("Partner2", x27e_partner2);
ImGuiUniqueId("Previous Door", x280_prevDoor);
ImGuiUniqueId("Dock", x282_dockId);
// TODO: model aabox
ImGuiVector3fInput("Orbit Position", x29c_orbitPos);
BITFIELD_CHECKBOX("Closing", x2a8_24_closing);
BITFIELD_CHECKBOX("Was Open", x2a8_25_wasOpen);
BITFIELD_CHECKBOX("Is Open", x2a8_26_isOpen);
BITFIELD_CHECKBOX("Open Conditions Met", x2a8_27_conditionsMet);
BITFIELD_CHECKBOX("Projectiles Can Collide", x2a8_28_projectilesCollide);
BITFIELD_CHECKBOX("Is Ball Door", x2a8_29_ballDoor);
BITFIELD_CHECKBOX("Will Close", x2a8_30_doClose);
})
IMGUI_ENTITY_INSPECT(CScriptGunTurret, CPhysicsActor, ScriptGunTurret, {})
IMGUI_ENTITY_INSPECT(CScriptPickup, CPhysicsActor, ScriptPickup, {
ImGuiEnumInput("Item Type", x258_itemType);
ImGui::DragInt("Amount", &x25c_amount);
ImGui::DragInt("Capacity", &x260_capacity);
ImGui::SliderFloat("Possibility", &x264_possibility, 0.f, 100.f);
ImGui::DragFloat("Fade In Time", &x268_fadeInTime);
ImGui::DragFloat("Lifetime", &x26c_lifeTime);
ImGui::DragFloat("Current Time", &x270_curTime);
ImGui::DragFloat("Tractor Time", &x274_tractorTime);
ImGui::DragFloat("Delay Timer", &x278_delayTimer);
})
IMGUI_ENTITY_INSPECT(CScriptPlatform, CPhysicsActor, ScriptPlatform, {
ImGuiUniqueId("Current Waypoint", x258_currentWaypoint);
ImGuiUniqueId("Target Waypoint", x25a_targetWaypoint);
})
// <- CScriptActor
IMGUI_ENTITY_INSPECT(MP1::CActorContraption, CScriptActor, ActorContraption, {})
IMGUI_ENTITY_INSPECT(CScriptPlayerActor, CScriptActor, PlayerActor, {
ImGuiAnimRes("Suit Resource", x2e8_suitRes);
ImGuiEnumInput("Beam", x304_beam);
ImGuiEnumInput("Suit", x308_suit);
})
// <- CScriptPlatform
IMGUI_ENTITY_INSPECT(MP1::CRipperControlledPlatform, CScriptPlatform, RipperControlledPlatform, {})
// <- CAi
IMGUI_ENTITY_INSPECT(CDestroyableRock, CAi, DestroyableRock, {})
IMGUI_ENTITY_INSPECT(CPatterned, CAi, Patterned, {
BITFIELD_CHECKBOX("Enable state machine", x403_25_enableStateMachine);
ImGui::Text("Body state:");
ImGui::SameLine();
ImGuiStringViewText(pas::AnimationStateToStr(x450_bodyController->GetCurrentStateId()));
if (ImGui::Button("Burn")) {
Burn(1.f, 1.f);
}
if (ImGui::Button("Shock")) {
Shock(*g_StateManager, 1.f, 1.f);
}
if (ImGui::Button("Freeze")) {
Freeze(*g_StateManager, GetTranslation(), zeus::skZero3f, 1.f);
}
})
// <- CPatterned
IMGUI_ENTITY_INSPECT(MP1::CAtomicAlpha, CPatterned, AtomicAlpha, {})
IMGUI_ENTITY_INSPECT(MP1::CAtomicBeta, CPatterned, AtomicBeta, {})
IMGUI_ENTITY_INSPECT(MP1::CBabygoth, CPatterned, Babygoth, {})
IMGUI_ENTITY_INSPECT(MP1::CBeetle, CPatterned, Beetle, {})
IMGUI_ENTITY_INSPECT(MP1::CBloodFlower, CPatterned, BloodFlower, {})
IMGUI_ENTITY_INSPECT(MP1::CBurrower, CPatterned, Burrower, {})
IMGUI_ENTITY_INSPECT(MP1::CChozoGhost, CPatterned, ChozoGhost, {})
IMGUI_ENTITY_INSPECT(MP1::CDrone, CPatterned, Drone, {})
IMGUI_ENTITY_INSPECT(MP1::CElitePirate, CPatterned, ElitePirate, {})
IMGUI_ENTITY_INSPECT(MP1::CEnergyBall, CPatterned, EnergyBall, {})
IMGUI_ENTITY_INSPECT(MP1::CEyeball, CPatterned, EyeBall, {})
IMGUI_ENTITY_INSPECT(MP1::CFireFlea, CPatterned, FireFlea, {})
IMGUI_ENTITY_INSPECT(MP1::CFlaahgra, CPatterned, Flaahgra, {})
IMGUI_ENTITY_INSPECT(MP1::CFlaahgraTentacle, CPatterned, FlaahgraTentacle, {})
IMGUI_ENTITY_INSPECT(MP1::CFlickerBat, CPatterned, FlickerBat, {})
IMGUI_ENTITY_INSPECT(MP1::CFlyingPirate, CPatterned, FlyingPirate, {})
IMGUI_ENTITY_INSPECT(MP1::CIceSheegoth, CPatterned, IceSheegoth, {})
IMGUI_ENTITY_INSPECT(MP1::CJellyZap, CPatterned, JellyZap, {})
IMGUI_ENTITY_INSPECT(MP1::CMagdolite, CPatterned, Magdolite, {})
IMGUI_ENTITY_INSPECT(MP1::CMetaree, CPatterned, Metaree, {})
IMGUI_ENTITY_INSPECT(MP1::CMetroid, CPatterned, Metroid, {})
IMGUI_ENTITY_INSPECT(MP1::CMetroidBeta, CPatterned, MetroidBeta, {})
IMGUI_ENTITY_INSPECT(MP1::CMetroidPrimeEssence, CPatterned, MetroidPrimeEssence, {})
IMGUI_ENTITY_INSPECT(MP1::CMetroidPrimeExo, CPatterned, MetroidPrimeExo, {})
IMGUI_ENTITY_INSPECT(MP1::CNewIntroBoss, CPatterned, NewIntroBoss, {})
IMGUI_ENTITY_INSPECT(MP1::CPhazonHealingNodule, CPatterned, PhazonHealingNodule, {})
IMGUI_ENTITY_INSPECT(MP1::CPuddleSpore, CPatterned, PuddleSpore, {})
IMGUI_ENTITY_INSPECT(MP1::CPuddleToadGamma, CPatterned, PuddleToadGamma, {})
IMGUI_ENTITY_INSPECT(MP1::CPuffer, CPatterned, Puffer, {})
IMGUI_ENTITY_INSPECT(MP1::CRidley, CPatterned, Ridley, {})
IMGUI_ENTITY_INSPECT(MP1::CRipper, CPatterned, Ripper, {})
IMGUI_ENTITY_INSPECT(MP1::CSpacePirate, CPatterned, SpacePirate, {})
IMGUI_ENTITY_INSPECT(MP1::CSpankWeed, CPatterned, SpankWeed, {})
IMGUI_ENTITY_INSPECT(MP1::CThardus, CPatterned, Thardus, {})
IMGUI_ENTITY_INSPECT(MP1::CThardusRockProjectile, CPatterned, ThardusRockProjectile, {})
IMGUI_ENTITY_INSPECT(MP1::CTryclops, CPatterned, Tryclops, {})
IMGUI_ENTITY_INSPECT(CWallWalker, CPatterned, WallWalker, {})
IMGUI_ENTITY_INSPECT(MP1::CParasite, CWallWalker, Parasite, {})
IMGUI_ENTITY_INSPECT(MP1::CSeedling, CWallWalker, Seedling, {})
IMGUI_ENTITY_INSPECT(MP1::CWarWasp, CPatterned, WarWasp, {})
IMGUI_ENTITY_INSPECT(MP1::COmegaPirate, MP1::CElitePirate, OmegaPirate, {})
} // namespace metaforce