Skip to content

Commit

Permalink
Removed function Player::IsPatchItalian() & added a new heuristic che…
Browse files Browse the repository at this point in the history
…ck to automatically apply the known patch config for WhiteDragon patch
  • Loading branch information
florianessl committed Feb 19, 2025
1 parent 1278152 commit 1ac267b
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 42 deletions.
38 changes: 38 additions & 0 deletions src/exe_constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,22 @@

namespace ExeConstants {

enum class KnownPatchConfigurations {
//Rm2k_Italian_40, // Italian "RPG Maker 4.0" patch
Rm2k3_Italian_108, // Italian "WhiteDragon" patch
//QP_StatDelimiter,
LAST
};
static constexpr auto kKnownPatchConfigurations = lcf::makeEnumTags<KnownPatchConfigurations>(
//"Rm2k Italian 4.0",
"Rm2k3 Italian 1.08"
//"QuickPatch StatDelimiter"
);

static_assert(kKnownPatchConfigurations.size() == static_cast<size_t>(KnownPatchConfigurations::LAST));

using patch_config = std::map<Player::GameConstantType, int32_t>;

constexpr size_t MAX_SIZE_CHK_PRE = 4;

struct CodeAddressInfoU32 {
Expand Down Expand Up @@ -288,4 +304,26 @@ namespace ExeConstants::RT_2K3 {
not_def<T::MaxSaveFiles>()
}};
}

namespace ExeConstants {
using T = Player::GameConstantType;

std::map<KnownPatchConfigurations, patch_config> known_patch_configurations = {
{
KnownPatchConfigurations::Rm2k3_Italian_108, {
{ T::MinVarLimit, -999999999 },
{ T::MaxVarLimit, 999999999 },
{ T::MaxEnemyHP, 999999999 },
{ T::MaxEnemySP, 999999999 },
{ T::MaxActorHP, 99999 },
{ T::MaxActorSP, 9999 },
{ T::MaxAtkBaseValue, 9999 },
{ T::MaxDefBaseValue, 9999 },
{ T::MaxSpiBaseValue, 9999 },
{ T::MaxAgiBaseValue, 9999 },
{ T::MaxDamageValue, 99999 },
{ T::MaxGoldValue, 9999999 }
}}
};
}
#endif
33 changes: 30 additions & 3 deletions src/exe_reader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -540,11 +540,15 @@ std::map<Player::GameConstantType, int32_t> EXEReader::GetOverridenGameConstants
if (extract_constant) {
int32_t value = GetU32(const_ofs);

if (value != addr_info.default_val) {
auto it = game_constants.find(const_type);
if (it != game_constants.end() && it->second == value) {
// Constant override has already been applied through some other means
continue;
}

if (value != addr_info.default_val || it != game_constants.end()) {
game_constants[const_type] = value;
Output::Debug("Read constant '{}': {} (default: {})", Player::kGameConstantType.tag(const_type), value, addr_info.default_val);

Check warning on line 551 in src/exe_reader.cpp

View workflow job for this annotation

GitHub Actions / ubuntu:22.04

comparison of integer expressions of different signedness: 'int' and 'const size_t' {aka 'const long unsigned int'} [-Wsign-compare]

Check warning on line 551 in src/exe_reader.cpp

View workflow job for this annotation

GitHub Actions / debian:12

comparison of integer expressions of different signedness: 'int' and 'const size_t' {aka 'const long unsigned int'} [-Wsign-compare]
} else {
Output::Debug("Read constant '{}': {}", Player::kGameConstantType.tag(const_type), value);
}
extract_success = true;
} else {
Expand All @@ -562,6 +566,24 @@ std::map<Player::GameConstantType, int32_t> EXEReader::GetOverridenGameConstants
Output::Debug("Assuming RPG2003 build '{}' for constant extraction", str);
};

auto apply_known_config = [&](ExeConstants::KnownPatchConfigurations conf) {
Output::Debug("Assuming known patch config '{}'", ExeConstants::kKnownPatchConfigurations.tag(static_cast<int>(conf)));
auto it_conf = ExeConstants::known_patch_configurations.find(conf);
assert(it_conf != ExeConstants::known_patch_configurations.end());

for (auto it = it_conf->second.begin(); it != it_conf->second.end(); ++it) {
game_constants[it->first] = it->second;
}
};

auto check_for_string = [&](uint32_t offset, const char* p) {
while (*p) {
if (GetU8(offset++) != *p++)
return false;
}
return true;
};

switch (file_info.code_size) {
case 0x96600:
if (file_info.entrypoint == 0x0972C4) {
Expand Down Expand Up @@ -593,6 +615,11 @@ std::map<Player::GameConstantType, int32_t> EXEReader::GetOverridenGameConstants
break;
case 0xC8E00:
log_version_rm2k3("1.0.8.0_1.0.8.0");

if (check_for_string(file_info.code_ofs + 0x08EBE0, "NoTitolo")) {
apply_known_config(ExeConstants::KnownPatchConfigurations::Rm2k3_Italian_108);
}

check_address_map(ExeConstants::RT_2K3::const_addresses_108);
break;
}
Expand Down
31 changes: 0 additions & 31 deletions src/player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1610,16 +1610,11 @@ namespace Player::Constants {

void Player::Constants::GetVariableLimits(Var_t& min_var, Var_t& max_var) {

static constexpr Var_t min_2k3_patch_italiano = -999'999'999;
static constexpr Var_t max_2k3_patch_italiano = 999'999'999;

min_var = lcf::Data::system.easyrpg_variable_min_value;
TryGetOverriddenConstant(GameConstantType::MinVarLimit, min_var);
if (min_var == 0) {
if (Player::IsPatchManiac()) {
min_var = std::numeric_limits<Game_Variables::Var_t>::min();
} else if (Player::IsPatchItalian()) {
min_var = min_2k3_patch_italiano;
} else {
min_var = Player::IsRPG2k3() ? Game_Variables::min_2k3 : Game_Variables::min_2k;
}
Expand All @@ -1629,8 +1624,6 @@ void Player::Constants::GetVariableLimits(Var_t& min_var, Var_t& max_var) {
if (max_var == 0) {
if (Player::IsPatchManiac()) {
max_var = std::numeric_limits<Game_Variables::Var_t>::max();
} else if (Player::IsPatchItalian()) {
max_var = max_2k3_patch_italiano;
} else {
max_var = Player::IsRPG2k3() ? Game_Variables::max_2k3 : Game_Variables::max_2k;
}
Expand Down Expand Up @@ -1659,9 +1652,6 @@ int32_t Player::Constants::MaxEnemyHpValue() {
auto& val = lcf::Data::system.easyrpg_max_enemy_hp;
TryGetOverriddenConstant(GameConstantType::MaxEnemyHP, val);
if (val == -1) {
if (Player::IsPatchItalian()) {
return 999'999'999;
}
return Player::IsRPG2k() ? 9'999 : 99'999;
}
return val;
Expand All @@ -1671,9 +1661,6 @@ int32_t Player::Constants::MaxEnemySpValue() {
auto& val = lcf::Data::system.easyrpg_max_enemy_sp;
TryGetOverriddenConstant(GameConstantType::MaxEnemySP, val);
if (val == -1) {
if (Player::IsPatchItalian()) {
return 999'999'999;
}
return 9'999;
}
return val;
Expand All @@ -1683,9 +1670,6 @@ int32_t Player::Constants::MaxAtkBaseValue() {
auto& val = lcf::Data::system.easyrpg_max_stat_base_value;
TryGetOverriddenConstant(GameConstantType::MaxAtkBaseValue, val);
if (val == -1) {
if (Player::IsPatchItalian()) {
return 9'999;
}
return max_stat_base_value;
}
return val;
Expand All @@ -1695,9 +1679,6 @@ int32_t Player::Constants::MaxDefBaseValue() {
auto& val = lcf::Data::system.easyrpg_max_stat_base_value;
TryGetOverriddenConstant(GameConstantType::MaxDefBaseValue, val);
if (val == -1) {
if (Player::IsPatchItalian()) {
return 9'999;
}
return max_stat_base_value;
}
return val;
Expand All @@ -1707,9 +1688,6 @@ int32_t Player::Constants::MaxSpiBaseValue() {
auto& val = lcf::Data::system.easyrpg_max_stat_base_value;
TryGetOverriddenConstant(GameConstantType::MaxSpiBaseValue, val);
if (val == -1) {
if (Player::IsPatchItalian()) {
return 9'999;
}
return max_stat_base_value;
}
return val;
Expand All @@ -1719,9 +1697,6 @@ int32_t Player::Constants::MaxAgiBaseValue() {
auto& val = lcf::Data::system.easyrpg_max_stat_base_value;
TryGetOverriddenConstant(GameConstantType::MaxAgiBaseValue, val);
if (val == -1) {
if (Player::IsPatchItalian()) {
return 9'999;
}
return max_stat_base_value;
}
return val;
Expand Down Expand Up @@ -1767,9 +1742,6 @@ int32_t Player::Constants::MaxDamageValue() {
auto& val = lcf::Data::system.easyrpg_max_damage;
TryGetOverriddenConstant(GameConstantType::MaxDamageValue, val);
if (val == -1) {
if (Player::IsPatchItalian()) {
return 99'999;
}
return (Player::IsRPG2k() ? 999 : 9'999);
}
return val;
Expand Down Expand Up @@ -1800,9 +1772,6 @@ int32_t Player::Constants::MaxGoldValue() {
if (TryGetOverriddenConstant(GameConstantType::MaxGoldValue, max_gold)) {
return max_gold;
}
if (Player::IsPatchItalian()) {
return 9'999'999;
}
return max_gold;
}

Expand Down
8 changes: 0 additions & 8 deletions src/player.h
Original file line number Diff line number Diff line change
Expand Up @@ -367,8 +367,6 @@ namespace Player {
*/
bool IsPatchDestiny();

bool IsPatchItalian();

/**
* @return True when EasyRpg extensions are on
*/
Expand Down Expand Up @@ -615,12 +613,6 @@ inline bool Player::IsPatchDestiny() {
return game_config.patch_destiny.Get();
}


inline bool Player::IsPatchItalian() {
return false;
//return game_config.patch_italian.Get();
}

inline bool Player::HasEasyRpgExtensions() {
return game_config.patch_easyrpg.Get();
}
Expand Down

0 comments on commit 1ac267b

Please sign in to comment.