From de8c77103274e763ce12b36ce54129e4544d11a2 Mon Sep 17 00:00:00 2001 From: Saxashitter Date: Sat, 18 Apr 2026 13:52:24 -0400 Subject: [PATCH 01/17] FANG: Remove lockon --- BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua b/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua index 0103764..b6cda0d 100644 --- a/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua +++ b/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua @@ -103,12 +103,13 @@ local function newGunslinger(player) -- Same code as vanilla, but without the clause for speed. -- You naturally lose your speed via friction. -- v10 EDIT: Now Fang automatically looks towards lockons + -- v10 EDIT: KILL ALL LOCKONS - local lockon = B.NewGunLook(player) + --[[local lockon = B.NewGunLook(player) if (lockon and lockon.valid) player.drawangle = R_PointToAngle2(mo.x, mo.y, lockon.x, lockon.y) P_SpawnLockOn(player, lockon, mobjinfo[MT_LOCKON].spawnstate) - end + end]] //Trigger firing action if (player.cmd.buttons & BT_SPIN) -- and not (player.gunheld) @@ -126,7 +127,7 @@ local function newGunslinger(player) P_StartQuake(4*FRACUNIT,1) end - if (lockon and lockon.valid) + --[[if (lockon and lockon.valid) mo.angle = R_PointToAngle2(mo.x, mo.y, lockon.x, lockon.y) bullet = P_SpawnPointMissile( mo, @@ -135,7 +136,7 @@ local function newGunslinger(player) mo.x, mo.y, zpos(mo, player.revitem) ) - else + else]] bullet = P_SpawnPointMissile( mo, mo.x + P_ReturnThrustX(nil, mo.angle, FRACUNIT), @@ -150,7 +151,7 @@ local function newGunslinger(player) bullet.momx = $1 / 2 bullet.momy = $1 / 2 end - end + --end -- player.gunheld = true player.drawangle = mo.angle //Air function From 5bd889bab49adb19bbb132728d0352c24dff304d Mon Sep 17 00:00:00 2001 From: Saxashitter Date: Sat, 18 Apr 2026 13:58:01 -0400 Subject: [PATCH 02/17] FANG: Modify bullet properties (No Gravity, Bullet scales with speed) --- BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua b/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua index b6cda0d..b05ae59 100644 --- a/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua +++ b/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua @@ -147,9 +147,10 @@ local function newGunslinger(player) ) if (bullet and bullet.valid) - bullet.flags = $1 & ~MF_NOGRAVITY - bullet.momx = $1 / 2 - bullet.momy = $1 / 2 + -- bullet.flags = $1 & ~MF_NOGRAVITY + local speed = max(FixedHypot(bullet.momx, bullet.momy), FixedHypot(mo.momx - player.cmomx, mo.momy - player.cmomy)) + bullet.momx = P_ReturnThrustX(nil, mo.angle, speed) + bullet.momy = P_ReturnThrustY(nil, mo.angle, speed) end --end -- player.gunheld = true From 740da590e2f0722cc56990ec334d40e8e650b13f Mon Sep 17 00:00:00 2001 From: Saxashitter Date: Sat, 18 Apr 2026 15:37:40 -0400 Subject: [PATCH 03/17] FANG: Hold spin to lock-on to players. --- .../Lua/3-Functions/3-Player/Lib_Popgun.lua | 59 +++++++++++-------- 1 file changed, 34 insertions(+), 25 deletions(-) diff --git a/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua b/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua index b05ae59..a4093fa 100644 --- a/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua +++ b/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua @@ -103,17 +103,27 @@ local function newGunslinger(player) -- Same code as vanilla, but without the clause for speed. -- You naturally lose your speed via friction. -- v10 EDIT: Now Fang automatically looks towards lockons - -- v10 EDIT: KILL ALL LOCKONS + -- v10 EDIT 2: i gave fang autoaim if he holds lol - --[[local lockon = B.NewGunLook(player) - if (lockon and lockon.valid) - player.drawangle = R_PointToAngle2(mo.x, mo.y, lockon.x, lockon.y) - P_SpawnLockOn(player, lockon, mobjinfo[MT_LOCKON].spawnstate) - end]] + local lockon = nil + + if player.cmd.buttons & BT_SPIN then + player.gunheld = $ + 1 + else + player.gunheld = 0 + end + + if player.gunheld >= 12 then + lockon = B.NewGunLook(player) + + if (lockon and lockon.valid) then + player.drawangle = R_PointToAngle2(mo.x, mo.y, lockon.x, lockon.y) + P_SpawnLockOn(player, lockon, mobjinfo[MT_LOCKON].spawnstate) + end + end //Trigger firing action - if (player.cmd.buttons & BT_SPIN) --- and not (player.gunheld) - and not(player.buttonhistory&BT_SPIN) + if not (player.cmd.buttons & BT_SPIN) + and (player.buttonhistory&BT_SPIN) local bullet = nil mo.state = S_PLAY_FIRE @@ -127,7 +137,7 @@ local function newGunslinger(player) P_StartQuake(4*FRACUNIT,1) end - --[[if (lockon and lockon.valid) + if (lockon and lockon.valid) mo.angle = R_PointToAngle2(mo.x, mo.y, lockon.x, lockon.y) bullet = P_SpawnPointMissile( mo, @@ -135,8 +145,7 @@ local function newGunslinger(player) player.revitem, mo.x, mo.y, zpos(mo, player.revitem) ) - - else]] + else bullet = P_SpawnPointMissile( mo, mo.x + P_ReturnThrustX(nil, mo.angle, FRACUNIT), @@ -145,15 +154,16 @@ local function newGunslinger(player) player.revitem, mo.x, mo.y, zpos(mo, player.revitem) ) + end + + if (bullet and bullet.valid) + -- bullet.flags = $1 & ~MF_NOGRAVITY + local speed = max(26 * mo.scale, FixedHypot(mo.momx - player.cmomx, mo.momy - player.cmomy) * 5 / 4) + + bullet.momx = P_ReturnThrustX(nil, mo.angle, speed) + bullet.momy = P_ReturnThrustY(nil, mo.angle, speed) + end - if (bullet and bullet.valid) - -- bullet.flags = $1 & ~MF_NOGRAVITY - local speed = max(FixedHypot(bullet.momx, bullet.momy), FixedHypot(mo.momx - player.cmomx, mo.momy - player.cmomy)) - bullet.momx = P_ReturnThrustX(nil, mo.angle, speed) - bullet.momy = P_ReturnThrustY(nil, mo.angle, speed) - end - --end --- player.gunheld = true player.drawangle = mo.angle //Air function if not(P_IsObjectOnGround(mo)) @@ -169,6 +179,8 @@ local function newGunslinger(player) P_Thrust(mo,mo.angle+ANGLE_180,mo.scale*3) end end + else + player.gunheld = 0 end //Running and gunning local spd = FixedHypot(player.rmomx,player.rmomy) @@ -227,6 +239,7 @@ end B.CustomGunslinger = function(player) if not(player.mo) return end if not(B.GetSkinVarsFlags(player)&SKINVARS_GUNSLINGER) return end + //Disallow native CA2_GUNSLINGER functionality if player.charability2 == CA2_GUNSLINGER player.charability2 = CA2_NONE @@ -246,11 +259,7 @@ B.CustomGunslinger = function(player) return end //Get inputs if (player.gunheld == nil) - player.gunheld = false - end - - if not (player.cmd.buttons & BT_SPIN) - player.gunheld = false + player.gunheld = 0 end //Do Gunslinger From 2926732dc80a2fbd1212bc4066813e31b837a60e Mon Sep 17 00:00:00 2001 From: Saxashitter Date: Sat, 18 Apr 2026 15:59:07 -0400 Subject: [PATCH 04/17] FANG: Remove cooldown while landing on the ground after shooting in the air. Fix lockon --- .../Lua/3-Functions/3-Player/Lib_Popgun.lua | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua b/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua index a4093fa..6824f5f 100644 --- a/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua +++ b/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua @@ -107,12 +107,6 @@ local function newGunslinger(player) local lockon = nil - if player.cmd.buttons & BT_SPIN then - player.gunheld = $ + 1 - else - player.gunheld = 0 - end - if player.gunheld >= 12 then lockon = B.NewGunLook(player) @@ -121,6 +115,12 @@ local function newGunslinger(player) P_SpawnLockOn(player, lockon, mobjinfo[MT_LOCKON].spawnstate) end end + + if player.cmd.buttons & BT_SPIN then + player.gunheld = $ + 1 + else + player.gunheld = 0 + end //Trigger firing action if not (player.cmd.buttons & BT_SPIN) and (player.buttonhistory&BT_SPIN) @@ -230,8 +230,8 @@ local function newGunslinger(player) if P_IsObjectOnGround(mo) and player.airgun == true player.airgun = false if (player.weapondelay) then - mo.state = S_PLAY_FIRE_FINISH - mo.tics = player.weapondelay + player.weapondelay = 0 + mo.state = S_PLAY_STND end end end From b973d1a260c56aa39675a4dfdec672f83e64ee44 Mon Sep 17 00:00:00 2001 From: Saxashitter Date: Sat, 18 Apr 2026 16:12:28 -0400 Subject: [PATCH 05/17] FANG: ...Honestly, I forgot what I did here. --- BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua b/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua index 6824f5f..0c3576e 100644 --- a/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua +++ b/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua @@ -228,6 +228,7 @@ local function newGunslinger(player) -- end end if P_IsObjectOnGround(mo) and player.airgun == true + print "FANG DEBUG: Landed after shot" player.airgun = false if (player.weapondelay) then player.weapondelay = 0 From ee745e66a1c3c1d710b5d9c502e514675a12c7f2 Mon Sep 17 00:00:00 2001 From: Saxashitter Date: Sat, 18 Apr 2026 16:13:47 -0400 Subject: [PATCH 06/17] FANG: Oh, so that's what I did. (Removed debug print) --- BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua b/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua index 0c3576e..6824f5f 100644 --- a/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua +++ b/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua @@ -228,7 +228,6 @@ local function newGunslinger(player) -- end end if P_IsObjectOnGround(mo) and player.airgun == true - print "FANG DEBUG: Landed after shot" player.airgun = false if (player.weapondelay) then player.weapondelay = 0 From 6d878aa4e465fac7ce2a40c0ca0942d79b4874ac Mon Sep 17 00:00:00 2001 From: Saxashitter Date: Sat, 18 Apr 2026 17:17:20 -0400 Subject: [PATCH 07/17] FANG: AFix speed angle-aiming thingamajig... Iunno. --- BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua b/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua index 6824f5f..5ab5331 100644 --- a/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua +++ b/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua @@ -129,8 +129,8 @@ local function newGunslinger(player) mo.state = S_PLAY_FIRE player.panim = PA_ABILITY2 player.weapondelay = refiretime - mo.momx = $ * 2/3 - mo.momy = $ * 2/3 + mo.momx = $ * 3/4 + mo.momy = $ * 3/4 S_StartSoundAtVolume(mo,sfx_s1c4,150) if player == consoleplayer @@ -158,10 +158,13 @@ local function newGunslinger(player) if (bullet and bullet.valid) -- bullet.flags = $1 & ~MF_NOGRAVITY - local speed = max(26 * mo.scale, FixedHypot(mo.momx - player.cmomx, mo.momy - player.cmomy) * 5 / 4) + local speed = max(35 * mo.scale, FixedHypot(mo.momx - player.cmomx, mo.momy - player.cmomy) * 6 / 4) + local angle = R_PointToAngle2(0, 0, bullet.momx, bullet.momy) + local aiming = R_PointToAngle2(0, 0, FixedHypot(bullet.momx, bullet.momy), bullet.momz) - bullet.momx = P_ReturnThrustX(nil, mo.angle, speed) - bullet.momy = P_ReturnThrustY(nil, mo.angle, speed) + bullet.momx = P_ReturnThrustX(nil, angle, FixedMul(speed, cos(aiming)) + bullet.momy = P_ReturnThrustY(nil, angle, FixedMul(speed, cos(aiming))) + bullet.momz = FixedMul(speed, sin(aiming)) end player.drawangle = mo.angle From 7faa4c40b9d1bce8f4787ac022b4bebb82188375 Mon Sep 17 00:00:00 2001 From: Saxashitter Date: Sat, 18 Apr 2026 17:26:16 -0400 Subject: [PATCH 08/17] FANG: IM SO FUCKING STUPIDDWHSJEJFKEFK (Fix syntax error) --- BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua b/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua index 5ab5331..38b81b4 100644 --- a/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua +++ b/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua @@ -162,7 +162,7 @@ local function newGunslinger(player) local angle = R_PointToAngle2(0, 0, bullet.momx, bullet.momy) local aiming = R_PointToAngle2(0, 0, FixedHypot(bullet.momx, bullet.momy), bullet.momz) - bullet.momx = P_ReturnThrustX(nil, angle, FixedMul(speed, cos(aiming)) + bullet.momx = P_ReturnThrustX(nil, angle, FixedMul(speed, cos(aiming))) bullet.momy = P_ReturnThrustY(nil, angle, FixedMul(speed, cos(aiming))) bullet.momz = FixedMul(speed, sin(aiming)) end From 4ea03972e6ed0d2141c096d831478dd42625c5eb Mon Sep 17 00:00:00 2001 From: Saxashitter Date: Sat, 18 Apr 2026 19:16:40 -0400 Subject: [PATCH 09/17] FANG: W.I.P Slide (NOT FUNCTIONAL), Added special_playerthink to Def_SkinVars --- .../2-Specials/Info_ActBomb.lua | 63 ------------------ .../2-Specials/Info_ActSlide.lua | 8 +++ .../3-Player/Lib_ActionControl.lua | 46 ++++++++----- .../3-Functions/3-Player/Lib_PlayerFrame.lua | 3 +- ...Lib_ActCombatRoll.lua => Lib_ActSlide.lua} | 9 +-- .../6-Definitions/Def_SkinVars.lua | 4 +- BattleMod/Lua/4-Hooks/Exec_Player.lua | 4 ++ BattleMod/zSkins/5_Fang/2_Sprites/FLY_A1.lmp | Bin 0 -> 2097 bytes BattleMod/zSkins/5_Fang/2_Sprites/FLY_A2.lmp | Bin 0 -> 2709 bytes BattleMod/zSkins/5_Fang/2_Sprites/FLY_A3.lmp | Bin 0 -> 2754 bytes BattleMod/zSkins/5_Fang/2_Sprites/FLY_A4.lmp | Bin 0 -> 2789 bytes BattleMod/zSkins/5_Fang/2_Sprites/FLY_A5.lmp | Bin 0 -> 2149 bytes BattleMod/zSkins/5_Fang/2_Sprites/FLY_A6.lmp | Bin 0 -> 2709 bytes BattleMod/zSkins/5_Fang/2_Sprites/FLY_A7.lmp | Bin 0 -> 2699 bytes BattleMod/zSkins/5_Fang/2_Sprites/FLY_A8.lmp | Bin 0 -> 2656 bytes 15 files changed, 49 insertions(+), 88 deletions(-) delete mode 100644 BattleMod/Lua/2-MobjStateInfo/2-Specials/Info_ActBomb.lua create mode 100644 BattleMod/Lua/2-MobjStateInfo/2-Specials/Info_ActSlide.lua rename BattleMod/Lua/3-Functions/3-Player/Special Moves/{Lib_ActCombatRoll.lua => Lib_ActSlide.lua} (96%) create mode 100644 BattleMod/zSkins/5_Fang/2_Sprites/FLY_A1.lmp create mode 100644 BattleMod/zSkins/5_Fang/2_Sprites/FLY_A2.lmp create mode 100644 BattleMod/zSkins/5_Fang/2_Sprites/FLY_A3.lmp create mode 100644 BattleMod/zSkins/5_Fang/2_Sprites/FLY_A4.lmp create mode 100644 BattleMod/zSkins/5_Fang/2_Sprites/FLY_A5.lmp create mode 100644 BattleMod/zSkins/5_Fang/2_Sprites/FLY_A6.lmp create mode 100644 BattleMod/zSkins/5_Fang/2_Sprites/FLY_A7.lmp create mode 100644 BattleMod/zSkins/5_Fang/2_Sprites/FLY_A8.lmp diff --git a/BattleMod/Lua/2-MobjStateInfo/2-Specials/Info_ActBomb.lua b/BattleMod/Lua/2-MobjStateInfo/2-Specials/Info_ActBomb.lua deleted file mode 100644 index be3c30d..0000000 --- a/BattleMod/Lua/2-MobjStateInfo/2-Specials/Info_ActBomb.lua +++ /dev/null @@ -1,63 +0,0 @@ -freeslot( - 'spr_flob', - 's_fangchar_lob1', - 's_fangchar_lob2', - 's_fangchar_lob3', - 'spr_cbom', - 's_colorbomb1', - 's_colorbomb2' -) - -//Fang lob animation -states[S_FANGCHAR_LOB1] = { - sprite = SPR_FLOB, - frame = A -} - -states[S_FANGCHAR_LOB2] = { - sprite = SPR_FLOB, - frame = B -} - -states[S_FANGCHAR_LOB3] = { - sprite = SPR_FLOB, - frame = C -} - -//overwritting some bomb states to prevent it from using A_GhostMe -states[S_FBOMB1] = { - sprite = SPR_FBOM, - frame = A, - tics = 1, - nextstate = S_FBOMB2 -} - -states[S_FBOMB2] = { - sprite = SPR_FBOM, - frame = B, - tics = 1, - nextstate = S_FBOMB1 -} - -//Fang's team-colored bomb - -states[S_COLORBOMB1] = { - sprite = SPR_CBOM, - frame = A, - tics = 1, - nextstate = S_COLORBOMB2 -} - -states[S_COLORBOMB2] = { - sprite = SPR_CBOM, - frame = B, - tics = 1, - nextstate = S_COLORBOMB1 -} - -states[S_FBOMB_EXPL2] = { - sprite = SPR_BARX, - frame = 1|FF_FULLBRIGHT, - tics = 2, - nextstate = S_FBOMB_EXPL3 -} diff --git a/BattleMod/Lua/2-MobjStateInfo/2-Specials/Info_ActSlide.lua b/BattleMod/Lua/2-MobjStateInfo/2-Specials/Info_ActSlide.lua new file mode 100644 index 0000000..da3f908 --- /dev/null +++ b/BattleMod/Lua/2-MobjStateInfo/2-Specials/Info_ActSlide.lua @@ -0,0 +1,8 @@ +freeslot("S_FANG_SLIDE") + +states[S_FANG_SLIDE] = { + sprite = SPR_PLAY, + frame = SPR2_FLY_, + tics = -1, + nextstate = S_PLAY_STND +} \ No newline at end of file diff --git a/BattleMod/Lua/3-Functions/3-Player/Lib_ActionControl.lua b/BattleMod/Lua/3-Functions/3-Player/Lib_ActionControl.lua index 125e6f8..338a983 100644 --- a/BattleMod/Lua/3-Functions/3-Player/Lib_ActionControl.lua +++ b/BattleMod/Lua/3-Functions/3-Player/Lib_ActionControl.lua @@ -4,7 +4,10 @@ local S = B.SkinVars local spendringwarning = false -B.MasterActionScript = function(player,doaction) +B.MasterActionScript = function(player,doaction,type) + -- 0 = PlayerThink + -- 1 = ThinkFrame + --Set action state player.actionallowed = B.CanDoAction(player) player.actioncooldown = max($,player.tossdelay-TICRATE) @@ -34,26 +37,33 @@ B.MasterActionScript = function(player,doaction) local t = player.skinvars --Reset action values for this frame - player.actiontext = nil - player.action2text = nil - player.actionrings = 0 - player.action2rings = 0 - player.actiontextflags = nil - player.action2textflags = nil - player.actionsuper = false - --Set exhaustmeter hud (if enabled) - if player.exhaustmeter ~= FRACUNIT then --- player.action2text = player.exhaustmeter*100/FRACUNIT.."%" - if player.exhaustmeter > FRACUNIT/3 or (player.exhaustmeter > 0 and leveltime&4) then - player.action2textflags = 0 - elseif player.exhaustmeter > 0 then - player.action2textflags = 2 - else - player.action2textflags = 3 + if type == 1 then + player.actiontext = nil + player.action2text = nil + player.actionrings = 0 + player.action2rings = 0 + player.actiontextflags = nil + player.action2textflags = nil + player.actionsuper = false + --Set exhaustmeter hud (if enabled) + if player.exhaustmeter ~= FRACUNIT then + -- player.action2text = player.exhaustmeter*100/FRACUNIT.."%" + if player.exhaustmeter > FRACUNIT/3 or (player.exhaustmeter > 0 and leveltime&4) then + player.action2textflags = 0 + elseif player.exhaustmeter > 0 then + player.action2textflags = 2 + else + player.action2textflags = 3 + end end end --Perform action script - if S[t].special ~= nil then + local special = S[t].special + if type == 0 then + special = S[t].special_playerthink + end + + if special ~= nil then S[t].special(mo,doaction) --For custom characters if player.spendrings == 1 then diff --git a/BattleMod/Lua/3-Functions/3-Player/Lib_PlayerFrame.lua b/BattleMod/Lua/3-Functions/3-Player/Lib_PlayerFrame.lua index a185498..567f1dd 100644 --- a/BattleMod/Lua/3-Functions/3-Player/Lib_PlayerFrame.lua +++ b/BattleMod/Lua/3-Functions/3-Player/Lib_PlayerFrame.lua @@ -177,8 +177,7 @@ B.PlayerThinkFrame = function(player) B.PlayerMovementControl(player) --Perform Actions - local doaction = B.ButtonCheck(player,player.battleconfig_special) - B.MasterActionScript(player,doaction) + B.MasterActionScript(player,B.ButtonCheck(player,player.battleconfig_special),1) --Air dodge, Stun Break, Guard local doguard = B.ButtonCheck(player,player.battleconfig_guard) diff --git a/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActCombatRoll.lua b/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua similarity index 96% rename from BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActCombatRoll.lua rename to BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua index 69c484e..cc7f3c7 100644 --- a/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActCombatRoll.lua +++ b/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua @@ -11,15 +11,16 @@ B.Action.CombatRoll = function(mo,doaction) //Conditions local bouncing = player.pflags&PF_BOUNCING local activate = player.actiontime == 0 and doaction == 1 - local thrust_trigger = activate and not(bouncing) + local slide_trigger = activate and not(bouncing) local springdrop_trigger = activate and bouncing local drop_state = player.actionstate == 1 and bouncing and P_MobjFlip(mo)*mo.momz < 0 local thrust_state = player.actiontime and mo.state == S_PLAY_ROLL and not(P_IsObjectOnGround(mo)) and player.actiontime < 18 - + + local grounded = P_IsObjectOnGround(mo) or mo.eflags & MFE_JUSTHITFLOOR //Properties - player.actiontext = "Combat Roll" + player.actiontext = "Slide" player.actionrings = 5 if player.pflags&PF_BOUNCING player.actiontext = "Spring Drop" @@ -27,7 +28,7 @@ B.Action.CombatRoll = function(mo,doaction) end //Perform Thrust - if thrust_trigger + if slide_trigger //Apply cost, cooldown, state B.PayRings(player) player.actionstate = 2 diff --git a/BattleMod/Lua/3-Functions/6-Definitions/Def_SkinVars.lua b/BattleMod/Lua/3-Functions/6-Definitions/Def_SkinVars.lua index 97a14bd..ed9be55 100644 --- a/BattleMod/Lua/3-Functions/6-Definitions/Def_SkinVars.lua +++ b/BattleMod/Lua/3-Functions/6-Definitions/Def_SkinVars.lua @@ -7,6 +7,8 @@ S[-1] = { weight = 100, shields = 1, special = nil, + special_playerthink = nil, + special_thinkframe = nil, -- guard_enabled = true, //Deprecated guard_frame = 2, func_guard_trigger = G.Parry, @@ -75,7 +77,7 @@ S["amy"] = { S["fang"] = { flags = SKINVARS_GUARD|SKINVARS_NOSPINSHIELD|SKINVARS_GUNSLINGER, weight = 100, - special = Act.CombatRoll, + special = Act.Slide, guard_frame = 1, func_priority_ext = Act.CombatRoll_Priority, func_precollide = B.Fang_PreCollide, diff --git a/BattleMod/Lua/4-Hooks/Exec_Player.lua b/BattleMod/Lua/4-Hooks/Exec_Player.lua index e691a86..0e38e2d 100644 --- a/BattleMod/Lua/4-Hooks/Exec_Player.lua +++ b/BattleMod/Lua/4-Hooks/Exec_Player.lua @@ -142,6 +142,10 @@ addHook("PlayerThink", function(player) B.GlideSound(player) B.AutoSpectator(player) B.DiminishingMomentum(player) + + --Perform Actions + B.MasterActionScript(player,B.ButtonCheck(player,player.battleconfig_special),0) + -- Spring checks (Should this be dropped in `Exec_Springs.lua`?) if player.mo and player.mo.valid then player.suicide_watch = true // is this joke too dark? diff --git a/BattleMod/zSkins/5_Fang/2_Sprites/FLY_A1.lmp b/BattleMod/zSkins/5_Fang/2_Sprites/FLY_A1.lmp new file mode 100644 index 0000000000000000000000000000000000000000..ff1bb5d973c5395c8ea2cfa3bd0bf5725349b30d GIT binary patch literal 2097 zcma)-O>Z1U5QfW+XYFkvx1jUo#AFjYCLeA)3Cn@ibR#*kHIRfPaNxv|$eN5s`~Z|Y z91%!9EI#L!Ul1wc&XF_x0u+S$=-Fp9C#1%5kx&_&* zrp&W>7%yyUXl~>eSP*(D zEj>IW}_5d+O6o zcB?Kcn;ni1yPyyl{_o!0+1)cJTFnhTy^)z}%4&RYa3mr~V%y1YhFxPRm#S60`*&4& zAm5G0hnffjRhh}oXcRk@>KgfnY__w!uDOF+##7n<$*U@@ZalZgQT%w*3-;gpS6PpU z!D;C^4gdX|bla=SxynY$NoCP#smk!RC6Nvp9lK6K$Y>cM6w#_~ZvA!DXXr(!kd<}4 zv8?x0`_Yk-?IhnBrJgFqIU+?_w@qs*o9D=9-lXhRK5eM#M7Mr%b5_$4HbHCG`BQj$nJ!Mv5>eYl*|Ss_L*ADAim1t0Jm_~I#PY!d7T5lD_86wtp67?dOka@H8n8$v-mlK mX_nqlzxobW{AL%-#G$*ui~}9xuPAu%EMaJh0>w+v zlit+P`o`P@AA#?|1Mny4SYx)p5g38DK@C0xAA?W9=im!)4}1x}0{6k! zpqZ~HH>>%|bTzxD^4!IhS1Bv2s^(m_*u<2{Zl1Hhb0+_f0f*L7&JR)wad6JzI9HVN zryNmnPzfV)u*6lCrORDel%-g%c5rNV&SJhc6o=Ab9AQE?JBjUNU z7}Zqfl`EDu4&Ch`gJ@W)izl5D+hbGCeJY76)#ip*uZfM6#U}1FSyN>NZut!@4I`2KV@xOmtl3mVC3v3@?^Xfj=x*mZcNJGf3O>ffH-rlti@7lmd} zd5ibfKoXA2W{}6MN(oB_T`rVLDn}vhTof@ZY+AylT(4Kg6^YTRs?h1ZHOV3mlX`;D z#AT(7NU16}Xmvq>!>Ob**M+RamUO4ykW!xItqyoaB21#Bc55(@ffE-2EkzO;k8x<; z!5|+>{^TN=NInZvN@$L9Z5WBud5#+?AQeL)X^l04kW?R0&>KQU`nq75i*%LHwp3sh zr2CX6zpPZ;*F1-C&=46IdBz6_-# z=?FjZ{;-#FLs99RUmspsS?gVp<54##4P))}p?px*}ur zN!1tf66u?i`Xerc$k3M7A}}VYoD5MIT&-M`m-7=wf-v%2C{hIpvZs@ENF9_SH%@J_ z3WZy8Jb8K&Qqm^Vbm9#uMTO~UB-*|P$NxpQ}kk25Bx>?46^vk26s2=bK@L+SkFj?|Odkxr60%iFdomZ~~j#$j&f zWg7;DQYiNJsW?;VDQ+v1DpZGyKx?Pt+#!B_M}?tdo9<$++DNe}X&uBkoY$=Lk*5kp z0YQVn*y%EPXn{eWue&w{g*YGz^@P&jlnWAn2!WFBbP@oD z%;lV0K~AzTpWt1`lRUXZSU`PuCK`&UQy+Vu~kN@BGD literal 0 HcmV?d00001 diff --git a/BattleMod/zSkins/5_Fang/2_Sprites/FLY_A3.lmp b/BattleMod/zSkins/5_Fang/2_Sprites/FLY_A3.lmp new file mode 100644 index 0000000000000000000000000000000000000000..63d09447ecb653f8287f215efd5076a26a49da2c GIT binary patch literal 2754 zcmZvdJ#1q|6on_YpJUJNW_B~|5+zv-yNmNTS%H=UV?T)vmLC6X1ri8}CK&7Sv<>wZ z6tsYlNMRWXL_ve-fPw-cK|zJI9ipbBK~O+pzBBJRanMe3ocPW?_nx_PXXci9+*~w| znWvYGc?LWSo&(Q=7r=|)C2$M83T}h_+g>Lc`fJx$=gesRG* z2)!H3l#KOD%=9%PFO)Nb%=_8;r8JE*aV|g+X%L*7t>4eojb24Np0bE8=SZxO>44x- z#2|@tYbV)48p<`K!6X*qMm0$emg_9jAy|_{=4Oj8l1NRu=bTHN4{4kf^?`(0)u>x% z%G$k_rIs)qi;wQs+e8LS)>(H&UOu{5A1l;d@jjYx@l;kkOt$p06kBEQw!L>nf>X>Ibrm`Ivn;iAG1eEw)%MMsH-~9HiUAr_SB)0jDjbHZT%&Js<&1N~VZSGD z2}zQa0^)x5A$(a%T+N)~RjtINy(}+E_njD>KE|&MZ*hnt@kOqG@y1!fn>z$gQ#K=4 z=)&1!F~;j~nPi;yv*?VJ-Hg+Lf5<4(I4?S#wPXJzHUOT3ln(`OP>NJrP5da%I$A6S zl^j|~j^hyhMX2vXAi5YK8yBwBE%{NG^<))8g2et06MUliM)k;ZXBLxOOMM;RN z>Q|v;old2Tjh7hw`K6)ICAVUym6yq4nky{4)9IAT3OeP4qb^L8qu7Nq8c7*zsa+w> z;Fyywa!3M6&9K{YuH>+oC6sY_!0E&~WOHq*S*%5pkBTC2LSh=Sm}`;Jm$*zT$|!-v zp-Dxf{qwOnb7{zoB;6+|B(5ZCO$*6godgxce%}9IB60d_Ye7_PsYX85e#Sw=dcS{< zM7^FDCz7g~9(N53nv+zyxjJ2rx`%b?rD0B*r-J0%^;4N1rVf$RuSjV{8oR3dDK{ti z6l>{Pnx2rPZ@%YqefK1Vcti6ZXi=QZn2C=_qI$Xl{-dp^k$*bzsszQ_;(i}1o&$iU*UPrSo+T)E<&Fipa zj}=ez!_%Z}(C5l@y0RBrqTY?Ym&R1-IFiasgc>BlaqV~)pT$L1oW$t_N}lq>I2$YUdFAgN z*Fd)5-&|2O*(N0z=|FF+pveV?CXSL`vA|n`Box_pU=J%Po9EEXp5wz%*wcQvMai2r z1?sdj&Z-)lCpI*Qs8ea%;}|byzPv=R2b+3>HTL8*;)<}XvDC$2(I{qnk-1mLRmKI+ zUFflll`*E+#Zh-#ds!i4d3Njcq_|C_M9a?HNpC2*3K^7hrzS)E!?*34UZ&ah5+2p( Ee?Po^F#rGn literal 0 HcmV?d00001 diff --git a/BattleMod/zSkins/5_Fang/2_Sprites/FLY_A4.lmp b/BattleMod/zSkins/5_Fang/2_Sprites/FLY_A4.lmp new file mode 100644 index 0000000000000000000000000000000000000000..594292494790b2c39e3c992ee40c0b3e9ed15b76 GIT binary patch literal 2789 zcmZvey>A>v7{=$$H+S~f$tc+*IJV)4?buE-ae@pI*6wtO1&IQQ9@3c8vRcv7p`?Ni zi847P3K}FDsE`n%K~yvpfrO9n^$#Ec64mj0-`PD!h>;%KH}CVz`#E!d(L8O=nkUV3 zJ!4)1H^A%QP4EtQAAAD70{6jR;8fq3eeeQ!4ZHxC{KqnCHPw@G1BM>@6De3V0WM3H}6|OXLA= zfserhu;`4r0-gmoz#HIga0h$@J_lceyWm^!9k>VXgYUr);79NicmRF|zkpxCZ{T;Z zGYqUUmgVf?VhFL2#fNPdLXqe4No-rount+WBcE47$gdxyjnHl!9v;XJj4YdNok#+u zcq==8zEebRt!HohWVcsHH62@zo-5lG@?0GnW30_^vhhe4VGL12B?D`%M7X|6z}*VC z3d!ar+_m!$8H>U@hZUiZMF`27%ThhoOpoBJx=>fvlw*HWHrgxPz} z$Tn!0=1c>2M$Xx~svDs!O{d;!ep&XIg(L;t846<}gpusY${b9}t6^n3);Tw+nr1c} zQC?!BuxFfChV~%4IOL>e(s)0!OY^#vlgp=rEOAEs}vz-GmwsWeu58A0bDXdG5%DLIfj)pZ?;SXUDq z%!XHrqGjj8wyvtW^9@C=>Z+<43w}|}W;WO-V7e$x%=22dWpxgWud0U6p$HQ-An89L zwMCV}!ZS;L%>78C_>4$QEL6P%?RV^S#G6#d&ghOXww4x+M{%)jtvX;qxB4@Kiyvv@QWfH6*Sh?G(EUM(Ojv=*^tK#&r<8_JG7fD#NY;|(&C|D~#W~km?qB9z=DC>SPj%7}v&XZl4htN%h2c?d19i6KiI8WDi+N3j z5~&C;wL^I@;eq*t&mW~<*1DnkGx~MwgBwe8?;;<%yank8%5>w!A>sZZoY@+Ma!Y)qk$aq{9 z;%+XJk&sJ@>}uz(s#K=#5dWV{rw|$0C0X*ea1n2*D5~P79y^oDN+`5GTpgy85aGfW z^TRftN(qn`ztfPW^gOL&#o&UBCG}5{rLQy|J(hG!`o%+P)dLRf<8nY$@>q*4`8RxV z@Ng?#*i|Jxgw1zQ8qTsz(@!g!=KP9J0#$f_1;OM<9umtJ4yWcZ#X;=SyR~H<9Os3f z=-hPZ!&5@nmMB$*ty~+*>5jf%7|34;29tFBh`T9#DXXp!*04*GesjTleqEN}_3%ah zFG$aeQaO2jKpb$k`ttf;9!Q!*vCRJ|(i)bK7KG%sdr&S3Wdh~INY2vlz;*oKQ%#~? zVN!H8%|>6M-9t1Hkyzw;rE?o{+TH>N=4oZffUw^*dwrSu*|HLKXID596CGAkz1tV= ae4}Z0`{Hi4Oi%Ut?e_HJKz8Zbf7ZV~Hkwrc literal 0 HcmV?d00001 diff --git a/BattleMod/zSkins/5_Fang/2_Sprites/FLY_A5.lmp b/BattleMod/zSkins/5_Fang/2_Sprites/FLY_A5.lmp new file mode 100644 index 0000000000000000000000000000000000000000..14d35d0d7e4921a5322f297511df58cd726e2d37 GIT binary patch literal 2149 zcmb7_&u$b)5Qlrc?zKI(8NwtM*ohGi1P3)CQ4ETi?t_)X0Jg!9@F#JAgk)KbCUeU% z$_0rt7cM+R4j^v4K`wa!BrY6Ku3WecU)AiG#m3kv>GRs&Uv*VicU7;MZ_Gz#!JKIs za~96QGOWNVoQDgr1{Yx+dhiF_g$M9A{0lE(ddQe>;di(XPvALBwOJeff=BQIW`~Wr z0{7q_=vZTx;7@oA|G{jBxNrv^!ZVm0G3GSfhWqdYp292GH)_m0oP;G=P$yAyt{R<05YjaD-iP3_Y-ZA0V-dxXO`?FLvp0m`7u8UCk7|04E`=hBY!s)+ z><3;&^;)&i9f>%bsUn-GR8bpe4 z-inR|t0A@&eCpYZ8}Lb8-=)w6ojW?BS-Ln$s@9yih&5g~lhlS27a`9-8`Fh7b;QSf z*)JW%!%IVXb&`G5J1$DfQxcGaiDI_XILY?VYJy&hm1;4yOt?r9yrZ&`Yh}I)b>VPA z9QG57k9Rr+ClRr#^>uv*w2vJMpZ@j-$tl)u zk}@WTA~AQmHnqCZb9=bctrI)n&qUfT#1U664$=o-?9d13xVIrhHtxH$k85vi*K9?} z#h1|}Vb_-z_9OJ1aE_Hz^`B>aqcsaXra<-{k;)5O(c}^B8*7NSykO=MJUz6 z6$;ztF`8O(5{WItOGOMs&RY?8wQHz28i_-G)niU-91iDnK<+va0&{!wz&cJ*g-D4l zvNW-5O7BlE3W=mXl+GA^+l=lu60PE`1ZjG@+?HT2CDItyq+u1+oaKz=U7FtHwkstS zPVse0kSwX9jBR*{OVYAr4oM14Ro2RVRn4gAMx!k20&K%`kUShnH&%$a)F^3KXaz+# znrv*8jaJnZ9RDO`C_Cr<37S);%mtdwhq3OD62nk6^@EWZive^zq!=s&8@U65WLk_# zP>rOq01soK=#1u&D%tjMP5T*Jc6HP<>JP}=3=Ia$-N?pPq{J%cK(RWe&SBw9Hw0Dk zRLGWp!)!DmrXm(0=F-%^bY$-)&LOBg5Zg;Ao}z7*=@k^QWuewTL2cx{IEXenMKM?M z%@gBDNR(sRi%XY!ujFE2E?iJa8b(QzDm10kKQe~KhgUf#VSZc$W(3u75~V;Y{X_hj zQH%o58JNH8(!hOMRE$al+U>8C18vRrbT6q_yBnQ1=Yn^peMnBhBs(FbnK|3x@XWGp zPLKqzE@v58kp|vNTPP_G^?;R!NVO?-=dSJzn1>myhU;J>L&r0{RDE-?bJf7z8)O+Y z^SiWY2bIy>S~6pY=*wxDWpy@~%^sr4ZhNbUyJE_`GESW(GmH;sv%R%EXJQl;FBTOv z)Yo`FaXp!qx5+`|H?+-QhGdi9JeBVvjlkoFvt5n2ck%?Ja?_9>BYaQ}9 z!QypF388JTlbp2|8|KtF$*5h5WebZs)><#J9VWdbJ(d_pXJ<0;I*De+UAm-O47AfLXd5$uig)qsEgb4~omsG<^|+ zClT@BA0V>GG6;g8N4*LD1A+$?z2+G3=v`@lUsca0YO&w;bk+Ob``)Wp)%VS9bJpB4 zFD@AK61WRq2KT@#;8pM%xDQ?jZ-6(!JD>*df{(#x;A`*$_ys%ye}VNy{DBAHOYke` z_l&s>YA^#ogI?d5=Rgg<0KbDYG3I&j9{2`41m^~50iS^H!5`qz3^;DgQ}WNt18Y^GFhssgM%=&-K(_Hj)t0I z4(2w*U>4^NWU$?5E*OsRHn-ftaw_)7d+(eJraPEUC1|+peQsTvI48H47Ob`7LD`L9 zHbu?S3C!{|P14kQLR?(tN9l{A@E%(~cPG2drb&`Io0r&~ND_-x7+87|5Bl4IMNTwL zZH61~S5Ky?Ikqm!@>-ufq%v9Y#L7}f{9v6!SUs5}CPjgqTbUm_@1MrrXL}ZNXS1x} z&-)9f@NZH~MX<;bBSz?-K@E((y^IQU3^piol!GsAV##&)I7)AWqC^rjIC++NZL6h8 zL)z9D2V)STC=pRG%5wC<$ayI|8(%lHRzfl`5-8V?gDfftvd}M8%D0ihmkySS${XbGxjK^bjXW<)84c*BD3Lq6o{=bpvvCKm%3sRyb!`39~ zxIkn-o5nvGX<=Pmnn4-s5EW&JqZr6jD;T!8X|Cwx?*yW%L0*dxi(E97+?O#F_H!N* zsdON2AIs#j=&yMxj5La@gd!~#q>=lpinl!%s(8s-SyBuID`PSK%~CTqTLcQNsmpJ$ z!;O+h0+k3+q%MYW+Pa!;h=T}ATa+T?QiU@rQ7T-B6Ut5K@r`Tb{swjHa)gBu9m8# zDl%G-W@?i`=iaYabr)A#moWXfcCxPZR_tY^&J5-W&UN(9EL$~49L_y^LOjkOx`Saq z34WvD+%Cls-ei(-@5H0g@97%xZrLf3FtA!5-MMpTf<(1l>zH{gYJIf7U+hn8w>EMv zuyj&4hLg$u#Ko1jXdr`nqA2PZR4B_`Y`E4|t5Xg0gd3}xh-xU1yKvb{`o@J1fm zc_yw<1-1?WR5QHGuhaJ}zVm_Msz*Rdt=loh#7|jX3G;lfxMHAP8Zw_VSd2^Zp|skI zXX8DU$zQ1+aa_(+qFsF&j&86$Zv4W}mqc1U%QbrQrq*(VhNZF$B(2uEqt)xq8wUdCeu%ht%K(|(M-8f+(Cr{z0laxsl-DDF7O?I;{l^9754&8Ogu+Y9l6G0G?7*EU4G=0<$ z;7vgk6jxXVKZ9O8cvDdH{{%A&%rOitQd10Ou?7nXYdc$SvBSk_z-*x{s76qn5*C| z@E-UWd<}jDe}c6kI#7TE@B#P=dhZbw8m^QK&0K2dhl8>_IG8e5*O!*7inXSl(_~$5_e5`oL(vWn5HmOD4Xa9% zEs@EomkynT$~w#$yRuo9jR=`GND`O(IL`K+GuFA$N)d;1yNm6f3Spe2k(~vf=U6;@EJ>gj zK7`<0QS6DVz*kPP_1Lj<>ar|knb>De;GeMx0&To;)~X zEJQD#0z2$kQavS?P5&anMFpB@A@fx%M^sQy6j<=lBLvHv2r`c&9(VZS!z;_vs>X%{ zHjN5wOrwq7mbgKQk&Kb^tFG&~Zjnf%JYBYw1h?v@w;9;p2RW4yr!S<#Ggp_GiV~X= z%H@TbrRW*1Nt2@~2r`bu60Jl^0+N*&J$Y%QQ2=f5n4vYJgan%?vaM@ZWJcZB7?~l% zQPY`GEVzbOa}nW4!d_HG5{i86Ezqjh`mAQTnwmFjYu46dqkzUqRQ4P%I=`%Te&8tr5DvY zqY){OO|Zy<1Th~8WKj!MjlZPoy%0i3ns9%Ed-o@NKH@33(m}0s(>d;kOQPV2IbPkJS9_;My@}pHZj{TK)#< zjoWitlv^Zox=qvPj&qgWnB17`tEr=bhXRf<_YyvJ0_)QB`L!gukxg>=u<_^kVt-Bw zCp=x_E^UYI=nKQiBpZt!*~cDXbGFl@BjXp`!T$avhpU6z=MCr_CznM!)Gf;C6Y=6I z#QlA)*|g~=@q$vuMH|d!M>=|u#U-GaVc7vJr2!95!8tsdQEu&|i-L<5&WhEg#l3cN zaCBr2kD#=Ka!M5;oLoIT{Oo8p<7L{U@ihyB`Ti`9kv7o9xOsvGXO(vYf@YfYIDiN7 z{n%oeRh!CBr}gICdc1RJB|RA=+@>*D-I>kC8Kl>)>3+#W?z>fO(5~`AUDYa`orkzu z6v_Zk6Ixc=f$?^gEYK;7)$S3*4T5RiP32Xyfm692xpu^NjXw)dP;v3$T6lc%+%p`5 z#fWQU#s>+{KfPF^zj%bxLa&pSo;|Hx#SvW@=Xnu=T-l;=Vvy}j+D^onBjx`SlC05d fa|XXJ@dE2w*AD#LrXV_5dgz*+m9BC{_y5p;-c&!3 literal 0 HcmV?d00001 From 24e16fd5037a6db13f6c50a9ca8039ed818b99ad Mon Sep 17 00:00:00 2001 From: Saxashitter Date: Sat, 18 Apr 2026 20:23:21 -0400 Subject: [PATCH 10/17] FANG: Slowly progressing.. --- .../2-Specials/Info_ActSlide.lua | 3 +- .../3-Player/Special Moves/Lib_ActSlide.lua | 102 +++++++++++------- 2 files changed, 66 insertions(+), 39 deletions(-) diff --git a/BattleMod/Lua/2-MobjStateInfo/2-Specials/Info_ActSlide.lua b/BattleMod/Lua/2-MobjStateInfo/2-Specials/Info_ActSlide.lua index da3f908..3aea167 100644 --- a/BattleMod/Lua/2-MobjStateInfo/2-Specials/Info_ActSlide.lua +++ b/BattleMod/Lua/2-MobjStateInfo/2-Specials/Info_ActSlide.lua @@ -4,5 +4,6 @@ states[S_FANG_SLIDE] = { sprite = SPR_PLAY, frame = SPR2_FLY_, tics = -1, - nextstate = S_PLAY_STND + nextstate = S_PLAY_STND, + action = function(mo) mo.player.panim = PA_ROLL end } \ No newline at end of file diff --git a/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua b/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua index cc7f3c7..1f8b73b 100644 --- a/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua +++ b/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua @@ -1,24 +1,41 @@ local B = CBW_Battle -local cooldown = TICRATE * 3 +local cooldown = TICRATE * 2 local cooldown2 = TICRATE * 5 +local duration = 3 * TICRATE local xythrust = 38 local zthrust = 9 local dropspeed = 20 +local nojumpwindow = 10 -B.Action.CombatRoll = function(mo,doaction) +B.Action.Slide_PlayerThink = function(mo) local player = mo.player - //Conditions + local grounded = P_IsObjectOnGround(mo) or mo.eflags & MFE_JUSTHITFLOOR local bouncing = player.pflags&PF_BOUNCING local activate = player.actiontime == 0 and doaction == 1 local slide_trigger = activate and not(bouncing) local springdrop_trigger = activate and bouncing local drop_state = player.actionstate == 1 and bouncing and P_MobjFlip(mo)*mo.momz < 0 - local thrust_state = player.actiontime and mo.state == S_PLAY_ROLL - and not(P_IsObjectOnGround(mo)) and player.actiontime < 18 + local sliding = player.actionstate == 2 + and player.pflags & PF_SPINNING + +end +B.Action.Slide = function(mo,doaction) + local player = mo.player + + //Conditions local grounded = P_IsObjectOnGround(mo) or mo.eflags & MFE_JUSTHITFLOOR + local bouncing = player.pflags&PF_BOUNCING + local activate = player.actiontime == 0 and doaction == 1 + local slide_trigger = activate and not(bouncing) + local springdrop_trigger = activate and bouncing + local drop_state = player.actionstate == 1 and bouncing + and P_MobjFlip(mo)*mo.momz < 0 + local sliding = player.actionstate == 2 + and player.actiontime + //Properties player.actiontext = "Slide" player.actionrings = 5 @@ -29,29 +46,18 @@ B.Action.CombatRoll = function(mo,doaction) //Perform Thrust if slide_trigger - //Apply cost, cooldown, state + -- thrust player forward + local speed = max(xythrust * mo.scale, FixedHypot(mo.momx - player.cmomx, mo.momy - player.cmomy) * 3 / 2) + B.PayRings(player) + B.ApplyCooldown(player, cooldown2) + + P_InstaThrust(mo, mo.angle, speed) + player.pflags = ($|PF_SPINNING) & ~(PF_THOKKED|PF_JUMPED|PF_BOUNCING) player.actionstate = 2 - player.actiontime = 1 - B.ApplyCooldown(player,cooldown) - player.drawangle = mo.angle - //Apply momentum - B.ZLaunch(mo,zthrust*FRACUNIT,false) - P_InstaThrust(mo,mo.angle,xythrust*mo.scale) - //Apply midair state - player.pflags = ($|PF_JUMPED) &~ (PF_NOJUMPDAMAGE|PF_THOKKED) - mo.state = S_PLAY_ROLL - player.airgun = false - //Do effects - S_StartSound(mo,sfx_zoom) - for n = 0,3 - local dust = P_SpawnMobjFromMobj(mo,0,0,0,MT_SPINDUST) - local angle = (180+P_RandomRange(-60,60))*ANG1+mo.angle - local speed = mo.scale*P_RandomRange(5,10) - P_InstaThrust(dust,angle,speed) - end - player.noshieldactive = -1 - return + player.actiontime = duration + player.lockjumpframe = nojumpwindow + mo.state = S_FANG_SLIDE end //Perform spring drop @@ -70,15 +76,11 @@ B.Action.CombatRoll = function(mo,doaction) return end - if thrust_state - player.drawangle = mo.angle - end - //Drop bombs if player.actionstate == 1 and bouncing and (mo.eflags & MFE_JUSTHITFLOOR) - B.ApplyCooldown(player,cooldown2) + B.ApplyCooldown(player,cooldown2) player.nobombjump = true for n = 0, 4 local bomb = B.throwbomb(mo) @@ -91,17 +93,41 @@ B.Action.CombatRoll = function(mo,doaction) end player.actiontime = 0 player.actionstate = 0 - end - - //Reset state - if not(drop_state or thrust_state or (mo.eflags & MFE_SPRUNG)) + elseif player.actionstate == 1 + and not bouncing + or mo.eflags & MFE_SPRUNG then player.actiontime = 0 player.actionstate = 0 - else //Afterimage - player.actiontime = $+1 - if player.actiontime%8 + end + + if sliding then + if grounded then + player.actiontime = $-1 + end + if leveltime%8 then + print("ghost") P_SpawnGhostMobj(mo) end + + if player.pflags & PF_JUMPED then + player.actionstate = 0 + player.actiontime = 0 + return + end + + player.pflags = ($|PF_SPINNING) & ~(PF_THOKKED|PF_JUMPED|PF_BOUNCING) + + if mo.eflags & MFE_JUSTHITFLOOR or mo.eflags & MFE_SPRUNG then + print("hit floor or sprung") + mo.state = S_FANG_SLIDE + end + + if player.actiontime == 0 then + mo.state = S_PLAY_STND + mo.momx = $/2 + mo.momy = $/2 + player.actionstate = 0 + end end end From cc497a7944cf1604ed59b9ab7fe0590c6237e369 Mon Sep 17 00:00:00 2001 From: Saxashitter Date: Sat, 18 Apr 2026 22:46:31 -0400 Subject: [PATCH 11/17] FANG: Slide just needs polish and balancing. Fixed PlayerThink action thingy. --- .../3-Player/Lib_ActionControl.lua | 2 +- .../3-Player/Special Moves/Lib_ActSlide.lua | 93 ++++++++++--------- .../6-Definitions/Def_SkinVars.lua | 2 +- 3 files changed, 52 insertions(+), 45 deletions(-) diff --git a/BattleMod/Lua/3-Functions/3-Player/Lib_ActionControl.lua b/BattleMod/Lua/3-Functions/3-Player/Lib_ActionControl.lua index 338a983..f40c697 100644 --- a/BattleMod/Lua/3-Functions/3-Player/Lib_ActionControl.lua +++ b/BattleMod/Lua/3-Functions/3-Player/Lib_ActionControl.lua @@ -64,7 +64,7 @@ B.MasterActionScript = function(player,doaction,type) end if special ~= nil then - S[t].special(mo,doaction) + special(mo,doaction) --For custom characters if player.spendrings == 1 then if not(spendringwarning) then diff --git a/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua b/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua index 1f8b73b..9a5d6d9 100644 --- a/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua +++ b/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua @@ -2,26 +2,11 @@ local B = CBW_Battle local cooldown = TICRATE * 2 local cooldown2 = TICRATE * 5 local duration = 3 * TICRATE -local xythrust = 38 +local xythrust = 20 local zthrust = 9 local dropspeed = 20 local nojumpwindow = 10 -B.Action.Slide_PlayerThink = function(mo) - local player = mo.player - - local grounded = P_IsObjectOnGround(mo) or mo.eflags & MFE_JUSTHITFLOOR - local bouncing = player.pflags&PF_BOUNCING - local activate = player.actiontime == 0 and doaction == 1 - local slide_trigger = activate and not(bouncing) - local springdrop_trigger = activate and bouncing - local drop_state = player.actionstate == 1 and bouncing - and P_MobjFlip(mo)*mo.momz < 0 - local sliding = player.actionstate == 2 - and player.pflags & PF_SPINNING - -end - B.Action.Slide = function(mo,doaction) local player = mo.player @@ -47,12 +32,15 @@ B.Action.Slide = function(mo,doaction) //Perform Thrust if slide_trigger -- thrust player forward - local speed = max(xythrust * mo.scale, FixedHypot(mo.momx - player.cmomx, mo.momy - player.cmomy) * 3 / 2) + local speed = max(xythrust * mo.scale, FixedHypot(mo.momx - player.cmomx, mo.momy - player.cmomy) * 5 / 4) B.PayRings(player) B.ApplyCooldown(player, cooldown2) P_InstaThrust(mo, mo.angle, speed) + player.slidebouncex = mo.momx + player.slidebouncey = mo.momy + player.slidebouncez = abs(mo.momz) player.pflags = ($|PF_SPINNING) & ~(PF_THOKKED|PF_JUMPED|PF_BOUNCING) player.actionstate = 2 player.actiontime = duration @@ -94,8 +82,8 @@ B.Action.Slide = function(mo,doaction) player.actiontime = 0 player.actionstate = 0 elseif player.actionstate == 1 - and not bouncing - or mo.eflags & MFE_SPRUNG then + and (not bouncing + or mo.eflags & MFE_SPRUNG) then player.actiontime = 0 player.actionstate = 0 end @@ -105,7 +93,6 @@ B.Action.Slide = function(mo,doaction) player.actiontime = $-1 end if leveltime%8 then - print("ghost") P_SpawnGhostMobj(mo) end @@ -118,17 +105,35 @@ B.Action.Slide = function(mo,doaction) player.pflags = ($|PF_SPINNING) & ~(PF_THOKKED|PF_JUMPED|PF_BOUNCING) if mo.eflags & MFE_JUSTHITFLOOR or mo.eflags & MFE_SPRUNG then - print("hit floor or sprung") mo.state = S_FANG_SLIDE end + if mo.eflags & MFE_JUSTHITFLOOR then + if player.slidebouncez >= 10 * mo.scale then + P_SetObjectMomZ(mo, player.slidebouncez/2) + end + mo.momx = player.slidebouncex + mo.momy = player.slidebouncey + end - if player.actiontime == 0 then + player.slidebouncex = mo.momx + player.slidebouncey = mo.momy + player.slidebouncez = abs(mo.momz) + + if player.actiontime == 0 + or FixedHypot(mo.momx - player.cmomx, mo.momy - player.cmomy) < 4 * mo.scale + or player.powers[pw_carry] then mo.state = S_PLAY_STND mo.momx = $/2 mo.momy = $/2 + player.pflags = $ & ~PF_SPINNING player.actionstate = 0 end end + + if not player.actionstate then + -- for some reason this is being set to 9 upon spawn. why is it doing that + player.actiontime = 0 + end end local function fanghop(player) @@ -143,58 +148,60 @@ local function fanghop(player) player.powers[pw_nocontrol] = 16 end -local function iscombatroll(player) +local function isSlide(player) if not (player and player.valid and player.playerstate == PST_LIVE) - or not player.mo - or not (player.actiontime and player.mo.state == S_PLAY_ROLL) - or not player.mo.health + or not player.mo + or not player.mo.health + or player.actionstate ~= 2 then return false end return true end B.Fang_PreCollide = function(n1,n2,plr,mo,atk,def,weight,hurt,pain,ground,angle,thrust,thrust2,collisiontype) - if iscombatroll(plr[n1]) + if isSlide(plr[n1]) then plr[n1].fangmarker = true end end B.Fang_PostCollide = function(n1,n2,plr,mo,atk,def,weight,hurt,pain,ground,angle,thrust,thrust2,collisiontype) - if plr[n1] and plr[n1].fangmarker + if plr[n1] and plr[n1].fangmarker then plr[n1].fangmarker = nil end end B.Fang_Collide = function(n1,n2,plr,mo,atk,def,weight,hurt,pain,ground,angle,thrust,thrust2,collisiontype) - if not (plr[n1] and plr[n1].fangmarker) + if not (plr[n1] and plr[n1].fangmarker) then return false end - if (hurt != 1 and n1 == 1) or (hurt != -1 and n1 == 2) - if not (plr[n2] and plr[n2].fangmarker) - fanghop(plr[n1]) - end - if plr[n2] - B.DoPlayerTumble(plr[n2], 24, angle[n1], mo[n1].scale*3, true, true) + + if (hurt != 1 and n1 == 1) or (hurt != -1 and n1 == 2) then + mo[n1].momx = $/3 + mo[n1].momy = $/3 + + if plr[n2] then + B.DoPlayerTumble(plr[n2], 50, angle[n1], mo[n1].scale*3, true, true) end - P_InstaThrust(mo[n2], angle[n2], mo[n1].scale * 5) - B.ZLaunch(mo[n2], 7 * mo[n2].scale, false) + + P_InstaThrust(mo[n2], angle[n2], -mo[n1].scale * 5) + B.ZLaunch(mo[n2], 10 * mo[n2].scale, false) return true end end -B.Action.CombatRoll_Priority = function(player) +B.Action.Slide_Priority = function(player) local mo = player.mo if not (mo and mo.valid) return end local bouncing = player.pflags&PF_BOUNCING local drop_state = player.actionstate == 1 and bouncing and P_MobjFlip(mo)*mo.momz < 0 - local thrust_state = player.actiontime and mo.state == S_PLAY_ROLL - and not(P_IsObjectOnGround(mo)) and player.actiontime < 20 + local sliding = player.actionstate == 2 + and player.actiontime - if player.actionstate == 1 + if player.actionstate == 1 then B.SetPriority(player,0,1,"fang_springdrop",2,3,"spring drop") - elseif player.actionstate == 2 - B.SetPriority(player,1,1,nil,1,1,"combat roll") + elseif player.actionstate == 2 then + B.SetPriority(player,0,1,nil,0,1,"fang slide") end end \ No newline at end of file diff --git a/BattleMod/Lua/3-Functions/6-Definitions/Def_SkinVars.lua b/BattleMod/Lua/3-Functions/6-Definitions/Def_SkinVars.lua index ed9be55..b34c814 100644 --- a/BattleMod/Lua/3-Functions/6-Definitions/Def_SkinVars.lua +++ b/BattleMod/Lua/3-Functions/6-Definitions/Def_SkinVars.lua @@ -79,7 +79,7 @@ S["fang"] = { weight = 100, special = Act.Slide, guard_frame = 1, - func_priority_ext = Act.CombatRoll_Priority, + func_priority_ext = Act.Slide_Priority, func_precollide = B.Fang_PreCollide, func_collide = B.Fang_Collide, func_postcollide = B.Fang_PostCollide, From 0e17f91e08a54b3fb7990392f23da4f8bf463067 Mon Sep 17 00:00:00 2001 From: Saxashitter Date: Sun, 19 Apr 2026 00:17:52 -0400 Subject: [PATCH 12/17] FANG: Allow for spin-jumping out of slide.* --- .../3-Player/Special Moves/Lib_ActSlide.lua | 17 +++++++++++++++++ BattleMod/Lua/4-Hooks/Exec_Player.lua | 1 + 2 files changed, 18 insertions(+) diff --git a/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua b/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua index 9a5d6d9..49eea1f 100644 --- a/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua +++ b/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua @@ -1,4 +1,5 @@ local B = CBW_Battle +local S = B.SkinVars local cooldown = TICRATE * 2 local cooldown2 = TICRATE * 5 local duration = 3 * TICRATE @@ -204,4 +205,20 @@ B.Action.Slide_Priority = function(player) elseif player.actionstate == 2 then B.SetPriority(player,0,1,nil,0,1,"fang slide") end +end + +B.Fang_SlideJump = function(player) + local mo = player.mo + if not (mo and mo.valid) then return end + + local skin = S[mo.skin] + + if skin.special ~= B.Action.Slide then print("doesnt work") return end + if player.actionstate ~= 2 then return end + if not P_IsObjectOnGround(mo) then return end + + P_DoJump(player) + player.mo.state = S_PLAY_ROLL + player.pflags = $ & ~PF_NOJUMPDAMAGE + return true end \ No newline at end of file diff --git a/BattleMod/Lua/4-Hooks/Exec_Player.lua b/BattleMod/Lua/4-Hooks/Exec_Player.lua index 0e38e2d..26b4747 100644 --- a/BattleMod/Lua/4-Hooks/Exec_Player.lua +++ b/BattleMod/Lua/4-Hooks/Exec_Player.lua @@ -120,6 +120,7 @@ addHook("JumpSpecial",function(player) if (player.powers[pw_carry]) or player.battlespawning then return end if B.TwinSpinJump(player) then return true end if B.RingSparkCheck(player) then return true end + if B.Fang_SlideJump(player) then return true end end) addHook("SpinSpecial",function(player) From dcbf9fa4c5aac00f9beda9c5d840841385f2bd07 Mon Sep 17 00:00:00 2001 From: Saxashitter Date: Sun, 19 Apr 2026 21:21:08 -0400 Subject: [PATCH 13/17] FANG: Re-added missing states, Fang can shoot corks from sliding BUG: Fang can not keep sliding after hitting a spring... --- .../2-Specials/Info_ActSlide.lua | 65 ++++++++++++++++++- .../Lua/3-Functions/3-Player/Lib_Popgun.lua | 23 +++++-- .../3-Player/Special Moves/Lib_ActSlide.lua | 13 +++- 3 files changed, 95 insertions(+), 6 deletions(-) diff --git a/BattleMod/Lua/2-MobjStateInfo/2-Specials/Info_ActSlide.lua b/BattleMod/Lua/2-MobjStateInfo/2-Specials/Info_ActSlide.lua index 3aea167..7cf6c78 100644 --- a/BattleMod/Lua/2-MobjStateInfo/2-Specials/Info_ActSlide.lua +++ b/BattleMod/Lua/2-MobjStateInfo/2-Specials/Info_ActSlide.lua @@ -1,4 +1,13 @@ -freeslot("S_FANG_SLIDE") +freeslot( + 'spr_flob', + 's_fangchar_lob1', + 's_fangchar_lob2', + 's_fangchar_lob3', + 's_fang_slide', + 'spr_cbom', + 's_colorbomb1', + 's_colorbomb2' +) states[S_FANG_SLIDE] = { sprite = SPR_PLAY, @@ -6,4 +15,58 @@ states[S_FANG_SLIDE] = { tics = -1, nextstate = S_PLAY_STND, action = function(mo) mo.player.panim = PA_ROLL end +} + +//Fang lob animation +states[S_FANGCHAR_LOB1] = { + sprite = SPR_FLOB, + frame = A +} + +states[S_FANGCHAR_LOB2] = { + sprite = SPR_FLOB, + frame = B +} + +states[S_FANGCHAR_LOB3] = { + sprite = SPR_FLOB, + frame = C +} + +//overwritting some bomb states to prevent it from using A_GhostMe +states[S_FBOMB1] = { + sprite = SPR_FBOM, + frame = A, + tics = 1, + nextstate = S_FBOMB2 +} + +states[S_FBOMB2] = { + sprite = SPR_FBOM, + frame = B, + tics = 1, + nextstate = S_FBOMB1 +} + +//Fang's team-colored bomb + +states[S_COLORBOMB1] = { + sprite = SPR_CBOM, + frame = A, + tics = 1, + nextstate = S_COLORBOMB2 +} + +states[S_COLORBOMB2] = { + sprite = SPR_CBOM, + frame = B, + tics = 1, + nextstate = S_COLORBOMB1 +} + +states[S_FBOMB_EXPL2] = { + sprite = SPR_BARX, + frame = 1|FF_FULLBRIGHT, + tics = 2, + nextstate = S_FBOMB_EXPL3 } \ No newline at end of file diff --git a/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua b/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua index 38b81b4..10da4b6 100644 --- a/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua +++ b/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua @@ -1,6 +1,7 @@ //Original scripts by TehRealSalt, modified by CobaltBW local B = CBW_Battle +local S = B.SkinVars local refiretime = 18 @@ -92,14 +93,18 @@ end local function newGunslinger(player) local mo = player.mo + local skin = S[mo.skin] or S[-1] local onground = P_IsObjectOnGround(mo) local canstand = true + + local sliding = skin.special == B.Action.Slide + and player.actionstate == 2 //State: ready to gunsling if not ((player.pflags & (PF_SLIDING|PF_BOUNCING|PF_THOKKED)) or (player.exiting) or (P_PlayerInPain(player))) and not (player.weapondelay) and not (player.panim == PA_ABILITY2) - and (player.pflags&PF_JUMPED or onground) + and (player.pflags&PF_JUMPED or onground or sliding) then -- Same code as vanilla, but without the clause for speed. -- You naturally lose your speed via friction. -- v10 EDIT: Now Fang automatically looks towards lockons @@ -126,6 +131,12 @@ local function newGunslinger(player) and (player.buttonhistory&BT_SPIN) local bullet = nil + if sliding then + player.actionstate = 0 + player.actiontime = 0 + player.pflags = $ & ~PF_SPINNING + end + mo.state = S_PLAY_FIRE player.panim = PA_ABILITY2 player.weapondelay = refiretime @@ -158,7 +169,7 @@ local function newGunslinger(player) if (bullet and bullet.valid) -- bullet.flags = $1 & ~MF_NOGRAVITY - local speed = max(35 * mo.scale, FixedHypot(mo.momx - player.cmomx, mo.momy - player.cmomy) * 6 / 4) + local speed = max(45 * mo.scale, FixedHypot(mo.momx - player.cmomx, mo.momy - player.cmomy) * 3 / 4) local angle = R_PointToAngle2(0, 0, bullet.momx, bullet.momy) local aiming = R_PointToAngle2(0, 0, FixedHypot(bullet.momx, bullet.momy), bullet.momz) @@ -253,11 +264,15 @@ B.CustomGunslinger = function(player) player.airgun = false return end + local skin = S[player.mo.skin] or S[-1] + local sliding = skin.special == B.Action.Slide + and player.actionstate == 2 + //Unable to use gun during certain states if player.powers[pw_nocontrol] or player.powers[pw_carry] - or player.actionstate - or player.pflags&PF_SPINNING + or (player.actionstate and not sliding) + or (player.pflags&PF_SPINNING and not sliding) player.airgun = false return end //Get inputs diff --git a/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua b/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua index 49eea1f..884e60a 100644 --- a/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua +++ b/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua @@ -22,6 +22,15 @@ B.Action.Slide = function(mo,doaction) local sliding = player.actionstate == 2 and player.actiontime + -- hax + if mo._lastactionstate == 2 + and player.actionstate == 0 + and player.actiontime + and mo.eflags & MFE_SPRUNG then + print("uhuh") + player.actionstate = 2 + end + //Properties player.actiontext = "Slide" player.actionrings = 5 @@ -119,6 +128,7 @@ B.Action.Slide = function(mo,doaction) player.slidebouncex = mo.momx player.slidebouncey = mo.momy player.slidebouncez = abs(mo.momz) + mo.angle = player.drawangle if player.actiontime == 0 or FixedHypot(mo.momx - player.cmomx, mo.momy - player.cmomy) < 4 * mo.scale @@ -135,6 +145,7 @@ B.Action.Slide = function(mo,doaction) -- for some reason this is being set to 9 upon spawn. why is it doing that player.actiontime = 0 end + mo._lastactionstate = player.actionstate -- dumb hack to fix the sliding springing thingy end local function fanghop(player) @@ -213,7 +224,7 @@ B.Fang_SlideJump = function(player) local skin = S[mo.skin] - if skin.special ~= B.Action.Slide then print("doesnt work") return end + if skin.special ~= B.Action.Slide then return end if player.actionstate ~= 2 then return end if not P_IsObjectOnGround(mo) then return end From 98fc9074d1ea8b58c689da0d8cccad4a6bded768 Mon Sep 17 00:00:00 2001 From: Saxashitter Date: Sun, 19 Apr 2026 22:24:08 -0400 Subject: [PATCH 14/17] FANG: Slide mid-air bounces you back. --- .../3-Player/Lib_PlayerControl.lua | 5 ++- .../3-Player/Special Moves/Lib_ActSlide.lua | 38 ++++++++++++------- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/BattleMod/Lua/3-Functions/3-Player/Lib_PlayerControl.lua b/BattleMod/Lua/3-Functions/3-Player/Lib_PlayerControl.lua index 20d0ba3..9a15e09 100644 --- a/BattleMod/Lua/3-Functions/3-Player/Lib_PlayerControl.lua +++ b/BattleMod/Lua/3-Functions/3-Player/Lib_PlayerControl.lua @@ -132,8 +132,11 @@ end B.ResetPlayerProperties = function(player,jumped,thokked) local mo = player.mo + local skin = S[mo.skin] or S[-1] + if not(mo) then return end - if mo.eflags&MFE_SPRUNG then + if mo.eflags&MFE_SPRUNG + and not (player.actionsuper == true and skin.special == B.Action.Slide and player.actionstate == 2) then -- HYPER SPECIFIC USECASE player.actionstate = 0 player.actiontime = 0 player.mo.tics = 0 diff --git a/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua b/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua index 884e60a..5407acf 100644 --- a/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua +++ b/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua @@ -22,15 +22,6 @@ B.Action.Slide = function(mo,doaction) local sliding = player.actionstate == 2 and player.actiontime - -- hax - if mo._lastactionstate == 2 - and player.actionstate == 0 - and player.actiontime - and mo.eflags & MFE_SPRUNG then - print("uhuh") - player.actionstate = 2 - end - //Properties player.actiontext = "Slide" player.actionrings = 5 @@ -99,6 +90,8 @@ B.Action.Slide = function(mo,doaction) end if sliding then + player.actionsuper = true + if grounded then player.actiontime = $-1 end @@ -109,6 +102,7 @@ B.Action.Slide = function(mo,doaction) if player.pflags & PF_JUMPED then player.actionstate = 0 player.actiontime = 0 + player.actionsuper = false return end @@ -125,6 +119,11 @@ B.Action.Slide = function(mo,doaction) mo.momy = player.slidebouncey end + -- custom friction + local fric = FU - FU / 150 + mo.momx = FixedMul($, fric) + mo.momy = FixedMul($, fric) + player.slidebouncex = mo.momx player.slidebouncey = mo.momy player.slidebouncez = abs(mo.momz) @@ -138,14 +137,15 @@ B.Action.Slide = function(mo,doaction) mo.momy = $/2 player.pflags = $ & ~PF_SPINNING player.actionstate = 0 + player.actionsuper = false end end if not player.actionstate then -- for some reason this is being set to 9 upon spawn. why is it doing that player.actiontime = 0 + player.actionsuper = false end - mo._lastactionstate = player.actionstate -- dumb hack to fix the sliding springing thingy end local function fanghop(player) @@ -188,15 +188,27 @@ B.Fang_Collide = function(n1,n2,plr,mo,atk,def,weight,hurt,pain,ground,angle,thr end if (hurt != 1 and n1 == 1) or (hurt != -1 and n1 == 2) then - mo[n1].momx = $/3 - mo[n1].momy = $/3 + if P_IsObjectOnGround(mo[n1]) then + mo[n1].momx = $/3 + mo[n1].momy = $/3 + else + P_InstaThrust(mo[n1], angle[n2], -10 * mo[n1].scale) + P_SetObjectMomZ(mo[n1], 8 * mo[n1].scale) + mo[n1].angle = angle[n2] + plr[n1].drawangle = angle[n2] + plr[n1].actionstate = 0 + plr[n1].actiontime = 0 + plr[n1].pflags = ($|PF_JUMPED) & ~PF_SPINNING + plr[n1].mo.state = S_PLAY_FALL + plr[n1].lockjumpframe = 0 + end if plr[n2] then B.DoPlayerTumble(plr[n2], 50, angle[n1], mo[n1].scale*3, true, true) end P_InstaThrust(mo[n2], angle[n2], -mo[n1].scale * 5) - B.ZLaunch(mo[n2], 10 * mo[n2].scale, false) + B.ZLaunch(mo[n2], 13 * mo[n2].scale, false) return true end end From 005a00a511c355974058eaa218448570d3a57906 Mon Sep 17 00:00:00 2001 From: Saxashitter Date: Sun, 19 Apr 2026 23:35:55 -0400 Subject: [PATCH 15/17] Fix error at line 135 (mo invalid) --- BattleMod/Lua/3-Functions/3-Player/Lib_PlayerControl.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BattleMod/Lua/3-Functions/3-Player/Lib_PlayerControl.lua b/BattleMod/Lua/3-Functions/3-Player/Lib_PlayerControl.lua index 9a15e09..b568af0 100644 --- a/BattleMod/Lua/3-Functions/3-Player/Lib_PlayerControl.lua +++ b/BattleMod/Lua/3-Functions/3-Player/Lib_PlayerControl.lua @@ -132,7 +132,7 @@ end B.ResetPlayerProperties = function(player,jumped,thokked) local mo = player.mo - local skin = S[mo.skin] or S[-1] + local skin = (mo and mo.valid) and S[mo.skin] or S[-1] if not(mo) then return end if mo.eflags&MFE_SPRUNG From 6c208c0f43d66c6c6cf282b0c3d1203f440f6410 Mon Sep 17 00:00:00 2001 From: Saxashitter Date: Sun, 19 Apr 2026 23:38:25 -0400 Subject: [PATCH 16/17] FANG: Tighter friction for slide, fix frame-perfect jump bug --- .../3-Player/Special Moves/Lib_ActSlide.lua | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua b/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua index 5407acf..df0eca2 100644 --- a/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua +++ b/BattleMod/Lua/3-Functions/3-Player/Special Moves/Lib_ActSlide.lua @@ -94,7 +94,10 @@ B.Action.Slide = function(mo,doaction) if grounded then player.actiontime = $-1 + else + player.lockjumpframe = max(2, $) end + if leveltime%8 then P_SpawnGhostMobj(mo) end @@ -120,14 +123,13 @@ B.Action.Slide = function(mo,doaction) end -- custom friction - local fric = FU - FU / 150 + local fric = FU - FU / 100 mo.momx = FixedMul($, fric) mo.momy = FixedMul($, fric) player.slidebouncex = mo.momx player.slidebouncey = mo.momy player.slidebouncez = abs(mo.momz) - mo.angle = player.drawangle if player.actiontime == 0 or FixedHypot(mo.momx - player.cmomx, mo.momy - player.cmomy) < 4 * mo.scale @@ -192,13 +194,13 @@ B.Fang_Collide = function(n1,n2,plr,mo,atk,def,weight,hurt,pain,ground,angle,thr mo[n1].momx = $/3 mo[n1].momy = $/3 else - P_InstaThrust(mo[n1], angle[n2], -10 * mo[n1].scale) - P_SetObjectMomZ(mo[n1], 8 * mo[n1].scale) + P_InstaThrust(mo[n1], angle[n2], -15 * mo[n1].scale) + P_SetObjectMomZ(mo[n1], 13 * mo[n1].scale) mo[n1].angle = angle[n2] plr[n1].drawangle = angle[n2] plr[n1].actionstate = 0 plr[n1].actiontime = 0 - plr[n1].pflags = ($|PF_JUMPED) & ~PF_SPINNING + plr[n1].pflags = ($|PF_JUMPED|PF_STARTJUMP) & ~PF_SPINNING plr[n1].mo.state = S_PLAY_FALL plr[n1].lockjumpframe = 0 end From a718af059aa57dc69dc422a45133da25bbdac91a Mon Sep 17 00:00:00 2001 From: Lumyni <24883013+felixLumyni@users.noreply.github.com> Date: Sun, 19 Apr 2026 23:46:54 -0400 Subject: [PATCH 17/17] FANG: Ensure corks have 0 momz when not locked in funny way to say it --- BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua b/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua index 10da4b6..dc1ed24 100644 --- a/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua +++ b/BattleMod/Lua/3-Functions/3-Player/Lib_Popgun.lua @@ -175,7 +175,11 @@ local function newGunslinger(player) bullet.momx = P_ReturnThrustX(nil, angle, FixedMul(speed, cos(aiming))) bullet.momy = P_ReturnThrustY(nil, angle, FixedMul(speed, cos(aiming))) - bullet.momz = FixedMul(speed, sin(aiming)) + if (lockon and lockon.valid) then + bullet.momz = FixedMul(speed, sin(aiming)) + else + bullet.momz = 0 + end end player.drawangle = mo.angle