1
0
Fork 0
mirror of https://github.com/jugeeya/UltimateTrainingModpack.git synced 2025-03-14 02:16:10 +00:00

Merge pull request #26 from jugeeya/layoff-interface

Layoff menu interface
This commit is contained in:
jugeeya 2019-10-30 23:06:35 -07:00 committed by GitHub
commit a6f56aedf1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 157 additions and 260 deletions

3
.gitmodules vendored
View file

@ -2,3 +2,6 @@
path = code-mod-framework
url = https://github.com/ultimate-research/code-mod-framework
branch = master
[submodule "layoff"]
path = layoff
url = https://github.com/jugeeya/layoff

View file

@ -47,7 +47,7 @@ CFLAGS := -Wall -O2 \
CFLAGS += $(INCLUDE) -DSWITCH
CXXFLAGS := $(CFLAGS) -fno-rtti -Wno-parentheses -Wno-write-strings -Wno-int-to-pointer-cast -std=gnu++11
CXXFLAGS := $(CFLAGS) -g3 -fno-rtti -Wno-parentheses -Wno-write-strings -Wno-int-to-pointer-cast -std=gnu++11
ASFLAGS := -g $(ARCH)
LDFLAGS = -specs=$(TOPDIR)/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)

@ -1 +1 @@
Subproject commit 7b435a8147524d6a87fc2018126b30f798a6969a
Subproject commit a31fc22e1859da6f217b61cdd17afa54f5a105fb

1
layoff Submodule

@ -0,0 +1 @@
Subproject commit 9e1d8b7529e7c303842a0784d6f1affb156c39a2

Binary file not shown.

Binary file not shown.

View file

@ -10,7 +10,7 @@
#include "acmd_wrapper.h"
#include "lib/l2c_imports.h"
#include "saltysd/saltysd_helper.h"
#include "taunt_toggles.h"
#include "training/common.hpp"
#include "useful/const_value_table.h"
#include "useful/raygun_printer.h"
@ -176,8 +176,7 @@ void ATTACK_replace(u64 a1) {
l2c_agent.get_lua_stack(15, &z2); // float or void
// hacky way of forcing no shield damage on all hitboxes
if (is_training_mode() &&
TOGGLE_STATE == SHIELD_TOGGLES && SHIELD_STATE == SHIELD_INFINITE) {
if (is_training_mode() && menu.SHIELD_STATE == SHIELD_INFINITE) {
L2CValue hitbox_params[36];
for (size_t i = 0; i < 36; i++)
l2c_agent.get_lua_stack(i + 1, &hitbox_params[i]);
@ -196,7 +195,7 @@ void ATTACK_replace(u64 a1) {
// original code: parse lua stack and call AttackModule::set_attack()
AttackModule_set_attack_lua_state(LOAD64(LOAD64(a1 - 8) + 416LL), a1);
if (HITBOX_VIS && is_training_mode()) { // generate hitbox effect(s)
if (menu.HITBOX_VIS && is_training_mode()) { // generate hitbox effect(s)
float color_scale;
if (false) { // color intensity scales with damage
color_scale = unlerp_bounded(1.0f, 18.0f, damage.raw_float);
@ -267,7 +266,7 @@ void CATCH_replace(u64 a1) {
// jump to Catch_jumpback
asm("BLR X9");
if (HITBOX_VIS && is_training_mode()) {
if (menu.HITBOX_VIS && is_training_mode()) {
Vector3f color = ID_COLORS[(id.raw + 3) % 8];
generate_hitbox_effects(&l2c_agent, &joint, &size, &x, &y, &z, &x2, &y2, &z2, &color);
}

View file

@ -66,8 +66,15 @@ void __attribute__((weak)) NORETURN __libnx_exit(int rc) {
extern int sprintf(char* s, const char* format, ...) LINKABLE;
int sprintf_intercept(char* s, const char* format, ...) {
if (strcmp(format, "Ver. %d.%d.%d") == 0 || strcmp(format, "Salty v%d%d%d") == 0)
format = "Training Mods v1.4";
if (strcmp(format, "Ver. %d.%d.%d") == 0 || strcmp(format, "Salty v%d%d%d") == 0) {
va_list vl;
va_start(vl, format);
major = va_arg(vl, int);
minor = va_arg(vl, int);
patch = va_arg(vl, int);
va_end(vl);
return vsprintf(s, "Training Mods v1.5", vl);
}
va_list vl;
va_start(vl,format);
@ -101,6 +108,14 @@ int main(int argc, char* argv[]) {
// Add function replacements here
hitbox_vis_main();
training_mods_main();
FILE* f = SaltySDCore_fopen("sdmc:/SaltySD/training_modpack.log", "w");
if (f) {
SaltySD_printf("Writing training_modpack.log...\n");
char buffer[20];
snprintf(buffer, 20, "%lx", (u64)&menu);
SaltySDCore_fwrite(buffer, strlen(buffer), 1, f);
SaltySDCore_fclose(f);
}
__libnx_exit(0);
}

View file

@ -1,22 +1,20 @@
#ifndef TAUNT_TOGGLES_H
#define TAUNT_TOGGLES_H
u64 is_training_mode(void) asm("_ZN3app9smashball16is_training_modeEv") LINKABLE;
#define NONE 0
// Up Taunt
bool HITBOX_VIS = 1;
// Side Taunt
// DI
float DI_stick_x = 0;
float DI_stick_y = 0;
/*
0, 0.785398, 1.570796, 2.356194, -3.14159, -2.356194, -1.570796, -0.785398
0, pi/4, pi/2, 3pi/4, pi, 5pi/4, 3pi/2, 7pi/4
*/
/* DI */
int DI_STATE = NONE;
#define SET_DI 1
#define DI_RANDOM_IN_AWAY 2
#define NUM_DI_STATES 3
#define DI_RANDOM_IN_AWAY 9
const char* di_items[] = { "None", "Away", "Up Away", "Up", "Up In", "In", "Down In", "Down", "Down In", "Random In/Away"};
// Attack Option
#define MASH_NAIR 0
@ -28,9 +26,7 @@ int DI_STATE = NONE;
#define MASH_SIDE_B 6
#define MASH_UP_B 7
#define MASH_DOWN_B 8
int ATTACK_STATE = MASH_NAIR;
#define NUM_ATTACK_STATES 9
const char* attack_items[] = { "Neutral Air", "Forward Air", "Back Air", "Up Air", "Down Air", "Neutral B", "Side B", "Up B", "Down B" };
// Ledge Option
#define RANDOM_LEDGE 1
@ -38,44 +34,45 @@ int ATTACK_STATE = MASH_NAIR;
#define ROLL_LEDGE 3
#define JUMP_LEDGE 4
#define ATTACK_LEDGE 5
int LEDGE_STATE = RANDOM_LEDGE;
#define NUM_LEDGE_STATES 6
const char* ledge_items[] = { "None", "Random", "Neutral Getup", "Roll", "Jump", "Attack" };
// Tech Option
#define RANDOM_TECH 1
#define TECH_IN_PLACE 2
#define TECH_ROLL 3
#define TECH_MISS 4
int TECH_STATE = RANDOM_TECH;
#define NUM_TECH_STATES 5
// Down Taunt
#define MASH_TOGGLES 0
#define ESCAPE_TOGGLES 1
#define SHIELD_TOGGLES 2
int TOGGLE_STATE = MASH_TOGGLES;
#define NUM_TOGGLE_STATES 3
const char* tech_items[] = { "None", "Random", "In-Place", "Roll", "Miss Tech" };
// Mash States
#define MASH_AIRDODGE 1
#define MASH_JUMP 2
#define MASH_ATTACK 3
#define MASH_RANDOM 4
int MASH_STATE = NONE;
#define NUM_MASH_STATES 5
// Escape States
#define ESCAPE_LEDGE 1
#define ESCAPE_TECH 2
int ESCAPE_STATE = ESCAPE_LEDGE;
#define NUM_ESCAPE_STATES 3
const char* mash_items[] = { "None", "Airdodge", "Jump", "Attack", "Random" };
// Shield States
#define SHIELD_INFINITE 1
#define SHIELD_HOLD 2
int SHIELD_STATE = NONE;
#define NUM_SHIELD_STATES 3
const char* shield_items[] = { "None", "Infinite", "Hold" };
// Defensive States
#define RANDOM_DEFENSIVE 1
#define DEFENSIVE_SHIELD 2
#define DEFENSIVE_SPOTDODGE 3
#define DEFENSIVE_JAB 4
const char* defensive_items[] = { "None", "Random", "Flash Shield", "Spotdodge", "Jab" };
struct TrainingModpackMenu {
bool HITBOX_VIS = 1;
int DI_STATE = NONE;
int ATTACK_STATE = MASH_NAIR;
int LEDGE_STATE = RANDOM_LEDGE;
int TECH_STATE = RANDOM_TECH;
int MASH_STATE = NONE;
int SHIELD_STATE = NONE;
int DEFENSIVE_STATE = RANDOM_DEFENSIVE;
char print_buffer[256];
u64 print_buffer_len = 0;
} menu;
#endif // TAUNT_TOGGLES_H

View file

@ -3,7 +3,12 @@
#include "useful/const_value_table.h"
#include "../taunt_toggles.h"
using namespace app::lua_bind;
int major, minor, patch;
u64 fighter_manager_addr;
u64 is_training_mode(void) asm("_ZN3app9smashball16is_training_modeEv") LINKABLE;
u8 get_category(u64 module_accessor) {
return (u8)(*(u32*)(module_accessor + 8) >> 28);
@ -29,4 +34,23 @@ bool is_in_landing(u64 module_accessor) {
int status_kind = StatusModule::status_kind(module_accessor);
return status_kind >= FIGHTER_STATUS_KIND_LANDING &&
status_kind <= FIGHTER_STATUS_KIND_LANDING_DAMAGE_LIGHT;
}
void perform_defensive_option(u64 module_accessor) {
if (menu.DEFENSIVE_STATE == RANDOM_DEFENSIVE) {
const int NUM_GROUND_STATUSES = 3;
int random_statuses[NUM_GROUND_STATUSES] = {
FIGHTER_STATUS_KIND_ESCAPE,
FIGHTER_STATUS_KIND_ATTACK,
FIGHTER_STATUS_KIND_GUARD_ON
};
int random_status_index = app::sv_math::rand(hash40("fighter"), NUM_GROUND_STATUSES);
StatusModule::change_status_request_from_script(module_accessor, random_statuses[random_status_index], 1);
} else if (menu.DEFENSIVE_STATE == DEFENSIVE_SHIELD)
StatusModule::change_status_request_from_script(module_accessor, FIGHTER_STATUS_KIND_GUARD_ON, 1);
else if (menu.DEFENSIVE_STATE == DEFENSIVE_SPOTDODGE)
StatusModule::change_status_request_from_script(module_accessor, FIGHTER_STATUS_KIND_ESCAPE, 1);
else if (menu.DEFENSIVE_STATE == DEFENSIVE_JAB)
StatusModule::change_status_request_from_script(module_accessor, FIGHTER_STATUS_KIND_ATTACK, 1);
}

View file

@ -1,30 +1,33 @@
#include "common.hpp"
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
namespace DirectionalInfluence {
float get_float(u64 module_accessor, int var, bool& replace) {
if (var == FIGHTER_STATUS_DAMAGE_WORK_FLOAT_VECOR_CORRECT_STICK_X ||
var == FIGHTER_STATUS_DAMAGE_WORK_FLOAT_VECOR_CORRECT_STICK_Y) {
if (is_training_mode() && is_operation_cpu(module_accessor) &&
is_in_hitstun(module_accessor)) {
if (DI_STATE != NONE) {
float stick_x = 0.0, stick_y = 0.0;
if (DI_STATE == SET_DI) {
stick_x = DI_stick_x;
stick_y = DI_stick_y;
} else if (DI_STATE == DI_RANDOM_IN_AWAY) {
// either 1.0 or -1.0
stick_x = (float)(app::sv_math::rand(hash40("fighter"), 2) * 2.0) - 1;
stick_y = 0.0;
}
if (menu.DI_STATE != NONE) {
float angle = (menu.DI_STATE - 1) * M_PI / 4.0;
// Either 0 (right) or PI (left)
if (menu.DI_STATE == DI_RANDOM_IN_AWAY) {
angle = app::sv_math::rand(hash40("fighter"), 2) * M_PI;
}
// If facing left, reverse angle
if (PostureModule::lr(module_accessor) != -1.0) angle -= M_PI;
// If facing left, reverse stick x
if (var == FIGHTER_STATUS_DAMAGE_WORK_FLOAT_VECOR_CORRECT_STICK_X) {
replace = true;
return stick_x * -1 * PostureModule::lr(module_accessor);
return cos(angle);
}
if (var == FIGHTER_STATUS_DAMAGE_WORK_FLOAT_VECOR_CORRECT_STICK_Y) {
replace = true;
return stick_y;
return sin(angle);
}
}
}

View file

@ -13,10 +13,10 @@ void force_option(u64 module_accessor) {
if (frame == random_frame || frame > 30.0) {
int status = 0;
int ledge_case = LEDGE_STATE - 1;
int ledge_case = menu.LEDGE_STATE;
if (LEDGE_STATE == RANDOM_LEDGE)
ledge_case = app::sv_math::rand(hash40("fighter"), 4) + 1;
if (menu.LEDGE_STATE == RANDOM_LEDGE)
ledge_case = app::sv_math::rand(hash40("fighter"), 4) + 2;
switch (ledge_case) {
case NEUTRAL_LEDGE:
@ -37,6 +37,7 @@ void force_option(u64 module_accessor) {
void defensive_option(u64 module_accessor, int category, int& flag) {
int status = StatusModule::status_kind(module_accessor);
int prev_status = StatusModule::prev_status_kind(module_accessor, 0);
if (status == FIGHTER_STATUS_KIND_CLIFF_JUMP3 ||
status == FIGHTER_STATUS_KIND_CLIFF_JUMP2 ||
status == FIGHTER_STATUS_KIND_CLIFF_JUMP1) {
@ -45,22 +46,18 @@ void defensive_option(u64 module_accessor, int category, int& flag) {
if ((status == FIGHTER_STATUS_KIND_CLIFF_CLIMB ||
status == FIGHTER_STATUS_KIND_CLIFF_ATTACK ||
status == FIGHTER_STATUS_KIND_CLIFF_ESCAPE) &&
WorkModule::is_enable_transition_term(module_accessor, FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ESCAPE)) {
const int NUM_GROUND_STATUSES = 3;
int random_statuses[NUM_GROUND_STATUSES] = {
FIGHTER_STATUS_KIND_ESCAPE,
FIGHTER_STATUS_KIND_ATTACK,
FIGHTER_STATUS_KIND_GUARD_ON
};
int random_status_index = app::sv_math::rand(hash40("fighter"), NUM_GROUND_STATUSES);
StatusModule::change_status_request_from_script(module_accessor, random_statuses[random_status_index], 1);
status == FIGHTER_STATUS_KIND_CLIFF_ESCAPE ||
prev_status == FIGHTER_STATUS_KIND_CLIFF_CLIMB ||
prev_status == FIGHTER_STATUS_KIND_CLIFF_ATTACK ||
prev_status == FIGHTER_STATUS_KIND_CLIFF_ESCAPE) &&
(WorkModule::is_enable_transition_term(module_accessor, FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ESCAPE) ||
CancelModule::is_enable_cancel(module_accessor))) {
perform_defensive_option(module_accessor);
}
}
void get_command_flag_cat(u64 module_accessor, int category, int& flag) {
if (LEDGE_STATE != NONE && is_training_mode() && is_operation_cpu(module_accessor)) {
if (menu.LEDGE_STATE != NONE && is_training_mode() && is_operation_cpu(module_accessor)) {
force_option(module_accessor);
defensive_option(module_accessor, category, flag);
}

View file

@ -4,9 +4,9 @@ namespace Mash {
int get_attack_air_kind(u64 module_accessor, bool& replace) {
int kind = 0;
if (is_training_mode() && is_operation_cpu(module_accessor)) {
if (MASH_STATE == MASH_ATTACK) {
if (menu.MASH_STATE == MASH_ATTACK) {
replace = true;
switch (ATTACK_STATE) {
switch (menu.ATTACK_STATE) {
case MASH_NAIR:
kind = FIGHTER_COMMAND_ATTACK_AIR_KIND_N; break;
case MASH_FAIR:
@ -21,7 +21,7 @@ int get_attack_air_kind(u64 module_accessor, bool& replace) {
return kind;
}
if (MASH_STATE == MASH_RANDOM) {
if (menu.MASH_STATE == MASH_RANDOM) {
replace = true;
return app::sv_math::rand(hash40("fighter"), 5) + 1;
}
@ -35,17 +35,17 @@ void get_command_flag_cat(u64 module_accessor, int category, int& flag) {
if (is_training_mode() && is_operation_cpu(module_accessor)) {
if (is_in_hitstun(module_accessor) || is_in_landing(module_accessor)) {
if (MASH_STATE == MASH_AIRDODGE)
if (menu.MASH_STATE == MASH_AIRDODGE)
if (category == FIGHTER_PAD_COMMAND_CATEGORY1)
flag |= FIGHTER_PAD_CMD_CAT1_FLAG_AIR_ESCAPE;
if (MASH_STATE == MASH_JUMP)
if (menu.MASH_STATE == MASH_JUMP && !is_in_landing(module_accessor))
if (category == FIGHTER_PAD_COMMAND_CATEGORY1)
flag |= FIGHTER_PAD_CMD_CAT1_FLAG_JUMP_BUTTON;
if (MASH_STATE == MASH_ATTACK)
if (menu.MASH_STATE == MASH_ATTACK)
if (category == FIGHTER_PAD_COMMAND_CATEGORY1) {
switch (ATTACK_STATE) {
switch (menu.ATTACK_STATE) {
case MASH_NAIR:
case MASH_FAIR:
case MASH_BAIR:
@ -68,7 +68,7 @@ void get_command_flag_cat(u64 module_accessor, int category, int& flag) {
}
}
if (MASH_STATE == MASH_RANDOM)
if (menu.MASH_STATE == MASH_RANDOM)
if (category == FIGHTER_PAD_COMMAND_CATEGORY1) {
int situation_kind =
StatusModule::situation_kind(module_accessor);
@ -128,7 +128,7 @@ void get_command_flag_cat(u64 module_accessor, int category, int& flag) {
bool check_button_on(u64 module_accessor, int button, bool& replace) {
if (button == CONTROL_PAD_BUTTON_GUARD_HOLD || button == CONTROL_PAD_BUTTON_GUARD) {
if (is_training_mode() && is_operation_cpu(module_accessor)) {
if (MASH_STATE == MASH_AIRDODGE && (is_in_hitstun(module_accessor) || is_in_landing(module_accessor))) {
if (menu.MASH_STATE == MASH_AIRDODGE && (is_in_hitstun(module_accessor) || is_in_landing(module_accessor))) {
replace = true;
return true;
}

View file

@ -1,143 +0,0 @@
#include "common.hpp"
extern int vsnprintf(char* s, size_t maxlen, const char* format, va_list arg) LINKABLE;
int vsnprintf_intercept(char* s, size_t maxlen, const char* format, va_list arg) {
if (strcmp(format, "mel_training_help_shift0") == 0) {
TOGGLE_STATE = MASH_TOGGLES;
switch (MASH_STATE) {
case NONE:
format = "mel_shortmsg_1"; break;
case MASH_AIRDODGE:
format = "mel_shortmsg_2"; break;
case MASH_JUMP:
format = "mel_shortmsg_3"; break;
case MASH_RANDOM:
format = "mel_shortmsg_4"; break;
case MASH_ATTACK:
format = "mel_shortmsg_5"; break;
}
} else if (strcmp(format, "mel_training_help_shift1") == 0) {
TOGGLE_STATE = ESCAPE_TOGGLES;
switch (ESCAPE_STATE) {
case NONE:
format = "mel_shortmsg_6"; break;
case ESCAPE_LEDGE:
format = "mel_shortmsg_7"; break;
case ESCAPE_TECH:
format = "mel_shortmsg_8"; break;
}
} else if (strcmp(format, "mel_training_help_shift2") == 0) {
TOGGLE_STATE = SHIELD_TOGGLES;
switch (SHIELD_STATE) {
case NONE:
format = "mel_shortmsg_9"; break;
case SHIELD_INFINITE:
format = "mel_shortmsg_10"; break;
case SHIELD_HOLD:
format = "mel_shortmsg_11"; break;
}
}
// For Shulk
if (strcmp(format, "mel_info_fighter_shulk_special_00") == 0)
format = "mel_shortmsg_101"; // SMASH
else if (strcmp(format, "mel_info_fighter_shulk_special_03") == 0)
format = "mel_shortmsg_102"; // SPEED
else if (strcmp(format, "mel_info_fighter_shulk_special_02") == 0)
format = "mel_shortmsg_103"; // SHIELD
if (strcmp(format, "mel_training_shift0") == 0)
format = "mel_info_fighter_shulk_special_00"; // SMASH
else if (strcmp(format, "mel_training_shift1") == 0)
format = "mel_info_fighter_shulk_special_03"; // SPEED
else if (strcmp(format, "mel_training_shift2") == 0)
format = "mel_info_fighter_shulk_special_02"; // SHIELD
return vsnprintf(s, maxlen, format, arg);
}
namespace Selection {
void menu_replace() {
SaltySDCore_ReplaceImport("vsnprintf", (void*)vsnprintf_intercept);
}
void clear_command(u64 module_accessor, u64 motion_kind) {
if (motion_kind == hash40("appeal_lw_l") || motion_kind == hash40("appeal_lw_r")) {
if (is_training_mode()) {
if (TOGGLE_STATE == MASH_TOGGLES) {
MASH_STATE = (MASH_STATE + 1) % NUM_MASH_STATES;
const char* toggle_strings[NUM_MASH_STATES] =
{"NONE", "AIRDODGE", "JUMP", "ATTACK", "RANDOM"};
print_string(module_accessor, toggle_strings[MASH_STATE]);
}
if (TOGGLE_STATE == ESCAPE_TOGGLES) {
ESCAPE_STATE = (ESCAPE_STATE + 1) % NUM_ESCAPE_STATES;
const char* toggle_strings[NUM_ESCAPE_STATES] =
{"NONE", "LEDGE", "TECH"};
print_string(module_accessor, toggle_strings[ESCAPE_STATE]);
}
if (TOGGLE_STATE == SHIELD_TOGGLES) {
SHIELD_STATE = (SHIELD_STATE + 1) % NUM_SHIELD_STATES;
const char* toggle_strings[NUM_SHIELD_STATES] =
{"NONE", "INFINITE", "HOLD"};
print_string(module_accessor, toggle_strings[SHIELD_STATE]);
}
}
} else if (motion_kind == hash40("appeal_s_l") || motion_kind == hash40("appeal_s_r")) {
if (is_training_mode()) {
if (TOGGLE_STATE == ESCAPE_TOGGLES &&
ESCAPE_STATE == ESCAPE_LEDGE) {
LEDGE_STATE = (LEDGE_STATE + 1) % NUM_LEDGE_STATES;
const char* LEDGE_strings[NUM_LEDGE_STATES] =
{"NONE", "RANDOM", "NORMAL", "ROLL", "JUMP", "ATTACK"};
print_string(module_accessor, LEDGE_strings[LEDGE_STATE]);
} else if (TOGGLE_STATE == ESCAPE_TOGGLES &&
ESCAPE_STATE == ESCAPE_TECH) {
TECH_STATE = (TECH_STATE + 1) % NUM_TECH_STATES;
const char* TECH_strings[NUM_TECH_STATES] =
{"NONE", "RANDOM", "IN PLACE", "ROLL", "MISS TECH"};
print_string(module_accessor, TECH_strings[TECH_STATE]);
} else if (MASH_STATE == MASH_ATTACK) {
ATTACK_STATE = (ATTACK_STATE + 1) % NUM_ATTACK_STATES;
const char* ATTACK_strings[NUM_ATTACK_STATES] =
{"NAIR", "FAIR", "BAIR", "UPAIR", "DAIR",
"NEUTRAL B", "SIDE B", "UP B", "DOWN B"};
print_string(module_accessor,
ATTACK_strings[ATTACK_STATE]);
} else {
if (ControlModule::check_button_on(module_accessor, CONTROL_PAD_BUTTON_APPEAL_S_L)) {
DI_STATE = DI_STATE == NONE ? DI_RANDOM_IN_AWAY : NONE;
} else {
DI_STATE = DI_STATE == NONE ? SET_DI : NONE;
}
const char* DI_strings[NUM_DI_STATES] =
{"NONE", "SET_DI", "RANDOM\nIN AWAY"};
print_string(module_accessor, DI_strings[DI_STATE]);
if (DI_STATE == SET_DI) {
DI_stick_x = ControlModule::get_stick_x(module_accessor);
DI_stick_y = ControlModule::get_stick_y(module_accessor);
}
}
}
} else if (motion_kind == hash40("appeal_hi_l") || motion_kind == hash40("appeal_hi_r")) {
if (is_training_mode()) {
HITBOX_VIS = !HITBOX_VIS;
if (HITBOX_VIS)
print_string(module_accessor, "HITBOX\nVIS");
else
print_string(module_accessor, "NO\nHITBOX");
}
}
}
}

View file

@ -4,7 +4,7 @@
namespace Shield {
float get_param_float(u64 module_accessor, u64 param_type, u64 param_hash, bool& replace) {
if (is_training_mode()) {
if (SHIELD_STATE == SHIELD_INFINITE) {
if (menu.SHIELD_STATE == SHIELD_INFINITE) {
if (param_type == hash40("common")) {
if (param_hash == hash40("shield_dec1")) {
replace = true;
@ -30,7 +30,7 @@ float get_param_float(u64 module_accessor, u64 param_type, u64 param_hash, bool&
bool check_button_on(u64 module_accessor, int button, bool& replace) {
if (button == CONTROL_PAD_BUTTON_GUARD_HOLD || button == CONTROL_PAD_BUTTON_GUARD) {
if (is_training_mode() && is_operation_cpu(module_accessor)) {
if (SHIELD_STATE == SHIELD_HOLD || SHIELD_STATE == SHIELD_INFINITE) {
if (menu.SHIELD_STATE == SHIELD_HOLD || menu.SHIELD_STATE == SHIELD_INFINITE) {
replace = true;
return true;
}
@ -44,7 +44,7 @@ bool check_button_on(u64 module_accessor, int button, bool& replace) {
bool check_button_off(u64 module_accessor, int button, bool& replace) {
if (button == CONTROL_PAD_BUTTON_GUARD_HOLD || button == CONTROL_PAD_BUTTON_GUARD) {
if (is_training_mode() && is_operation_cpu(module_accessor)) {
if (SHIELD_STATE == SHIELD_HOLD || SHIELD_STATE == SHIELD_INFINITE) {
if (menu.SHIELD_STATE == SHIELD_HOLD || menu.SHIELD_STATE == SHIELD_INFINITE) {
replace = true;
return false;
}

View file

@ -4,7 +4,7 @@ namespace Tech {
void init_settings(u64 module_accessor, int status_kind, bool& replace) {
if (is_training_mode() && is_operation_cpu(module_accessor)) {
if (status_kind == FIGHTER_STATUS_KIND_DOWN) {
if (TECH_STATE == RANDOM_TECH) {
if (menu.TECH_STATE == RANDOM_TECH) {
const int NUM_TECH_STATUSES = 3;
int random_statuses[NUM_TECH_STATUSES] = {
FIGHTER_STATUS_KIND_DOWN,
@ -18,11 +18,11 @@ void init_settings(u64 module_accessor, int status_kind, bool& replace) {
replace = true;
return;
}
} else if (TECH_STATE == TECH_IN_PLACE) {
} else if (menu.TECH_STATE == TECH_IN_PLACE) {
StatusModule::change_status_request_from_script(module_accessor, FIGHTER_STATUS_KIND_PASSIVE, 1);
replace = true;
return;
} else if (TECH_STATE == TECH_ROLL) {
} else if (menu.TECH_STATE == TECH_ROLL) {
StatusModule::change_status_request_from_script(module_accessor, FIGHTER_STATUS_KIND_PASSIVE_FB, 1);
replace = true;
return;
@ -47,7 +47,7 @@ void init_settings(u64 module_accessor, int status_kind, bool& replace) {
}
void get_command_flag_cat(u64 module_accessor, int category, int& flag) {
if (TECH_STATE != NONE && is_training_mode() && is_operation_cpu(module_accessor)) {
if (menu.TECH_STATE != NONE && is_training_mode() && is_operation_cpu(module_accessor)) {
int prev_status = StatusModule::prev_status_kind(module_accessor, 0);
int status = StatusModule::status_kind(module_accessor);
if (status == FIGHTER_STATUS_KIND_DOWN_WAIT || status == FIGHTER_STATUS_KIND_DOWN_WAIT_CONTINUE) {
@ -69,16 +69,9 @@ void get_command_flag_cat(u64 module_accessor, int category, int& flag) {
status == FIGHTER_STATUS_KIND_DOWN_STAND ||
status == FIGHTER_STATUS_KIND_DOWN_STAND_FB ||
status == FIGHTER_STATUS_KIND_DOWN_STAND_ATTACK) &&
WorkModule::is_enable_transition_term(module_accessor, FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_GUARD_ON)) {
const int NUM_GROUND_STATUSES = 3;
int random_statuses[NUM_GROUND_STATUSES] = {
FIGHTER_STATUS_KIND_ESCAPE,
FIGHTER_STATUS_KIND_ATTACK,
FIGHTER_STATUS_KIND_GUARD_ON
};
int random_status_index = app::sv_math::rand(hash40("fighter"), NUM_GROUND_STATUSES);
StatusModule::change_status_request_from_script(module_accessor, random_statuses[random_status_index], 1);
(WorkModule::is_enable_transition_term(module_accessor, FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_GUARD_ON) ||
CancelModule::is_enable_cancel(module_accessor))) {
perform_defensive_option(module_accessor);
}
}
}

View file

@ -19,7 +19,6 @@
#include "training/directional_influence.hpp"
#include "training/ledge.hpp"
#include "training/mash.hpp"
#include "training/selection.hpp"
#include "training/shield.hpp"
#include "training/tech.h"
#include "training/input_recorder.hpp"
@ -77,7 +76,7 @@ int get_command_flag_cat_replace(u64 module_accessor, int category) {
int status_kind = StatusModule::status_kind(module_accessor);
MotionAnimcmdModule::set_sleep_effect(module_accessor,
is_training_mode() &&
HITBOX_VIS &&
menu.HITBOX_VIS &&
!(status_kind >= FIGHTER_STATUS_KIND_CATCH && status_kind <= FIGHTER_STATUS_KIND_TREAD_FALL));
u64 control_module = load_module(module_accessor, 0x48);
@ -152,16 +151,6 @@ bool check_button_off_replace(u64 module_accessor, int button) {
bool (*check_button_off)(u64, int) = (bool (*)(u64, int)) load_module_impl(control_module, 0x268);
return check_button_off(control_module, button);
}
void clear_command_replace(u64 module_accessor, bool unk1) {
Selection::clear_command(module_accessor, MotionModule::motion_kind(module_accessor));
u64 control_module = load_module(module_accessor, 0x48);
void (*clear_command)(u64, bool) =
(void (*)(u64, bool)) load_module_impl(control_module, 0x358);
clear_command(control_module, unk1);
}
} // namespace ControlModule
namespace StatusModule {
@ -177,15 +166,33 @@ void init_settings_replace(u64 module_accessor, int situationKind, int unk1, uin
init_settings(status_module, situationKind, unk1, unk2, groundCliffCheckKind, unk3, unk4, unk5, unk6, unk7);
}
} // namespace StatusModule
namespace MotionModule {
u64 change_motion_replace(u64 module_accessor, u64 motion_kind, float unk1, float unk2, bool unk3, float unk4, bool unk5, bool unk6) {
if (menu.TECH_STATE != NONE && is_training_mode() && is_operation_cpu(module_accessor)) {
if (motion_kind == hash40("passive_stand_f") || motion_kind == hash40("passive_stand_b")) {
int rand_int = app::sv_math::rand(hash40("fighter"), 2);
if (rand_int) motion_kind = hash40("passive_stand_f");
else motion_kind = hash40("passive_stand_b");
}
}
u64 motion_module = load_module(module_accessor, 0x88);
u64 change_motion_offset = 0;
if (major < 4) change_motion_offset = 0xD8;
else change_motion_offset = 0xE0;
u64 (*change_motion)(u64,u64,float,float,bool,float,bool,bool) =
(u64 (*)(u64,u64,float,float,bool,float,bool,bool)) load_module_impl(motion_module, change_motion_offset);
return change_motion(motion_module, motion_kind, unk1, unk2, unk3, unk4, unk5, unk6);
}
} // namespace MotionModule
} // namespace app::lua_bind
void training_mods_main() {
fighter_manager_addr = SaltySDCore_FindSymbol(
"_ZN3lib9SingletonIN3app14FighterManagerEE9instance_E");
// Taunt toggles
SaltySD_function_replace_sym(
"_ZN3app8lua_bind33ControlModule__clear_command_implEPNS_26BattleObjectModuleAccessorEb",
(u64)&ControlModule::clear_command_replace);
// Mash airdodge/jump
SaltySD_function_replace_sym_check_prev(
@ -226,8 +233,9 @@ void training_mods_main() {
SaltySD_function_replace_sym(
"_ZN3app8lua_bind32StatusModule__init_settings_implEPNS_26BattleObjectModuleAccessorENS_13SituationKindEijNS_20GroundCliffCheckKindEbiiii",
(u64)&StatusModule::init_settings_replace);
Selection::menu_replace();
SaltySD_function_replace_sym(
"_ZN3app8lua_bind32MotionModule__change_motion_implEPNS_26BattleObjectModuleAccessorEN3phx6Hash40Effbfbb",
(u64)&MotionModule::change_motion_replace);
}
#endif // TRAINING_MODS_H