This tutorial is for Dark Souls III specifically, although most aspects are similar or the same in the other games.
In order to follow along, you will need to use Yapped and Yabber.
Adding a Weapon
You first need to find where the weapons are defined. In Yapped, this is the EquipParamWeapon file. Click on it and bring up the list. You will see that all weapons have an unique ID, and that the infused versions of the weapons are at +100 intervals from the base ID.
It is important to know that the game expects the infused versions to be +100 from each other, and that reinforcement is handled by adding +1 (to +15) to the base ID. This means you must make sure you add new weapons outside of these ranges, otherwise you will be overriding existing weapons, as the game will load your badly ID'd row incorrectly.
Let's say you want to add a new dagger. It would be best to base your dagger on an existing entry, saving time and effort, as you will only need to edit the fields you want to change, rather than filling in blank fields.
So, start off by duplicating an existing weapon and assigning it a unique and valid ID. This will be your base weapon entry.
Customise the Weapon
Having created a new base weapon, you will now want to edit the properties of the weapon to achieve your vision. The following tables will cover commonly used fields:
General
Field | Description |
---|---|
behaviorVariationId | This controls the behavior used by the weapon. Behavior determines the multipliers used during specific moves (known as 'motion values') and which bullets and effects to apply. |
sortId | This controls the position of the weapon in your menu. Note that reinforcement will add the current level of reinforcement to this ID, so you need to space the ID properly between infusion entries. |
weight | The impact this weapon has on equipment load. |
fixPrice | The soul cost to repair this weapon. |
basicPrice | The soul cost to reinforce this weapon. |
sellValue | The souls given when this weapon is sold. |
equipModelId | The part model ID. Determines the part model used by the weapon. |
iconId | The icon index ID. Determines the icon used by the weapon. |
durability | The default durability of the weapon. |
durailityMax | The max durability of the weapon. |
originEquipWep | Contains the base weapon ID. Determines the max reinforcement level and what an infused weapon returns to when uninfused. |
materialSetId | Determines the EquipMtrlSetParam row range used for infusion and reinforcement. |
reinforceTypeId | Determines the ReinforceParamWeapon row range used to determine the reinforcement multipliers. |
displayTypeId | Determines the weapon category displayed in the weapon menu. |
spEffectBehaviorId | The SpEffect to apply to the enemy on hit. Typically used for Poison, Bleed, etc. |
residentSpEffectId | The SpEffect to apply passively. |
properStrength | Determines the level of STR required to wield this weapon. |
properAgility | Determines the level of DEX required to wield this weapon. |
properMagic | Determines the level of INT required to wield this weapon. |
properFaith | Determines the level of FTH required to wield this weapon. |
shopPrice | The soul cost of the weapon in a shop. |
Unk66 (Infusion Cost) | The soul cost to infuse this weapon. |
Moveset
Field | Description |
---|---|
weaponCategory | Determines the weapon category. |
wepmotionCategory | Determines the base moveset used by the weapon. Corresponds to TAE ID. |
guardmotionCategory | Determines the moveset used whilst guarding. |
spAttribute | Determines the hit effect of the weapon. |
spAtkCategory | Determines the override moveset used by the weapon. Corresponds to TAE ID. |
wepmotionOneHandId | Determines the hold position whilst the weapon is one-handed. |
wepmotionBothHandId | Determines the hold position whilst the weapon is two-handed. |
swordArtId | Determines the SwordArtsParam ID to use. |
Booleans
Field | Description |
---|---|
rightHandEquipable | Determines whether this weapon can be equipped in the right-hand. |
leftHandEquipable | Determines whether this weapon can be equipped in the left-hand. |
bothHandEquipable | Determines whether this weapon can be two-handed. |
arrowSlotEquipable | Determines whether this weapon is an Arrow. |
boltSlotEquipable | Determines whether this weapon is a Bolt. |
enableGuard | Determines whether this weapon can guard (requires TAE support for actual effect). |
enableParry | Determines whether this weapon can parry (requires TAE support for actual effect). |
enableMagic | Determines whether this weapon can cast Sorceries (requires TAE support for actual effect). |
enablePyromancy | Determines whether this weapon can cast Pyromancies (requires TAE support for actual effect). |
enableMiracle | Determines whether this weapon can cast Miracles (requires TAE support for actual effect). |
isNormalAttackType | Display Standard as the damage type in the weapon menu. Actual type is defined in behavior. |
isBlowAttackType | Display Strike as the damage type in the weapon menu. Actual type is defined in behavior. |
isSlashAttackType | Display Slash as the damage type in the weapon menu. Actual type is defined in behavior. |
isThrustAttackType | Display Thrust as the damage type in the weapon menu. Actual type is defined in behavior. |
isEnhance | Determines whether this weapon can be buffed via SpEffects. |
isCustom | Determines whether this weapon can be reinforced. |
Damage and Absorption
Field | Description |
---|---|
correctStrength | The base scaling value used for STR. Note that this is multiplied by reinforcement (via ReinforceParamWeapon). |
correctAgility | The base scaling value used for DEX. Note that this is multiplied by reinforcement (via ReinforceParamWeapon). |
corretMagic | The base scaling value used for INT. Note that this is multiplied by reinforcement (via ReinforceParamWeapon). |
corretFaith | The base scaling value used for FTH. Note that this is multiplied by reinforcement (via ReinforceParamWeapon). |
correctLuck | The base scaling value used for LCK. Note that this is multiplied by reinforcement (via ReinforceParamWeapon). |
antiDemonDamageRate | Modifies damage against Demon-type enemies. |
antUndeadDamageRate | Modifies damage against Undead-type enemies (i.e. Skeletons). |
antHollowDamageRate | Modifies damage against Hollow-type enemies. |
antAbyssalDamageRate | Modifies damage against Abyssal-type enemies. |
atkBasePhysics | The base Physical damage. Note that this is multiplied by reinforcement (via ReinforceParamWeapon). |
atkBaseMagic | The base Magic damage. Note that this is multiplied by reinforcement (via ReinforceParamWeapon). |
atkBaseFire | The base Fire damage. Note that this is multiplied by reinforcement (via ReinforceParamWeapon). |
atkBaseThunder | The base Lightning damage. Note that this is multiplied by reinforcement (via ReinforceParamWeapon). |
atkBaseDark | The base Dark damage. Note that this is multiplied by reinforcement (via ReinforceParamWeapon). |
atkBaseStamina | The base Stamina damage. Note that this is multiplied by reinforcement (via ReinforceParamWeapon). |
saWeaponDamage | The base Poise damage. Note that this is multiplied by reinforcement (via ReinforceParamWeapon). |
correctType | Determines the stat graph used for Physical damage (i.e. how effective a stat is). |
Unk21 (Correction Type: Magic) | Determines the stat graph used for Magic damage (i.e. how effective a stat is). |
Unk22 (Correction Type: Fire) | Determines the stat graph used for Fire damage (i.e. how effective a stat is). |
Unk23 (Correction Type: Lightning) | Determines the stat graph used for Lightning damage (i.e. how effective a stat is). |
Unk26 (Correction Type: Dark) | Determines the stat graph used for Dark damage (i.e. how effective a stat is). |
StaminaConsumeRate | The stamina multiplier applied to the stamina costs defined in behavior. |
throwAtkRate | The critical value applies to backstab and parry moves. |
bowDistRate | The bow distance added to ammunition range. |
Unk12 (Poise Health Multiplier) | Determines the multiplier to apply to Toughness (when applied via InvokeToughness in TAE). |
attackElementCorrectId | Determines how each stat affects each damage type (i.e. how FTH can effect Physical scaling on specific weapons). |
Defense
Field | Description |
---|---|
physGuardCutRate | The Physical absorption to use when guarding. |
magGuardCutRate | The Magic absorption to use when guarding. |
fireGuardCutRate | The Fire absorption to use when guarding. |
thunGuardCutRate | The Lightning absorption to use when guarding. |
darkGuardCutRate | The Dark absorption to use when guarding. |
poisonGuardResist | The Poison resist to use whilst guarding. |
toxicGuardResist | The Toxic resist to use whilst guarding. |
bloodGuardResist | The Bleed resist to use whilst guarding. |
curseGuardResist | The Curse resist to use whilst guarding. |
Unk31 (Frost Guard Resist) | The Frost resist to use whilst guarding. |
Supporting Infusions
You may want to support infusions for your weapon. Infusions are determines based on ID, with each infusion being +100 to the base weapon ID.
To support infusions in vanilla, you will need to duplicate your base weapon 15 times and adjust the following properties:
- sortId
- materialSetId
- reinforceTypeId
- attackElementCorrectId
For the exact changes, study the existing infusions to see what they add in comparison to the base weapon.
Localizing a Weapon
Having created a weapon, you will want to localize your weapon properly, so it displays in game with a proper name and description.
To start with, you need to unpack item_dlc2.msgbnd.dcx using Yabber. After that, unpack the .fmg files using Yabber also. You can now edit the localization by editing the .xml files.
To add a new name, open the 武器名.fmg.xml file and add a new definition with your weapon ID (and the infused versions if you are supporting infusions).
To add a new description, open the 武器うんちく.fmg.xml file and add a new definition with your weapon ID (and the infused versions if you are supporting infusions).