Tutorial · Dark Souls 3
Adding a New Weapon in Dark Souls 3 with DSMapStudio
Adding a New Weapon in Dark Souls 3 with DSMapStudio
"Adding a weapon" rarely means modeling a new sword from scratch — that needs new game assets and is a separate, advanced job. In practice it means cloning an existing weapon's param rows to a new ID, restatting it, naming it, and making it obtainable. The result is a distinct weapon that reuses an existing model but behaves and reads as its own item — entirely param and text work, no 3D tools.
The catch beginners miss: a DS3 weapon isn't one row — it's a block of rows, one per upgrade level, and you must duplicate the whole block or the weapon breaks when reinforced. You'll need a DS3 project open (Dark Souls 3 setup); general param workflow in the Param Editor hub.
Two kinds of "new weapon"
A fully new weapon with a new 3D model needs custom assets (model, textures, animations) imported — out of scope. A new weapon entry clones an existing weapon's data into a new ID, lets you change every stat, name, and behavior, and reuses an existing model. The second is what ~90% of "custom weapon" mods do.
How weapon IDs and upgrade levels work
In EquipParamWeapon, a weapon occupies a contiguous block of row IDs: the base at a round ID, then consecutive IDs per upgrade level (+1, +2 … max). The game looks up the row matching the current reinforcement, so duplicating only the base leaves the weapon statless or broken once upgraded. The rule: duplicate the entire block, base through max, to a new unused ID range, keeping the same internal spacing. Pick a donor whose upgrade structure matches what you want (standard weapons go to +10; some special weapons cap at +5), so the new block has the right number of levels.
Cloning the block to a new ID
- Open
EquipParamWeaponin the Param Editor. - Find your donor and select all of its rows — the base and every upgrade-level row in its block (search to locate it, then select the contiguous range).
- Ctrl + D to duplicate the selection.
- Re-ID the block. Set the duplicated base row to an unused base ID and keep the upgrade rows in the same consecutive pattern beneath it, so the levels stay aligned.
- Save (
Ctrl + S).
Your new weapon now exists as a full upgrade block.
Restat it
Select the new block's rows and edit the fields that define play:
- Base damage —
attackBasePhysical,attackBaseMagic,attackBaseFire,attackBaseThunder,attackBaseDark. - Scaling — the
correct*fields (strength, dex, intelligence, faith). - Requirements — the
proper*fields. - Weight and moveset/category fields for handling.
- Reinforcement —
reinforceTypeIdpoints at aReinforceParamWeaponrow governing per-level growth; leave the donor's value unless you want a different curve.
Apply level-appropriate values across the block — each upgrade row should reflect that level's stats, which is exactly why cloning a real weapon saves enormous effort: the upgrade scaling is already there to tweak. (For the field-by-field detail, see editing weapon params.)
Name it in the Text Editor
Right now it reuses the donor's name. Open the Text Editor and edit the weapon-name and weapon-description (FMG) entries at your new weapon's ID so it shows its own title and description in menus. Matching the text entry ID to the weapon's row ID is what links the name to the item.
Make it obtainable
A weapon nobody can pick up isn't much use:
- Shop — in
ShopLineupParam, add/edit a row so a merchant sells it (referencing itsEquipParamWeaponID and category). Fastest for testing — buy it immediately. - Drop — add it to an
ItemLotParamtable. The loot-table method is detailed in the Elden Ring item drops tutorial; the sameItemLotParamconcept applies to DS3.
Save and test
Ctrl + S, point ModEngine2 at the project's mod folder, launch DS3 offline (modded DS3 must never go online — DS3 setup). Buy or pick up your weapon and confirm stats, name, and upgrade behavior. Off? Reopen and run modified on EquipParamWeapon to review your changes.
To go deeper on the stat fields, the Param Editor hub covers navigation and bulk edits, and CSV export/import makes restatting a whole block far faster than editing rows one at a time.
