even with d7f10754b27fd216bf2180dff15639e39ec3bdeb. add injection list files from head at f68f6f6cbf56b3e4e43f27475763f1d15b6d7c67

This commit is contained in:
R2DLiu 2023-06-22 17:58:08 -04:00
commit 9421f0c56b
35 changed files with 6807 additions and 388 deletions

View file

@ -0,0 +1,81 @@
{
"Details": [
{
"InjectionAddress": "80068F30",
"Name": "PAL Toggle",
"Codetype": "Auto",
"Annotation": "External/PAL/Core/Character DAT Patcher.asm",
"Tags": ""
},
{
"InjectionAddress": "802F9A3C",
"Name": "PAL Toggle",
"Codetype": "Auto",
"Annotation": "External/PAL/Core/PAL Stock Icons.asm",
"Tags": ""
},
{
"InjectionAddress": "8010FC44",
"Name": "PAL Toggle",
"Codetype": "Auto",
"Annotation": "External/PAL/Core/Additional/DK_AerialUpB.asm",
"Tags": ""
},
{
"InjectionAddress": "8010FB64",
"Name": "PAL Toggle",
"Codetype": "Auto",
"Annotation": "External/PAL/Core/Additional/DK_GroundedUpB.asm",
"Tags": ""
},
{
"InjectionAddress": "800796E0",
"Name": "PAL Toggle",
"Codetype": "Auto",
"Annotation": "External/PAL/Core/Additional/DetectionHitboxes.asm",
"Tags": ""
},
{
"InjectionAddress": "801239A8",
"Name": "PAL Toggle",
"Codetype": "Auto",
"Annotation": "External/PAL/Core/Additional/ICs_FreezeGlitch.asm",
"Tags": ""
},
{
"InjectionAddress": "803CE4D4",
"Name": "PAL Toggle",
"Codetype": "Auto",
"Annotation": "External/PAL/Core/Additional/Samus_BombJump.asm",
"Tags": ""
},
{
"InjectionAddress": "802B7E54",
"Name": "PAL Toggle",
"Codetype": "Auto",
"Annotation": "External/PAL/Core/Additional/Samus_Extender1.asm",
"Tags": ""
},
{
"InjectionAddress": "802B808C",
"Name": "PAL Toggle",
"Codetype": "Auto",
"Annotation": "External/PAL/Core/Additional/Samus_Extender2.asm",
"Tags": ""
},
{
"InjectionAddress": "80266978",
"Name": "PAL Toggle",
"Codetype": "Auto",
"Annotation": "External/PAL/Indicators/PAL CSS Indicator.asm",
"Tags": ""
},
{
"InjectionAddress": "804DEC14",
"Name": "PAL Toggle",
"Codetype": "Auto",
"Annotation": "External/PAL/Toggle/PALToggleEnable.asm",
"Tags": ""
}
]
}

View file

@ -0,0 +1,32 @@
{
"Details": [
{
"InjectionAddress": "800C9A44",
"Name": "UCF Slippi",
"Codetype": "Auto",
"Annotation": "External/UCF 0.8/Logic/UCF DB.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "800998A4",
"Name": "UCF Slippi",
"Codetype": "Auto",
"Annotation": "External/UCF 0.8/Logic/UCF SD.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "800908F4",
"Name": "UCF Slippi",
"Codetype": "Auto",
"Annotation": "External/UCF 0.8/Logic/UCF Tumble.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "802662D0",
"Name": "UCF Slippi",
"Codetype": "Auto",
"Annotation": "External/UCF 0.8/Indicator/UCF Text.asm",
"Tags": ""
}
]
}

View file

@ -0,0 +1,67 @@
{
"Details": [
{
"InjectionAddress": "800D65EC",
"Name": "UCF Slippi",
"Codetype": "Auto",
"Annotation": "External/UCF 0.84/UCF/UCF DBOOC SquatRv Fix.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "800C9A44",
"Name": "UCF Slippi",
"Codetype": "Auto",
"Annotation": "External/UCF 0.84/UCF/UCF Dashback.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "8006B460",
"Name": "UCF Slippi",
"Codetype": "Auto",
"Annotation": "External/UCF 0.84/UCF/UCF Pad Buffer + 1.0 Cardinals.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "8008E54C",
"Name": "UCF Slippi",
"Codetype": "Auto",
"Annotation": "External/UCF 0.84/UCF/UCF SDI.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "8009A0B8",
"Name": "UCF Slippi",
"Codetype": "Auto",
"Annotation": "External/UCF 0.84/UCF/UCF Shield Drop Extended.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "800998A4",
"Name": "UCF Slippi",
"Codetype": "Auto",
"Annotation": "External/UCF 0.84/UCF/UCF Shield Drop.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "80093294",
"Name": "UCF Slippi",
"Codetype": "Auto",
"Annotation": "External/UCF 0.84/UCF/UCF Shield SDI.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "800908F4",
"Name": "UCF Slippi",
"Codetype": "Auto",
"Annotation": "External/UCF 0.84/UCF/UCF Tumble.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "802662D0",
"Name": "UCF Slippi",
"Codetype": "Auto",
"Annotation": "External/UCF 0.84/Indicator/UCF Text.asm",
"Tags": ""
}
]
}

View file

@ -0,0 +1,60 @@
{
"Details": [
{
"InjectionAddress": "800D65EC",
"Name": "UCF 0.84 Slippi",
"Codetype": "Auto",
"Annotation": "External/UCF 0.84/UCF/UCF DBOOC SquatRv Fix.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "800C9A44",
"Name": "UCF 0.84 Slippi",
"Codetype": "Auto",
"Annotation": "External/UCF 0.84/UCF/UCF Dashback.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "8006B460",
"Name": "UCF 0.84 Slippi",
"Codetype": "Auto",
"Annotation": "External/UCF 0.84/UCF/UCF Pad Buffer + 1.0 Cardinals.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "8008E54C",
"Name": "UCF 0.84 Slippi",
"Codetype": "Auto",
"Annotation": "External/UCF 0.84/UCF/UCF SDI.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "8009A0B8",
"Name": "UCF 0.84 Slippi",
"Codetype": "Auto",
"Annotation": "External/UCF 0.84/UCF/UCF Shield Drop Extended.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "800998A4",
"Name": "UCF 0.84 Slippi",
"Codetype": "Auto",
"Annotation": "External/UCF 0.84/UCF/UCF Shield Drop.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "80093294",
"Name": "UCF 0.84 Slippi",
"Codetype": "Auto",
"Annotation": "External/UCF 0.84/UCF/UCF Shield SDI.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "800908F4",
"Name": "UCF 0.84 Slippi",
"Codetype": "Auto",
"Annotation": "External/UCF 0.84/UCF/UCF Tumble.asm",
"Tags": "[affects-gameplay]"
}
]
}

View file

@ -0,0 +1,25 @@
{
"Details": [
{
"InjectionAddress": "800C9A44",
"Name": "UCF Slippi",
"Codetype": "Auto",
"Annotation": "External/UCF 0.8/Logic/UCF DB.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "800998A4",
"Name": "UCF Slippi",
"Codetype": "Auto",
"Annotation": "External/UCF 0.8/Logic/UCF SD.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "800908F4",
"Name": "UCF Slippi",
"Codetype": "Auto",
"Annotation": "External/UCF 0.8/Logic/UCF Tumble.asm",
"Tags": "[affects-gameplay]"
}
]
}

View file

@ -0,0 +1,382 @@
{
"Details": [
{
"InjectionAddress": "801BFA20",
"Name": "General",
"Codetype": "Auto",
"Annotation": "External/Boot to CSS/Boot To CSS.asm",
"Tags": ""
},
{
"InjectionAddress": "8015EE98",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "8015EDDC",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "80164B14",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "801648F4",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "8015EE4C",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "8015EE14",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "8015D968",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "8015D9D8",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "8017229C",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "801737B0",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "80164658",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "801644E8",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "8030490C",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "803044F0",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "803D4A48",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "803D4A4C",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "803D4A50",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "803D4A60",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "803D4A78",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "8015D94C",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "8015D984",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "8016B480",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "801B0A14",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "802641B0",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "80397878",
"Name": "General",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "801AF6F4",
"Name": "General",
"Codetype": "Auto",
"Annotation": "External/Skip Memcard Prompt/Skip Memcard Prompt.asm",
"Tags": ""
},
{
"InjectionAddress": "8025B8BC",
"Name": "General",
"Codetype": "Auto",
"Annotation": "External/LRAStart From SSS Goes to CSS/LRAStart From SSS Goes to CSS.asm",
"Tags": ""
},
{
"InjectionAddress": "803D4A70",
"Name": "General",
"Codetype": "Auto",
"Annotation": "External/Rumble Off/Rumble Off.asm",
"Tags": ""
},
{
"InjectionAddress": "800679BC",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Recording/ExtendPlayerBlock.asm",
"Tags": ""
},
{
"InjectionAddress": "803219EC",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Recording/FlushFrameBuffer.asm",
"Tags": ""
},
{
"InjectionAddress": "8016D884",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Recording/SendGameEnd.asm",
"Tags": ""
},
{
"InjectionAddress": "8016E74C",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Recording/SendGameInfo.asm",
"Tags": ""
},
{
"InjectionAddress": "8006DA34",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Recording/SendGamePostFrame.asm",
"Tags": ""
},
{
"InjectionAddress": "8006B0DC",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Recording/SendGamePreFrame.asm",
"Tags": ""
},
{
"InjectionAddress": "80005604",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Recording/ShouldRecord.asm",
"Tags": ""
},
{
"InjectionAddress": "8008D698",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Recording/GetLCancelStatus/GetLCancelStatus.asm",
"Tags": ""
},
{
"InjectionAddress": "8006C324",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Recording/GetLCancelStatus/ResetLCancelStatus.asm",
"Tags": ""
},
{
"InjectionAddress": "800055F8",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Common/GetIsFollower.asm",
"Tags": ""
},
{
"InjectionAddress": "8016D294",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Common/IncrementFrameIndex.asm",
"Tags": ""
},
{
"InjectionAddress": "801D460C",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Common/Preload Stadium Transformations/Core/GetPreloadedTransition.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "801D14C8",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Common/Preload Stadium Transformations/Core/Init isLoaded Bool.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "801D45EC",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Common/Preload Stadium Transformations/Core/Load Transformation.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "801D4F14",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Common/Preload Stadium Transformations/Core/Reset isLoaded.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "801D4610",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Common/Preload Stadium Transformations/Core/SkipNormalDecision1.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "801D4724",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Common/Preload Stadium Transformations/Core/SkipNormalDecision2.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "804DEC18",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Common/Preload Stadium Transformations/Toggle/PsPreloadToggleEnable.asm",
"Tags": ""
},
{
"InjectionAddress": "801C154C",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Common/Initialize Stage Data/Init Stage Data.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "80068EEC",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Common/Initialize Player Data/Init Player Data.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "800055F0",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Common/EXITransferBuffer/EXITransferBuffer.asm",
"Tags": ""
},
{
"InjectionAddress": "800055FC",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Common/Gecko/ProcessCodeList.asm",
"Tags": ""
},
{
"InjectionAddress": "80005600",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Common/ConsoleOverrides/SetGeckoStart.asm",
"Tags": ""
},
{
"InjectionAddress": "800AC5B8",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Common/NanaDeterminism/NanaDeterminism.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "801D24FC",
"Name": "Slippi Recording",
"Codetype": "Auto",
"Annotation": "Common/PSCameraIndependentMonitor/PSCameraIndependentMonitor.asm",
"Tags": "[affects-gameplay]"
}
]
}

View file

@ -0,0 +1,11 @@
{
"Details": [
{
"InjectionAddress": "80394A68",
"Name": "Crash Output",
"Codetype": "Auto",
"Annotation": "Debugging/AdditionalCrashInfo/AdditionalCrashInfo.asm",
"Tags": ""
}
]
}

View file

@ -0,0 +1,67 @@
{
"Details": [
{
"InjectionAddress": "801A5E90",
"Name": "Ledge Grab Limit",
"Codetype": "C2",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "8016EBD8",
"Name": "Ledge Grab Limit",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "801B0498",
"Name": "Ledge Grab Limit",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "801B05CC",
"Name": "Ledge Grab Limit",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "801B05C8",
"Name": "Ledge Grab Limit",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "80165C48",
"Name": "Ledge Grab Limit",
"Codetype": "C2",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "800DB880",
"Name": "Disable Wobbling",
"Codetype": "Auto",
"Annotation": "External/PreventWobbling/Init Wobble Count Air.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "800DBBD4",
"Name": "Disable Wobbling",
"Codetype": "Auto",
"Annotation": "External/PreventWobbling/Init Wobble Count Ground.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "8008F090",
"Name": "Disable Wobbling",
"Codetype": "Auto",
"Annotation": "External/PreventWobbling/Wobble Check.asm",
"Tags": "[affects-gameplay]"
}
]
}

View file

@ -0,0 +1,46 @@
{
"Details": [
{
"InjectionAddress": "801A5E90",
"Name": "Ledge Grab Limit",
"Codetype": "C2",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "8016EBD8",
"Name": "Ledge Grab Limit",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "801B0498",
"Name": "Ledge Grab Limit",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "801B05CC",
"Name": "Ledge Grab Limit",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "801B05C8",
"Name": "Ledge Grab Limit",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "80165C48",
"Name": "Ledge Grab Limit",
"Codetype": "C2",
"Annotation": "",
"Tags": ""
}
]
}

View file

@ -0,0 +1,16 @@
{
"Details": [
{
"InjectionAddress": "800DA9DC",
"Codetype": "Auto",
"Annotation": "",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "8008F090",
"Codetype": "Auto",
"Annotation": "",
"Tags": "[affects-gameplay]"
}
]
}

View file

@ -0,0 +1,25 @@
{
"Details": [
{
"InjectionAddress": "800DB880",
"Name": "Disable Wobbling",
"Codetype": "Auto",
"Annotation": "External/PreventWobbling/Init Wobble Count Air.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "800DBBD4",
"Name": "Disable Wobbling",
"Codetype": "Auto",
"Annotation": "External/PreventWobbling/Init Wobble Count Ground.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "8008F090",
"Name": "Disable Wobbling",
"Codetype": "Auto",
"Annotation": "External/PreventWobbling/Wobble Check.asm",
"Tags": "[affects-gameplay]"
}
]
}

View file

@ -0,0 +1,25 @@
{
"Details": [
{
"InjectionAddress": "801A4DA0",
"Name": "Polling Drift Fix",
"Codetype": "C2",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "801A4DB4",
"Name": "Polling Drift Fix",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "80019860",
"Name": "Polling Drift Fix",
"Codetype": "04",
"Annotation": "",
"Tags": ""
}
]
}

View file

@ -0,0 +1,53 @@
{
"Details": [
{
"InjectionAddress": "801A4D98",
"Name": "Polling Drift + Half Visual Buffer Fixes",
"Codetype": "C2",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "801A5050",
"Name": "Polling Drift + Half Visual Buffer Fixes",
"Codetype": "C2",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "801A4BEC",
"Name": "Polling Drift + Half Visual Buffer Fixes",
"Codetype": "C2",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "80158268",
"Name": "Polling Drift + Half Visual Buffer Fixes",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "8034EB60",
"Name": "Polling Drift + Half Visual Buffer Fixes",
"Codetype": "C2",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "80397878",
"Name": "Polling Drift + Half Visual Buffer Fixes",
"Codetype": "04",
"Annotation": "",
"Tags": ""
},
{
"InjectionAddress": "801A4570",
"Name": "Polling Drift + Half Visual Buffer Fixes",
"Codetype": "Auto",
"Annotation": "External/Lag Reduction/Force HD/480pDeflickerOff.asm",
"Tags": ""
}
]
}

View file

@ -0,0 +1,109 @@
{
"Details": [
{
"InjectionAddress": "8016E510",
"Name": "Full friendlies codes",
"Codetype": "Auto",
"Annotation": "External/NeutralSpawn/NeutralSpawn.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "802FCCD8",
"Name": "Full friendlies codes",
"Codetype": "Auto",
"Annotation": "External/Hide Nametag When Invisible/Hide Nametag When Invisible.asm",
"Tags": ""
},
{
"InjectionAddress": "80261B1C",
"Name": "Full friendlies codes",
"Codetype": "Auto",
"Annotation": "External/Closing CSS Door Preserves Nametag/On Window Close/Skip Nametag ID Reset.asm",
"Tags": ""
},
{
"InjectionAddress": "80261B30",
"Name": "Full friendlies codes",
"Codetype": "Auto",
"Annotation": "External/Closing CSS Door Preserves Nametag/On Window Close/Skip isUsingNametag Bool Reset.asm",
"Tags": ""
},
{
"InjectionAddress": "802605FC",
"Name": "Full friendlies codes",
"Codetype": "Auto",
"Annotation": "External/Unplugging Closes CSS Door/Unplugging Closes CSS Door.asm",
"Tags": ""
},
{
"InjectionAddress": "804DC47C",
"Name": "Full friendlies codes",
"Codetype": "Auto",
"Annotation": "External/CSS Player Hands Default to HMN Button/Change Default Hand Position.asm",
"Tags": ""
},
{
"InjectionAddress": "80261A6C",
"Name": "Full friendlies codes",
"Codetype": "Auto",
"Annotation": "External/CSS Player Hands Default to HMN Button/Fix A Button Buffer When Exiting Name Entry.asm",
"Tags": ""
},
{
"InjectionAddress": "80266CE0",
"Name": "Full friendlies codes",
"Codetype": "Auto",
"Annotation": "External/Disable FoD During Doubles/Disable FoD During Doubles.asm",
"Tags": ""
},
{
"InjectionAddress": "802608D8",
"Name": "Full friendlies codes",
"Codetype": "Auto",
"Annotation": "External/Toggle Rumble From CSS/Toggle Rumble From CSS.asm",
"Tags": ""
},
{
"InjectionAddress": "80259B84",
"Name": "Full friendlies codes",
"Codetype": "Auto",
"Annotation": "External/Stage Striking/Random_Stage_Fix.asm",
"Tags": ""
},
{
"InjectionAddress": "80259C40",
"Name": "Full friendlies codes",
"Codetype": "Auto",
"Annotation": "External/Stage Striking/Stage_Striking.asm",
"Tags": ""
},
{
"InjectionAddress": "801A5B14",
"Name": "Full friendlies codes",
"Codetype": "Auto",
"Annotation": "External/Salty Runback/Salty Runback.asm",
"Tags": ""
},
{
"InjectionAddress": "80265220",
"Name": "Full friendlies codes",
"Codetype": "Auto",
"Annotation": "Common/Winners Names are Gold on CSS/Change Name Color.asm",
"Tags": ""
},
{
"InjectionAddress": "8016EA30",
"Name": "Full friendlies codes",
"Codetype": "Auto",
"Annotation": "Common/Winners Names are Gold on CSS/Remember Who LRA Started.asm",
"Tags": ""
},
{
"InjectionAddress": "8016EBAC",
"Name": "Full friendlies codes",
"Codetype": "Auto",
"Annotation": "Common/CSS KO Stars/Asign KO Stars Upon Exiting Dairantou.asm",
"Tags": ""
}
]
}

View file

@ -0,0 +1,39 @@
{
"Details": [
{
"InjectionAddress": "8016E510",
"Name": "Stealth tournament codes",
"Codetype": "Auto",
"Annotation": "External/NeutralSpawn/NeutralSpawn.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "802FCCD8",
"Name": "Stealth tournament codes",
"Codetype": "Auto",
"Annotation": "External/Hide Nametag When Invisible/Hide Nametag When Invisible.asm",
"Tags": ""
},
{
"InjectionAddress": "80261B1C",
"Name": "Stealth tournament codes",
"Codetype": "Auto",
"Annotation": "External/Closing CSS Door Preserves Nametag/On Window Close/Skip Nametag ID Reset.asm",
"Tags": ""
},
{
"InjectionAddress": "80261B30",
"Name": "Stealth tournament codes",
"Codetype": "Auto",
"Annotation": "External/Closing CSS Door Preserves Nametag/On Window Close/Skip isUsingNametag Bool Reset.asm",
"Tags": ""
},
{
"InjectionAddress": "802605FC",
"Name": "Stealth tournament codes",
"Codetype": "Auto",
"Annotation": "External/Unplugging Closes CSS Door/Unplugging Closes CSS Door.asm",
"Tags": ""
}
]
}

View file

@ -0,0 +1,81 @@
{
"Details": [
{
"InjectionAddress": "8016E510",
"Name": "Full tournament codes",
"Codetype": "Auto",
"Annotation": "External/NeutralSpawn/NeutralSpawn.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "802FCCD8",
"Name": "Full tournament codes",
"Codetype": "Auto",
"Annotation": "External/Hide Nametag When Invisible/Hide Nametag When Invisible.asm",
"Tags": ""
},
{
"InjectionAddress": "80261B1C",
"Name": "Full tournament codes",
"Codetype": "Auto",
"Annotation": "External/Closing CSS Door Preserves Nametag/On Window Close/Skip Nametag ID Reset.asm",
"Tags": ""
},
{
"InjectionAddress": "80261B30",
"Name": "Full tournament codes",
"Codetype": "Auto",
"Annotation": "External/Closing CSS Door Preserves Nametag/On Window Close/Skip isUsingNametag Bool Reset.asm",
"Tags": ""
},
{
"InjectionAddress": "802605FC",
"Name": "Full tournament codes",
"Codetype": "Auto",
"Annotation": "External/Unplugging Closes CSS Door/Unplugging Closes CSS Door.asm",
"Tags": ""
},
{
"InjectionAddress": "804DC47C",
"Name": "Full tournament codes",
"Codetype": "Auto",
"Annotation": "External/CSS Player Hands Default to HMN Button/Change Default Hand Position.asm",
"Tags": ""
},
{
"InjectionAddress": "80261A6C",
"Name": "Full tournament codes",
"Codetype": "Auto",
"Annotation": "External/CSS Player Hands Default to HMN Button/Fix A Button Buffer When Exiting Name Entry.asm",
"Tags": ""
},
{
"InjectionAddress": "80266CE0",
"Name": "Full tournament codes",
"Codetype": "Auto",
"Annotation": "External/Disable FoD During Doubles/Disable FoD During Doubles.asm",
"Tags": ""
},
{
"InjectionAddress": "802608D8",
"Name": "Full tournament codes",
"Codetype": "Auto",
"Annotation": "External/Toggle Rumble From CSS/Toggle Rumble From CSS.asm",
"Tags": ""
},
{
"InjectionAddress": "80259B84",
"Name": "Full tournament codes",
"Codetype": "Auto",
"Annotation": "External/Stage Striking/Random_Stage_Fix.asm",
"Tags": ""
},
{
"InjectionAddress": "80259C40",
"Name": "Full tournament codes",
"Codetype": "Auto",
"Annotation": "External/Stage Striking/Stage_Striking.asm",
"Tags": ""
}
]
}

View file

@ -0,0 +1,18 @@
{
"Details": [
{
"InjectionAddress": "8022F958",
"Name": "Tournament safety codes",
"Codetype": "Auto",
"Annotation": "External/FixedDamageRatio/SkipInputHandling.asm",
"Tags": ""
},
{
"InjectionAddress": "80167F40",
"Name": "Tournament safety codes",
"Codetype": "Auto",
"Annotation": "External/PreventPauseSoftLocks/ForcePauseOn.asm",
"Tags": ""
}
]
}

View file

@ -0,0 +1,95 @@
{
"Details": [
{
"InjectionAddress": "803BB05C",
"Name": "Optional: Widescreen 16:9",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Fix Screen Flash.asm",
"Tags": ""
},
{
"InjectionAddress": "8036A4A8",
"Name": "Optional: Widescreen 16:9",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Overwrite CObj Values.asm",
"Tags": ""
},
{
"InjectionAddress": "804DDB58",
"Name": "Optional: Widescreen 16:9",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Adjust Offscreen Scissor/Adjust Bubble Zoom.asm",
"Tags": ""
},
{
"InjectionAddress": "80086B24",
"Name": "Optional: Widescreen 16:9",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Adjust Offscreen Scissor/Draw High Poly Models.asm",
"Tags": ""
},
{
"InjectionAddress": "80030C7C",
"Name": "Optional: Widescreen 16:9",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Adjust Offscreen Scissor/Left Camera Bound.asm",
"Tags": ""
},
{
"InjectionAddress": "80030C88",
"Name": "Optional: Widescreen 16:9",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Adjust Offscreen Scissor/Right Camera Bound.asm",
"Tags": ""
},
{
"InjectionAddress": "804DDB30",
"Name": "Optional: Widescreen 16:9",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Adjust Offscreen Scissor/Fix Bubble Positions/Adjust Corner Value 1.asm",
"Tags": ""
},
{
"InjectionAddress": "804DDB34",
"Name": "Optional: Widescreen 16:9",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Adjust Offscreen Scissor/Fix Bubble Positions/Adjust Corner Value 2.asm",
"Tags": ""
},
{
"InjectionAddress": "804DDB2C",
"Name": "Optional: Widescreen 16:9",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Adjust Offscreen Scissor/Fix Bubble Positions/Extend Negative Vertical Bound.asm",
"Tags": ""
},
{
"InjectionAddress": "804DDB28",
"Name": "Optional: Widescreen 16:9",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Adjust Offscreen Scissor/Fix Bubble Positions/Extend Positive Vertical Bound.asm",
"Tags": ""
},
{
"InjectionAddress": "804DDB4C",
"Name": "Optional: Widescreen 16:9",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Adjust Offscreen Scissor/Fix Bubble Positions/Widen Bubble Region.asm",
"Tags": ""
},
{
"InjectionAddress": "802FCFC4",
"Name": "Optional: Widescreen 16:9",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Nametag Fixes/Adjust Nametag Background X Scale.asm",
"Tags": ""
},
{
"InjectionAddress": "804DDB84",
"Name": "Optional: Widescreen 16:9",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Nametag Fixes/Adjust Nametag Text X Scale.asm",
"Tags": ""
}
]
}

View file

@ -0,0 +1,102 @@
{
"Details": [
{
"InjectionAddress": "803BB05C",
"Name": "Optional: 16:9 -\u003e 73:60",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Fix Screen Flash.asm",
"Tags": ""
},
{
"InjectionAddress": "8036A4A8",
"Name": "Optional: 16:9 -\u003e 73:60",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Overwrite CObj Values.asm",
"Tags": ""
},
{
"InjectionAddress": "804DDB58",
"Name": "Optional: 16:9 -\u003e 73:60",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Adjust Offscreen Scissor/Adjust Bubble Zoom.asm",
"Tags": ""
},
{
"InjectionAddress": "80086B24",
"Name": "Optional: 16:9 -\u003e 73:60",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Adjust Offscreen Scissor/Draw High Poly Models.asm",
"Tags": ""
},
{
"InjectionAddress": "80030C7C",
"Name": "Optional: 16:9 -\u003e 73:60",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Adjust Offscreen Scissor/Left Camera Bound.asm",
"Tags": ""
},
{
"InjectionAddress": "80030C88",
"Name": "Optional: 16:9 -\u003e 73:60",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Adjust Offscreen Scissor/Right Camera Bound.asm",
"Tags": ""
},
{
"InjectionAddress": "804DDB30",
"Name": "Optional: 16:9 -\u003e 73:60",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Adjust Offscreen Scissor/Fix Bubble Positions/Adjust Corner Value 1.asm",
"Tags": ""
},
{
"InjectionAddress": "804DDB34",
"Name": "Optional: 16:9 -\u003e 73:60",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Adjust Offscreen Scissor/Fix Bubble Positions/Adjust Corner Value 2.asm",
"Tags": ""
},
{
"InjectionAddress": "804DDB2C",
"Name": "Optional: 16:9 -\u003e 73:60",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Adjust Offscreen Scissor/Fix Bubble Positions/Extend Negative Vertical Bound.asm",
"Tags": ""
},
{
"InjectionAddress": "804DDB28",
"Name": "Optional: 16:9 -\u003e 73:60",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Adjust Offscreen Scissor/Fix Bubble Positions/Extend Positive Vertical Bound.asm",
"Tags": ""
},
{
"InjectionAddress": "804DDB4C",
"Name": "Optional: 16:9 -\u003e 73:60",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Adjust Offscreen Scissor/Fix Bubble Positions/Widen Bubble Region.asm",
"Tags": ""
},
{
"InjectionAddress": "802FCFC4",
"Name": "Optional: 16:9 -\u003e 73:60",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Nametag Fixes/Adjust Nametag Background X Scale.asm",
"Tags": ""
},
{
"InjectionAddress": "804DDB84",
"Name": "Optional: 16:9 -\u003e 73:60",
"Codetype": "Auto",
"Annotation": "External/Widescreen/Nametag Fixes/Adjust Nametag Text X Scale.asm",
"Tags": ""
},
{
"InjectionAddress": "80302784",
"Name": "Optional: 16:9 -\u003e 73:60",
"Codetype": "Auto",
"Annotation": "External/WidescreenShutters/Add Shutters.asm",
"Tags": ""
}
]
}

View file

@ -0,0 +1,46 @@
{
"Details": [
{
"InjectionAddress": "8025A530",
"Name": "Frozen Stages",
"Codetype": "Auto",
"Annotation": "External/Frozen All/Blink SSS/EditColor.asm",
"Tags": ""
},
{
"InjectionAddress": "8025B718",
"Name": "Frozen Stages",
"Codetype": "Auto",
"Annotation": "External/Frozen All/Blink SSS/SavePointer.asm",
"Tags": ""
},
{
"InjectionAddress": "803E67E0",
"Name": "Frozen Stages",
"Codetype": "Auto",
"Annotation": "External/Frozen All/Core/1.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "8021AAE4",
"Name": "Frozen Stages",
"Codetype": "Auto",
"Annotation": "External/Frozen All/Core/2.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "801D1548",
"Name": "Frozen Stages",
"Codetype": "Auto",
"Annotation": "External/Frozen All/Core/3.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "801E3348",
"Name": "Frozen Stages",
"Codetype": "Auto",
"Annotation": "External/Frozen All/Core/4.asm",
"Tags": "[affects-gameplay]"
}
]
}

View file

@ -0,0 +1,32 @@
{
"Details": [
{
"InjectionAddress": "801D45FC",
"Name": "Frozen Stadium",
"Codetype": "Auto",
"Annotation": "External/Frozen PS/Core/FreezePokemon.asm",
"Tags": "[affects-gameplay]"
},
{
"InjectionAddress": "8025A530",
"Name": "Frozen Stadium",
"Codetype": "Auto",
"Annotation": "External/Frozen PS/PSBlinkBlue/PSEditColor.asm",
"Tags": ""
},
{
"InjectionAddress": "8025B718",
"Name": "Frozen Stadium",
"Codetype": "Auto",
"Annotation": "External/Frozen PS/PSBlinkBlue/SavePointer.asm",
"Tags": ""
},
{
"InjectionAddress": "804DEC1C",
"Name": "Frozen Stadium",
"Codetype": "Auto",
"Annotation": "External/Frozen PS/Toggle/FrzPkmToggleEnable.asm",
"Tags": ""
}
]
}

View file

@ -0,0 +1,32 @@
{
"Details": [
{
"InjectionAddress": "8015FDBC",
"Name": "Optional: Normal Functionality in Develop Mode (1.02)",
"Codetype": "Auto",
"Annotation": "External/NormalDevelopMode/Enable.asm",
"Tags": ""
},
{
"InjectionAddress": "8006AE90",
"Name": "Optional: Normal Functionality in Develop Mode (1.02)",
"Codetype": "Auto",
"Annotation": "External/NormalDevelopMode/NormalCStick1.asm",
"Tags": ""
},
{
"InjectionAddress": "800300A4",
"Name": "Optional: Normal Functionality in Develop Mode (1.02)",
"Codetype": "Auto",
"Annotation": "External/NormalDevelopMode/NormalCStick2.asm",
"Tags": ""
},
{
"InjectionAddress": "80089250",
"Name": "Optional: Normal Functionality in Develop Mode (1.02)",
"Codetype": "Auto",
"Annotation": "External/NormalDevelopMode/StaleMoves.asm",
"Tags": ""
}
]
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,11 @@
{
"Details": [
{
"InjectionAddress": "800056AC",
"Name": "Required: Slippi Online",
"Codetype": "Auto",
"Annotation": "Online/Static/ChatMessages.asm",
"Tags": ""
}
]
}

File diff suppressed because it is too large Load diff

View file

@ -805,364 +805,24 @@ void CEXISlippi::prepareGameInfo(u8* payload)
void CEXISlippi::prepareGeckoList()
{
// TODO: How do I move this somewhere else?
// This contains all of the codes required to play legacy replays (UCF, PAL, Frz Stadium)
static std::vector<u8> defaultCodeList = {
0xC2, 0x0C, 0x9A, 0x44, 0x00, 0x00, 0x00, 0x2F, // #External/UCF + Arduino Toggle UI/UCF/UCF
// 0.74 Dashback - Check for Toggle.asm
0xD0, 0x1F, 0x00, 0x2C, 0x88, 0x9F, 0x06, 0x18, 0x38, 0x62, 0xF2, 0x28, 0x7C, 0x63, 0x20,
0xAE, 0x2C, 0x03, 0x00, 0x01, 0x41, 0x82, 0x00, 0x14, 0x38, 0x62, 0xF2, 0x2C, 0x7C, 0x63,
0x20, 0xAE, 0x2C, 0x03, 0x00, 0x01, 0x40, 0x82, 0x01, 0x50, 0x7C, 0x08, 0x02, 0xA6, 0x90,
0x01, 0x00, 0x04, 0x94, 0x21, 0xFF, 0x50, 0xBE, 0x81, 0x00, 0x08, 0x48, 0x00, 0x01, 0x21,
0x7F, 0xC8, 0x02, 0xA6, 0xC0, 0x3F, 0x08, 0x94, 0xC0, 0x5E, 0x00, 0x00, 0xFC, 0x01, 0x10,
0x40, 0x40, 0x82, 0x01, 0x18, 0x80, 0x8D, 0xAE, 0xB4, 0xC0, 0x3F, 0x06, 0x20, 0xFC, 0x20,
0x0A, 0x10, 0xC0, 0x44, 0x00, 0x3C, 0xFC, 0x01, 0x10, 0x40, 0x41, 0x80, 0x01, 0x00, 0x88,
0x7F, 0x06, 0x70, 0x2C, 0x03, 0x00, 0x02, 0x40, 0x80, 0x00, 0xF4, 0x88, 0x7F, 0x22, 0x1F,
0x54, 0x60, 0x07, 0x39, 0x40, 0x82, 0x00, 0xE8, 0x3C, 0x60, 0x80, 0x4C, 0x60, 0x63, 0x1F,
0x78, 0x8B, 0xA3, 0x00, 0x01, 0x38, 0x7D, 0xFF, 0xFE, 0x88, 0x9F, 0x06, 0x18, 0x48, 0x00,
0x00, 0x8D, 0x7C, 0x7C, 0x1B, 0x78, 0x7F, 0xA3, 0xEB, 0x78, 0x88, 0x9F, 0x06, 0x18, 0x48,
0x00, 0x00, 0x7D, 0x7C, 0x7C, 0x18, 0x50, 0x7C, 0x63, 0x19, 0xD6, 0x2C, 0x03, 0x15, 0xF9,
0x40, 0x81, 0x00, 0xB0, 0x38, 0x00, 0x00, 0x01, 0x90, 0x1F, 0x23, 0x58, 0x90, 0x1F, 0x23,
0x40, 0x80, 0x9F, 0x00, 0x04, 0x2C, 0x04, 0x00, 0x0A, 0x40, 0xA2, 0x00, 0x98, 0x88, 0x7F,
0x00, 0x0C, 0x38, 0x80, 0x00, 0x01, 0x3D, 0x80, 0x80, 0x03, 0x61, 0x8C, 0x41, 0x8C, 0x7D,
0x89, 0x03, 0xA6, 0x4E, 0x80, 0x04, 0x21, 0x2C, 0x03, 0x00, 0x00, 0x41, 0x82, 0x00, 0x78,
0x80, 0x83, 0x00, 0x2C, 0x80, 0x84, 0x1E, 0xCC, 0xC0, 0x3F, 0x00, 0x2C, 0xD0, 0x24, 0x00,
0x18, 0xC0, 0x5E, 0x00, 0x04, 0xFC, 0x01, 0x10, 0x40, 0x41, 0x81, 0x00, 0x0C, 0x38, 0x60,
0x00, 0x80, 0x48, 0x00, 0x00, 0x08, 0x38, 0x60, 0x00, 0x7F, 0x98, 0x64, 0x00, 0x06, 0x48,
0x00, 0x00, 0x48, 0x7C, 0x85, 0x23, 0x78, 0x38, 0x63, 0xFF, 0xFF, 0x2C, 0x03, 0x00, 0x00,
0x40, 0x80, 0x00, 0x08, 0x38, 0x63, 0x00, 0x05, 0x3C, 0x80, 0x80, 0x46, 0x60, 0x84, 0xB1,
0x08, 0x1C, 0x63, 0x00, 0x30, 0x7C, 0x84, 0x1A, 0x14, 0x1C, 0x65, 0x00, 0x0C, 0x7C, 0x84,
0x1A, 0x14, 0x88, 0x64, 0x00, 0x02, 0x7C, 0x63, 0x07, 0x74, 0x4E, 0x80, 0x00, 0x20, 0x4E,
0x80, 0x00, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBA, 0x81, 0x00, 0x08,
0x80, 0x01, 0x00, 0xB4, 0x38, 0x21, 0x00, 0xB0, 0x7C, 0x08, 0x03, 0xA6, 0x00, 0x00, 0x00,
0x00, 0xC2, 0x09, 0x98, 0xA4, 0x00, 0x00, 0x00,
0x2B, // #External/UCF + Arduino Toggle UI/UCF/UCF
// 0.74 Shield Drop - Check for Toggle.asm
0x7C, 0x08, 0x02, 0xA6, 0x90, 0x01, 0x00, 0x04, 0x94, 0x21, 0xFF, 0x50, 0xBE, 0x81, 0x00,
0x08, 0x7C, 0x7E, 0x1B, 0x78, 0x83, 0xFE, 0x00, 0x2C, 0x48, 0x00, 0x01, 0x01, 0x7F, 0xA8,
0x02, 0xA6, 0x88, 0x9F, 0x06, 0x18, 0x38, 0x62, 0xF2, 0x28, 0x7C, 0x63, 0x20, 0xAE, 0x2C,
0x03, 0x00, 0x01, 0x41, 0x82, 0x00, 0x14, 0x38, 0x62, 0xF2, 0x30, 0x7C, 0x63, 0x20, 0xAE,
0x2C, 0x03, 0x00, 0x01, 0x40, 0x82, 0x00, 0xF8, 0xC0, 0x3F, 0x06, 0x3C, 0x80, 0x6D, 0xAE,
0xB4, 0xC0, 0x03, 0x03, 0x14, 0xFC, 0x01, 0x00, 0x40, 0x40, 0x81, 0x00, 0xE4, 0xC0, 0x3F,
0x06, 0x20, 0x48, 0x00, 0x00, 0x71, 0xD0, 0x21, 0x00, 0x90, 0xC0, 0x3F, 0x06, 0x24, 0x48,
0x00, 0x00, 0x65, 0xC0, 0x41, 0x00, 0x90, 0xEC, 0x42, 0x00, 0xB2, 0xEC, 0x21, 0x00, 0x72,
0xEC, 0x21, 0x10, 0x2A, 0xC0, 0x5D, 0x00, 0x0C, 0xFC, 0x01, 0x10, 0x40, 0x41, 0x80, 0x00,
0xB4, 0x88, 0x9F, 0x06, 0x70, 0x2C, 0x04, 0x00, 0x03, 0x40, 0x81, 0x00, 0xA8, 0xC0, 0x1D,
0x00, 0x10, 0xC0, 0x3F, 0x06, 0x24, 0xFC, 0x00, 0x08, 0x40, 0x40, 0x80, 0x00, 0x98, 0xBA,
0x81, 0x00, 0x08, 0x80, 0x01, 0x00, 0xB4, 0x38, 0x21, 0x00, 0xB0, 0x7C, 0x08, 0x03, 0xA6,
0x80, 0x61, 0x00, 0x1C, 0x83, 0xE1, 0x00, 0x14, 0x38, 0x21, 0x00, 0x18, 0x38, 0x63, 0x00,
0x08, 0x7C, 0x68, 0x03, 0xA6, 0x4E, 0x80, 0x00, 0x20, 0xFC, 0x00, 0x0A, 0x10, 0xC0, 0x3D,
0x00, 0x00, 0xEC, 0x00, 0x00, 0x72, 0xC0, 0x3D, 0x00, 0x04, 0xEC, 0x00, 0x08, 0x28, 0xFC,
0x00, 0x00, 0x1E, 0xD8, 0x01, 0x00, 0x80, 0x80, 0x61, 0x00, 0x84, 0x38, 0x63, 0x00, 0x02,
0x3C, 0x00, 0x43, 0x30, 0xC8, 0x5D, 0x00, 0x14, 0x6C, 0x63, 0x80, 0x00, 0x90, 0x01, 0x00,
0x80, 0x90, 0x61, 0x00, 0x84, 0xC8, 0x21, 0x00, 0x80, 0xEC, 0x01, 0x10, 0x28, 0xC0, 0x3D,
0x00, 0x00, 0xEC, 0x20, 0x08, 0x24, 0x4E, 0x80, 0x00, 0x20, 0x4E, 0x80, 0x00, 0x21, 0x42,
0xA0, 0x00, 0x00, 0x37, 0x27, 0x00, 0x00, 0x43, 0x30, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00,
0xBF, 0x4C, 0xCC, 0xCD, 0x43, 0x30, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x7F, 0xC3, 0xF3,
0x78, 0x7F, 0xE4, 0xFB, 0x78, 0xBA, 0x81, 0x00, 0x08, 0x80, 0x01, 0x00, 0xB4, 0x38, 0x21,
0x00, 0xB0, 0x7C, 0x08, 0x03, 0xA6, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2,
0x16, 0xE7, 0x50, 0x00, 0x00, 0x00,
0x33, // #Common/StaticPatches/ToggledStaticOverwrites.asm
0x88, 0x62, 0xF2, 0x34, 0x2C, 0x03, 0x00, 0x00, 0x41, 0x82, 0x00, 0x14, 0x48, 0x00, 0x00,
0x75, 0x7C, 0x68, 0x02, 0xA6, 0x48, 0x00, 0x01, 0x3D, 0x48, 0x00, 0x00, 0x14, 0x48, 0x00,
0x00, 0x95, 0x7C, 0x68, 0x02, 0xA6, 0x48, 0x00, 0x01, 0x2D, 0x48, 0x00, 0x00, 0x04, 0x88,
0x62, 0xF2, 0x38, 0x2C, 0x03, 0x00, 0x00, 0x41, 0x82, 0x00, 0x14, 0x48, 0x00, 0x00, 0xB9,
0x7C, 0x68, 0x02, 0xA6, 0x48, 0x00, 0x01, 0x11, 0x48, 0x00, 0x00, 0x10, 0x48, 0x00, 0x00,
0xC9, 0x7C, 0x68, 0x02, 0xA6, 0x48, 0x00, 0x01, 0x01, 0x88, 0x62, 0xF2, 0x3C, 0x2C, 0x03,
0x00, 0x00, 0x41, 0x82, 0x00, 0x14, 0x48, 0x00, 0x00, 0xD1, 0x7C, 0x68, 0x02, 0xA6, 0x48,
0x00, 0x00, 0xE9, 0x48, 0x00, 0x01, 0x04, 0x48, 0x00, 0x00, 0xD1, 0x7C, 0x68, 0x02, 0xA6,
0x48, 0x00, 0x00, 0xD9, 0x48, 0x00, 0x00, 0xF4, 0x4E, 0x80, 0x00, 0x21, 0x80, 0x3C, 0xE4,
0xD4, 0x00, 0x24, 0x04, 0x64, 0x80, 0x07, 0x96, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x80, 0x2B,
0x7E, 0x54, 0x48, 0x00, 0x00, 0x88, 0x80, 0x2B, 0x80, 0x8C, 0x48, 0x00, 0x00, 0x84, 0x80,
0x12, 0x39, 0xA8, 0x60, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x4E, 0x80, 0x00, 0x21,
0x80, 0x3C, 0xE4, 0xD4, 0x00, 0x20, 0x00, 0x00, 0x80, 0x07, 0x96, 0xE0, 0x3A, 0x40, 0x00,
0x01, 0x80, 0x2B, 0x7E, 0x54, 0x88, 0x7F, 0x22, 0x40, 0x80, 0x2B, 0x80, 0x8C, 0x2C, 0x03,
0x00, 0x02, 0x80, 0x10, 0xFC, 0x48, 0x90, 0x05, 0x21, 0xDC, 0x80, 0x10, 0xFB, 0x68, 0x90,
0x05, 0x21, 0xDC, 0x80, 0x12, 0x39, 0xA8, 0x90, 0x1F, 0x1A, 0x5C, 0xFF, 0xFF, 0xFF, 0xFF,
0x4E, 0x80, 0x00, 0x21, 0x80, 0x1D, 0x46, 0x10, 0x48, 0x00, 0x00, 0x4C, 0x80, 0x1D, 0x47,
0x24, 0x48, 0x00, 0x00, 0x3C, 0x80, 0x1D, 0x46, 0x0C, 0x80, 0x9F, 0x00, 0xEC, 0xFF, 0xFF,
0xFF, 0xFF, 0x4E, 0x80, 0x00, 0x21, 0x80, 0x1D, 0x46, 0x10, 0x38, 0x83, 0x7F, 0x9C, 0x80,
0x1D, 0x47, 0x24, 0x88, 0x1B, 0x00, 0xC4, 0x80, 0x1D, 0x46, 0x0C, 0x3C, 0x60, 0x80, 0x3B,
0xFF, 0xFF, 0xFF, 0xFF, 0x4E, 0x80, 0x00, 0x21, 0x80, 0x1D, 0x45, 0xFC, 0x48, 0x00, 0x09,
0xDC, 0xFF, 0xFF, 0xFF, 0xFF, 0x4E, 0x80, 0x00, 0x21, 0x80, 0x1D, 0x45, 0xFC, 0x40, 0x80,
0x09, 0xDC, 0xFF, 0xFF, 0xFF, 0xFF, 0x38, 0xA3, 0xFF, 0xFC, 0x84, 0x65, 0x00, 0x04, 0x2C,
0x03, 0xFF, 0xFF, 0x41, 0x82, 0x00, 0x10, 0x84, 0x85, 0x00, 0x04, 0x90, 0x83, 0x00, 0x00,
0x4B, 0xFF, 0xFF, 0xEC, 0x4E, 0x80, 0x00, 0x20, 0x3C, 0x60, 0x80, 0x00, 0x3C, 0x80, 0x00,
0x3B, 0x60, 0x84, 0x72, 0x2C, 0x3D, 0x80, 0x80, 0x32, 0x61, 0x8C, 0x8F, 0x50, 0x7D, 0x89,
0x03, 0xA6, 0x4E, 0x80, 0x04, 0x21, 0x3C, 0x60, 0x80, 0x17, 0x3C, 0x80, 0x80, 0x17, 0x00,
0x00, 0x00, 0x00, 0xC2, 0x1D, 0x14, 0xC8, 0x00, 0x00, 0x00,
0x04, // #Common/Preload Stadium
// Transformations/Handlers/Init
// isLoaded Bool.asm
0x88, 0x62, 0xF2, 0x38, 0x2C, 0x03, 0x00, 0x00, 0x41, 0x82, 0x00, 0x0C, 0x38, 0x60, 0x00,
0x00, 0x98, 0x7F, 0x00, 0xF0, 0x3B, 0xA0, 0x00, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xC2, 0x1D, 0x45, 0xEC, 0x00, 0x00, 0x00, 0x1B, // #Common/Preload Stadium
// Transformations/Handlers/Load
// Transformation.asm
0x88, 0x62, 0xF2, 0x38, 0x2C, 0x03, 0x00, 0x00, 0x41, 0x82, 0x00, 0xC4, 0x88, 0x7F, 0x00,
0xF0, 0x2C, 0x03, 0x00, 0x00, 0x40, 0x82, 0x00, 0xB8, 0x38, 0x60, 0x00, 0x04, 0x3D, 0x80,
0x80, 0x38, 0x61, 0x8C, 0x05, 0x80, 0x7D, 0x89, 0x03, 0xA6, 0x4E, 0x80, 0x04, 0x21, 0x54,
0x60, 0x10, 0x3A, 0xA8, 0x7F, 0x00, 0xE2, 0x3C, 0x80, 0x80, 0x3B, 0x60, 0x84, 0x7F, 0x9C,
0x7C, 0x84, 0x00, 0x2E, 0x7C, 0x03, 0x20, 0x00, 0x41, 0x82, 0xFF, 0xD4, 0x90, 0x9F, 0x00,
0xEC, 0x2C, 0x04, 0x00, 0x03, 0x40, 0x82, 0x00, 0x0C, 0x38, 0x80, 0x00, 0x00, 0x48, 0x00,
0x00, 0x34, 0x2C, 0x04, 0x00, 0x04, 0x40, 0x82, 0x00, 0x0C, 0x38, 0x80, 0x00, 0x01, 0x48,
0x00, 0x00, 0x24, 0x2C, 0x04, 0x00, 0x09, 0x40, 0x82, 0x00, 0x0C, 0x38, 0x80, 0x00, 0x02,
0x48, 0x00, 0x00, 0x14, 0x2C, 0x04, 0x00, 0x06, 0x40, 0x82, 0x00, 0x00, 0x38, 0x80, 0x00,
0x03, 0x48, 0x00, 0x00, 0x04, 0x3C, 0x60, 0x80, 0x3E, 0x60, 0x63, 0x12, 0x48, 0x54, 0x80,
0x10, 0x3A, 0x7C, 0x63, 0x02, 0x14, 0x80, 0x63, 0x03, 0xD8, 0x80, 0x9F, 0x00, 0xCC, 0x38,
0xBF, 0x00, 0xC8, 0x3C, 0xC0, 0x80, 0x1D, 0x60, 0xC6, 0x42, 0x20, 0x38, 0xE0, 0x00, 0x00,
0x3D, 0x80, 0x80, 0x01, 0x61, 0x8C, 0x65, 0x80, 0x7D, 0x89, 0x03, 0xA6, 0x4E, 0x80, 0x04,
0x21, 0x38, 0x60, 0x00, 0x01, 0x98, 0x7F, 0x00, 0xF0, 0x80, 0x7F, 0x00, 0xD8, 0x60, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0x1D, 0x4F, 0x14, 0x00, 0x00, 0x00,
0x04, // #Common/Preload
// Stadium
// Transformations/Handlers/Reset
// isLoaded.asm
0x88, 0x62, 0xF2, 0x38, 0x2C, 0x03, 0x00, 0x00, 0x41, 0x82, 0x00, 0x0C, 0x38, 0x60, 0x00,
0x00, 0x98, 0x7F, 0x00, 0xF0, 0x80, 0x6D, 0xB2, 0xD8, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xC2, 0x06, 0x8F, 0x30, 0x00, 0x00, 0x00, 0x9D, // #Common/PAL/Handlers/Character
// DAT Patcher.asm
0x88, 0x62, 0xF2, 0x34, 0x2C, 0x03, 0x00, 0x00, 0x41, 0x82, 0x04, 0xD4, 0x7C, 0x08, 0x02,
0xA6, 0x90, 0x01, 0x00, 0x04, 0x94, 0x21, 0xFF, 0x50, 0xBE, 0x81, 0x00, 0x08, 0x83, 0xFE,
0x01, 0x0C, 0x83, 0xFF, 0x00, 0x08, 0x3B, 0xFF, 0xFF, 0xE0, 0x80, 0x7D, 0x00, 0x00, 0x2C,
0x03, 0x00, 0x1B, 0x40, 0x80, 0x04, 0x9C, 0x48, 0x00, 0x00, 0x71, 0x48, 0x00, 0x00, 0xA9,
0x48, 0x00, 0x00, 0xB9, 0x48, 0x00, 0x01, 0x51, 0x48, 0x00, 0x01, 0x79, 0x48, 0x00, 0x01,
0x79, 0x48, 0x00, 0x02, 0x29, 0x48, 0x00, 0x02, 0x39, 0x48, 0x00, 0x02, 0x81, 0x48, 0x00,
0x02, 0xF9, 0x48, 0x00, 0x03, 0x11, 0x48, 0x00, 0x03, 0x11, 0x48, 0x00, 0x03, 0x11, 0x48,
0x00, 0x03, 0x11, 0x48, 0x00, 0x03, 0x21, 0x48, 0x00, 0x03, 0x21, 0x48, 0x00, 0x03, 0x89,
0x48, 0x00, 0x03, 0x89, 0x48, 0x00, 0x03, 0x91, 0x48, 0x00, 0x03, 0x91, 0x48, 0x00, 0x03,
0xA9, 0x48, 0x00, 0x03, 0xA9, 0x48, 0x00, 0x03, 0xB9, 0x48, 0x00, 0x03, 0xB9, 0x48, 0x00,
0x03, 0xC9, 0x48, 0x00, 0x03, 0xC9, 0x48, 0x00, 0x03, 0xC9, 0x48, 0x00, 0x04, 0x29, 0x7C,
0x88, 0x02, 0xA6, 0x1C, 0x63, 0x00, 0x04, 0x7C, 0x84, 0x1A, 0x14, 0x80, 0xA4, 0x00, 0x00,
0x54, 0xA5, 0x01, 0xBA, 0x7C, 0xA4, 0x2A, 0x14, 0x80, 0x65, 0x00, 0x00, 0x80, 0x85, 0x00,
0x04, 0x2C, 0x03, 0x00, 0xFF, 0x41, 0x82, 0x00, 0x14, 0x7C, 0x63, 0xFA, 0x14, 0x90, 0x83,
0x00, 0x00, 0x38, 0xA5, 0x00, 0x08, 0x4B, 0xFF, 0xFF, 0xE4, 0x48, 0x00, 0x03, 0xF0, 0x00,
0x00, 0x33, 0x44, 0x3F, 0x54, 0x7A, 0xE1, 0x00, 0x00, 0x33, 0x60, 0x42, 0xC4, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x37, 0x9C, 0x42, 0x92, 0x00, 0x00, 0x00, 0x00, 0x39,
0x08, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x0C, 0x40, 0x86, 0x66, 0x66, 0x00, 0x00,
0x39, 0x10, 0x3D, 0xEA, 0x0E, 0xA1, 0x00, 0x00, 0x39, 0x28, 0x41, 0xA0, 0x00, 0x00, 0x00,
0x00, 0x3C, 0x04, 0x2C, 0x01, 0x48, 0x0C, 0x00, 0x00, 0x47, 0x20, 0x1B, 0x96, 0x80, 0x13,
0x00, 0x00, 0x47, 0x34, 0x1B, 0x96, 0x80, 0x13, 0x00, 0x00, 0x47, 0x3C, 0x04, 0x00, 0x00,
0x09, 0x00, 0x00, 0x4A, 0x40, 0x2C, 0x00, 0x68, 0x11, 0x00, 0x00, 0x4A, 0x4C, 0x28, 0x1B,
0x00, 0x13, 0x00, 0x00, 0x4A, 0x50, 0x0D, 0x00, 0x01, 0x0B, 0x00, 0x00, 0x4A, 0x54, 0x2C,
0x80, 0x68, 0x11, 0x00, 0x00, 0x4A, 0x60, 0x28, 0x1B, 0x00, 0x13, 0x00, 0x00, 0x4A, 0x64,
0x0D, 0x00, 0x01, 0x0B, 0x00, 0x00, 0x4B, 0x24, 0x2C, 0x00, 0x68, 0x0D, 0x00, 0x00, 0x4B,
0x30, 0x0F, 0x10, 0x40, 0x13, 0x00, 0x00, 0x4B, 0x38, 0x2C, 0x80, 0x38, 0x0D, 0x00, 0x00,
0x4B, 0x44, 0x0F, 0x10, 0x40, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x38, 0x0C, 0x00,
0x00, 0x00, 0x07, 0x00, 0x00, 0x4E, 0xF8, 0x2C, 0x00, 0x38, 0x03, 0x00, 0x00, 0x4F, 0x08,
0x0F, 0x80, 0x00, 0x0B, 0x00, 0x00, 0x4F, 0x0C, 0x2C, 0x80, 0x20, 0x03, 0x00, 0x00, 0x4F,
0x1C, 0x0F, 0x80, 0x00, 0x0B, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,
0x4D, 0x10, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x70, 0x42, 0x94, 0x00, 0x00, 0x00,
0x00, 0x4D, 0xD4, 0x41, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xE0, 0x41, 0x90, 0x00, 0x00,
0x00, 0x00, 0x83, 0xAC, 0x2C, 0x00, 0x00, 0x09, 0x00, 0x00, 0x83, 0xB8, 0x34, 0x8C, 0x80,
0x11, 0x00, 0x00, 0x84, 0x00, 0x34, 0x8C, 0x80, 0x11, 0x00, 0x00, 0x84, 0x30, 0x05, 0x00,
0x00, 0x8B, 0x00, 0x00, 0x84, 0x38, 0x04, 0x1A, 0x05, 0x00, 0x00, 0x00, 0x84, 0x44, 0x05,
0x00, 0x00, 0x8B, 0x00, 0x00, 0x84, 0xDC, 0x05, 0x78, 0x05, 0x78, 0x00, 0x00, 0x85, 0xB8,
0x10, 0x00, 0x01, 0x0B, 0x00, 0x00, 0x85, 0xC0, 0x03, 0xE8, 0x01, 0xF4, 0x00, 0x00, 0x85,
0xCC, 0x10, 0x00, 0x01, 0x0B, 0x00, 0x00, 0x85, 0xD4, 0x03, 0x84, 0x03, 0xE8, 0x00, 0x00,
0x85, 0xE0, 0x10, 0x00, 0x01, 0x0B, 0x00, 0x00, 0x88, 0x18, 0x0B, 0x00, 0x01, 0x0B, 0x00,
0x00, 0x88, 0x2C, 0x0B, 0x00, 0x01, 0x0B, 0x00, 0x00, 0x88, 0xF8, 0x04, 0x1A, 0x0B, 0xB8,
0x00, 0x00, 0x89, 0x3C, 0x04, 0x1A, 0x0B, 0xB8, 0x00, 0x00, 0x89, 0x80, 0x04, 0x1A, 0x0B,
0xB8, 0x00, 0x00, 0x89, 0xE0, 0x04, 0xFE, 0xF7, 0x04, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,
0x36, 0xCC, 0x42, 0xEC, 0x00, 0x00, 0x00, 0x00, 0x37, 0xC4, 0x0C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0x00, 0x00, 0x34, 0x68, 0x3F, 0x66, 0x66, 0x66, 0x00, 0x00, 0x39, 0xD8,
0x44, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x44, 0xB4, 0x99, 0x00, 0x11, 0x00, 0x00, 0x3A,
0x48, 0x1B, 0x8C, 0x00, 0x8F, 0x00, 0x00, 0x3A, 0x58, 0xB4, 0x99, 0x00, 0x11, 0x00, 0x00,
0x3A, 0x5C, 0x1B, 0x8C, 0x00, 0x8F, 0x00, 0x00, 0x3A, 0x6C, 0xB4, 0x99, 0x00, 0x11, 0x00,
0x00, 0x3A, 0x70, 0x1B, 0x8C, 0x00, 0x8F, 0x00, 0x00, 0x3B, 0x30, 0x44, 0x0C, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x45, 0xC8, 0x2C, 0x01, 0x50, 0x10, 0x00, 0x00, 0x45,
0xD4, 0x2D, 0x19, 0x80, 0x13, 0x00, 0x00, 0x45, 0xDC, 0x2C, 0x80, 0xB0, 0x10, 0x00, 0x00,
0x45, 0xE8, 0x2D, 0x19, 0x80, 0x13, 0x00, 0x00, 0x49, 0xC4, 0x2C, 0x00, 0x68, 0x0A, 0x00,
0x00, 0x49, 0xD0, 0x28, 0x1B, 0x80, 0x13, 0x00, 0x00, 0x49, 0xD8, 0x2C, 0x80, 0x78, 0x0A,
0x00, 0x00, 0x49, 0xE4, 0x28, 0x1B, 0x80, 0x13, 0x00, 0x00, 0x49, 0xF0, 0x2C, 0x00, 0x68,
0x08, 0x00, 0x00, 0x49, 0xFC, 0x23, 0x1B, 0x80, 0x13, 0x00, 0x00, 0x4A, 0x04, 0x2C, 0x80,
0x78, 0x08, 0x00, 0x00, 0x4A, 0x10, 0x23, 0x1B, 0x80, 0x13, 0x00, 0x00, 0x5C, 0x98, 0x1E,
0x0C, 0x80, 0x80, 0x00, 0x00, 0x5C, 0xF4, 0xB4, 0x80, 0x0C, 0x90, 0x00, 0x00, 0x5D, 0x08,
0xB4, 0x80, 0x0C, 0x90, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3A, 0x1C, 0xB4, 0x94, 0x00,
0x13, 0x00, 0x00, 0x3A, 0x64, 0x2C, 0x00, 0x00, 0x15, 0x00, 0x00, 0x3A, 0x70, 0xB4, 0x92,
0x80, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00,
0x00, 0x00, 0xFF, 0x00, 0x00, 0x64, 0x7C, 0xB4, 0x9A, 0x40, 0x17, 0x00, 0x00, 0x64, 0x80,
0x64, 0x00, 0x10, 0x97, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x33,
0xE4, 0x42, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x45, 0x28, 0x2C, 0x01, 0x30, 0x11, 0x00, 0x00,
0x45, 0x34, 0xB4, 0x98, 0x80, 0x13, 0x00, 0x00, 0x45, 0x3C, 0x2C, 0x81, 0x30, 0x11, 0x00,
0x00, 0x45, 0x48, 0xB4, 0x98, 0x80, 0x13, 0x00, 0x00, 0x45, 0x50, 0x2D, 0x00, 0x20, 0x11,
0x00, 0x00, 0x45, 0x5C, 0xB4, 0x98, 0x80, 0x13, 0x00, 0x00, 0x45, 0xF8, 0x2C, 0x01, 0x30,
0x0F, 0x00, 0x00, 0x46, 0x08, 0x0F, 0x00, 0x01, 0x0B, 0x00, 0x00, 0x46, 0x0C, 0x2C, 0x81,
0x28, 0x0F, 0x00, 0x00, 0x46, 0x1C, 0x0F, 0x00, 0x01, 0x0B, 0x00, 0x00, 0x4A, 0xEC, 0x2C,
0x00, 0x70, 0x03, 0x00, 0x00, 0x4B, 0x00, 0x2C, 0x80, 0x38, 0x03, 0x00, 0x00, 0x00, 0xFF,
0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x48, 0x5C, 0x2C, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00,
0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x37, 0xB0, 0x3F, 0x59, 0x99, 0x9A, 0x00, 0x00,
0x37, 0xCC, 0x42, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x55, 0x20, 0x87, 0x11, 0x80, 0x13, 0x00,
0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3B, 0x8C, 0x44, 0x0C, 0x00, 0x00,
0x00, 0x00, 0x3D, 0x0C, 0x44, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
0xFF, 0x00, 0x00, 0x50, 0xE4, 0xB4, 0x99, 0x00, 0x13, 0x00, 0x00, 0x50, 0xF8, 0xB4, 0x99,
0x00, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00,
0x00, 0x4E, 0xB0, 0x02, 0xBC, 0xFF, 0x38, 0x00, 0x00, 0x4E, 0xBC, 0x14, 0x00, 0x01, 0x23,
0x00, 0x00, 0x4E, 0xC4, 0x03, 0x84, 0x01, 0xF4, 0x00, 0x00, 0x4E, 0xD0, 0x14, 0x00, 0x01,
0x23, 0x00, 0x00, 0x4E, 0xD8, 0x04, 0x4C, 0x04, 0xB0, 0x00, 0x00, 0x4E, 0xE4, 0x14, 0x00,
0x01, 0x23, 0x00, 0x00, 0x50, 0x5C, 0x2C, 0x00, 0x68, 0x15, 0x00, 0x00, 0x50, 0x6C, 0x14,
0x08, 0x01, 0x23, 0x00, 0x00, 0x50, 0x70, 0x2C, 0x80, 0x60, 0x15, 0x00, 0x00, 0x50, 0x80,
0x14, 0x08, 0x01, 0x23, 0x00, 0x00, 0x50, 0x84, 0x2D, 0x00, 0x20, 0x15, 0x00, 0x00, 0x50,
0x94, 0x14, 0x08, 0x01, 0x23, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xBA, 0x81,
0x00, 0x08, 0x80, 0x01, 0x00, 0xB4, 0x38, 0x21, 0x00, 0xB0, 0x7C, 0x08, 0x03, 0xA6, 0x3C,
0x60, 0x80, 0x3C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0x2F, 0x9A, 0x3C,
0x00, 0x00, 0x00, 0x08, // #Common/PAL/Handlers/PAL Stock Icons.asm
0x88, 0x62, 0xF2, 0x34, 0x2C, 0x03, 0x00, 0x00, 0x41, 0x82, 0x00, 0x30, 0x48, 0x00, 0x00,
0x21, 0x7C, 0x88, 0x02, 0xA6, 0x80, 0x64, 0x00, 0x00, 0x90, 0x7D, 0x00, 0x2C, 0x90, 0x7D,
0x00, 0x30, 0x80, 0x64, 0x00, 0x04, 0x90, 0x7D, 0x00, 0x3C, 0x48, 0x00, 0x00, 0x10, 0x4E,
0x80, 0x00, 0x21, 0x3F, 0x59, 0x99, 0x9A, 0xC1, 0xA8, 0x00, 0x00, 0x80, 0x1D, 0x00, 0x14,
0x00, 0x00, 0x00, 0x00, 0xC2, 0x10, 0xFC, 0x44, 0x00, 0x00, 0x00,
0x04, // #Common/PAL/Handlers/DK
// Up B/Aerial Up B.asm
0x88, 0x82, 0xF2, 0x34, 0x2C, 0x04, 0x00, 0x00, 0x41, 0x82, 0x00, 0x10, 0x3C, 0x00, 0x80,
0x11, 0x60, 0x00, 0x00, 0x74, 0x48, 0x00, 0x00, 0x08, 0x38, 0x03, 0xD7, 0x74, 0x00, 0x00,
0x00, 0x00, 0xC2, 0x10, 0xFB, 0x64, 0x00, 0x00, 0x00, 0x04, // #Common/PAL/Handlers/DK Up
// B/Grounded Up B.asm
0x88, 0x82, 0xF2, 0x34, 0x2C, 0x04, 0x00, 0x00, 0x41, 0x82, 0x00, 0x10, 0x3C, 0x00, 0x80,
0x11, 0x60, 0x00, 0x00, 0x74, 0x48, 0x00, 0x00, 0x08, 0x38, 0x03, 0xD7, 0x74, 0x00, 0x00,
0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // Termination sequence
};
static std::unordered_map<u32, bool> static_deny_list = {
{0x8008d698, true}, // Recording/GetLCancelStatus/GetLCancelStatus.asm
{0x8006c324, true}, // Recording/GetLCancelStatus/ResetLCancelStatus.asm
{0x800679bc, true}, // Recording/ExtendPlayerBlock.asm
{0x802fef88, true}, // Recording/FlushFrameBuffer.asm
{0x80005604, true}, // Recording/IsVSMode.asm
{0x8016d30c, true}, // Recording/SendGameEnd.asm
{0x8016e74c, true}, // Recording/SendGameInfo.asm
{0x8006c5d8, true}, // Recording/SendGamePostFrame.asm
{0x8006b0dc, true}, // Recording/SendGamePreFrame.asm
{0x803219ec, true}, // 3.4.0: Recording/FlushFrameBuffer.asm (Have to keep old ones for
// backward compatibility)
{0x8006da34, true}, // 3.4.0: Recording/SendGamePostFrame.asm
{0x8016d884, true}, // 3.7.0: Recording/SendGameEnd.asm
{0x8021aae4, true}, // Binary/FasterMeleeSettings/DisableFdTransitions.bin
{0x801cbb90, true}, // Binary/FasterMeleeSettings/LaglessFod.bin
{0x801CC8AC, true}, // Binary/FasterMeleeSettings/LaglessFod.bin
{0x801CBE9C, true}, // Binary/FasterMeleeSettings/LaglessFod.bin
{0x801CBEF0, true}, // Binary/FasterMeleeSettings/LaglessFod.bin
{0x801CBF54, true}, // Binary/FasterMeleeSettings/LaglessFod.bin
{0x80390838, true}, // Binary/FasterMeleeSettings/LaglessFod.bin
{0x801CD250, true}, // Binary/FasterMeleeSettings/LaglessFod.bin
{0x801CCDCC, true}, // Binary/FasterMeleeSettings/LaglessFod.bin
{0x801C26B0, true}, // Binary/FasterMeleeSettings/RandomStageMusic.bin
{0x803761ec, true}, // Binary/NormalLagReduction.bin
{0x800198a4, true}, // Binary/PerformanceLagReduction.bin
{0x80019620, true}, // Binary/PerformanceLagReduction.bin
{0x801A5054, true}, // Binary/PerformanceLagReduction.bin
{0x80397878, true}, // Binary/OsReportPrintOnCrash.bin
{0x801A4DA0, true}, // Binary/LagReduction/PD.bin
{0x801A4DB4, true}, // Binary/LagReduction/PD.bin
{0x80019860, true}, // Binary/LagReduction/PD.bin
{0x801A4C24, true}, // Binary/LagReduction/PD+VB.bin
{0x8001985C, true}, // Binary/LagReduction/PD+VB.bin
{0x80019860, true}, // Binary/LagReduction/PD+VB.bin
{0x80376200, true}, // Binary/LagReduction/PD+VB.bin
{0x801A5018, true}, // Binary/LagReduction/PD+VB.bin
{0x80218D68, true}, // Binary/LagReduction/PD+VB.bin
{0x8016E9AC, true}, // Binary/Force2PCenterHud.bin
{0x80030E44, true}, // Binary/DisableScreenShake.bin
{0x803761EC, true}, // Binary/NormalLagReduction.bin
{0x80376238, true}, // Binary/NormalLagReduction.bin
{0x800055f0, true}, // Common/EXITransferBuffer.asm
{0x800055f8, true}, // Common/GetIsFollower.asm
{0x800055fc, true}, // Common/Gecko/ProcessCodeList.asm
{0x8016d294, true}, // Common/IncrementFrameIndex.asm
{0x80376a24, true}, // Common/UseInGameDelay/ApplyInGameDelay.asm
{0x8016e9b0, true}, // Common/UseInGameDelay/InitializeInGameDelay.asm
{0x8000561c, true}, // Common/GetCommonMinorID/GetCommonMinorID.asm
{0x802f666c, true}, // Common/UseInGameDelay/InitializeInGameDelay.asm v2
{0x8000569c, true}, // Common/CompatibilityHooks/GetFighterNum.asm
{0x800056a0, true}, // Common/CompatibilityHooks/GetSSMIndex.asm
{0x800056a8, true}, // Common/CompatibilityHooks/RequestSSMLoad.asm
{0x801a5b14, true}, // External/Salty Runback/Salty Runback.asm
{0x801a4570, true}, // External/LagReduction/ForceHD/480pDeflickerOff.asm
{0x802fccd8, true}, // External/Hide Nametag When Invisible/Hide Nametag When Invisible.asm
{0x804ddb30, true}, // External/Widescreen/Adjust Offscreen Scissor/Fix Bubble
// Positions/Adjust Corner Value 1.asm
{0x804ddb34, true}, // External/Widescreen/Adjust Offscreen Scissor/Fix Bubble
// Positions/Adjust Corner Value 2.asm
{0x804ddb2c, true}, // External/Widescreen/Adjust Offscreen Scissor/Fix Bubble
// Positions/Extend Negative Vertical Bound.asm
{0x804ddb28, true}, // External/Widescreen/Adjust Offscreen Scissor/Fix Bubble
// Positions/Extend Positive Vertical Bound.asm
{0x804ddb4c, true}, // External/Widescreen/Adjust Offscreen Scissor/Fix Bubble
// Positions/Widen Bubble Region.asm
{0x804ddb58, true}, // External/Widescreen/Adjust Offscreen Scissor/Adjust Bubble Zoom.asm
{0x80086b24, true}, // External/Widescreen/Adjust Offscreen Scissor/Draw High Poly Models.asm
{0x80030C7C, true}, // External/Widescreen/Adjust Offscreen Scissor/Left Camera Bound.asm
{0x80030C88, true}, // External/Widescreen/Adjust Offscreen Scissor/Right Camera Bound.asm
{0x802fcfc4,
true}, // External/Widescreen/Nametag Fixes/Adjust Nametag Background X Scale.asm
{0x804ddb84, true}, // External/Widescreen/Nametag Fixes/Adjust Nametag Text X Scale.asm
{0x803BB05C, true}, // External/Widescreen/Fix Screen Flash.asm
{0x8036A4A8, true}, // External/Widescreen/Overwrite CObj Values.asm
{0x80302784, true}, // External/Monitor4-3/Add Shutters.asm
{0x800C0148, true}, // External/FlashRedFailedLCancel/ChangeColor.asm
{0x8008D690, true}, // External/FlashRedFailedLCancel/TriggerColor.asm
{0x801A4DB4, true}, // Online/Core/ForceEngineOnRollback.asm
{0x8016D310, true}, // Online/Core/HandleLRAS.asm
{0x8034DED8, true}, // Online/Core/HandleRumble.asm
{0x8016E748, true}, // Online/Core/InitOnlinePlay.asm
{0x8016e904, true}, // Online/Core/InitPause.asm
{0x801a5014, true}, // Online/Core/LoopEngineForRollback.asm
{0x801a4de4, true}, // Online/Core/StartEngineLoop.asm
{0x80376A28, true}, // Online/Core/TriggerSendInput.asm
{0x801a4cb4, true}, // Online/Core/EXIFileLoad/AllocBuffer.asm
{0x800163fc, true}, // Online/Core/EXIFileLoad/GetFileSize.asm
{0x800166b8, true}, // Online/Core/EXIFileLoad/TransferFile.asm
{0x80019260, true}, // Online/Core/Hacks/ForceNoDiskCrash.asm
{0x80376304, true}, // Online/Core/Hacks/ForceNoVideoAssert.asm
{0x80321d70, true}, // Online/Core/Hacks/PreventCharacterCrowdChants.asm
{0x80019608, true}, // Online/Core/Hacks/PreventPadAlarmDuringRollback.asm
{0x8038D224, true}, // Online/Core/Sound/AssignSoundInstanceId.asm
{0x80088224, true}, // Online/Core/Sound/NoDestroyVoice.asm
{0x800882B0, true}, // Online/Core/Sound/NoDestroyVoice2.asm
{0x8038D0B0, true}, // Online/Core/Sound/PreventDuplicateSounds.asm
{0x803775b8, true}, // Online/Logging/LogInputOnCopy.asm
{0x8016e9b4, true}, // Online/Menus/InGame/InitInGame.asm
{0x80185050, true}, // Online/Menus/VSScreen/HideStageDisplay/PreventEarlyR3Overwrite.asm
{0x80184b1c, true}, // Online/Menus/VSScreen/HideStageText/SkipStageNumberShow.asm
{0x801A45BC, true}, // Online/Slippi Online Scene/main.asm
{0x801a45b8, true}, // Online/Slippi Online Scene/main.asm (https://bit.ly/3kxohf4)
{0x801BFA20, true}, // Online/Slippi Online Scene/boot.asm
{0x800cc818, true}, // External/GreenDuringWait/fall.asm
{0x8008a478, true}, // External/GreenDuringWait/wait.asm
{0x802f6690, true}, // HUD Transparency v1.1
// (https://smashboards.com/threads/transparent-hud-v1-1.508509/)
{0x802F71E0,
true}, // Smaller "Ready, GO!" (https://smashboards.com/threads/smaller-ready-go.509740/)
{0x80071960,
true}, // Yellow During IASA
// (https://smashboards.com/threads/color-overlays-for-iasa-frames.401474/post-19120928)
};
std::unordered_map<u32, bool> deny_list;
deny_list.insert(static_deny_list.begin(), static_deny_list.end());
// Assignment like this copies the values into a new map I think
std::vector<u8> legacyCodelist = g_playbackStatus->getLegacyCodelist();
std::unordered_map<u32, bool> denylist = g_playbackStatus->getDenylist();
auto replayCommSettings = g_replayComm->getSettings();
if (replayCommSettings.rollbackDisplayMethod == "off")
{
// Some codes should only be blacklisted when not displaying rollbacks, these are codes
// that are required for things to not break when using Slippi savestates. Perhaps this
// should be handled by actually applying these codes in the playback ASM instead? not sure
deny_list[0x8038add0] = true; // Online/Core/PreventFileAlarms/PreventMusicAlarm.asm
deny_list[0x80023FFC] = true; // Online/Core/PreventFileAlarms/MuteMusic.asm
}
// Some codes should only be denylisted when not displaying rollbacks, these are codes
// that are required for things to not break when using Slippi savestates. Perhaps this
// should be handled by actually applying these codes in the playback ASM instead? not sure
auto should_deny = replayCommSettings.rollbackDisplayMethod == "off";
denylist[0x8038add0] = should_deny; // Online/Core/PreventFileAlarms/PreventMusicAlarm.asm
denylist[0x80023FFC] = should_deny; // Online/Core/PreventFileAlarms/MuteMusic.asm
geckoList.clear();
Slippi::GameSettings* settings = m_current_game->GetSettings();
if (settings->geckoCodes.empty())
{
geckoList = defaultCodeList;
geckoList = legacyCodelist;
return;
}
@ -1203,14 +863,14 @@ void CEXISlippi::prepareGeckoList()
idx += codeOffset;
// If this address is blacklisted, we don't add it to what we will send to game
if (deny_list.count(address))
// If this address is denylisted, we don't add it to what we will send to game
if (denylist[address])
continue;
INFO_LOG_FMT(SLIPPI, "Codetype [{:x}] Inserting section: {} - {} ({:x}, {})", codeType,
idx - codeOffset, idx, address, codeOffset);
// If not blacklisted, add code to return vector
// If not denylisted, add code to return vector
geckoList.insert(geckoList.end(), source.begin() + (idx - codeOffset), source.begin() + idx);
}

View file

@ -158,6 +158,7 @@ enum class MessageID : u8
SLIPPI_CONN_SELECTED = 0x83,
SLIPPI_CHAT_MESSAGE = 0x84,
SLIPPI_COMPLETE_STEP = 0x85,
SLIPPI_SYNCED_STATE = 0x86,
GolfRequest = 0x90,
GolfSwitch = 0x91,

View file

@ -18,6 +18,8 @@ struct ReportGameQueryPlayer
u8 slot_type;
u8 stocks_remaining;
float damage_done;
u8 synced_stocks_remaining;
u16 synced_current_health;
};
struct ReportGameQuery
@ -30,6 +32,7 @@ struct ReportGameQuery
s8 winner_idx;
u8 game_end_method;
s8 lras_initiator;
u32 synced_timer;
ReportGameQueryPlayer players[REPORT_PLAYER_COUNT];
u8 game_info_block[312];
};
@ -90,10 +93,12 @@ inline ReportGameQuery Convert(u8* payload)
q.frame_length = Common::FromBigEndian(q.frame_length);
q.game_index = Common::FromBigEndian(q.game_index);
q.tiebreak_index = Common::FromBigEndian(q.tiebreak_index);
q.synced_timer = Common::FromBigEndian(q.synced_timer);
for (int i = 0; i < REPORT_PLAYER_COUNT; i++)
{
auto* p = &q.players[i];
p->damage_done = Common::FromBigEndian(p->damage_done);
p->synced_current_health = Common::FromBigEndian(p->synced_current_health);
}
return q;
}

View file

@ -2,6 +2,7 @@
#include <locale>
#include <string>
#include <Common/CommonTypes.h>
#include "SlippiGame.h"
namespace Slippi
@ -526,7 +527,7 @@ void SlippiGame::processData()
// Transform this message into a different message
command = data[SPLIT_MESSAGE_INTERNAL_DATA_LEN + 2];
data = &splitMessageBuf[0];
payloadSize = asmEvents[command];
payloadSize = static_cast<u32>(splitMessageBuf.size());
shouldResetSplitMessageBuf = true;
}
}

View file

@ -334,6 +334,12 @@ unsigned int SlippiNetplayClient::OnData(sf::Packet& packet, ENetPeer* peer)
static_cast<s32>(frame64 - i), &packetData[pad_data_offset + i * SLIPPI_PAD_DATA_SIZE]);
remotePadQueue[pIdx].push_front(std::move(pad));
}
// Write checksum pad to keep track of latest remote checksum
ChecksumEntry e;
e.frame = checksum_frame;
e.value = checksum;
remote_checksums[pIdx] = e;
}
// Only ack if inputsToCopy is greater than 0. Otherwise we are receiving an old input and
@ -481,6 +487,43 @@ unsigned int SlippiNetplayClient::OnData(sf::Packet& packet, ENetPeer* peer)
}
break;
case NetPlay::MessageID::SLIPPI_SYNCED_STATE:
{
u8 packetPlayerPort;
if (!(packet >> packetPlayerPort))
{
ERROR_LOG_FMT(SLIPPI_ONLINE, "Netplay packet too small to read player index");
break;
}
u8 pIdx = PlayerIdxFromPort(packetPlayerPort);
if (pIdx >= m_remotePlayerCount)
{
ERROR_LOG_FMT(SLIPPI_ONLINE, "Got packet with invalid player idx {}", pIdx);
break;
}
SlippiSyncedGameState results;
packet >> results.match_id;
packet >> results.game_index;
packet >> results.tiebreak_index;
packet >> results.seconds_remaining;
for (int i = 0; i < 4; i++)
{
packet >> results.fighters[i].stocks_remaining;
packet >> results.fighters[i].current_health;
}
// ERROR_LOG_FMT(SLIPPI_ONLINE, "Received synced state from opponent. {}, {}, {}, {}. F1: {}
// ({}%%), F2: {} ({}%%)",
// results.match_id, results.game_index, results.tiebreak_index,
// results.seconds_remaining, results.fighters[0].stocks_remaining,
// results.fighters[0].current_health, results.fighters[1].stocks_remaining,
// results.fighters[1].current_health);
remote_sync_states[pIdx] = results;
}
break;
default:
WARN_LOG_FMT(SLIPPI_ONLINE, "Unknown message received with id : {}", static_cast<u8>(mid));
break;
@ -1030,6 +1073,8 @@ void SlippiNetplayClient::StartSlippiGame()
std::swap(ackTimers[i], empty);
}
is_desync_recovery = false;
// Clear game prep queue in case anything is still lingering
game_prep_step_queue.clear();
@ -1044,6 +1089,7 @@ void SlippiNetplayClient::SendConnectionSelected()
*spac << static_cast<u8>(NetPlay::MessageID::SLIPPI_CONN_SELECTED);
SendAsync(std::move(spac));
}
void SlippiNetplayClient::SendSlippiPad(std::unique_ptr<SlippiPad> pad)
{
auto status = slippiConnectStatus;
@ -1138,6 +1184,26 @@ void SlippiNetplayClient::SendGamePrepStep(SlippiGamePrepStepResults& s)
SendAsync(std::move(spac));
}
void SlippiNetplayClient::SendSyncedGameState(SlippiSyncedGameState& s)
{
is_desync_recovery = true;
local_sync_state = s;
auto spac = std::make_unique<sf::Packet>();
*spac << static_cast<u8>(NetPlay::MessageID::SLIPPI_SYNCED_STATE);
*spac << this->m_player_idx;
*spac << s.match_id;
*spac << s.game_index;
*spac << s.tiebreak_index;
*spac << s.seconds_remaining;
for (int i = 0; i < 4; i++)
{
*spac << s.fighters[i].stocks_remaining;
*spac << s.fighters[i].current_health;
}
SendAsync(std::move(spac));
}
bool SlippiNetplayClient::GetGamePrepResults(u8 step_idx, SlippiGamePrepStepResults& res)
{
// Just pull stuff off until we find something for the right step. I think that should be fine
@ -1256,8 +1322,8 @@ std::unique_ptr<SlippiRemotePadOutput> SlippiNetplayClient::GetSlippiRemotePad(i
int inputCount = 0;
padOutput->latest_frame = 0;
padOutput->checksum_frame = remoteChecksum[index].frame;
padOutput->checksum = remoteChecksum[index].value;
padOutput->checksum_frame = remote_checksums[index].frame;
padOutput->checksum = remote_checksums[index].value;
// Copy inputs from the remote pad queue to the output. We iterate backwards because
// we want to get the oldest frames possible (will have been cleared to contain the last
@ -1379,3 +1445,94 @@ s32 SlippiNetplayClient::CalcTimeOffsetUs()
return minOffset;
}
bool SlippiNetplayClient::IsWaitingForDesyncRecovery()
{
// If we are not in a desync recovery state, we do not need to wait
if (!is_desync_recovery)
return false;
for (int i = 0; i < m_remotePlayerCount; i++)
{
if (local_sync_state.game_index != remote_sync_states[i].game_index)
return true;
if (local_sync_state.tiebreak_index != remote_sync_states[i].tiebreak_index)
return true;
}
return false;
}
SlippiDesyncRecoveryResp SlippiNetplayClient::GetDesyncRecoveryState()
{
SlippiDesyncRecoveryResp result;
result.is_recovering = is_desync_recovery;
result.is_waiting = IsWaitingForDesyncRecovery();
// If we are not recovering or if we are currently waiting, don't need to compute state, just
// return
if (!result.is_recovering || result.is_waiting)
return result;
result.state = local_sync_state;
// Here let's try to reconcile all the states into one. This is important to make sure
// everyone starts at the same percent/stocks because their last synced state might be
// a slightly different frame. There didn't seem to be an easy way to guarantee they'd
// all be on exactly the same frame
for (int i = 0; i < m_remotePlayerCount; i++)
{
auto& s = remote_sync_states[i];
if (abs(static_cast<int>(result.state.seconds_remaining) -
static_cast<int>(s.seconds_remaining)) > 1)
{
ERROR_LOG_FMT(SLIPPI_ONLINE, "Timer values for desync recovery too different: {}, {}",
result.state.seconds_remaining, s.seconds_remaining);
result.is_error = true;
return result;
}
// Use the timer with more time remaining
if (s.seconds_remaining > result.state.seconds_remaining)
{
result.state.seconds_remaining = s.seconds_remaining;
}
for (int j = 0; j < 4; j++)
{
auto& fighter = result.state.fighters[i];
auto& iFighter = s.fighters[i];
if (fighter.stocks_remaining != iFighter.stocks_remaining)
{
// This might actually happen sometimes if a desync happens right as someone is KO'd...
// should be quite rare though in a 1v1 situation.
ERROR_LOG_FMT(SLIPPI_ONLINE,
"Stocks remaining for desync recovery do not match: [Player {}] {}, {}",
j + 1, fighter.stocks_remaining, iFighter.stocks_remaining);
result.is_error = true;
return result;
}
if (abs(static_cast<int>(fighter.current_health) -
static_cast<int>(iFighter.current_health)) > 25)
{
ERROR_LOG_FMT(SLIPPI_ONLINE,
"Current health for desync recovery too different: [Player {}] {}, {}", j + 1,
fighter.current_health, iFighter.current_health);
result.is_error = true;
return result;
}
// Use the lower health value
if (iFighter.current_health < fighter.current_health)
{
result.state.fighters[i].current_health = iFighter.current_health;
}
}
}
return result;
}

View file

@ -49,6 +49,29 @@ struct SlippiGamePrepStepResults
u8 stage_selections[2];
};
struct SlippiSyncedFighterState
{
u8 stocks_remaining = 4;
u16 current_health = 0;
};
struct SlippiSyncedGameState
{
std::string match_id = "";
u32 game_index = 0;
u32 tiebreak_index = 0;
u32 seconds_remaining = 480;
SlippiSyncedFighterState fighters[4];
};
struct SlippiDesyncRecoveryResp
{
bool is_recovering = false;
bool is_waiting = false;
bool is_error = false;
SlippiSyncedGameState state;
};
class SlippiPlayerSelections
{
public:
@ -154,6 +177,7 @@ public:
void SendSlippiPad(std::unique_ptr<SlippiPad> pad);
void SetMatchSelections(SlippiPlayerSelections& s);
void SendGamePrepStep(SlippiGamePrepStepResults& s);
void SendSyncedGameState(SlippiSyncedGameState& s);
bool GetGamePrepResults(u8 stepIdx, SlippiGamePrepStepResults& res);
std::unique_ptr<SlippiRemotePadOutput> GetFakePadOutput(int frame);
std::unique_ptr<SlippiRemotePadOutput> GetSlippiRemotePad(int index, int maxFrameCount);
@ -163,6 +187,8 @@ public:
SlippiPlayerSelections GetSlippiRemoteChatMessage(bool isChatEnabled);
u8 GetSlippiRemoteSentChatMessage(bool isChatEnabled);
s32 CalcTimeOffsetUs();
bool IsWaitingForDesyncRecovery();
SlippiDesyncRecoveryResp GetDesyncRecoveryState();
void WriteChatMessageToPacket(sf::Packet& packet, int messageId, u8 playerIdx);
std::unique_ptr<SlippiPlayerSelections> ReadChatMessageFromPacket(sf::Packet& packet);
@ -219,7 +245,10 @@ protected:
std::deque<std::unique_ptr<SlippiPad>> localPadQueue; // most recent inputs at start of deque
std::deque<std::unique_ptr<SlippiPad>>
remotePadQueue[SLIPPI_REMOTE_PLAYER_MAX]; // most recent inputs at start of deque
ChecksumEntry remoteChecksum[SLIPPI_REMOTE_PLAYER_MAX];
bool is_desync_recovery = false;
ChecksumEntry remote_checksums[SLIPPI_REMOTE_PLAYER_MAX];
SlippiSyncedGameState remote_sync_states[SLIPPI_REMOTE_PLAYER_MAX];
SlippiSyncedGameState local_sync_state;
std::deque<SlippiGamePrepStepResults> game_prep_step_queue;
u64 pingUs[SLIPPI_REMOTE_PLAYER_MAX];
int32_t lastFrameAcked[SLIPPI_REMOTE_PLAYER_MAX];

View file

@ -5,7 +5,9 @@
#include <share.h>
#endif
#include "Common/CommonPaths.h"
#include "Common/Config/Config.h"
#include "Common/FileUtil.h"
#include "Common/Logging/Log.h"
#include "Core/Config/MainSettings.h"
#include "Core/Core.h"
@ -64,6 +66,8 @@ SlippiPlaybackStatus::SlippiPlaybackStatus()
currentPlaybackFrame = INT_MIN;
targetFrameNum = INT_MAX;
lastFrame = Slippi::PLAYBACK_FIRST_SAVE;
generateDenylist();
generateLegacyCodelist();
}
void SlippiPlaybackStatus::startThreads()
@ -320,6 +324,333 @@ void SlippiPlaybackStatus::updateWatchSettingsStartEnd()
}
}
std::unordered_map<u32, bool> SlippiPlaybackStatus::getDenylist()
{
return denylist;
}
std::vector<u8> SlippiPlaybackStatus::getLegacyCodelist()
{
return legacyCodelist;
}
inline std::string readString(json obj, std::string key)
{
auto item = obj.find(key);
if (item == obj.end() || item.value().is_null())
{
return "";
}
return obj[key];
}
void SlippiPlaybackStatus::generateDenylist()
{
// We start by populating the denylist with old injections that are not longer used but need
// to be included for backward compatibility reasons.
// It also includes some common codes that are not in our codebase
denylist = {
// Backward compatibility
// Post 3.4.0: Recording/FlushFrameBuffer.asm
{0x802fef88, true},
// Post 3.4.0: Recording/SendGamePostFrame.asm
{0x8006c5d8, true},
// Post 3.7.0: Recording/SendGameEnd.asm
{0x8016d30c, true},
// Common codes not in our codebase
// HUD Transparency v1.1 (https://smashboards.com/threads/transparent-hud-v1-1.508509/)
{0x802f6690, true},
// Smaller "Ready, GO!" (https://smashboards.com/threads/smaller-ready-go.509740/)
{0x802F71E0, true},
// Yellow During IASA
// (https://smashboards.com/threads/color-overlays-for-iasa-frames.401474/post-19120928)
{0x80071960, true},
};
// Next we parse through the injection lists files to exclude all of our injections that don't
// affect gameplay
std::string injections_path =
File::GetSysDirectory() + DIR_SEP + "Slippi" + DIR_SEP + "InjectionLists";
auto entries = File::ScanDirectoryTree(injections_path, false);
for (auto& entry : entries.children)
{
if (entry.isDirectory)
continue;
std::string contents;
File::ReadFileToString(entry.physicalName, contents);
auto res = json::parse(contents, nullptr, false);
if (res.is_discarded() || !res.is_object())
{
ERROR_LOG_FMT(SLIPPI, "Injection list file {} is not properly formatted.",
entry.physicalName);
continue;
}
auto list = res["Details"];
if (list.is_discarded() || !list.is_array())
{
ERROR_LOG_FMT(SLIPPI, "Injection list file {} is not properly formatted.",
entry.physicalName);
continue;
}
// Go through all the injections
for (auto& injection : list)
{
if (injection.is_discarded() || !injection.is_object())
{
ERROR_LOG_FMT(SLIPPI, "Injection entry in list file {} is not properly formatted.",
entry.physicalName);
continue;
}
// Check if tags indicate that this code affects gameplay, if so, do not put it on the
// denylist
auto tags = readString(injection, "Tags");
if (tags.find("[affects-gameplay]") != std::string::npos)
continue;
// Add injection to denylist
u32 address;
auto addressStr = readString(injection, "InjectionAddress");
if (!AsciiToHex(addressStr, address))
{
ERROR_LOG_FMT(SLIPPI, "Injection list file {}: Could not parse address: {}",
entry.physicalName, addressStr);
continue;
}
denylist[address] = true;
// INFO_LOG(SLIPPI, "New denylist entry: %08X", address);
}
}
NOTICE_LOG_FMT(SLIPPI, "Denylist populated with length: {}", denylist.size());
}
void SlippiPlaybackStatus::generateLegacyCodelist()
{
legacyCodelist = {
0xC2, 0x0C, 0x9A, 0x44, 0x00, 0x00, 0x00,
0x2F, // #External/UCF + Arduino Toggle UI/UCF/UCF 0.74
// Dashback - Check for Toggle.asm
0xD0, 0x1F, 0x00, 0x2C, 0x88, 0x9F, 0x06, 0x18, 0x38, 0x62, 0xF2, 0x28, 0x7C, 0x63, 0x20,
0xAE, 0x2C, 0x03, 0x00, 0x01, 0x41, 0x82, 0x00, 0x14, 0x38, 0x62, 0xF2, 0x2C, 0x7C, 0x63,
0x20, 0xAE, 0x2C, 0x03, 0x00, 0x01, 0x40, 0x82, 0x01, 0x50, 0x7C, 0x08, 0x02, 0xA6, 0x90,
0x01, 0x00, 0x04, 0x94, 0x21, 0xFF, 0x50, 0xBE, 0x81, 0x00, 0x08, 0x48, 0x00, 0x01, 0x21,
0x7F, 0xC8, 0x02, 0xA6, 0xC0, 0x3F, 0x08, 0x94, 0xC0, 0x5E, 0x00, 0x00, 0xFC, 0x01, 0x10,
0x40, 0x40, 0x82, 0x01, 0x18, 0x80, 0x8D, 0xAE, 0xB4, 0xC0, 0x3F, 0x06, 0x20, 0xFC, 0x20,
0x0A, 0x10, 0xC0, 0x44, 0x00, 0x3C, 0xFC, 0x01, 0x10, 0x40, 0x41, 0x80, 0x01, 0x00, 0x88,
0x7F, 0x06, 0x70, 0x2C, 0x03, 0x00, 0x02, 0x40, 0x80, 0x00, 0xF4, 0x88, 0x7F, 0x22, 0x1F,
0x54, 0x60, 0x07, 0x39, 0x40, 0x82, 0x00, 0xE8, 0x3C, 0x60, 0x80, 0x4C, 0x60, 0x63, 0x1F,
0x78, 0x8B, 0xA3, 0x00, 0x01, 0x38, 0x7D, 0xFF, 0xFE, 0x88, 0x9F, 0x06, 0x18, 0x48, 0x00,
0x00, 0x8D, 0x7C, 0x7C, 0x1B, 0x78, 0x7F, 0xA3, 0xEB, 0x78, 0x88, 0x9F, 0x06, 0x18, 0x48,
0x00, 0x00, 0x7D, 0x7C, 0x7C, 0x18, 0x50, 0x7C, 0x63, 0x19, 0xD6, 0x2C, 0x03, 0x15, 0xF9,
0x40, 0x81, 0x00, 0xB0, 0x38, 0x00, 0x00, 0x01, 0x90, 0x1F, 0x23, 0x58, 0x90, 0x1F, 0x23,
0x40, 0x80, 0x9F, 0x00, 0x04, 0x2C, 0x04, 0x00, 0x0A, 0x40, 0xA2, 0x00, 0x98, 0x88, 0x7F,
0x00, 0x0C, 0x38, 0x80, 0x00, 0x01, 0x3D, 0x80, 0x80, 0x03, 0x61, 0x8C, 0x41, 0x8C, 0x7D,
0x89, 0x03, 0xA6, 0x4E, 0x80, 0x04, 0x21, 0x2C, 0x03, 0x00, 0x00, 0x41, 0x82, 0x00, 0x78,
0x80, 0x83, 0x00, 0x2C, 0x80, 0x84, 0x1E, 0xCC, 0xC0, 0x3F, 0x00, 0x2C, 0xD0, 0x24, 0x00,
0x18, 0xC0, 0x5E, 0x00, 0x04, 0xFC, 0x01, 0x10, 0x40, 0x41, 0x81, 0x00, 0x0C, 0x38, 0x60,
0x00, 0x80, 0x48, 0x00, 0x00, 0x08, 0x38, 0x60, 0x00, 0x7F, 0x98, 0x64, 0x00, 0x06, 0x48,
0x00, 0x00, 0x48, 0x7C, 0x85, 0x23, 0x78, 0x38, 0x63, 0xFF, 0xFF, 0x2C, 0x03, 0x00, 0x00,
0x40, 0x80, 0x00, 0x08, 0x38, 0x63, 0x00, 0x05, 0x3C, 0x80, 0x80, 0x46, 0x60, 0x84, 0xB1,
0x08, 0x1C, 0x63, 0x00, 0x30, 0x7C, 0x84, 0x1A, 0x14, 0x1C, 0x65, 0x00, 0x0C, 0x7C, 0x84,
0x1A, 0x14, 0x88, 0x64, 0x00, 0x02, 0x7C, 0x63, 0x07, 0x74, 0x4E, 0x80, 0x00, 0x20, 0x4E,
0x80, 0x00, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBA, 0x81, 0x00, 0x08,
0x80, 0x01, 0x00, 0xB4, 0x38, 0x21, 0x00, 0xB0, 0x7C, 0x08, 0x03, 0xA6, 0x00, 0x00, 0x00,
0x00, 0xC2, 0x09, 0x98, 0xA4, 0x00, 0x00, 0x00,
0x2B, // #External/UCF + Arduino Toggle UI/UCF/UCF
// 0.74 Shield Drop - Check for Toggle.asm
0x7C, 0x08, 0x02, 0xA6, 0x90, 0x01, 0x00, 0x04, 0x94, 0x21, 0xFF, 0x50, 0xBE, 0x81, 0x00,
0x08, 0x7C, 0x7E, 0x1B, 0x78, 0x83, 0xFE, 0x00, 0x2C, 0x48, 0x00, 0x01, 0x01, 0x7F, 0xA8,
0x02, 0xA6, 0x88, 0x9F, 0x06, 0x18, 0x38, 0x62, 0xF2, 0x28, 0x7C, 0x63, 0x20, 0xAE, 0x2C,
0x03, 0x00, 0x01, 0x41, 0x82, 0x00, 0x14, 0x38, 0x62, 0xF2, 0x30, 0x7C, 0x63, 0x20, 0xAE,
0x2C, 0x03, 0x00, 0x01, 0x40, 0x82, 0x00, 0xF8, 0xC0, 0x3F, 0x06, 0x3C, 0x80, 0x6D, 0xAE,
0xB4, 0xC0, 0x03, 0x03, 0x14, 0xFC, 0x01, 0x00, 0x40, 0x40, 0x81, 0x00, 0xE4, 0xC0, 0x3F,
0x06, 0x20, 0x48, 0x00, 0x00, 0x71, 0xD0, 0x21, 0x00, 0x90, 0xC0, 0x3F, 0x06, 0x24, 0x48,
0x00, 0x00, 0x65, 0xC0, 0x41, 0x00, 0x90, 0xEC, 0x42, 0x00, 0xB2, 0xEC, 0x21, 0x00, 0x72,
0xEC, 0x21, 0x10, 0x2A, 0xC0, 0x5D, 0x00, 0x0C, 0xFC, 0x01, 0x10, 0x40, 0x41, 0x80, 0x00,
0xB4, 0x88, 0x9F, 0x06, 0x70, 0x2C, 0x04, 0x00, 0x03, 0x40, 0x81, 0x00, 0xA8, 0xC0, 0x1D,
0x00, 0x10, 0xC0, 0x3F, 0x06, 0x24, 0xFC, 0x00, 0x08, 0x40, 0x40, 0x80, 0x00, 0x98, 0xBA,
0x81, 0x00, 0x08, 0x80, 0x01, 0x00, 0xB4, 0x38, 0x21, 0x00, 0xB0, 0x7C, 0x08, 0x03, 0xA6,
0x80, 0x61, 0x00, 0x1C, 0x83, 0xE1, 0x00, 0x14, 0x38, 0x21, 0x00, 0x18, 0x38, 0x63, 0x00,
0x08, 0x7C, 0x68, 0x03, 0xA6, 0x4E, 0x80, 0x00, 0x20, 0xFC, 0x00, 0x0A, 0x10, 0xC0, 0x3D,
0x00, 0x00, 0xEC, 0x00, 0x00, 0x72, 0xC0, 0x3D, 0x00, 0x04, 0xEC, 0x00, 0x08, 0x28, 0xFC,
0x00, 0x00, 0x1E, 0xD8, 0x01, 0x00, 0x80, 0x80, 0x61, 0x00, 0x84, 0x38, 0x63, 0x00, 0x02,
0x3C, 0x00, 0x43, 0x30, 0xC8, 0x5D, 0x00, 0x14, 0x6C, 0x63, 0x80, 0x00, 0x90, 0x01, 0x00,
0x80, 0x90, 0x61, 0x00, 0x84, 0xC8, 0x21, 0x00, 0x80, 0xEC, 0x01, 0x10, 0x28, 0xC0, 0x3D,
0x00, 0x00, 0xEC, 0x20, 0x08, 0x24, 0x4E, 0x80, 0x00, 0x20, 0x4E, 0x80, 0x00, 0x21, 0x42,
0xA0, 0x00, 0x00, 0x37, 0x27, 0x00, 0x00, 0x43, 0x30, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00,
0xBF, 0x4C, 0xCC, 0xCD, 0x43, 0x30, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x7F, 0xC3, 0xF3,
0x78, 0x7F, 0xE4, 0xFB, 0x78, 0xBA, 0x81, 0x00, 0x08, 0x80, 0x01, 0x00, 0xB4, 0x38, 0x21,
0x00, 0xB0, 0x7C, 0x08, 0x03, 0xA6, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2,
0x16, 0xE7, 0x50, 0x00, 0x00, 0x00,
0x33, // #Common/StaticPatches/ToggledStaticOverwrites.asm
0x88, 0x62, 0xF2, 0x34, 0x2C, 0x03, 0x00, 0x00, 0x41, 0x82, 0x00, 0x14, 0x48, 0x00, 0x00,
0x75, 0x7C, 0x68, 0x02, 0xA6, 0x48, 0x00, 0x01, 0x3D, 0x48, 0x00, 0x00, 0x14, 0x48, 0x00,
0x00, 0x95, 0x7C, 0x68, 0x02, 0xA6, 0x48, 0x00, 0x01, 0x2D, 0x48, 0x00, 0x00, 0x04, 0x88,
0x62, 0xF2, 0x38, 0x2C, 0x03, 0x00, 0x00, 0x41, 0x82, 0x00, 0x14, 0x48, 0x00, 0x00, 0xB9,
0x7C, 0x68, 0x02, 0xA6, 0x48, 0x00, 0x01, 0x11, 0x48, 0x00, 0x00, 0x10, 0x48, 0x00, 0x00,
0xC9, 0x7C, 0x68, 0x02, 0xA6, 0x48, 0x00, 0x01, 0x01, 0x88, 0x62, 0xF2, 0x3C, 0x2C, 0x03,
0x00, 0x00, 0x41, 0x82, 0x00, 0x14, 0x48, 0x00, 0x00, 0xD1, 0x7C, 0x68, 0x02, 0xA6, 0x48,
0x00, 0x00, 0xE9, 0x48, 0x00, 0x01, 0x04, 0x48, 0x00, 0x00, 0xD1, 0x7C, 0x68, 0x02, 0xA6,
0x48, 0x00, 0x00, 0xD9, 0x48, 0x00, 0x00, 0xF4, 0x4E, 0x80, 0x00, 0x21, 0x80, 0x3C, 0xE4,
0xD4, 0x00, 0x24, 0x04, 0x64, 0x80, 0x07, 0x96, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x80, 0x2B,
0x7E, 0x54, 0x48, 0x00, 0x00, 0x88, 0x80, 0x2B, 0x80, 0x8C, 0x48, 0x00, 0x00, 0x84, 0x80,
0x12, 0x39, 0xA8, 0x60, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x4E, 0x80, 0x00, 0x21,
0x80, 0x3C, 0xE4, 0xD4, 0x00, 0x20, 0x00, 0x00, 0x80, 0x07, 0x96, 0xE0, 0x3A, 0x40, 0x00,
0x01, 0x80, 0x2B, 0x7E, 0x54, 0x88, 0x7F, 0x22, 0x40, 0x80, 0x2B, 0x80, 0x8C, 0x2C, 0x03,
0x00, 0x02, 0x80, 0x10, 0xFC, 0x48, 0x90, 0x05, 0x21, 0xDC, 0x80, 0x10, 0xFB, 0x68, 0x90,
0x05, 0x21, 0xDC, 0x80, 0x12, 0x39, 0xA8, 0x90, 0x1F, 0x1A, 0x5C, 0xFF, 0xFF, 0xFF, 0xFF,
0x4E, 0x80, 0x00, 0x21, 0x80, 0x1D, 0x46, 0x10, 0x48, 0x00, 0x00, 0x4C, 0x80, 0x1D, 0x47,
0x24, 0x48, 0x00, 0x00, 0x3C, 0x80, 0x1D, 0x46, 0x0C, 0x80, 0x9F, 0x00, 0xEC, 0xFF, 0xFF,
0xFF, 0xFF, 0x4E, 0x80, 0x00, 0x21, 0x80, 0x1D, 0x46, 0x10, 0x38, 0x83, 0x7F, 0x9C, 0x80,
0x1D, 0x47, 0x24, 0x88, 0x1B, 0x00, 0xC4, 0x80, 0x1D, 0x46, 0x0C, 0x3C, 0x60, 0x80, 0x3B,
0xFF, 0xFF, 0xFF, 0xFF, 0x4E, 0x80, 0x00, 0x21, 0x80, 0x1D, 0x45, 0xFC, 0x48, 0x00, 0x09,
0xDC, 0xFF, 0xFF, 0xFF, 0xFF, 0x4E, 0x80, 0x00, 0x21, 0x80, 0x1D, 0x45, 0xFC, 0x40, 0x80,
0x09, 0xDC, 0xFF, 0xFF, 0xFF, 0xFF, 0x38, 0xA3, 0xFF, 0xFC, 0x84, 0x65, 0x00, 0x04, 0x2C,
0x03, 0xFF, 0xFF, 0x41, 0x82, 0x00, 0x10, 0x84, 0x85, 0x00, 0x04, 0x90, 0x83, 0x00, 0x00,
0x4B, 0xFF, 0xFF, 0xEC, 0x4E, 0x80, 0x00, 0x20, 0x3C, 0x60, 0x80, 0x00, 0x3C, 0x80, 0x00,
0x3B, 0x60, 0x84, 0x72, 0x2C, 0x3D, 0x80, 0x80, 0x32, 0x61, 0x8C, 0x8F, 0x50, 0x7D, 0x89,
0x03, 0xA6, 0x4E, 0x80, 0x04, 0x21, 0x3C, 0x60, 0x80, 0x17, 0x3C, 0x80, 0x80, 0x17, 0x00,
0x00, 0x00, 0x00, 0xC2, 0x1D, 0x14, 0xC8, 0x00, 0x00, 0x00, 0x04, // #Common/Preload Stadium
// Transformations/Handlers/Init
// isLoaded Bool.asm
0x88, 0x62, 0xF2, 0x38, 0x2C, 0x03, 0x00, 0x00, 0x41, 0x82, 0x00, 0x0C, 0x38, 0x60, 0x00,
0x00, 0x98, 0x7F, 0x00, 0xF0, 0x3B, 0xA0, 0x00, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xC2, 0x1D, 0x45, 0xEC, 0x00, 0x00, 0x00, 0x1B, // #Common/Preload Stadium
// Transformations/Handlers/Load
// Transformation.asm
0x88, 0x62, 0xF2, 0x38, 0x2C, 0x03, 0x00, 0x00, 0x41, 0x82, 0x00, 0xC4, 0x88, 0x7F, 0x00,
0xF0, 0x2C, 0x03, 0x00, 0x00, 0x40, 0x82, 0x00, 0xB8, 0x38, 0x60, 0x00, 0x04, 0x3D, 0x80,
0x80, 0x38, 0x61, 0x8C, 0x05, 0x80, 0x7D, 0x89, 0x03, 0xA6, 0x4E, 0x80, 0x04, 0x21, 0x54,
0x60, 0x10, 0x3A, 0xA8, 0x7F, 0x00, 0xE2, 0x3C, 0x80, 0x80, 0x3B, 0x60, 0x84, 0x7F, 0x9C,
0x7C, 0x84, 0x00, 0x2E, 0x7C, 0x03, 0x20, 0x00, 0x41, 0x82, 0xFF, 0xD4, 0x90, 0x9F, 0x00,
0xEC, 0x2C, 0x04, 0x00, 0x03, 0x40, 0x82, 0x00, 0x0C, 0x38, 0x80, 0x00, 0x00, 0x48, 0x00,
0x00, 0x34, 0x2C, 0x04, 0x00, 0x04, 0x40, 0x82, 0x00, 0x0C, 0x38, 0x80, 0x00, 0x01, 0x48,
0x00, 0x00, 0x24, 0x2C, 0x04, 0x00, 0x09, 0x40, 0x82, 0x00, 0x0C, 0x38, 0x80, 0x00, 0x02,
0x48, 0x00, 0x00, 0x14, 0x2C, 0x04, 0x00, 0x06, 0x40, 0x82, 0x00, 0x00, 0x38, 0x80, 0x00,
0x03, 0x48, 0x00, 0x00, 0x04, 0x3C, 0x60, 0x80, 0x3E, 0x60, 0x63, 0x12, 0x48, 0x54, 0x80,
0x10, 0x3A, 0x7C, 0x63, 0x02, 0x14, 0x80, 0x63, 0x03, 0xD8, 0x80, 0x9F, 0x00, 0xCC, 0x38,
0xBF, 0x00, 0xC8, 0x3C, 0xC0, 0x80, 0x1D, 0x60, 0xC6, 0x42, 0x20, 0x38, 0xE0, 0x00, 0x00,
0x3D, 0x80, 0x80, 0x01, 0x61, 0x8C, 0x65, 0x80, 0x7D, 0x89, 0x03, 0xA6, 0x4E, 0x80, 0x04,
0x21, 0x38, 0x60, 0x00, 0x01, 0x98, 0x7F, 0x00, 0xF0, 0x80, 0x7F, 0x00, 0xD8, 0x60, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0x1D, 0x4F, 0x14, 0x00, 0x00, 0x00,
0x04, // #Common/Preload
// Stadium
// Transformations/Handlers/Reset
// isLoaded.asm
0x88, 0x62, 0xF2, 0x38, 0x2C, 0x03, 0x00, 0x00, 0x41, 0x82, 0x00, 0x0C, 0x38, 0x60, 0x00,
0x00, 0x98, 0x7F, 0x00, 0xF0, 0x80, 0x6D, 0xB2, 0xD8, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xC2, 0x06, 0x8F, 0x30, 0x00, 0x00, 0x00,
0x9D, // #Common/PAL/Handlers/Character DAT
// Patcher.asm
0x88, 0x62, 0xF2, 0x34, 0x2C, 0x03, 0x00, 0x00, 0x41, 0x82, 0x04, 0xD4, 0x7C, 0x08, 0x02,
0xA6, 0x90, 0x01, 0x00, 0x04, 0x94, 0x21, 0xFF, 0x50, 0xBE, 0x81, 0x00, 0x08, 0x83, 0xFE,
0x01, 0x0C, 0x83, 0xFF, 0x00, 0x08, 0x3B, 0xFF, 0xFF, 0xE0, 0x80, 0x7D, 0x00, 0x00, 0x2C,
0x03, 0x00, 0x1B, 0x40, 0x80, 0x04, 0x9C, 0x48, 0x00, 0x00, 0x71, 0x48, 0x00, 0x00, 0xA9,
0x48, 0x00, 0x00, 0xB9, 0x48, 0x00, 0x01, 0x51, 0x48, 0x00, 0x01, 0x79, 0x48, 0x00, 0x01,
0x79, 0x48, 0x00, 0x02, 0x29, 0x48, 0x00, 0x02, 0x39, 0x48, 0x00, 0x02, 0x81, 0x48, 0x00,
0x02, 0xF9, 0x48, 0x00, 0x03, 0x11, 0x48, 0x00, 0x03, 0x11, 0x48, 0x00, 0x03, 0x11, 0x48,
0x00, 0x03, 0x11, 0x48, 0x00, 0x03, 0x21, 0x48, 0x00, 0x03, 0x21, 0x48, 0x00, 0x03, 0x89,
0x48, 0x00, 0x03, 0x89, 0x48, 0x00, 0x03, 0x91, 0x48, 0x00, 0x03, 0x91, 0x48, 0x00, 0x03,
0xA9, 0x48, 0x00, 0x03, 0xA9, 0x48, 0x00, 0x03, 0xB9, 0x48, 0x00, 0x03, 0xB9, 0x48, 0x00,
0x03, 0xC9, 0x48, 0x00, 0x03, 0xC9, 0x48, 0x00, 0x03, 0xC9, 0x48, 0x00, 0x04, 0x29, 0x7C,
0x88, 0x02, 0xA6, 0x1C, 0x63, 0x00, 0x04, 0x7C, 0x84, 0x1A, 0x14, 0x80, 0xA4, 0x00, 0x00,
0x54, 0xA5, 0x01, 0xBA, 0x7C, 0xA4, 0x2A, 0x14, 0x80, 0x65, 0x00, 0x00, 0x80, 0x85, 0x00,
0x04, 0x2C, 0x03, 0x00, 0xFF, 0x41, 0x82, 0x00, 0x14, 0x7C, 0x63, 0xFA, 0x14, 0x90, 0x83,
0x00, 0x00, 0x38, 0xA5, 0x00, 0x08, 0x4B, 0xFF, 0xFF, 0xE4, 0x48, 0x00, 0x03, 0xF0, 0x00,
0x00, 0x33, 0x44, 0x3F, 0x54, 0x7A, 0xE1, 0x00, 0x00, 0x33, 0x60, 0x42, 0xC4, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x37, 0x9C, 0x42, 0x92, 0x00, 0x00, 0x00, 0x00, 0x39,
0x08, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x0C, 0x40, 0x86, 0x66, 0x66, 0x00, 0x00,
0x39, 0x10, 0x3D, 0xEA, 0x0E, 0xA1, 0x00, 0x00, 0x39, 0x28, 0x41, 0xA0, 0x00, 0x00, 0x00,
0x00, 0x3C, 0x04, 0x2C, 0x01, 0x48, 0x0C, 0x00, 0x00, 0x47, 0x20, 0x1B, 0x96, 0x80, 0x13,
0x00, 0x00, 0x47, 0x34, 0x1B, 0x96, 0x80, 0x13, 0x00, 0x00, 0x47, 0x3C, 0x04, 0x00, 0x00,
0x09, 0x00, 0x00, 0x4A, 0x40, 0x2C, 0x00, 0x68, 0x11, 0x00, 0x00, 0x4A, 0x4C, 0x28, 0x1B,
0x00, 0x13, 0x00, 0x00, 0x4A, 0x50, 0x0D, 0x00, 0x01, 0x0B, 0x00, 0x00, 0x4A, 0x54, 0x2C,
0x80, 0x68, 0x11, 0x00, 0x00, 0x4A, 0x60, 0x28, 0x1B, 0x00, 0x13, 0x00, 0x00, 0x4A, 0x64,
0x0D, 0x00, 0x01, 0x0B, 0x00, 0x00, 0x4B, 0x24, 0x2C, 0x00, 0x68, 0x0D, 0x00, 0x00, 0x4B,
0x30, 0x0F, 0x10, 0x40, 0x13, 0x00, 0x00, 0x4B, 0x38, 0x2C, 0x80, 0x38, 0x0D, 0x00, 0x00,
0x4B, 0x44, 0x0F, 0x10, 0x40, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x38, 0x0C, 0x00,
0x00, 0x00, 0x07, 0x00, 0x00, 0x4E, 0xF8, 0x2C, 0x00, 0x38, 0x03, 0x00, 0x00, 0x4F, 0x08,
0x0F, 0x80, 0x00, 0x0B, 0x00, 0x00, 0x4F, 0x0C, 0x2C, 0x80, 0x20, 0x03, 0x00, 0x00, 0x4F,
0x1C, 0x0F, 0x80, 0x00, 0x0B, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,
0x4D, 0x10, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x70, 0x42, 0x94, 0x00, 0x00, 0x00,
0x00, 0x4D, 0xD4, 0x41, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xE0, 0x41, 0x90, 0x00, 0x00,
0x00, 0x00, 0x83, 0xAC, 0x2C, 0x00, 0x00, 0x09, 0x00, 0x00, 0x83, 0xB8, 0x34, 0x8C, 0x80,
0x11, 0x00, 0x00, 0x84, 0x00, 0x34, 0x8C, 0x80, 0x11, 0x00, 0x00, 0x84, 0x30, 0x05, 0x00,
0x00, 0x8B, 0x00, 0x00, 0x84, 0x38, 0x04, 0x1A, 0x05, 0x00, 0x00, 0x00, 0x84, 0x44, 0x05,
0x00, 0x00, 0x8B, 0x00, 0x00, 0x84, 0xDC, 0x05, 0x78, 0x05, 0x78, 0x00, 0x00, 0x85, 0xB8,
0x10, 0x00, 0x01, 0x0B, 0x00, 0x00, 0x85, 0xC0, 0x03, 0xE8, 0x01, 0xF4, 0x00, 0x00, 0x85,
0xCC, 0x10, 0x00, 0x01, 0x0B, 0x00, 0x00, 0x85, 0xD4, 0x03, 0x84, 0x03, 0xE8, 0x00, 0x00,
0x85, 0xE0, 0x10, 0x00, 0x01, 0x0B, 0x00, 0x00, 0x88, 0x18, 0x0B, 0x00, 0x01, 0x0B, 0x00,
0x00, 0x88, 0x2C, 0x0B, 0x00, 0x01, 0x0B, 0x00, 0x00, 0x88, 0xF8, 0x04, 0x1A, 0x0B, 0xB8,
0x00, 0x00, 0x89, 0x3C, 0x04, 0x1A, 0x0B, 0xB8, 0x00, 0x00, 0x89, 0x80, 0x04, 0x1A, 0x0B,
0xB8, 0x00, 0x00, 0x89, 0xE0, 0x04, 0xFE, 0xF7, 0x04, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,
0x36, 0xCC, 0x42, 0xEC, 0x00, 0x00, 0x00, 0x00, 0x37, 0xC4, 0x0C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0x00, 0x00, 0x34, 0x68, 0x3F, 0x66, 0x66, 0x66, 0x00, 0x00, 0x39, 0xD8,
0x44, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x44, 0xB4, 0x99, 0x00, 0x11, 0x00, 0x00, 0x3A,
0x48, 0x1B, 0x8C, 0x00, 0x8F, 0x00, 0x00, 0x3A, 0x58, 0xB4, 0x99, 0x00, 0x11, 0x00, 0x00,
0x3A, 0x5C, 0x1B, 0x8C, 0x00, 0x8F, 0x00, 0x00, 0x3A, 0x6C, 0xB4, 0x99, 0x00, 0x11, 0x00,
0x00, 0x3A, 0x70, 0x1B, 0x8C, 0x00, 0x8F, 0x00, 0x00, 0x3B, 0x30, 0x44, 0x0C, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x45, 0xC8, 0x2C, 0x01, 0x50, 0x10, 0x00, 0x00, 0x45,
0xD4, 0x2D, 0x19, 0x80, 0x13, 0x00, 0x00, 0x45, 0xDC, 0x2C, 0x80, 0xB0, 0x10, 0x00, 0x00,
0x45, 0xE8, 0x2D, 0x19, 0x80, 0x13, 0x00, 0x00, 0x49, 0xC4, 0x2C, 0x00, 0x68, 0x0A, 0x00,
0x00, 0x49, 0xD0, 0x28, 0x1B, 0x80, 0x13, 0x00, 0x00, 0x49, 0xD8, 0x2C, 0x80, 0x78, 0x0A,
0x00, 0x00, 0x49, 0xE4, 0x28, 0x1B, 0x80, 0x13, 0x00, 0x00, 0x49, 0xF0, 0x2C, 0x00, 0x68,
0x08, 0x00, 0x00, 0x49, 0xFC, 0x23, 0x1B, 0x80, 0x13, 0x00, 0x00, 0x4A, 0x04, 0x2C, 0x80,
0x78, 0x08, 0x00, 0x00, 0x4A, 0x10, 0x23, 0x1B, 0x80, 0x13, 0x00, 0x00, 0x5C, 0x98, 0x1E,
0x0C, 0x80, 0x80, 0x00, 0x00, 0x5C, 0xF4, 0xB4, 0x80, 0x0C, 0x90, 0x00, 0x00, 0x5D, 0x08,
0xB4, 0x80, 0x0C, 0x90, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3A, 0x1C, 0xB4, 0x94, 0x00,
0x13, 0x00, 0x00, 0x3A, 0x64, 0x2C, 0x00, 0x00, 0x15, 0x00, 0x00, 0x3A, 0x70, 0xB4, 0x92,
0x80, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00,
0x00, 0x00, 0xFF, 0x00, 0x00, 0x64, 0x7C, 0xB4, 0x9A, 0x40, 0x17, 0x00, 0x00, 0x64, 0x80,
0x64, 0x00, 0x10, 0x97, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x33,
0xE4, 0x42, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x45, 0x28, 0x2C, 0x01, 0x30, 0x11, 0x00, 0x00,
0x45, 0x34, 0xB4, 0x98, 0x80, 0x13, 0x00, 0x00, 0x45, 0x3C, 0x2C, 0x81, 0x30, 0x11, 0x00,
0x00, 0x45, 0x48, 0xB4, 0x98, 0x80, 0x13, 0x00, 0x00, 0x45, 0x50, 0x2D, 0x00, 0x20, 0x11,
0x00, 0x00, 0x45, 0x5C, 0xB4, 0x98, 0x80, 0x13, 0x00, 0x00, 0x45, 0xF8, 0x2C, 0x01, 0x30,
0x0F, 0x00, 0x00, 0x46, 0x08, 0x0F, 0x00, 0x01, 0x0B, 0x00, 0x00, 0x46, 0x0C, 0x2C, 0x81,
0x28, 0x0F, 0x00, 0x00, 0x46, 0x1C, 0x0F, 0x00, 0x01, 0x0B, 0x00, 0x00, 0x4A, 0xEC, 0x2C,
0x00, 0x70, 0x03, 0x00, 0x00, 0x4B, 0x00, 0x2C, 0x80, 0x38, 0x03, 0x00, 0x00, 0x00, 0xFF,
0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x48, 0x5C, 0x2C, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00,
0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x37, 0xB0, 0x3F, 0x59, 0x99, 0x9A, 0x00, 0x00,
0x37, 0xCC, 0x42, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x55, 0x20, 0x87, 0x11, 0x80, 0x13, 0x00,
0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3B, 0x8C, 0x44, 0x0C, 0x00, 0x00,
0x00, 0x00, 0x3D, 0x0C, 0x44, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
0xFF, 0x00, 0x00, 0x50, 0xE4, 0xB4, 0x99, 0x00, 0x13, 0x00, 0x00, 0x50, 0xF8, 0xB4, 0x99,
0x00, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00,
0x00, 0x4E, 0xB0, 0x02, 0xBC, 0xFF, 0x38, 0x00, 0x00, 0x4E, 0xBC, 0x14, 0x00, 0x01, 0x23,
0x00, 0x00, 0x4E, 0xC4, 0x03, 0x84, 0x01, 0xF4, 0x00, 0x00, 0x4E, 0xD0, 0x14, 0x00, 0x01,
0x23, 0x00, 0x00, 0x4E, 0xD8, 0x04, 0x4C, 0x04, 0xB0, 0x00, 0x00, 0x4E, 0xE4, 0x14, 0x00,
0x01, 0x23, 0x00, 0x00, 0x50, 0x5C, 0x2C, 0x00, 0x68, 0x15, 0x00, 0x00, 0x50, 0x6C, 0x14,
0x08, 0x01, 0x23, 0x00, 0x00, 0x50, 0x70, 0x2C, 0x80, 0x60, 0x15, 0x00, 0x00, 0x50, 0x80,
0x14, 0x08, 0x01, 0x23, 0x00, 0x00, 0x50, 0x84, 0x2D, 0x00, 0x20, 0x15, 0x00, 0x00, 0x50,
0x94, 0x14, 0x08, 0x01, 0x23, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xBA, 0x81,
0x00, 0x08, 0x80, 0x01, 0x00, 0xB4, 0x38, 0x21, 0x00, 0xB0, 0x7C, 0x08, 0x03, 0xA6, 0x3C,
0x60, 0x80, 0x3C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0x2F, 0x9A, 0x3C,
0x00, 0x00, 0x00, 0x08, // #Common/PAL/Handlers/PAL Stock Icons.asm
0x88, 0x62, 0xF2, 0x34, 0x2C, 0x03, 0x00, 0x00, 0x41, 0x82, 0x00, 0x30, 0x48, 0x00, 0x00,
0x21, 0x7C, 0x88, 0x02, 0xA6, 0x80, 0x64, 0x00, 0x00, 0x90, 0x7D, 0x00, 0x2C, 0x90, 0x7D,
0x00, 0x30, 0x80, 0x64, 0x00, 0x04, 0x90, 0x7D, 0x00, 0x3C, 0x48, 0x00, 0x00, 0x10, 0x4E,
0x80, 0x00, 0x21, 0x3F, 0x59, 0x99, 0x9A, 0xC1, 0xA8, 0x00, 0x00, 0x80, 0x1D, 0x00, 0x14,
0x00, 0x00, 0x00, 0x00, 0xC2, 0x10, 0xFC, 0x44, 0x00, 0x00, 0x00,
0x04, // #Common/PAL/Handlers/DK
// Up B/Aerial Up B.asm
0x88, 0x82, 0xF2, 0x34, 0x2C, 0x04, 0x00, 0x00, 0x41, 0x82, 0x00, 0x10, 0x3C, 0x00, 0x80,
0x11, 0x60, 0x00, 0x00, 0x74, 0x48, 0x00, 0x00, 0x08, 0x38, 0x03, 0xD7, 0x74, 0x00, 0x00,
0x00, 0x00, 0xC2, 0x10, 0xFB, 0x64, 0x00, 0x00, 0x00,
0x04, // #Common/PAL/Handlers/DK Up B/Grounded
// Up B.asm
0x88, 0x82, 0xF2, 0x34, 0x2C, 0x04, 0x00, 0x00, 0x41, 0x82, 0x00, 0x10, 0x3C, 0x00, 0x80,
0x11, 0x60, 0x00, 0x00, 0x74, 0x48, 0x00, 0x00, 0x08, 0x38, 0x03, 0xD7, 0x74, 0x00, 0x00,
0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // Termination sequence
};
}
SlippiPlaybackStatus::~SlippiPlaybackStatus()
{
// Kill threads to prevent cleanup crash

View file

@ -39,6 +39,8 @@ public:
bool shouldFFWFrame(s32 frameIndex) const;
void prepareSlippiPlayback(s32& frameIndex);
void setHardFFW(bool enable);
std::unordered_map<u32, bool> getDenylist();
std::vector<u8> getLegacyCodelist();
void seekToFrame();
private:
@ -46,12 +48,17 @@ private:
void loadState(s32 closestStateFrame);
void processInitialState();
void updateWatchSettingsStartEnd();
void generateDenylist();
void generateLegacyCodelist();
std::unordered_map<int32_t, std::shared_future<std::string>>
futureDiffs; // State diffs keyed by frameIndex, processed async
std::vector<u8> iState; // The initial state
std::vector<u8> cState; // The current (latest) state
std::unordered_map<u32, bool> denylist;
std::vector<u8> legacyCodelist;
open_vcdiff::VCDiffDecoder decoder;
open_vcdiff::VCDiffEncoder* encoder = NULL;
};

View file

@ -106,28 +106,21 @@ bool SlippiUser::AttemptLogin()
{
std::string user_file_path = getUserFilePath();
// INFO_LOG_FMT(SLIPPI_ONLINE, "Looking for file at: {}", user_file_path);
// TODO: Remove a couple updates after ranked
#ifndef __APPLE__
{
// Put the filename here in its own scope because we don't really need it elsewhere
std::string user_file_path_txt = user_file_path + ".txt";
if (File::Exists(user_file_path_txt))
#ifdef _WIN32
std::string old_user_file_path = File::GetExeDirectory() + DIR_SEP + "user.json";
#else
std::string old_user_file_path = File::GetUserPath(D_USER_IDX) + DIR_SEP + "user.json";
#endif
if (File::Exists(old_user_file_path) && !File::Rename(old_user_file_path, user_file_path))
{
// If both files exist we just log they exist and take no further action
if (File::Exists(user_file_path))
{
INFO_LOG_FMT(SLIPPI_ONLINE,
"Found both .json.txt and .json file for user data. Using .json "
"and ignoring the .json.txt");
}
// If only the .txt file exists move the contents to a json file and log if it fails
else if (!File::Rename(user_file_path_txt, user_file_path))
{
WARN_LOG_FMT(SLIPPI_ONLINE, "Could not move file {} to {}", user_file_path_txt,
user_file_path);
}
WARN_LOG_FMT(SLIPPI_ONLINE, "Could not move file {} to {}", old_user_file_path,
user_file_path);
}
}
#endif
// Get user file
std::string user_file_contents;

View file

@ -491,21 +491,21 @@ void HotkeyScheduler::Run()
Config::SetCurrent(Config::MAIN_EMULATION_SPEED, speed);
ShowEmulationSpeed();
}
// Slot Saving / Loading
if (IsHotkey(HK_SAVE_STATE_SLOT_SELECTED))
emit StateSaveSlotHotkey();
if (IsHotkey(HK_LOAD_STATE_SLOT_SELECTED))
emit StateLoadSlotHotkey();
if (IsHotkey(HK_INCREMENT_SELECTED_STATE_SLOT))
emit IncrementSelectedStateSlotHotkey();
if (IsHotkey(HK_DECREMENT_SELECTED_STATE_SLOT))
emit DecrementSelectedStateSlotHotkey();
}
// Slot Saving / Loading
if (IsHotkey(HK_SAVE_STATE_SLOT_SELECTED))
emit StateSaveSlotHotkey();
if (IsHotkey(HK_LOAD_STATE_SLOT_SELECTED))
emit StateLoadSlotHotkey();
if (IsHotkey(HK_INCREMENT_SELECTED_STATE_SLOT))
emit IncrementSelectedStateSlotHotkey();
if (IsHotkey(HK_DECREMENT_SELECTED_STATE_SLOT))
emit DecrementSelectedStateSlotHotkey();
// Stereoscopy
if (IsHotkey(HK_TOGGLE_STEREO_SBS))
{