Add gravity support

This commit is contained in:
David Chavez 2022-08-12 02:45:04 +02:00
parent d5f8dbfeea
commit 9e54c6d4ff
4 changed files with 101 additions and 17 deletions

View File

@ -4,6 +4,7 @@
#include "debugconsole.h"
#include "../libultraship/ImGuiImpl.h"
#include "../libultraship/Utils.h"
#include "savestates.h"
#include "Console.h"
@ -36,7 +37,7 @@ extern GlobalContext* gGlobalCtx;
uint32_t defenseModifier;
uint32_t giantLink;
uint32_t minishLink;
uint32_t highGravity;
uint32_t gravityLevel;
uint32_t resetLinkScale;
uint32_t noUi;
uint32_t invisibleLink;
@ -90,7 +91,6 @@ static bool ActorSpawnHandler(std::shared_ptr<Ship::Console> Console, const std:
return CMD_SUCCESS;
}
static bool KillPlayerHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>&) {
gSaveContext.health = 0;
SohImGui::console->SendInfoMessage("[SOH] You've met with a terrible fate, haven't you?");
@ -123,7 +123,6 @@ static bool SetPlayerHealthHandler(std::shared_ptr<Ship::Console> Console, const
return CMD_SUCCESS;
}
static bool LoadSceneHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>&) {
gSaveContext.respawnFlag = 0;
gSaveContext.seqId = 0xFF;
@ -387,19 +386,88 @@ static bool InvisibleHandler(std::shared_ptr<Ship::Console> Console, const std::
return CMD_FAILED;
}
bool invisible;
try {
invisible = std::stoi(args[1], nullptr, 10);
invisibleLink = std::stoi(args[1], nullptr, 10) == 0 ? 0 : 1;
return CMD_SUCCESS;
} catch (std::invalid_argument const& ex) {
SohImGui::console->SendErrorMessage("[SOH] Invisible value must be a number.");
return CMD_FAILED;
}
invisibleLink = invisible;
}
static bool GiantLinkHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>& args) {
if (args.size() != 2) {
SohImGui::console->SendErrorMessage("[SOH] Unexpected arguments passed");
return CMD_FAILED;
}
try {
giantLink = std::stoi(args[1], nullptr, 10) == 0 ? 0 : 1;
if (giantLink)
minishLink = 0;
else
resetLinkScale = 1;
return CMD_SUCCESS;
} catch (std::invalid_argument const& ex) {
SohImGui::console->SendErrorMessage("[SOH] Giant value must be a number.");
return CMD_FAILED;
}
}
static bool MinishLinkHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>& args) {
if (args.size() != 2) {
SohImGui::console->SendErrorMessage("[SOH] Unexpected arguments passed");
return CMD_FAILED;
}
try {
resetLinkScale = 1;
minishLink = std::stoi(args[1], nullptr, 10) == 0 ? 0 : 1;
if (minishLink)
giantLink = 0;
else
resetLinkScale = 1;
return CMD_SUCCESS;
} catch (std::invalid_argument const& ex) {
SohImGui::console->SendErrorMessage("[SOH] Minish value must be a number.");
return CMD_FAILED;
}
}
static bool AddHeartContainerHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>& args) {
if (gSaveContext.healthCapacity >= 0x140)
return CMD_FAILED;
gSaveContext.healthCapacity += 0x10;
return CMD_SUCCESS;
}
static bool RemoveHeartContainerHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>& args) {
if ((gSaveContext.healthCapacity - 0x10) < 3)
return CMD_FAILED;
gSaveContext.healthCapacity -= 0x10;
return CMD_SUCCESS;
}
static bool GravityHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>& args) {
if (args.size() != 2) {
SohImGui::console->SendErrorMessage("[SOH] Unexpected arguments passed");
return CMD_FAILED;
}
try {
gravityLevel = Ship::Math::clamp(std::stoi(args[1], nullptr, 10), 0.0f, 2.0f);
return CMD_SUCCESS;
} catch (std::invalid_argument const& ex) {
SohImGui::console->SendErrorMessage("[SOH] Minish value must be a number.");
return CMD_FAILED;
}
}
#define VARTYPE_INTEGER 0
#define VARTYPE_FLOAT 1
#define VARTYPE_STRING 2
@ -460,7 +528,6 @@ static bool SetCVarHandler(std::shared_ptr<Ship::Console> Console, const std::ve
return CMD_SUCCESS;
}
static bool GetCVarHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>& args) {
if (args.size() < 2)
return CMD_FAILED;
@ -546,8 +613,25 @@ void DebugConsole_Init(void) {
{ "Slot number", Ship::ArgumentType::NUMBER, }
}});
CMD_REGISTER("invisible", { InvisibleHandler, "Toggles invisibility.", {
{ "invisible", Ship::ArgumentType::NUMBER }
// Console effects
CMD_REGISTER("invisible", { InvisibleHandler, "Activate Link's Elvish cloak, making him appear invisible.", {
{ "value", Ship::ArgumentType::NUMBER }
}});
CMD_REGISTER("giant_link", { GiantLinkHandler, "Turn Link into a giant Lonky boi.", {
{ "value", Ship::ArgumentType::NUMBER }
}});
CMD_REGISTER("minish_link", { MinishLinkHandler, "Turn Link into a minish boi.", {
{ "value", Ship::ArgumentType::NUMBER }
}});
CMD_REGISTER("add_heart_container", { AddHeartContainerHandler, "Give Link a heart! The maximum amount of hearts is 20!" });
CMD_REGISTER("remove_heart_container", { RemoveHeartContainerHandler, "Remove a heart from Link. The minimal amount of hearts is 3." });
CMD_REGISTER("gravity", { GravityHandler, "Set gravity level.", {
{ "value", Ship::ArgumentType::NUMBER }
}});
CVar_Load();

View File

@ -8,7 +8,7 @@ extern "C" {
extern uint32_t defenseModifier;
extern uint32_t giantLink;
extern uint32_t minishLink;
extern uint32_t highGravity;
extern uint32_t gravityLevel;
extern uint32_t resetLinkScale;
extern uint32_t noUi;
extern uint32_t invisibleLink;

View File

@ -1559,7 +1559,7 @@ void RemoveEffect(const char* effectId) {
Player_SetBootData(gGlobalCtx, player);
return;
} else if (strcmp(effectId, "high_gravity") == 0 || strcmp(effectId, "low_gravity") == 0) {
highGravity = 0;
gravityLevel = 1;
return;
} else if (strcmp(effectId, "no_ui") == 0) {
noUi = 0;
@ -1597,10 +1597,10 @@ u8 ExecuteEffect(const char* effectId, uint32_t value) {
if (player != NULL && !Player_InBlockingCsMode(gGlobalCtx, player) && gGlobalCtx->pauseCtx.state == 0) {
if (strcmp(effectId, "high_gravity") == 0) {
highGravity = 1;
gravityLevel = 2;
return 1;
} else if (strcmp(effectId, "low_gravity") == 0) {
highGravity = 2;
gravityLevel = 0;
return 1;
} else if (strcmp(effectId, "giant_link") == 0) {
giantLink = 1;

View File

@ -11128,11 +11128,11 @@ void Player_Update(Actor* thisx, GlobalContext* globalCtx) {
resetLinkScale = 0;
}
if (highGravity == 1) {
if (gravityLevel == 2) {
this->actor.gravity = -4.0f;
}
if (highGravity == 2) {
if (gravityLevel == 0) {
this->actor.gravity = -0.3f;
}
}