Implement god mode, and CWeaponMgr

This commit is contained in:
Phillip Stephens 2018-06-13 12:36:11 -07:00
parent 4d8cf17078
commit de952f8e8b
5 changed files with 67 additions and 24 deletions

View File

@ -128,6 +128,8 @@ private:
std::vector<std::pair<CAssetId, float>> x170_scanTimes;
std::pair<u32, u32> x180_scanCompletionRate = {};
CStaticInterference x188_staticIntf;
bool m_canTakeDamage = true;
public:
u32 GetMissileCostForAltAttack() const;
@ -186,6 +188,8 @@ public:
void PutTo(CBitStreamWriter& stream);
static u32 GetPowerUpMaxValue(EItemType type) { return PowerUpMaxValues[u32(type)]; }
static EItemType ItemNameToType(std::string_view name);
bool CanTakeDamage() const { return m_canTakeDamage; }
void SetCanTakeDamage(bool c) { m_canTakeDamage = c; }
};
}

View File

@ -1706,23 +1706,28 @@ bool CStateManager::ApplyLocalDamage(const zeus::CVector3f& vec1, const zeus::CV
if (player)
{
if (x870_cameraManager->IsInCinematicCamera() ||
(weapMode.GetType() == EWeaponType::Phazon &&
x8b8_playerState->HasPowerUp(CPlayerState::EItemType::PhazonSuit)))
return false;
if (GetPlayerState()->CanTakeDamage())
{
if (x870_cameraManager->IsInCinematicCamera() ||
(weapMode.GetType() == EWeaponType::Phazon &&
x8b8_playerState->HasPowerUp(CPlayerState::EItemType::PhazonSuit)))
return false;
if (g_GameState->GetHardMode())
mulDam *= g_GameState->GetHardModeDamageMultiplier();
if (g_GameState->GetHardMode())
mulDam *= g_GameState->GetHardModeDamageMultiplier();
float damReduction = 0.f;
if (x8b8_playerState->HasPowerUp(CPlayerState::EItemType::VariaSuit))
damReduction = g_tweakPlayer->GetVariaDamageReduction();
if (x8b8_playerState->HasPowerUp(CPlayerState::EItemType::GravitySuit))
damReduction = std::max(g_tweakPlayer->GetGravityDamageReduction(), damReduction);
if (x8b8_playerState->HasPowerUp(CPlayerState::EItemType::PhazonSuit))
damReduction = std::max(g_tweakPlayer->GetPhazonDamageReduction(), damReduction);
float damReduction = 0.f;
if (x8b8_playerState->HasPowerUp(CPlayerState::EItemType::VariaSuit))
damReduction = g_tweakPlayer->GetVariaDamageReduction();
if (x8b8_playerState->HasPowerUp(CPlayerState::EItemType::GravitySuit))
damReduction = std::max(g_tweakPlayer->GetGravityDamageReduction(), damReduction);
if (x8b8_playerState->HasPowerUp(CPlayerState::EItemType::PhazonSuit))
damReduction = std::max(g_tweakPlayer->GetPhazonDamageReduction(), damReduction);
mulDam = -(damReduction * mulDam - mulDam);
mulDam = -(damReduction * mulDam - mulDam);
}
else
mulDam = 0.f;
}
float newHp = hInfo->GetHP() - mulDam;

View File

@ -515,6 +515,18 @@ void CMain::Give(hecl::Console* console, const std::vector<std::string>& args)
console->report(hecl::Console::Level::Info, "Cheater....., Greatly increasing Metroid encounters, have fun!");
}
void CMain::God(hecl::Console* con, const std::vector<std::string> &)
{
if (g_GameState && g_GameState->GetPlayerState())
{
g_GameState->GetPlayerState()->SetCanTakeDamage(!g_GameState->GetPlayerState()->CanTakeDamage());
if (!g_GameState->GetPlayerState()->CanTakeDamage())
con->report(hecl::Console::Level::Info, "God Mode Enabled");
else
con->report(hecl::Console::Level::Info, "God Mode Disabled");
}
}
void CMain::Teleport(hecl::Console *, const std::vector<std::string>& args)
{
if (!g_StateManager || args.size() < 3)
@ -655,6 +667,7 @@ void CMain::Init(const hecl::Runtime::FileStoreManager& storeMgr,
m_console->registerCommand("quit"sv, "Quits the game immediately"sv, ""sv, std::bind(&CMain::quit, this, std::placeholders::_1, std::placeholders::_2));
m_console->registerCommand("Give"sv, "Gives the player the specified item, maxing it out"sv, ""sv, std::bind(&CMain::Give, this, std::placeholders::_1, std::placeholders::_2), hecl::SConsoleCommand::ECommandFlags::Cheat);
m_console->registerCommand("Teleport"sv, "Teleports the player to the specified coordinates in worldspace"sv, "x y z [dX dY dZ]"sv, std::bind(&CMain::Teleport, this, std::placeholders::_1, std::placeholders::_2), (hecl::SConsoleCommand::ECommandFlags::Cheat | hecl::SConsoleCommand::ECommandFlags::Developer));
m_console->registerCommand("God"sv, "Disables damage given by enemies and objects"sv, ""sv, std::bind(&CMain::God, this, std::placeholders::_1, std::placeholders::_2), hecl::SConsoleCommand::ECommandFlags::Cheat);
m_console->registerCommand("listWorlds"sv, "Lists loaded worlds"sv, ""sv, std::bind(&CMain::ListWorlds, this, std::placeholders::_1, std::placeholders::_2), hecl::SConsoleCommand::ECommandFlags::Normal);
InitializeSubsystems(storeMgr);

View File

@ -332,6 +332,7 @@ public:
m_doQuit = true;
}
void Give(hecl::Console*, const std::vector<std::string>&);
void God(hecl::Console*, const std::vector<std::string>&);
void Teleport(hecl::Console*, const std::vector<std::string>&);
void ListWorlds(hecl::Console*, const std::vector<std::string>&);
hecl::Console* Console() const { return m_console.get(); }

View File

@ -3,34 +3,54 @@
namespace urde
{
void CWeaponMgr::Add(TUniqueId, EWeaponType)
void CWeaponMgr::Add(TUniqueId uid, EWeaponType type)
{
x0_weapons.insert(std::make_pair(uid, rstl::reserved_vector<s32, 10>()));
x0_weapons[uid].resize(10);
++x0_weapons[uid][u32(type)];
}
void CWeaponMgr::Remove(TUniqueId)
void CWeaponMgr::Remove(TUniqueId uid)
{
s32 totalActive = 0;
for (u32 i = 0; i < 10; ++i)
totalActive += x0_weapons[uid][i];
if (totalActive == 0)
x0_weapons.erase(uid);
}
void CWeaponMgr::IncrCount(TUniqueId, EWeaponType)
void CWeaponMgr::IncrCount(TUniqueId uid, EWeaponType type)
{
if (GetIndex(uid) < 0)
Add(uid, type);
else
x0_weapons[uid][u32(type)]++;
}
void CWeaponMgr::DecrCount(TUniqueId, EWeaponType)
void CWeaponMgr::DecrCount(TUniqueId uid, EWeaponType type)
{
if (GetIndex(uid) < 0)
return;
x0_weapons[uid][u32(type)]--;
if (x0_weapons[uid][u32(type)] <= 0)
Remove(uid);
}
s32 CWeaponMgr::GetNumActive(TUniqueId, EWeaponType) const
s32 CWeaponMgr::GetNumActive(TUniqueId uid, EWeaponType type) const
{
return 0;
if (GetIndex(uid) < 0)
return 0;
return x0_weapons.at(uid)[u32(type)];
}
s32 CWeaponMgr::GetIndex(TUniqueId) const
s32 CWeaponMgr::GetIndex(TUniqueId uid) const
{
return 0;
if (x0_weapons.find(uid) == x0_weapons.end())
return -1;
return s32(std::distance(x0_weapons.begin(), x0_weapons.find(uid)));
}
}