Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,8 @@ add_library(${PROJECT_NAME} OBJECT
src/game_pictures.h
src/game_player.cpp
src/game_player.h
src/game_runtime_patches.cpp
src/game_runtime_patches.h
src/game_quit.cpp
src/game_quit.h
src/game_screen.cpp
Expand Down
2 changes: 2 additions & 0 deletions Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,8 @@ libeasyrpg_player_a_SOURCES = \
src/game_pictures.h \
src/game_player.cpp \
src/game_player.h \
src/game_runtime_patches.cpp \
src/game_runtime_patches.h \
src/game_screen.cpp \
src/game_screen.h \
src/game_strings.cpp \
Expand Down
3 changes: 3 additions & 0 deletions src/algo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,9 @@ int VarianceAdjustEffect(int base, int var) {
}

int AdjustDamageForDefend(int dmg, const Game_Battler& target) {
if (RuntimePatches::GuardRevamp::OverrideDamageAdjustment(dmg, target)) {
return dmg;
}
if (target.IsDefending()) {
dmg /= 2;
if (target.HasStrongDefense()) {
Expand Down
19 changes: 15 additions & 4 deletions src/game_config_game.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
*/

#include "game_config_game.h"
#include "game_runtime_patches.h"
#include "cmdline_parser.h"
#include "directory_tree.h"
#include "filefinder.h"
Expand All @@ -24,8 +25,8 @@
#include "player.h"
#include <cstring>

Game_ConfigGame Game_ConfigGame::Create(CmdlineParser& cp) {
Game_ConfigGame cfg;
void Game_ConfigGame::Initialize(CmdlineParser& cp) {
Game_ConfigGame& cfg = *this;

auto cli_config = FileFinder::Game().OpenFile(EASYRPG_INI_NAME);
if (cli_config) {
Expand Down Expand Up @@ -56,8 +57,6 @@ Game_ConfigGame Game_ConfigGame::Create(CmdlineParser& cp) {
cfg.engine = Player::EngineRpg2k3 | Player::EngineMajorUpdated | Player::EngineEnglish;
}
}

return cfg;
}

void Game_ConfigGame::LoadFromArgs(CmdlineParser& cp) {
Expand Down Expand Up @@ -88,6 +87,8 @@ void Game_ConfigGame::LoadFromArgs(CmdlineParser& cp) {
patch_rpg2k3_commands.Lock(false);
patch_anti_lag_switch.Lock(0);
patch_direct_menu.Lock(0);

RuntimePatches::LockPatchesAsDiabled();
patch_override = true;
continue;
}
Expand Down Expand Up @@ -155,6 +156,10 @@ void Game_ConfigGame::LoadFromArgs(CmdlineParser& cp) {
}
continue;
}
if (RuntimePatches::ParseFromCommandLine(cp)) {
patch_override = true;
continue;
}
if (cp.ParseNext(arg, 6, "--patch")) {
// For backwards compatibility only
for (int i = 0; i < arg.NumValues(); ++i) {
Expand Down Expand Up @@ -229,6 +234,10 @@ void Game_ConfigGame::LoadFromStream(Filesystem_Stream::InputStream& is) {
if (patch_direct_menu.FromIni(ini)) {
patch_override = true;
}

if (RuntimePatches::ParseFromIni(ini)) {
patch_override = true;
}
}

void Game_ConfigGame::PrintActivePatches() {
Expand Down Expand Up @@ -258,6 +267,8 @@ void Game_ConfigGame::PrintActivePatches() {
add_int(patch_anti_lag_switch);
add_int(patch_direct_menu);

RuntimePatches::DetermineActivePatches(patches);

if (patches.empty()) {
Output::Debug("Patch configuration: None");
} else {
Expand Down
26 changes: 24 additions & 2 deletions src/game_config_game.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,28 @@ struct Game_ConfigGame {
ConfigParam<int> patch_anti_lag_switch{ "Anti-Lag Switch", "Disable event page refreshes when switch is set", "Patch", "AntiLagSwitch", 0 };
ConfigParam<int> patch_direct_menu{ "Direct Menu", " Allows direct access to subscreens of the default menu", "Patch", "DirectMenu", 0 };

ConfigParam<int> patch_encounter_random_alert_sw{ "Encounter Randomness Alert", "Set troop id to a variable, activate a switch and skip random battle", "Patch", "EncounterAlert.Switch", 0 };
ConfigParam<int> patch_encounter_random_alert_var{ "Encounter Randomness Alert", "Set troop id to a variable, activate a switch and skip random battle", "Patch", "EncounterAlert.Var", 0 };

ConfigParam<int> patch_monsca_maxhp{ "MonSca", "Scales enemy battle stats by variable value. (MaxHP)", "Patch", "MonSca.MaxHP", 0 };
ConfigParam<int> patch_monsca_maxsp{ "MonSca", "Scales enemy battle stats by variable value. (MaxSP)", "Patch", "MonSca.MaxSP", 0 };
ConfigParam<int> patch_monsca_atk{ "MonSca", "Scales enemy battle stats by variable value. (Attack)", "Patch", "MonSca.Attack", 0 };
ConfigParam<int> patch_monsca_def{ "MonSca", "Scales enemy battle stats by variable value. (Defense)", "Patch", "MonSca.Defense", 0 };
ConfigParam<int> patch_monsca_spi{ "MonSca", "Scales enemy battle stats by variable value. (Spirit)", "Patch", "MonSca.Spirit", 0 };
ConfigParam<int> patch_monsca_agi{ "MonSca", "Scales enemy battle stats by variable value. (Agility)", "Patch", "MonSca.Agility", 0 };
ConfigParam<int> patch_monsca_exp{ "MonSca", "Scales enemy battle stats by variable value. (Gained EXP)", "Patch", "MonSca.Experience", 0 };
ConfigParam<int> patch_monsca_gold{ "MonSca", "Scales enemy battle stats by variable value. (Gained Money)", "Patch", "MonSca.Money", 0 };
ConfigParam<int> patch_monsca_item{ "MonSca", "Scales enemy battle stats by variable value. (Gained Item)", "Patch", "MonSca.ItemId", 0 };
ConfigParam<int> patch_monsca_droprate{ "MonSca", "Scales enemy battle stats by variable value. (Item Drop Rate)", "Patch", "MonSca.ItemDropRate", 0 };
ConfigParam<int> patch_monsca_levelscaling{ "MonSca", "Scales enemy battle stats by variable value. (Alternate formula)", "Patch", "MonSca.LevelScaling", 0 };
ConfigParam<int> patch_monsca_plus{ "MonSca", "Scale enemies individually based on troop index", "Patch", "MonSca.Plus", 0 };

ConfigParam<int> patch_explus_var{ "EXPlus", "Boosts party EXP by set percentages", "Patch", "EXPlus.VarExpBoost", 0 };
ConfigParam<int> patch_explusplus_var{ "EXPlus", "Allows for setting party index of given actors to a variable", "Patch", "EXPlus.VarActorInParty", 0 };

ConfigParam<int> patch_guardrevamp_normal{ "GuardRevamp", "Changes damage calculation for defense situations (Normal)", "Patch", "GuardRevamp.NormalDefense", 0 };
ConfigParam<int> patch_guardrevamp_strong{ "GuardRevamp", "Changes damage calculation for defense situations (Strong)", "Patch", "GuardRevamp.StrongDefense", 0 };

// Command line only
BoolConfigParam patch_support{ "Support patches", "When OFF all patch support is disabled", "", "", true };

Expand All @@ -58,9 +80,9 @@ struct Game_ConfigGame {
int engine = 0;

/**
* Create a game config from the config file in the game directory, then loads command line arguments.
* Initializes a game config from the config file in the game directory, then loads command line arguments.
*/
static Game_ConfigGame Create(CmdlineParser& cp);
void Initialize(CmdlineParser& cp);

/**
* Load configuration values from a stream;
Expand Down
25 changes: 19 additions & 6 deletions src/game_enemy.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

// Headers
#include "game_battler.h"
#include "game_runtime_patches.h"
#include "sprite_enemy.h"
#include "player.h"
#include <lcf/rpg/enemy.h>
Expand Down Expand Up @@ -327,27 +328,39 @@ inline int Game_Enemy::GetTroopMemberId() const {
}

inline int Game_Enemy::GetBaseMaxHp() const {
return enemy->max_hp;
auto max_hp = enemy->max_hp;
RuntimePatches::MonSca::ModifyMaxHp(*this, max_hp);
return max_hp;
}

inline int Game_Enemy::GetBaseMaxSp() const {
return enemy->max_sp;
auto max_sp = enemy->max_sp;
RuntimePatches::MonSca::ModifyMaxSp(*this, max_sp);
return max_sp;
}

inline int Game_Enemy::GetBaseAtk(Weapon) const {
return enemy->attack;
auto attack = enemy->attack;
RuntimePatches::MonSca::ModifyAtk(*this, attack);
return attack;
}

inline int Game_Enemy::GetBaseDef(Weapon) const {
return enemy->defense;
auto defense = enemy->defense;
RuntimePatches::MonSca::ModifyDef(*this, defense);
return defense;
}

inline int Game_Enemy::GetBaseSpi(Weapon) const {
return enemy->spirit;
auto spirit = enemy->spirit;
RuntimePatches::MonSca::ModifySpi(*this, spirit);
return spirit;
}

inline int Game_Enemy::GetBaseAgi(Weapon) const {
return enemy->agility;
auto agility = enemy->agility;
RuntimePatches::MonSca::ModifyAgi(*this, agility);
return agility;
}

inline int Game_Enemy::GetHp() const {
Expand Down
23 changes: 18 additions & 5 deletions src/game_enemyparty.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include <algorithm>
#include "game_interpreter.h"
#include "game_enemyparty.h"
#include "game_runtime_patches.h"
#include "main_data.h"
#include <lcf/reader_util.h>
#include "utils.h"
Expand Down Expand Up @@ -102,7 +103,10 @@ int Game_EnemyParty::GetExp() const {
int sum = 0;
for (auto& enemy: enemies) {
if (enemy.IsDead()) {
sum += enemy.GetExp();
auto exp = enemy.GetExp();
RuntimePatches::MonSca::ModifyExpGained(enemy, exp);

sum += exp;
}
}
return sum;
Expand All @@ -112,7 +116,10 @@ int Game_EnemyParty::GetMoney() const {
int sum = 0;
for (auto& enemy: enemies) {
if (enemy.IsDead()) {
sum += enemy.GetMoney();
auto money = enemy.GetMoney();
RuntimePatches::MonSca::ModifyMoneyGained(enemy, money);

sum += money;
}
}
return sum;
Expand All @@ -121,10 +128,16 @@ int Game_EnemyParty::GetMoney() const {
void Game_EnemyParty::GenerateDrops(std::vector<int>& out) const {
for (auto& enemy: enemies) {
if (enemy.IsDead()) {
auto drop_id = enemy.GetDropId();
RuntimePatches::MonSca::ModifyItemGained(enemy, drop_id);

// Only roll if the enemy has something to drop
if (enemy.GetDropId() != 0) {
if (Rand::ChanceOf(enemy.GetDropProbability(), 100)) {
out.push_back(enemy.GetDropId());
if (drop_id > 0) {
auto drop_rate = enemy.GetDropProbability();
RuntimePatches::MonSca::ModifyItemDropRate(enemy, drop_rate);

if (Rand::ChanceOf(drop_rate, 100)) {
out.push_back(drop_id);
}
}
}
Expand Down
7 changes: 6 additions & 1 deletion src/game_interpreter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3566,6 +3566,7 @@ bool Game_Interpreter::CommandConditionalBranch(lcf::rpg::EventCommand const& co
case 0:
// Is actor in party
result = Main_Data::game_party->IsActorInParty(actor_id);
RuntimePatches::EXPlus::StoreActorPosition(actor_id);
break;
case 1:
// Name
Expand Down Expand Up @@ -4847,7 +4848,11 @@ bool Game_Interpreter::CommandManiacKeyInputProcEx(lcf::rpg::EventCommand const&
}
} else if (operation == 2) {
int key_id = ValueOrVariable(com.parameters[2], com.parameters[3]);
bool key_state = ManiacPatch::GetKeyState(key_id);
auto key = RuntimePatches::VirtualKeys::VirtualKeyToInputKey(key_id);
if (key == Input::Keys::NONE) {
Output::Debug("Maniac KeyInputProcEx: Unsupported keycode {}", key_id);
}
bool key_state = Input::IsRawKeyPressed(key);
Main_Data::game_variables->Set(start_var_id, key_state ? 1 : 0);
} else {
Output::Warning("Maniac KeyInputProcEx: Joypad not supported");
Expand Down
6 changes: 6 additions & 0 deletions src/game_map.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
#include "game_message.h"
#include "game_screen.h"
#include "game_pictures.h"
#include "game_variables.h"
#include "scene_battle.h"
#include "scene_map.h"
#include <lcf/lmu/reader.h>
Expand Down Expand Up @@ -1636,6 +1637,11 @@ bool Game_Map::PrepareEncounter(BattleArgs& args) {

args.troop_id = encounters[Rand::GetRandomNumber(0, encounters.size() - 1)];

if (RuntimePatches::EncounterRandomnessAlert::HandleEncounter(args.troop_id)) {
//Cancel the battle setup
return false;
}

if (Feature::HasRpg2kBattleSystem()) {
if (Rand::ChanceOf(1, 32)) {
args.first_strike = true;
Expand Down
Loading
Loading