Repository navigation
war_battle_modding
PKCore's War Battle system allows you to customize character stats, abilities, and special powers in Suikoden 2 war battles. This JSON-based modding system gives you complete control over how characters perform in strategic army battles.
Note: This feature is Suikoden 2 only (GSD2). Suikoden 1 uses a different army battle system not governed by this JSON mod.
Edit BepInEx/config/faospark.pkcore.cfg:
[05 Game : Suikoden 2]
# Enable custom war battle abilities (default: true)
EnableWarAbilityMod = trueThe war battle configuration file is located at:
<Game Root>/PKCore/Config/S2WarAbilities.json
Full path example:
D:\SteamLibrary\steamapps\common\Suikoden I and II HD Remaster\PKCore\Config\S2WarAbilities.json
⚠️ Important Note: These customizations only affect values in actua war battles (army vs army enemy encounters). They will NOT appear in Apple's war unit management UI where you organize and view your army roster. The UI shows original game stats, while actual battle encounters use your custom configurations.
{
"globalAbilities": [],
"characterAbilities": {
"3347": {
"name": "Riou",
"abilities": ["SP_SHINING_SHIELD", "SP_MOUNT"],
"attack": 12,
"defense": 12,
"bonusAttack": 3,
"bonusDefense": 2
}
}
}-
Game Launch: PKCore loads
S2WarAbilities.jsonon startup - War Battle Start: When a war battle begins, the mod intercepts character initialization
- Ability Assignment: Characters receive custom abilities and stats from the JSON config
- Usage Counts: Each ability is given 9 uses per battle (default)
{
"globalAbilities": [], // Abilities to add to ALL characters
"characterAbilities": {} // Character-specific configurations
}Apply abilities to all characters in war battles:
{
"globalAbilities": ["SP_MOUNT", "SP_CRITICAL"]
}Warning: This can make battles unbalanced. Use sparingly.
Each character entry can customize:
- Abilities (up to 3 with mod - normally limited to 2)
- Attack stat (base stat)
- Defense stat (base stat)
-
Bonus Attack from subunits/composition via
bonusAttack -
Bonus Defense from subunits/composition via
bonusDefense - Name (for documentation only, not used by game)
"3347": {
"name": "Riou",
"abilities": ["SP_SHINING_SHIELD", "SP_MOUNT"],
"attack": 12,
"defense": 12,
"bonusAttack": 3,
"bonusDefense": 2
}"54": {
"name": "Luc",
"abilities": ["SP_MAGIC_WIND1", "SP_FLYING"]
}"4": {
"name": "Viktor",
"attack": 15,
"defense": 10
}"93": {
"name": "Juan",
"abilities": ["SP_MEDICAL2"]
}- Unspecified ability slots default to
SP_NONE - Stats remain unchanged if not specified
These optional fields are best used for adjusting the extra assist/composition bonus applied to a war unit during battle. bonusAttack and bonusDefense are assist/composition bonuses, not strictly “subunit-only” fields.
-
bonusAttack→ sets the unit's assist attack bonus -
bonusDefense→ sets the unit's assist defense bonus
Example:
"90": {
"name": "Shu",
"bonusAttack": 2,
"bonusDefense": 3
}Important:
-
attackanddefensechange the unit's base stats -
bonusAttackandbonusDefensechange the extra assist/composition bonus used in actual war battles - These bonuses are applied in
Patches/WarAbilityPatch.csby settingassist_attackandassist_defense - The underlying game fields live in
IL2CPP/WAR_CHARA_TYPE.cs
| Ability Code | In-Game Name | Description |
|---|---|---|
SP_NONE |
No ability | Empty slot |
SP_MOUNT |
Cavalry | Movement Ability Up |
SP_AIMING |
Ranged Ability | Attack Enemy With 5 spaces |
SP_FLAME_SPEAR |
Fire Spear | Fire-based attack |
SP_SHINING_SHIELD |
Bright Shield | Large Heal AOE |
SP_HP_PLUS |
Heavy Armor | Defense plus 1 |
SP_CRITICAL |
Critical | Chance for critical damage |
SP_SCOUT |
Scout | Reconnaissance ability |
SP_FOREST_WALK |
Forest Walk | Larger are movement through forests |
SP_MAGIC_WIND1 |
Wind Magic | Wind-based magic attack |
SP_MAGIC_FIRE1 |
Fire Magic | Fire-based magic attack |
SP_MAGIC_THUNDER1 |
Thunder Magic | Lightning-based attack |
SP_SEE_THROUGH |
Shortcut | Detect deception/traps |
SP_MEDICAL1 |
Mend Self | Minor healing ability |
SP_MEDICAL2 |
Heal | Heal 1 unit on a larger area |
SP_THROUGH_ROAD |
Evade | Provides a Chance in Avoiding Damage |
SP_BODY_GUARD |
Bodyguard | Increases Defense and can prevent Death |
SP_CHEAR_UP |
Cheer Up | Gives Extra Turn |
SP_INVESTIGATION |
Investigation | Success Rates Disclosed |
SP_INVENTION |
Invention | Damage all Surrounding units including self |
SP_CONFUSED_FIGHT |
Melee | Increases Damage on Magic And Arm |
SP_FLYING |
Flying | Same effect as cavalry's increased area |
SP_KIN_SLAYER |
Kin Slayer |
BLOCKLISTED - Crashes game. Ignored in config files. |
SP_FORCE_MOVE |
Force Move |
Can force enemy movement |
SP_CHARGE |
Charge |
Powerful charge attack (likely unused/cut content) |
SP_MAGIC_WIND2 |
Wind Magic Lv2 |
BLOCKLISTED - Doesn't work. Ignored in config files. |
- Normal Gameplay: Each character can have up to 2 abilities
- With PKCore Mod: Each character can have up to 3 abilities ⭐
- Use
SP_NONEto leave slots empty - Abilities beyond slot 3 are ignored
Pro Tip: Using the 3rd ability slot gives you more tactical flexibility! The mod unlocks this for customization.
Some abilities are defined in game code but may not function:
-
SP_CHARGE: Appears to be cut/unused content. May not have any effect in-game.
- Each ability starts with 9 uses per battle
- Using an ability consumes 1 use
- When uses reach 0, the ability is unavailable for that battle
| Character ID | Name | ATK | DEF | Abilities |
|---|---|---|---|---|
| 3347 | Riou | 8 | 9 | SP_SHINING_SHIELD |
| 4 | Viktor | 8 | 7 | None |
| 118 | Ridley | 10 | 7 | SP_CRITICAL |
| 13 | Valeria | 8 | 8 | SP_MOUNT |
| 88 | Kiba | 7 | 12 | SP_HP_PLUS, SP_MOUNT |
| 35 | Hauser | 9 | 7 | SP_MOUNT |
| 12 | George | 11 | 8 | SP_CRITICAL |
| 120 | Maximillian | 6 | 7 | SP_MOUNT |
| 122 | Gilbert | 7 | 8 | None |
| 3 | Flik | 7 | 7 | SP_MOUNT |
| 102 | Teresa | 5 | 6 | SP_AIMING |
| 44 | Ayda | 6 | 5 | SP_MEDICAL1, SP_FOREST_WALK |
| 74 | Kasumi | 6 | 6 | SP_SCOUT |
| 123 | Boris | 9 | 8 | SP_SEE_THROUGH |
| 54 | Luc | 10 | 4 | SP_MAGIC_WIND1 |
| 62 | Mazus | 9 | 6 | SP_MAGIC_FIRE1 |
| Character ID | Name | ATK | DEF | Abilities |
|---|---|---|---|---|
| 90 | Shu | 0 | 0 | SP_CRITICAL, SP_SEE_THROUGH |
| 86 | Apple | 0 | 0 | SP_SEE_THROUGH |
| 119 | Klaus | 0 | 0 | SP_SEE_THROUGH, SP_MOUNT |
| 19 | Nanami | 0 | 0 | SP_MEDICAL1 |
| 53 | Tsai | 0 | 0 | SP_FLAME_SPEAR |
| 33 | Miklotov | 11 | 6 | SP_MOUNT |
| 34 | Camus | 9 | 8 | SP_MOUNT |
| 16 | Shin | 0 | 0 | SP_CRITICAL |
| 94 | Jess | 0 | 0 | SP_SEE_THROUGH |
| 3348 | Freed Y | 6 | 7 | None |
| 93 | Huan | 0 | 0 | SP_MEDICAL2 |
| 23 | Tuta | 0 | 0 | SP_MEDICAL1 |
| 11 | Humphrey | 0 | 0 | SP_HP_PLUS |
| 87 | Templeton | 0 | 0 | SP_THROUGH_ROAD |
| 117 | Jeane | 0 | 0 | SP_MAGIC_THUNDER1 |
| 39 | Tai Ho | 0 | 0 | None |
| 101 | Yam Koo | 0 | 0 | None |
| 47 | Oulan | 0 | 0 | SP_BODY_GUARD |
| 113 | Annallee | 0 | 0 | SP_CHEAR_UP |
| 14 | Pesmerga | 0 | 0 | SP_MOUNT |
| 15 | Lorelai | 0 | 0 | None |
| 97 | Emilia | 0 | 0 | SP_INVESTIGATION |
| 106 | Adlai | 0 | 0 | SP_INVENTION |
| 24 | Hanna | 0 | 0 | None |
| 55 | Chaco | 0 | 0 | SP_FLYING |
| 59 | Gijimu | 0 | 0 | SP_CONFUSED_FIGHT |
| 60 | Koyu | 0 | 0 | SP_MEDICAL1 |
| 61 | Lowen | 0 | 0 | SP_CONFUSED_FIGHT |
Finding More IDs:
- Set
DetailedLogs = truein config - Start a war battle with different characters
- Check BepInEx log for character ID listings
Make Riou a powerhouse with strong abilities and stats:
{
"globalAbilities": [],
"characterAbilities": {
"3347": {
"name": "Riou",
"abilities": ["SP_SHINING_SHIELD", "SP_MOUNT", "SP_CRITICAL"],
"attack": 15,
"defense": 15
}
}
}Boost magic users for spell-heavy strategies:
{
"globalAbilities": [],
"characterAbilities": {
"54": {
"name": "Luc",
"abilities": ["SP_MAGIC_WIND1", "SP_FLYING"],
"attack": 12,
"defense": 8
},
"62": {
"name": "Mazus",
"abilities": ["SP_MAGIC_FIRE1", "SP_MAGIC_THUNDER1"],
"attack": 12,
"defense": 8
},
"117": {
"name": "Jeane",
"abilities": ["SP_MAGIC_THUNDER1", "SP_MEDICAL1"],
"attack": 10,
"defense": 8
}
}
}Create a highly mobile mounted force:
{
"globalAbilities": [],
"characterAbilities": {
"3347": {
"name": "Riou",
"abilities": ["SP_MOUNT", "SP_CRITICAL"],
"attack": 13,
"defense": 12
},
"3": {
"name": "Flik",
"abilities": ["SP_MOUNT", "SP_THROUGH_ROAD"],
"attack": 12,
"defense": 11
},
"4": {
"name": "Viktor",
"abilities": ["SP_MOUNT", "SP_FLAME_SPEAR"],
"attack": 14,
"defense": 10
}
}
}Focus on healer and support characters:
{
"globalAbilities": [],
"characterAbilities": {
"93": {
"name": "Juan",
"abilities": ["SP_MEDICAL2", "SP_CHEAR_UP"],
"defense": 12
},
"113": {
"name": "Annallee",
"abilities": ["SP_CHEAR_UP", "SP_MEDICAL1"],
"defense": 10
}
}
}Balanced configuration with various roles:
{
"globalAbilities": [],
"characterAbilities": {
"3347": {
"name": "Riou",
"abilities": ["SP_SHINING_SHIELD", "SP_MOUNT"],
"attack": 12,
"defense": 12
},
"12": {
"name": "George",
"abilities": ["SP_CRITICAL", "SP_SEE_THROUGH"],
"attack": 13,
"defense": 10
},
"54": {
"name": "Luc",
"abilities": ["SP_MAGIC_WIND1", "SP_FLYING"],
"attack": 11,
"defense": 8
},
"102": {
"name": "Teresa",
"abilities": ["SP_AIMING", "SP_SCOUT"],
"attack": 10,
"defense": 10
}
}
}Symptoms:
- Characters have default abilities/stats
- No log messages about custom configuration
Solutions:
- ✅ Check
EnableWarAbilityMod = truein config - ✅ Verify JSON file is at correct location: `PKCore/Config/S2WarAbilities.json
- ✅ Ensure character IDs are strings (in quotes):
"3347"not3347 - ✅ Set
DetailedLogs = trueto see if config is loading - ✅ Restart the game completely after editing JSON
Common Errors:
❌ Missing comma:
{
"3347": {
"name": "Riou" // Missing comma here
"abilities": []
}
}✅ Correct:
{
"3347": {
"name": "Riou", // Comma added
"abilities": []
}
}❌ Trailing comma:
{
"characterAbilities": {
"3347": {},
} // Trailing comma before closing brace
}✅ Correct:
{
"characterAbilities": {
"3347": {}
} // No trailing comma
}❌ Unquoted keys/values:
{
3347: { // Keys must be strings
abilities: [SP_MOUNT] // Values must be strings
}
}✅ Correct:
{
"3347": {
"abilities": ["SP_MOUNT"]
}
}Symptoms:
- Custom abilities work for some characters but not others
- Log shows "Character 0" or incorrect character names
Solutions:
- Enable
DetailedLogs = true - Check logs during war battle initialization
- Look for lines like:
Riou Character 3347 - ATK: 8, DEF: 9 - Use the correct character ID from the log (3347 in this case)
- Note: Character IDs are not the same as party slots
Symptoms:
- Character has abilities in stats, but they don't work in battle
- Abilities show 0 uses
Solutions:
- ✅ Verify ability name is spelled correctly (case-sensitive)
- ✅ Use only abilities from the Available Abilities list
- ✅ Ensure abilities are in the correct format:
"SP_MOUNT"not"Mount"or"MOUNT" - ✅ Check for typos:
SP_MAGIC_THUNDER1notSP_THUNDER1 - ✅ Avoid blocklisted abilities:
SP_KIN_SLAYERandSP_MAGIC_WIND2are automatically ignored
Symptoms:
- You specified
SP_KIN_SLAYERorSP_MAGIC_WIND2in config - Log shows:
⚠️ Ability 'SP_KIN_SLAYER' is blocklisted (crashes or doesn't work). Using SP_NONE instead. - Character has fewer abilities than intended
Explanation:
-
SP_KIN_SLAYER- Crashes the game if used, permanently blocklisted -
SP_MAGIC_WIND2- Non-functional, automatically blocked to prevent wasted slots
Solutions:
- Remove these abilities from your JSON config
- Replace with working alternatives (see Full Syntax)
- PKCore automatically logs warnings when blocklisted abilities are detected
Symptoms:
- Game crashes when war battle starts
- Crash after editing JSON
Solutions:
- Validate JSON syntax at JSONLint
- Remove recently added entries to isolate problem
- Check for invalid ability names (typos)
- Ensure attack/defense values are numbers, not strings
- Delete
S2WarAbilities.jsonto reset to defaults, then rebuild
Recommended Stat Ranges:
- Early Game: ATK 8-10, DEF 7-9
- Mid Game: ATK 10-12, DEF 9-11
- Late Game: ATK 12-15, DEF 11-14
- Overpowered: ATK 18+, DEF 17+
Avoid:
- ATK/DEF values above 20 (breaks game balance)
- DEF 0 (makes character one-shot vFLAME_SPEARble)
Offensive Combos:
-
SP_MOUNT+SP_CRITICAL= Maximum damage cavalry -
SP_MAGIC_FIRE1+SP_FLYING= Versatile mage
Defensive Combos:
-
SP_SHINING_SHIELD+SP_HP_PLUS= Ultimate tank -
SP_SEE_THROUGH+SP_MOUNT= Intel specialist
Support Combos:
-
SP_MEDICAL2+SP_CHEAR_UP= Team support -
SP_THROUGH_ROAD+SP_SCOUT= Tactical control
WAR_CHARA_TYPE (Character Object)
├── nouryoku[] ← Abilities array (2 slots)
├── kaisu[] ← Current uses remaining
├── kaisu_max[] ← Maximum uses (9 default)
├── attack ← Attack stat
├── defense ← Defense stat
└── name ← Character ID
- Uses per Battle: Each ability starts with 9 uses
-
Usage Tracking:
kaisuarray decrements on use - Recharge: Uses reset at battle start
-
Depletion: When
kaisu[slot]reaches 0, ability is disabled
Q: Can I mod Suikoden 1 war battles? A: No, Suikoden 1 has a different War battle. This feature is Suikoden 2 only.
Q: Will this affect regular battles? A: No, this only affects war battles (army vs army). Regular turn-based battles are unchanged.
Q: Can I give a character more than 2 abilities? A: In normal gameplay, no—characters are limited to 2 abilities. However, with PKCore's War Battle mod, you can unlock the hidden 3rd ability slot! Use the JSON config to assign up to 3 abilities per character.
Q: Do stat boosts carry over between battles? A: Yes, custom stats are permanent for that playthrough until you edit the JSON again.
Q: Can I reset to default abilities? A: Yes, delete the character entry from JSON or set abilities to original values.
Q: Why does "Character 0" appear in logs? A: These are enemy units or unrecruited characters. You typically don't modify these.
Q: Can I share my custom configurations?
A: Yes! Just share your S2WarAbilities.json file. Others can place it in their PKCore/Config/ folder.
Q: Does this work with other mods? A: Yes, compatible with Suikoden Fix and other BepInEx mods. Load order doesn't matter.
Q: What happens if I specify an invalid ability? A: PKCore logs a warning and ignores that ability entry. The character will have fewer abilities than intended.
- Configuration Guide - All config options explained
- Custom Textures Guide - Replace war battle sprites/textures
War Battle modding system designed and implemented by faospark for Project Kyaro.
For support, visit the Project Kyaro Nexus Mods page.