diff --git a/autogen/lua_definitions/constants.lua b/autogen/lua_definitions/constants.lua index 94b734983..67c3e813a 100644 --- a/autogen/lua_definitions/constants.lua +++ b/autogen/lua_definitions/constants.lua @@ -3675,6 +3675,15 @@ INT_SUBTYPE_STAR_DOOR = 0x00000020 --- @type integer INT_SUBTYPE_TWIRL_BOUNCE = 0x00000080 +--- @type integer +PVP_ATTACK_KNOCKBACK_TIMER_DEFAULT = 10 + +--- @type integer +PVP_ATTACK_KNOCKBACK_TIMER_OVERRIDE = 9 + +--- @type integer +PVP_ATTACK_OVERRIDE_VANILLA_INVINCIBILITY = 0x0000FFFF + --- @class InteractionFlag --- @type InteractionFlag diff --git a/docs/lua/constants.md b/docs/lua/constants.md index ff544ae31..092200291 100644 --- a/docs/lua/constants.md +++ b/docs/lua/constants.md @@ -1295,6 +1295,9 @@ - INT_SUBTYPE_SIGN - INT_SUBTYPE_STAR_DOOR - INT_SUBTYPE_TWIRL_BOUNCE +- PVP_ATTACK_KNOCKBACK_TIMER_DEFAULT +- PVP_ATTACK_KNOCKBACK_TIMER_OVERRIDE +- PVP_ATTACK_OVERRIDE_VANILLA_INVINCIBILITY ### [enum InteractionFlag](#InteractionFlag) | Identifier | Value | diff --git a/src/game/interaction.c b/src/game/interaction.c index ed07028be..d69f42924 100644 --- a/src/game/interaction.c +++ b/src/game/interaction.c @@ -692,7 +692,7 @@ u32 determine_knockback_action(struct MarioState *m, UNUSED s32 arg) { m->vel[2] = -mag * coss(m->interactObj->oFaceAngleYaw); m->slideVelX = m->vel[0]; m->slideVelZ = m->vel[2]; - m->knockbackTimer = hasBeenPunched ? 9 : PVP_ATTACK_KNOCKBACK_TIMER_MAX; + m->knockbackTimer = hasBeenPunched ? PVP_ATTACK_KNOCKBACK_TIMER_OVERRIDE : PVP_ATTACK_KNOCKBACK_TIMER_DEFAULT; m->faceAngle[1] = m->interactObj->oFaceAngleYaw + (sign == 1.0f ? 0 : 0x8000); } @@ -827,7 +827,7 @@ u32 take_damage_and_knock_back(struct MarioState *m, struct Object *o) { update_mario_sound_and_camera(m); u32 action = determine_knockback_action(m, o->oDamageOrCoinValue); - return drop_and_set_mario_action(m, action, (m->knockbackTimer == PVP_ATTACK_KNOCKBACK_TIMER_MAX) ? damage : 0); + return drop_and_set_mario_action(m, action, (m->knockbackTimer == PVP_ATTACK_KNOCKBACK_TIMER_DEFAULT) ? damage : PVP_ATTACK_OVERRIDE_VANILLA_INVINCIBILITY); } return FALSE; @@ -1450,8 +1450,8 @@ u32 interact_player_pvp(struct MarioState* attacker, struct MarioState* victim) // determine if slide attack should be ignored if ((interaction & INT_ATTACK_SLIDE) || player_is_sliding(cVictim)) { // determine the difference in velocities - Vec3f velDiff; - vec3f_dif(velDiff, attacker->vel, cVictim->vel); + //Vec3f velDiff; + //vec3f_dif(velDiff, attacker->vel, cVictim->vel); if (attacker->action == ACT_SLIDE_KICK_SLIDE || attacker->action == ACT_SLIDE_KICK) { // if the difference vectors are not different enough, do not attack diff --git a/src/game/interaction.h b/src/game/interaction.h index 63ac74bf8..2c70d63b5 100644 --- a/src/game/interaction.h +++ b/src/game/interaction.h @@ -99,7 +99,9 @@ enum InteractionFlag { #define ATTACK_FAST_ATTACK 5 #define ATTACK_FROM_BELOW 6 -#define PVP_ATTACK_KNOCKBACK_TIMER_MAX 10 +#define PVP_ATTACK_KNOCKBACK_TIMER_DEFAULT 10 +#define PVP_ATTACK_KNOCKBACK_TIMER_OVERRIDE 9 +#define PVP_ATTACK_OVERRIDE_VANILLA_INVINCIBILITY 0x0000FFFF #define INT_STATUS_ATTACK_MASK 0x000000FF diff --git a/src/game/mario_actions_airborne.c b/src/game/mario_actions_airborne.c index b0087a200..229784b2c 100644 --- a/src/game/mario_actions_airborne.c +++ b/src/game/mario_actions_airborne.c @@ -1161,7 +1161,7 @@ u32 common_air_knockback_step(struct MarioState *m, u32 landAction, u32 hardFall mario_set_forward_vel(m, speed); } } else { - m->knockbackTimer = PVP_ATTACK_KNOCKBACK_TIMER_MAX; + m->knockbackTimer = PVP_ATTACK_KNOCKBACK_TIMER_DEFAULT; } stepResult = perform_air_step(m, 0); diff --git a/src/game/mario_actions_moving.c b/src/game/mario_actions_moving.c index 40fbfc650..129299914 100644 --- a/src/game/mario_actions_moving.c +++ b/src/game/mario_actions_moving.c @@ -1679,7 +1679,7 @@ s32 common_ground_knockback_action(struct MarioState *m, s32 animation, s32 arg2 } } } else { - m->knockbackTimer = PVP_ATTACK_KNOCKBACK_TIMER_MAX; + m->knockbackTimer = PVP_ATTACK_KNOCKBACK_TIMER_DEFAULT; } animFrame = set_character_animation(m, animation); @@ -1701,7 +1701,9 @@ s32 common_ground_knockback_action(struct MarioState *m, s32 animation, s32 arg2 if (m->health < 0x100) { set_mario_action(m, ACT_STANDING_DEATH, 0); } else { - if (arg4 > 0) { + if (arg4 == PVP_ATTACK_OVERRIDE_VANILLA_INVINCIBILITY) { // Make being punched have reduced invincibility frames + m->invincTimer = 12; + } else if (arg4 > 0) { m->invincTimer = 30; } set_mario_action(m, ACT_IDLE, 0); diff --git a/src/pc/lua/smlua_constants_autogen.c b/src/pc/lua/smlua_constants_autogen.c index e52b244d2..a7ee1bb32 100644 --- a/src/pc/lua/smlua_constants_autogen.c +++ b/src/pc/lua/smlua_constants_autogen.c @@ -1444,6 +1444,9 @@ char gSmluaConstants[] = "" "ATTACK_GROUND_POUND_OR_TWIRL = 4\n" "ATTACK_FAST_ATTACK = 5\n" "ATTACK_FROM_BELOW = 6\n" +"PVP_ATTACK_KNOCKBACK_TIMER_DEFAULT = 10\n" +"PVP_ATTACK_KNOCKBACK_TIMER_OVERRIDE = 9\n" +"PVP_ATTACK_OVERRIDE_VANILLA_INVINCIBILITY = 0x0000FFFF\n" "INT_STATUS_ATTACK_MASK = 0x000000FF\n" "INT_STATUS_HOOT_GRABBED_BY_MARIO = (1 << 0)\n" "INT_STATUS_MARIO_UNK1 = (1 << 1)\n"