diff --git a/src/ReceiveSubcommands.cc b/src/ReceiveSubcommands.cc index 3c8bcae5..1c8b0401 100644 --- a/src/ReceiveSubcommands.cc +++ b/src/ReceiveSubcommands.cc @@ -3688,6 +3688,79 @@ static asio::awaitable dispatch_dc_v2_exp_patch(shared_ptr c) { } } +// Dispatch the correct GC V3 EXP table for the current episode when the +// universal GC EXP enable shim is active. This avoids EP1/EP2 patches +// overwriting each other or leaving stale episode tables in memory. +static asio::awaitable dispatch_gc_v3_exp_patch(shared_ptr c) { + if (c->version() != Version::GC_V3) { + co_return; + } + if (not c->check_flag(Client::Flag::HAS_SEND_FUNCTION_CALL)) { + co_return; + } + if (not c->login || not c->login->account) { + co_return; + } + if (not c->login->account->auto_patches_enabled.count("PsoPeepsGCV3EXP_enabled")) { + co_return; + } + + auto l = c->require_lobby(); + if (not l->is_game()) { + co_return; + } + + const char* key = nullptr; + size_t num_exp_labels = 0; + switch (l->episode) { + case Episode::EP1: + key = "PsoPeepsEP1EXP_internal"; + num_exp_labels = 204; + break; + case Episode::EP2: + key = "PsoPeepsEP2EXP_internal"; + num_exp_labels = 239; + break; + default: + co_return; + } + + try { + auto server_state = c->require_server_state(); + auto base_fn = server_state->client_functions->get(key, c->specific_version); + auto fn = make_shared(*base_fn); + + for (size_t z = 0; z < num_exp_labels; z++) { + string label = std::format("exp_{:03}", z); + size_t offset = fn->label_offsets.at(label); + if (offset > fn->code.size() - 4) { + throw runtime_error("GC V3 EXP label out of range"); + } + + uint32_t base_exp = + (static_cast(static_cast(fn->code[offset])) << 24) | + (static_cast(static_cast(fn->code[offset + 1])) << 16) | + (static_cast(static_cast(fn->code[offset + 2])) << 8) | + static_cast(static_cast(fn->code[offset + 3])); + + uint64_t scaled_exp = static_cast(base_exp) * + static_cast(server_state->gc_v3_exp_multiplier); + if (scaled_exp > 0xFFFFFFFFULL) { + scaled_exp = 0xFFFFFFFFULL; + } + + fn->code[offset] = static_cast((scaled_exp >> 24) & 0xFF); + fn->code[offset + 1] = static_cast((scaled_exp >> 16) & 0xFF); + fn->code[offset + 2] = static_cast((scaled_exp >> 8) & 0xFF); + fn->code[offset + 3] = static_cast(scaled_exp & 0xFF); + } + + co_await send_function_call(c, fn); + } catch (const out_of_range&) { + c->log.warning_f("GC V3 EXP dispatcher could not find client function {}", key); + } +} + static asio::awaitable on_trigger_set_event(shared_ptr c, SubcommandMessage& msg) { auto l = c->require_lobby(); if (!l->is_game()) { @@ -3695,6 +3768,7 @@ static asio::awaitable on_trigger_set_event(shared_ptr c, Subcomma } co_await dispatch_dc_v2_exp_patch(c); + co_await dispatch_gc_v3_exp_patch(c); const auto& cmd = msg.check_size_t(); auto event_sts = l->map_state->event_states_for_id(c->version(), cmd.floor, cmd.event_id); diff --git a/src/ServerState.cc b/src/ServerState.cc index f946b38c..81d9f632 100644 --- a/src/ServerState.cc +++ b/src/ServerState.cc @@ -1139,6 +1139,7 @@ void ServerState::load_config_early() { this->bb_global_exp_multiplier = this->config_json->get_float("BBGlobalEXPMultiplier", 1.0f); this->dc_v2_exp_multiplier = std::max(1, this->config_json->get_int("DCV2EXPMultiplier", 1)); + this->gc_v3_exp_multiplier = std::max(1, this->config_json->get_int("GCV3EXPMultiplier", 1)); this->exp_share_multiplier = this->config_json->get_float("BBEXPShareMultiplier", 0.5f); this->server_global_drop_rate_multiplier = this->config_json->get_float("ServerGlobalDropRateMultiplier", 1.0f); diff --git a/src/ServerState.hh b/src/ServerState.hh index 68f4cbd3..61ebee3a 100644 --- a/src/ServerState.hh +++ b/src/ServerState.hh @@ -270,6 +270,7 @@ struct ServerState : public std::enable_shared_from_this { QuestF960Result quest_F960_failure_results; float bb_global_exp_multiplier = 1.0f; int64_t dc_v2_exp_multiplier = 1; + int64_t gc_v3_exp_multiplier = 1; float exp_share_multiplier = 0.5f; float server_global_drop_rate_multiplier = 1.0f; diff --git a/system/client-functions/PsoPeepsEP1EXP10x.s b/system/client-functions.disabled/PsoPeepsEP1EXP10x.s similarity index 100% rename from system/client-functions/PsoPeepsEP1EXP10x.s rename to system/client-functions.disabled/PsoPeepsEP1EXP10x.s diff --git a/system/client-functions/PsoPeepsEP1EXP5x.s b/system/client-functions.disabled/PsoPeepsEP1EXP5x.s similarity index 100% rename from system/client-functions/PsoPeepsEP1EXP5x.s rename to system/client-functions.disabled/PsoPeepsEP1EXP5x.s diff --git a/system/client-functions/PsoPeepsEP2EXP10x.s b/system/client-functions.disabled/PsoPeepsEP2EXP10x.s similarity index 100% rename from system/client-functions/PsoPeepsEP2EXP10x.s rename to system/client-functions.disabled/PsoPeepsEP2EXP10x.s diff --git a/system/client-functions/PsoPeepsEP2EXP10xJP.s b/system/client-functions.disabled/PsoPeepsEP2EXP10xJP.s similarity index 100% rename from system/client-functions/PsoPeepsEP2EXP10xJP.s rename to system/client-functions.disabled/PsoPeepsEP2EXP10xJP.s diff --git a/system/client-functions/PsoPeepsEP2EXP10xUS.s b/system/client-functions.disabled/PsoPeepsEP2EXP10xUS.s similarity index 100% rename from system/client-functions/PsoPeepsEP2EXP10xUS.s rename to system/client-functions.disabled/PsoPeepsEP2EXP10xUS.s diff --git a/system/client-functions/PsoPeepsEP2EXP5x.s b/system/client-functions.disabled/PsoPeepsEP2EXP5x.s similarity index 100% rename from system/client-functions/PsoPeepsEP2EXP5x.s rename to system/client-functions.disabled/PsoPeepsEP2EXP5x.s diff --git a/system/client-functions/PsoPeepsEP2EXP5xJP.s b/system/client-functions.disabled/PsoPeepsEP2EXP5xJP.s similarity index 100% rename from system/client-functions/PsoPeepsEP2EXP5xJP.s rename to system/client-functions.disabled/PsoPeepsEP2EXP5xJP.s diff --git a/system/client-functions/PsoPeepsEP2EXP5xUS.s b/system/client-functions.disabled/PsoPeepsEP2EXP5xUS.s similarity index 100% rename from system/client-functions/PsoPeepsEP2EXP5xUS.s rename to system/client-functions.disabled/PsoPeepsEP2EXP5xUS.s diff --git a/system/client-functions/PsoPeepsEP1EXP_internal.s b/system/client-functions/PsoPeepsEP1EXP_internal.s new file mode 100644 index 00000000..ce97fc85 --- /dev/null +++ b/system/client-functions/PsoPeepsEP1EXP_internal.s @@ -0,0 +1,1042 @@ +.meta key="PsoPeepsEP1EXP_internal" +.meta name="INTERNAL GC V3 Episode 1 EXP table template" +.meta client_flag="0x0000200000000000" +.meta description="Internal: 1x GC V3 Episode 1 EXP table template. Server scales values from GCV3EXPMultiplier before sending." + +.versions 3OE2 3OJ5 + +entry_ptr: +reloc0: + .offsetof start + +start: + .include WriteCodeBlocks + + # PSO Peeps GC Plus USA / 3OE2 + # Source table: BattleParamEntry_on.dat + # Active online battle-param table loaded at 0x811AB7C0 + # EXP field offset within each 0x24-byte row is +0x1C + # Generated from clean BattleParamEntry_on.dat; multiplier=5x + + .data + .data 4 +exp_000: + .binary 00000001 + + .data + .data 4 +exp_001: + .binary 00000006 + + .data + .data 4 +exp_002: + .binary 00000005 + + .data + .data 4 +exp_003: + .binary 00000007 + + .data + .data 4 +exp_004: + .binary 0000000a + + .data + .data 4 +exp_005: + .binary 00000096 + + .data + .data 4 +exp_006: + .binary 00000019 + + .data + .data 4 +exp_007: + .binary 00000010 + + .data + .data 4 +exp_008: + .binary 00000010 + + .data + .data 4 +exp_009: + .binary 00000011 + + .data + .data 4 +exp_010: + .binary 0000001d + + .data + .data 4 +exp_011: + .binary 00000004 + + .data + .data 4 +exp_012: + .binary 00000004 + + .data + .data 4 +exp_013: + .binary 00000023 + + .data + .data 4 +exp_014: + .binary 00000023 + + .data + .data 4 +exp_015: + .binary 0000037a + + .data + .data 4 +exp_016: + .binary 0000000a + + .data + .data 4 +exp_017: + .binary 0000000a + + .data + .data 4 +exp_018: + .binary 00000190 + + .data + .data 4 +exp_019: + .binary 0000001c + + .data + .data 4 +exp_020: + .binary 00000004 + + .data + .data 4 +exp_021: + .binary 00000064 + + .data + .data 4 +exp_022: + .binary 0000000f + + .data + .data 4 +exp_023: + .binary 00000003 + + .data + .data 4 +exp_024: + .binary 00000012 + + .data + .data 4 +exp_025: + .binary 00000016 + + .data + .data 4 +exp_026: + .binary 00000014 + + .data + .data 4 +exp_027: + .binary 0000001b + + .data + .data 4 +exp_028: + .binary 00000006 + + .data + .data 4 +exp_029: + .binary 000004e2 + + .data + .data 4 +exp_030: + .binary 0000000a + + .data + .data 4 +exp_031: + .binary 00000006 + + .data + .data 4 +exp_032: + .binary 00000004 + + .data + .data 4 +exp_033: + .binary 00000004 + + .data + .data 4 +exp_034: + .binary 00000096 + + .data + .data 4 +exp_035: + .binary 00000005 + + .data + .data 4 +exp_036: + .binary 00000bb8 + + .data + .data 4 +exp_037: + .binary 00000005 + + .data + .data 4 +exp_038: + .binary 0000000d + + .data + .data 4 +exp_039: + .binary 00000064 + + .data + .data 4 +exp_040: + .binary 00000005 + + .data + .data 4 +exp_041: + .binary 00000006 + + .data + .data 4 +exp_042: + .binary 00000007 + + .data + .data 4 +exp_043: + .binary 00000014 + + .data + .data 4 +exp_044: + .binary 0000000a + + .data + .data 4 +exp_045: + .binary 0000000c + + .data + .data 4 +exp_046: + .binary 0000000e + + .data + .data 4 +exp_047: + .binary 0000001e + + .data + .data 4 +exp_048: + .binary 00000016 + + .data + .data 4 +exp_049: + .binary 00000018 + + .data + .data 4 +exp_050: + .binary 0000001a + + .data + .data 4 +exp_051: + .binary 00000024 + + .data + .data 4 +exp_052: + .binary 0000002b + + .data + .data 4 +exp_053: + .binary 0000002a + + .data + .data 4 +exp_054: + .binary 0000002d + + .data + .data 4 +exp_055: + .binary 00000031 + + .data + .data 4 +exp_056: + .binary 00000103 + + .data + .data 4 +exp_057: + .binary 00000046 + + .data + .data 4 +exp_058: + .binary 0000003a + + .data + .data 4 +exp_059: + .binary 0000003a + + .data + .data 4 +exp_060: + .binary 0000003c + + .data + .data 4 +exp_061: + .binary 0000004e + + .data + .data 4 +exp_062: + .binary 00000028 + + .data + .data 4 +exp_063: + .binary 00000028 + + .data + .data 4 +exp_064: + .binary 00000061 + + .data + .data 4 +exp_065: + .binary 00000054 + + .data + .data 4 +exp_066: + .binary 00000c80 + + .data + .data 4 +exp_067: + .binary 00000019 + + .data + .data 4 +exp_068: + .binary 00000004 + + .data + .data 4 +exp_069: + .binary 00000960 + + .data + .data 4 +exp_070: + .binary 0000004b + + .data + .data 4 +exp_071: + .binary 00000028 + + .data + .data 4 +exp_072: + .binary 000000b8 + + .data + .data 4 +exp_073: + .binary 00000039 + + .data + .data 4 +exp_074: + .binary 0000000b + + .data + .data 4 +exp_075: + .binary 0000003d + + .data + .data 4 +exp_076: + .binary 00000043 + + .data + .data 4 +exp_077: + .binary 00000040 + + .data + .data 4 +exp_078: + .binary 0000004d + + .data + .data 4 +exp_079: + .binary 0000002b + + .data + .data 4 +exp_080: + .binary 00000ed8 + + .data + .data 4 +exp_081: + .binary 00000031 + + .data + .data 4 +exp_082: + .binary 0000001a + + .data + .data 4 +exp_083: + .binary 00000017 + + .data + .data 4 +exp_084: + .binary 00000017 + + .data + .data 4 +exp_085: + .binary 00000103 + + .data + .data 4 +exp_086: + .binary 00000005 + + .data + .data 4 +exp_087: + .binary 00001f40 + + .data + .data 4 +exp_088: + .binary 00000005 + + .data + .data 4 +exp_089: + .binary 00000038 + + .data + .data 4 +exp_090: + .binary 000000b8 + + .data + .data 4 +exp_091: + .binary 0000002a + + .data + .data 4 +exp_092: + .binary 0000002b + + .data + .data 4 +exp_093: + .binary 0000002d + + .data + .data 4 +exp_094: + .binary 00000040 + + .data + .data 4 +exp_095: + .binary 00000031 + + .data + .data 4 +exp_096: + .binary 00000034 + + .data + .data 4 +exp_097: + .binary 00000037 + + .data + .data 4 +exp_098: + .binary 00000051 + + .data + .data 4 +exp_099: + .binary 00000043 + + .data + .data 4 +exp_100: + .binary 00000046 + + .data + .data 4 +exp_101: + .binary 00000049 + + .data + .data 4 +exp_102: + .binary 00000052 + + .data + .data 4 +exp_103: + .binary 0000005c + + .data + .data 4 +exp_104: + .binary 0000005a + + .data + .data 4 +exp_105: + .binary 0000005e + + .data + .data 4 +exp_106: + .binary 00000064 + + .data + .data 4 +exp_107: + .binary 0000017c + + .data + .data 4 +exp_108: + .binary 00000089 + + .data + .data 4 +exp_109: + .binary 00000070 + + .data + .data 4 +exp_110: + .binary 00000070 + + .data + .data 4 +exp_111: + .binary 00000072 + + .data + .data 4 +exp_112: + .binary 00000094 + + .data + .data 4 +exp_113: + .binary 00000058 + + .data + .data 4 +exp_114: + .binary 00000058 + + .data + .data 4 +exp_115: + .binary 00000096 + + .data + .data 4 +exp_116: + .binary 00000090 + + .data + .data 4 +exp_117: + .binary 000021fc + + .data + .data 4 +exp_118: + .binary 0000001e + + .data + .data 4 +exp_119: + .binary 00000008 + + .data + .data 4 +exp_120: + .binary 00001f2c + + .data + .data 4 +exp_121: + .binary 0000008f + + .data + .data 4 +exp_122: + .binary 00000058 + + .data + .data 4 +exp_123: + .binary 00000118 + + .data + .data 4 +exp_124: + .binary 00000078 + + .data + .data 4 +exp_125: + .binary 00000016 + + .data + .data 4 +exp_126: + .binary 00000074 + + .data + .data 4 +exp_127: + .binary 0000007c + + .data + .data 4 +exp_128: + .binary 00000078 + + .data + .data 4 +exp_129: + .binary 00000080 + + .data + .data 4 +exp_130: + .binary 0000005c + + .data + .data 4 +exp_131: + .binary 00002b5c + + .data + .data 4 +exp_132: + .binary 00000064 + + .data + .data 4 +exp_133: + .binary 00000034 + + .data + .data 4 +exp_134: + .binary 00000030 + + .data + .data 4 +exp_135: + .binary 00000030 + + .data + .data 4 +exp_136: + .binary 0000017c + + .data + .data 4 +exp_137: + .binary 00000009 + + .data + .data 4 +exp_138: + .binary 00003e80 + + .data + .data 4 +exp_139: + .binary 00000009 + + .data + .data 4 +exp_140: + .binary 0000006f + + .data + .data 4 +exp_141: + .binary 00000118 + + .data + .data 4 +exp_142: + .binary 0000005a + + .data + .data 4 +exp_143: + .binary 0000005c + + .data + .data 4 +exp_144: + .binary 0000005e + + .data + .data 4 +exp_145: + .binary 0000007d + + .data + .data 4 +exp_146: + .binary 00000064 + + .data + .data 4 +exp_147: + .binary 00000068 + + .data + .data 4 +exp_148: + .binary 0000006c + + .data + .data 4 +exp_149: + .binary 00000096 + + .data + .data 4 +exp_150: + .binary 0000007c + + .data + .data 4 +exp_151: + .binary 00000080 + + .data + .data 4 +exp_152: + .binary 00000084 + + .data + .data 4 +exp_153: + .binary 00000091 + + .data + .data 4 +exp_154: + .binary 0000010e + + .data + .data 4 +exp_155: + .binary 00000113 + + .data + .data 4 +exp_156: + .binary 00000118 + + .data + .data 4 +exp_157: + .binary 00000127 + + .data + .data 4 +exp_158: + .binary 00000384 + + .data + .data 4 +exp_159: + .binary 0000015e + + .data + .data 4 +exp_160: + .binary 00000140 + + .data + .data 4 +exp_161: + .binary 00000140 + + .data + .data 4 +exp_162: + .binary 00000145 + + .data + .data 4 +exp_163: + .binary 0000016b + + .data + .data 4 +exp_164: + .binary 00000064 + + .data + .data 4 +exp_165: + .binary 00000064 + + .data + .data 4 +exp_166: + .binary 00000181 + + .data + .data 4 +exp_167: + .binary 00000174 + + .data + .data 4 +exp_168: + .binary 00004970 + + .data + .data 4 +exp_169: + .binary 0000003c + + .data + .data 4 +exp_170: + .binary 00000010 + + .data + .data 4 +exp_171: + .binary 00003e1c + + .data + .data 4 +exp_172: + .binary 00000158 + + .data + .data 4 +exp_173: + .binary 00000100 + + .data + .data 4 +exp_174: + .binary 000002bc + + .data + .data 4 +exp_175: + .binary 00000140 + + .data + .data 4 +exp_176: + .binary 0000003b + + .data + .data 4 +exp_177: + .binary 00000141 + + .data + .data 4 +exp_178: + .binary 00000163 + + .data + .data 4 +exp_179: + .binary 0000014e + + .data + .data 4 +exp_180: + .binary 0000014e + + .data + .data 4 +exp_181: + .binary 00000111 + + .data + .data 4 +exp_182: + .binary 00005bcc + + .data + .data 4 +exp_183: + .binary 00000122 + + .data + .data 4 +exp_184: + .binary 000000c3 + + .data + .data 4 +exp_185: + .binary 000000b4 + + .data + .data 4 +exp_186: + .binary 000000b4 + + .data + .data 4 +exp_187: + .binary 00000370 + + .data + .data 4 +exp_188: + .binary 00000019 + + .data + .data 4 +exp_189: + .binary 0000c350 + + .data + .data 4 +exp_190: + .binary 00000014 + + .data + .data 4 +exp_191: + .binary 0000012c + + .data + .data 4 +exp_192: + .binary 000002b2 + + .data + .data 4 +exp_193: + .binary 0000010f + + .data + .data 4 +exp_194: + .binary 00000114 + + .data + .data 4 +exp_195: + .binary 0000010c + + .data + .data 4 +exp_196: + .binary 0000014d + + .data + .data 4 +exp_197: + .binary 00000127 + + .data + .data 4 +exp_198: + .binary 0000012f + + .data + .data 4 +exp_199: + .binary 0000013e + + .data + .data 4 +exp_200: + .binary 00000177 + + .data + .data 4 +exp_201: + .binary 00000153 + + .data + .data 4 +exp_202: + .binary 00000159 + + .data + .data 4 +exp_203: + .binary 00000164 + + .data 0 + .data 0 diff --git a/system/client-functions/PsoPeepsEP2EXP_internal.s b/system/client-functions/PsoPeepsEP2EXP_internal.s new file mode 100644 index 00000000..95018fa1 --- /dev/null +++ b/system/client-functions/PsoPeepsEP2EXP_internal.s @@ -0,0 +1,1217 @@ +.meta key="PsoPeepsEP2EXP_internal" +.meta name="INTERNAL GC V3 Episode 2 EXP table template" +.meta client_flag="0x0000200000000000" +.meta description="Internal: 1x GC V3 Episode 2 EXP table template. Server scales values from GCV3EXPMultiplier before sending." + +.versions 3OE2 3OJ5 + +entry_ptr: +reloc0: + .offsetof start + +start: + .include WriteCodeBlocks + + # PSO Peeps GC Plus USA / 3OE2 + # Source table: BattleParamEntry_lab_on.dat + # Active online battle-param table loaded at 0x811AB7C0 + # EXP field offset within each 0x24-byte row is +0x1C + # Generated from clean BattleParamEntry_lab_on.dat; multiplier=5x + + .data + .data 4 +exp_000: + .binary 00000001 + + .data + .data 4 +exp_001: + .binary 00000006 + + .data + .data 4 +exp_002: + .binary 0000000a + + .data + .data 4 +exp_003: + .binary 0000000c + + .data + .data 4 +exp_004: + .binary 0000000a + + .data + .data 4 +exp_005: + .binary 00000096 + + .data + .data 4 +exp_006: + .binary 00000013 + + .data + .data 4 +exp_007: + .binary 0000000a + + .data + .data 4 +exp_008: + .binary 00000010 + + .data + .data 4 +exp_009: + .binary 00000011 + + .data + .data 4 +exp_010: + .binary 00000011 + + .data + .data 4 +exp_011: + .binary 00000002 + + .data + .data 4 +exp_012: + .binary 00000002 + + .data + .data 4 +exp_013: + .binary 00000028 + + .data + .data 4 +exp_014: + .binary 0000000f + + .data + .data 4 +exp_015: + .binary 000001e0 + + .data + .data 4 +exp_016: + .binary 0000000a + + .data + .data 4 +exp_017: + .binary 00000003 + + .data + .data 4 +exp_018: + .binary 000003b6 + + .data + .data 4 +exp_019: + .binary 00000015 + + .data + .data 4 +exp_020: + .binary 00000004 + + .data + .data 4 +exp_021: + .binary 00000100 + + .data + .data 4 +exp_022: + .binary 00000033 + + .data + .data 4 +exp_023: + .binary 00000002 + + .data + .data 4 +exp_024: + .binary 0000000b + + .data + .data 4 +exp_025: + .binary 00000013 + + .data + .data 4 +exp_026: + .binary 000005dc + + .data + .data 4 +exp_027: + .binary 00000088 + + .data + .data 4 +exp_028: + .binary 00000031 + + .data + .data 4 +exp_029: + .binary 0000002d + + .data + .data 4 +exp_030: + .binary 00000ce4 + + .data + .data 4 +exp_031: + .binary 0000001d + + .data + .data 4 +exp_032: + .binary 00000003 + + .data + .data 4 +exp_033: + .binary 00000007 + + .data + .data 4 +exp_034: + .binary 00000008 + + .data + .data 4 +exp_035: + .binary 0000002f + + .data + .data 4 +exp_036: + .binary 0000000c + + .data + .data 4 +exp_037: + .binary 0000000f + + .data + .data 4 +exp_038: + .binary 00000034 + + .data + .data 4 +exp_039: + .binary 0000001e + + .data + .data 4 +exp_040: + .binary 0000000c + + .data + .data 4 +exp_041: + .binary 00000002 + + .data + .data 4 +exp_042: + .binary 00000020 + + .data + .data 4 +exp_043: + .binary 00000028 + + .data + .data 4 +exp_044: + .binary 00000032 + + .data + .data 4 +exp_045: + .binary 00000037 + + .data + .data 4 +exp_046: + .binary 0000000a + + .data + .data 4 +exp_047: + .binary 00000064 + + .data + .data 4 +exp_048: + .binary 0000000b + + .data + .data 4 +exp_049: + .binary 0000000d + + .data + .data 4 +exp_050: + .binary 00000007 + + .data + .data 4 +exp_051: + .binary 0000000c + + .data + .data 4 +exp_052: + .binary 00000012 + + .data + .data 4 +exp_053: + .binary 00000015 + + .data + .data 4 +exp_054: + .binary 0000000e + + .data + .data 4 +exp_055: + .binary 0000000f + + .data + .data 4 +exp_056: + .binary 00000006 + + .data + .data 4 +exp_057: + .binary 00000007 + + .data + .data 4 +exp_058: + .binary 00000008 + + .data + .data 4 +exp_059: + .binary 00000025 + + .data + .data 4 +exp_060: + .binary 0000002d + + .data + .data 4 +exp_061: + .binary 00000034 + + .data + .data 4 +exp_062: + .binary 00000037 + + .data + .data 4 +exp_063: + .binary 00000034 + + .data + .data 4 +exp_064: + .binary 0000011b + + .data + .data 4 +exp_065: + .binary 00000042 + + .data + .data 4 +exp_066: + .binary 00000034 + + .data + .data 4 +exp_067: + .binary 0000003a + + .data + .data 4 +exp_068: + .binary 0000003c + + .data + .data 4 +exp_069: + .binary 0000003f + + .data + .data 4 +exp_070: + .binary 00000026 + + .data + .data 4 +exp_071: + .binary 00000026 + + .data + .data 4 +exp_072: + .binary 00000065 + + .data + .data 4 +exp_073: + .binary 0000003c + + .data + .data 4 +exp_074: + .binary 00000c80 + + .data + .data 4 +exp_075: + .binary 00000019 + + .data + .data 4 +exp_076: + .binary 00000004 + + .data + .data 4 +exp_077: + .binary 00000f3c + + .data + .data 4 +exp_078: + .binary 00000042 + + .data + .data 4 +exp_079: + .binary 0000002a + + .data + .data 4 +exp_080: + .binary 00000200 + + .data + .data 4 +exp_081: + .binary 00000077 + + .data + .data 4 +exp_082: + .binary 0000000a + + .data + .data 4 +exp_083: + .binary 00000035 + + .data + .data 4 +exp_084: + .binary 00000042 + + .data + .data 4 +exp_085: + .binary 00001194 + + .data + .data 4 +exp_086: + .binary 00000103 + + .data + .data 4 +exp_087: + .binary 00000074 + + .data + .data 4 +exp_088: + .binary 0000006d + + .data + .data 4 +exp_089: + .binary 00001e14 + + .data + .data 4 +exp_090: + .binary 00000053 + + .data + .data 4 +exp_091: + .binary 0000002f + + .data + .data 4 +exp_092: + .binary 0000002f + + .data + .data 4 +exp_093: + .binary 00000030 + + .data + .data 4 +exp_094: + .binary 00000071 + + .data + .data 4 +exp_095: + .binary 00000037 + + .data + .data 4 +exp_096: + .binary 0000003c + + .data + .data 4 +exp_097: + .binary 00000079 + + .data + .data 4 +exp_098: + .binary 00000055 + + .data + .data 4 +exp_099: + .binary 00000037 + + .data + .data 4 +exp_100: + .binary 0000002d + + .data + .data 4 +exp_101: + .binary 00000058 + + .data + .data 4 +exp_102: + .binary 00000065 + + .data + .data 4 +exp_103: + .binary 00000076 + + .data + .data 4 +exp_104: + .binary 0000007e + + .data + .data 4 +exp_105: + .binary 00000005 + + .data + .data 4 +exp_106: + .binary 00000034 + + .data + .data 4 +exp_107: + .binary 000000c8 + + .data + .data 4 +exp_108: + .binary 00000035 + + .data + .data 4 +exp_109: + .binary 00000038 + + .data + .data 4 +exp_110: + .binary 0000002d + + .data + .data 4 +exp_111: + .binary 00000037 + + .data + .data 4 +exp_112: + .binary 00000041 + + .data + .data 4 +exp_113: + .binary 00000046 + + .data + .data 4 +exp_114: + .binary 00000037 + + .data + .data 4 +exp_115: + .binary 0000003c + + .data + .data 4 +exp_116: + .binary 0000002d + + .data + .data 4 +exp_117: + .binary 0000002f + + .data + .data 4 +exp_118: + .binary 00000030 + + .data + .data 4 +exp_119: + .binary 00000057 + + .data + .data 4 +exp_120: + .binary 00000061 + + .data + .data 4 +exp_121: + .binary 00000069 + + .data + .data 4 +exp_122: + .binary 0000006d + + .data + .data 4 +exp_123: + .binary 00000069 + + .data + .data 4 +exp_124: + .binary 00000181 + + .data + .data 4 +exp_125: + .binary 00000073 + + .data + .data 4 +exp_126: + .binary 00000069 + + .data + .data 4 +exp_127: + .binary 00000070 + + .data + .data 4 +exp_128: + .binary 00000072 + + .data + .data 4 +exp_129: + .binary 00000077 + + .data + .data 4 +exp_130: + .binary 00000059 + + .data + .data 4 +exp_131: + .binary 00000059 + + .data + .data 4 +exp_132: + .binary 000000a5 + + .data + .data 4 +exp_133: + .binary 00000073 + + .data + .data 4 +exp_134: + .binary 00002260 + + .data + .data 4 +exp_135: + .binary 0000003c + + .data + .data 4 +exp_136: + .binary 0000003c + + .data + .data 4 +exp_137: + .binary 00002710 + + .data + .data 4 +exp_138: + .binary 0000007b + + .data + .data 4 +exp_139: + .binary 0000005d + + .data + .data 4 +exp_140: + .binary 000002f4 + + .data + .data 4 +exp_141: + .binary 000000bb + + .data + .data 4 +exp_142: + .binary 0000001e + + .data + .data 4 +exp_143: + .binary 0000006b + + .data + .data 4 +exp_144: + .binary 0000007b + + .data + .data 4 +exp_145: + .binary 000030d4 + + .data + .data 4 +exp_146: + .binary 00000165 + + .data + .data 4 +exp_147: + .binary 000000b7 + + .data + .data 4 +exp_148: + .binary 000000af + + .data + .data 4 +exp_149: + .binary 00003a98 + + .data + .data 4 +exp_150: + .binary 0000008f + + .data + .data 4 +exp_151: + .binary 0000005b + + .data + .data 4 +exp_152: + .binary 00000063 + + .data + .data 4 +exp_153: + .binary 00000065 + + .data + .data 4 +exp_154: + .binary 000000b3 + + .data + .data 4 +exp_155: + .binary 0000006d + + .data + .data 4 +exp_156: + .binary 00000073 + + .data + .data 4 +exp_157: + .binary 000000bd + + .data + .data 4 +exp_158: + .binary 00000091 + + .data + .data 4 +exp_159: + .binary 0000006d + + .data + .data 4 +exp_160: + .binary 0000005f + + .data + .data 4 +exp_161: + .binary 00000095 + + .data + .data 4 +exp_162: + .binary 000000a5 + + .data + .data 4 +exp_163: + .binary 000000b9 + + .data + .data 4 +exp_164: + .binary 000000c3 + + .data + .data 4 +exp_165: + .binary 00000005 + + .data + .data 4 +exp_166: + .binary 00000069 + + .data + .data 4 +exp_167: + .binary 0000011d + + .data + .data 4 +exp_168: + .binary 0000006b + + .data + .data 4 +exp_169: + .binary 0000006f + + .data + .data 4 +exp_170: + .binary 0000005e + + .data + .data 4 +exp_171: + .binary 0000006d + + .data + .data 4 +exp_172: + .binary 00000079 + + .data + .data 4 +exp_173: + .binary 0000007f + + .data + .data 4 +exp_174: + .binary 0000006c + + .data + .data 4 +exp_175: + .binary 00000073 + + .data + .data 4 +exp_176: + .binary 00000061 + + .data + .data 4 +exp_177: + .binary 00000063 + + .data + .data 4 +exp_178: + .binary 00000065 + + .data + .data 4 +exp_179: + .binary 00000096 + + .data + .data 4 +exp_180: + .binary 00000132 + + .data + .data 4 +exp_181: + .binary 0000014a + + .data + .data 4 +exp_182: + .binary 00000156 + + .data + .data 4 +exp_183: + .binary 0000014a + + .data + .data 4 +exp_184: + .binary 00000492 + + .data + .data 4 +exp_185: + .binary 00000168 + + .data + .data 4 +exp_186: + .binary 0000014a + + .data + .data 4 +exp_187: + .binary 00000130 + + .data + .data 4 +exp_188: + .binary 00000134 + + .data + .data 4 +exp_189: + .binary 00000174 + + .data + .data 4 +exp_190: + .binary 00000064 + + .data + .data 4 +exp_191: + .binary 00000064 + + .data + .data 4 +exp_192: + .binary 000001fe + + .data + .data 4 +exp_193: + .binary 00000168 + + .data + .data 4 +exp_194: + .binary 00004650 + + .data + .data 4 +exp_195: + .binary 0000003c + + .data + .data 4 +exp_196: + .binary 00000010 + + .data + .data 4 +exp_197: + .binary 00005208 + + .data + .data 4 +exp_198: + .binary 00000180 + + .data + .data 4 +exp_199: + .binary 00000126 + + .data + .data 4 +exp_200: + .binary 00000400 + + .data + .data 4 +exp_201: + .binary 00000240 + + .data + .data 4 +exp_202: + .binary 00000032 + + .data + .data 4 +exp_203: + .binary 00000150 + + .data + .data 4 +exp_204: + .binary 00000180 + + .data + .data 4 +exp_205: + .binary 0000607c + + .data + .data 4 +exp_206: + .binary 0000043e + + .data + .data 4 +exp_207: + .binary 00000234 + + .data + .data 4 +exp_208: + .binary 0000021c + + .data + .data 4 +exp_209: + .binary 0000b98c + + .data + .data 4 +exp_210: + .binary 000001bc + + .data + .data 4 +exp_211: + .binary 00000138 + + .data + .data 4 +exp_212: + .binary 00000138 + + .data + .data 4 +exp_213: + .binary 0000013e + + .data + .data 4 +exp_214: + .binary 0000015c + + .data + .data 4 +exp_215: + .binary 00000156 + + .data + .data 4 +exp_216: + .binary 00000168 + + .data + .data 4 +exp_217: + .binary 00000246 + + .data + .data 4 +exp_218: + .binary 000001c2 + + .data + .data 4 +exp_219: + .binary 00000156 + + .data + .data 4 +exp_220: + .binary 000000c8 + + .data + .data 4 +exp_221: + .binary 000001ce + + .data + .data 4 +exp_222: + .binary 000001fe + + .data + .data 4 +exp_223: + .binary 0000023a + + .data + .data 4 +exp_224: + .binary 00000258 + + .data + .data 4 +exp_225: + .binary 00000005 + + .data + .data 4 +exp_226: + .binary 0000014a + + .data + .data 4 +exp_227: + .binary 00000366 + + .data + .data 4 +exp_228: + .binary 00000150 + + .data + .data 4 +exp_229: + .binary 0000015c + + .data + .data 4 +exp_230: + .binary 0000010c + + .data + .data 4 +exp_231: + .binary 00000156 + + .data + .data 4 +exp_232: + .binary 0000017a + + .data + .data 4 +exp_233: + .binary 0000018c + + .data + .data 4 +exp_234: + .binary 00000128 + + .data + .data 4 +exp_235: + .binary 00000168 + + .data + .data 4 +exp_236: + .binary 00000132 + + .data + .data 4 +exp_237: + .binary 00000138 + + .data + .data 4 +exp_238: + .binary 0000013e + + .data 0 + .data 0 diff --git a/system/client-functions/PsoPeepsGCV3EXP_enabled.s b/system/client-functions/PsoPeepsGCV3EXP_enabled.s new file mode 100644 index 00000000..2033f7e5 --- /dev/null +++ b/system/client-functions/PsoPeepsGCV3EXP_enabled.s @@ -0,0 +1,14 @@ +.meta visibility="menu" +.meta key="PsoPeepsGCV3EXP_enabled" +.meta name="GC XP" +.meta client_flag="0x0000200000000000" +.meta description="Enables server-scaled GC V3 EXP boost. Server applies the correct Episode 1 or Episode 2 table." + +.versions 3OE2 3OJ5 + +entry_ptr: +reloc0: + .offsetof start + +start: + blr