MMDK
REFramework Moveset Mod Development Kit for Street Fighter 6
Install / Use
/learn @alphazolam/MMDKREADME
MMDK - Moveset Mod Development Kit
MMDK is a REFramework script and mod development kit for creating and researching Lua moveset mods in Street Fighter 6. It creates a dictionary of all the relevant data needed to mod movesets for each fighter, along with functions and methods to change and add-to various aspects of the moves, and then allows you to edit this dictionary at the start of each match using a Lua file.
It also can produce a "Moveset Research" window where you can set the current move being performed, view its keys live and skip frame-by-frame as they are executed. Combined with the Hitbox Viewer, it can provide a lot of insight into SF6's mechanics.
MMDK allows for full moveset modding including adding entirely new moves with new command inputs while using animations, VFX, keyframe data and damage data from any characters. Mods for MMDK are created as Lua files and multiple of them can run on a character per match.
Installation
- Download REFramework SF6.zip here (must be newer than Sept 8 2023) and place its dinput8.dll in your game folder
- Download this repository under Code -> Download as Zip and extract the the contents of each folder inside to your game folder or install as a mod with Fluffy Mod Manager
EMV Engine
Download EMV Engine + Console to see useful control panels for each object (including keys) while developing moveset mods, allowing you to do live testing more easily. EMV is also required to see the imgui menu trees for the fighter in the Moveset Research window.
Usage
- Open REFramework's main window by pressing Insert (default)
- Navigate to '
Script Generated UI' and open the MMDK menu - Here you can enable and disable the automatic modification of specific characters by the mod's fighter Lua files, control which mods are active for what characters, control individual mod options, and set the visibility of the Moveset Research window
The Street Fighter Battle System
- Street Fighter 6 uses the same battle system as Street Fighter V and IV (and maybe earlier), ported into RE Engine's "Managed Objects"
- The battle system for each fighter is completely independent from their visual appearance (mesh, GameObject); one can exist without the other
- Each fighter has a list of "Actions" (moves), each identified by a number ID
- Each Action has 50+ arrays of keys for different key types (most empty) across its duration
- A Key activates game logic for the character over a specific frame-range of the action
Key Types
- A
MotionKeyactivates an animation (MotionID) from a motlist file (MotionType) at a certain frame - A
AttackCollisionKeyactivates a hitbox rectangle from the character's rectangle list over a frame range, and applies damage from a linked 'HIT_DT_TBL' when the hit connects - A
DamageCollisionKeyactivates a hurtbox rectangle over a frame range - A
TriggerKeydetermines the move's cancel list (what actions the move can transition into) - A
VfxKeyplays a visual effect - A
BranchKeyconnects actions together automatically without player inputs - A
ShotKeyspawns a projectile (another action) - A
SEKeyplays a sound effect by its unique ID (number) - A
VoiceKeyplays a voice line by its unique ID (number) - A
FacialKeyplays a facial animation, similar to a MotionKey - A
SteerKeymoves the fighter in a X,Y direction - A
PlaceKeyalso moves a fighter in a X,Y direction during a move, but frame-by-frame - A
LockKeylinks certain actions together and can apply damage in some cases - Various other types of keys are also available; test them in the Moveset Research window with EMV Engine
The 'Moveset Research' Window
Under REFramework Script Generated UI, MMDK features a checkbox to enable a Moveset Research window. This window will appear during a match and allow you to trigger moves from the fighter's list, seek across the frames of their move, play in slow motion (or reverse), and seek frame by frame. It can also preview animations and sound effects, among other things.

Functionalities of the Moveset Research window are largely explained through its tooltips; hover your mouse over each element to see what it does.
Scripting Fighter Lua Files
MMDK provides a lua template file for each fighter by name, under reframework/autorun/MMDK. These files each contain a function called apply_moveset_changes, which is automatically run when the character is enabled in the mod and they are detected in a match.
Within this function, you have access to many useful tables and objects from the battle system for the context of modding that character's moveset, all contained in the data parameter. data is a lua class, and it has several attached methods that facilitate adding new objects such as Actions, VFX, and Triggers to the moveset.
- The
dataparameter containsdata.moves_dict, which has a dictionary of actions/moves (as Lua tables). You can assign a move to a local variable such as Juri's:
local MyAction = data.moves_dict.By_Name.SPA_TENSINREN_L
- Each action will have subtables for its active keys, such as
MyAction.TriggerKey[1](for the first key in the Lua table of the list),MyAction.AttackCollisionKey.list(for the actual List object), etc.
NOTE: RE Engine objects use 0-based indexing and are actually parts of the game, while Lua uses 1-based indexing and its tables are only part of MDMK. MyAction.TriggerKey is a Lua table while MyAction.TriggerKey.list isn't, so it's important to know the difference
-
You can also access the keys through the
fab'FAB_ACTION 'object of the action, which has the 54+ keys lists as an array calledMyAction.fab.Keysand also has the master frame count of an action -
The
MyAction.dmgtable can exist if a move has an AttackCollisionKey that does damage. Here contains a HIT_DT_TBL, which has 20 differentparamsubtables for different scenarios like being in midair or on the ground when an attack connects. A damage table from an AttackCollisionKey that uses AttackDataIndex15can be accessed asMyAction.dmg[15] -
The
MyAction.boxtable may also be present, containing hurtbox and hitbox rectangles for the move -
The
MyAction.vfxtable contains the VFX elements used by a move -
The
MyAction.triggertable contains the BCM.TRIGGER elements used by a move, dictated by its TriggerKeys. These decide how a move is inputted by button presses -
The
MyAction.tgroupstable contains information about TriggerGroups for a move. These are lists of other actions which the move can cancel into
Lua Basics
For a general understanding of Lua, check out the official Programming in Lua textbook and read through Part I.
Then check out the REFramework guide to see which APIs you have available within a REFramework script like this.
Functions.lua
Functions.lua is included with MMDK and is shared among all its scripts by Lua's 'require' function. Its functions can be accessed through the table fn, by default. Check the source code for a description of each function, provided in comments. Some useful functions being:
- edit_obj - takes a RE Managed object and a table of fields/properties vs values in which to change, and changes them. Use the value
"nil"(in quotes) to set a field to nil (delete it). - append_to_list - takes a RE Managed Object 'Generic.Dictionary/List' object and adds a new element to it, then returns the incremented list
- append_key - Takes a RE Engine System.Collections.Generic.List object, a string KeyType, and a table of field names vs values and adds a new instance of that key to the list object while applying the fields table to it as changes
- clone - Takes a RE Managed Object and returns a basic duplicate of it. Fields of the object are cloned as well unless they are System.Arrays or System.Collections objects
- insert_list/array - Inserts elements from list B (or just element B) into list A at the given index
Fighter Lua Examples
Check out 'Ken Donkey Kick.lua' and 'SF6 Balance Tweaks.lua' for some working examples of MDMK scripts. Since these are Lua scripts, you have full access to what REFramework provides inside each mod and can add things like loading options from json files or creating hooks and callbacks to support your changes.
There are also mods to disable parry/perfect parry, Drive Impact and Drive Rush.
Getting a move:
local moves_by_name = data.moves_dict.By_Name
local ATK_5LP = moves_by_name["ATK_5LP"] --Light punch
-- or --
local moves_by_id = data.moves_dict.By_ID
local ATK_5LP = moves_by_id[600] --Light punch
Getting a move from another character
local ryu_data = data:get_simple_fighter_data("Ryu")
local ryu_moves_by_id = ryu_data.moves_dict.By_ID
local ryu_ATK_5HK = ryu_moves_by_id[617]
Editing damage data:
--ATK_5LP
for attack_idx, dmg_tbl in pairs(ATK_5LP.dmg) do
--Only going through dmg params for standing and crouching:
for i, param_idx in ipairs(hit_types.s_c_only) do
--Use 'to_isvec2' to save special isvec2 Vector2 fields like FloorDest
edit_obj(dmg_tbl.param[param_idx], {DmgType=11, MoveType=15, JuggleLimit=15, JuggleAdd=1, FloorDest=to_isvec2(50, 80)})
--or you can save fields one at a time:
dmg_tbl.param[tbl_idx].DmgType = 11
dmg_tbl.param[tbl_idx].MoveType
Related Skills
node-connect
353.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
111.6kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
353.1kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
353.1kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
