https://wargroovewiki.com/mediawiki/api.php?action=feedcontributions&user=Ckrakauer&feedformat=atomWargroove Wiki - User contributions [en]2024-03-29T01:18:54ZUser contributionsMediaWiki 1.40.1https://wargroovewiki.com/mediawiki/index.php?title=Guide:Modding&diff=3703Guide:Modding2019-09-09T14:11:54Z<p>Ckrakauer: /* Unit Class Configuration */</p>
<hr />
<div>[[File:Wargroove header modding.png|center]]<br />
<br />
<br />
{{TOC right|noautonum}}<span style="color:red">'''Modding is in beta, so please ask questions on [https://discord.gg/eW3hnAF Discord] and report bugs to the [https://community.playstarbound.com/threads/wargroove-modding-beta-known-issues-and-fixes.156978/ support forums].'''</span><br />
<br />
This documentation details what's involved with setting up and implementing mods for Wargroove. Guide credit goes to [[Chucklefish]] programmer [https://twitter.com/ckrakauer Caryn Krakauer]<br />
<br />
A lot of documentation refers to the “Tolstoy” mod. [https://www.instagram.com/tinytolstoy/ Tolstoy] is a dog, not the famous Russian author.<br />
<br />
=Mod Usage=<br />
Before using any mods, especially during the modding beta, make sure to '''back up your save files'''! They're likely located at %APPDATA%\Chucklefish\Wargroove\save\<br />
==Mod File Location==<br />
Mods are stored in your application folder, which is probably at <code>%appdata%\Roaming\Chucklefish\Wargroove\mods</code>. My folder with the example mods looks like this:<br />
<br />
[[File:Modding Guide 2.png]]<br />
<br />
Each folder contains the <code>.dat</code> files for the individual mod.<br />
<br />
The EXE and example mods are located at <code>C:\Program Files (x86)\Steam\steamapps\common\Wargroove\modpacker_bin</code><br />
<br />
==Using Mods in Maps==<br />
Mods are per map/campaign and can be selected on map creation and on map selection. In addition, maps can be packaged along with mods or used separately.<br />
===Adding Mods to a Map===<br />
Create a map as normal. In the map editor menu, select the “mods” option. This will bring up the list of currently available mods. When selecting “save and reload map” this will also remove any broken units and tiles, such as if a unit type no longer exists that was placed on the map.<br />
===Using a Mod on an Unmodded Map===<br />
Mods can be used on any skirmish map. In the ‘Match Settings” view when setting up the map, select the “mods” option and you will be given the list of mods. The user can turn on new mods and also turn off currently active mods. If any changes would break the map (such as a unit type being removed that is placed on the map) the changes to mods will revert.<br />
===Updating a Modded Map===<br />
If a mod that a map relies on is updated, the map also needs to be updated. If the map is part of the mod this happens automatically on packing the mod. If not, the next time the map is opened for edit the game will ask which mods should be updated. If a mod is not updated, it will remove all units and events that rely on the mod. It’s a good idea to back up a map before updating a mod.<br />
==Using Mods Online==<br />
Maps that are packaged within mods can be used for online play. These maps can be used online if and only if all players have the same version of the mod installed.<br />
<br />
=Mod Creation: Requirements=<br />
Mods use a combination of Yaml, Lua, art, and sound files. It's definitely advisable to be familiar with the Yaml format, and Lua if there's any scripting. In addition, animations are done using Aseprite which is paid software (but very much worth it!).<br />
<br />
Aseprite is available from their website (https://www.aseprite.org/) along with itch.io, Humble Bundle, Steam, and Gumroad.<br />
Mod Creation: Configuration<br />
The basic steps are:<br />
:#Create a mod manifest file with basic information<br />
:#Create configuration, art, and sound files<br />
:#Package the mod<br />
:#Create maps that use the mod<br />
:#Package the mod to include the maps<br />
:#Give the mod to internet friends!<br />
<br />
Mods are created from a collection of yaml files, lua files, image files, and sound files. Once a mod is created and added to a user’s game, they can create new maps/campaigns using the mod and apply the mod to existing maps/campaigns.<br />
<br />
We have included a few example mods as well as a lot of example config files, lua files, and some image assets. The easiest way to get started is to take a look at these examples while going through this document.<br />
<br />
The basic structure of a mod looks like this:<br />
{|<br />
|<br />
mod<br />
- assets_src<br />
- audio<br />
- music<br />
- sfx<br />
- audio_event<br />
- config <br />
- gameplay<br />
- triggers<br />
- actions.yaml<br />
- conditions.yaml<br />
- units<br />
- strings<br />
- image<br />
- palettes<br />
- portraits<br />
- _dir.meta<br />
- ui <br />
- units<br />
- _dir.meta<br />
- lua<br />
- initialized<br />
- manifest.yaml<br />
|<br />
# The top level folder<br />
# Contains all assets<br />
# Audio files<br />
<br />
<br />
# Audio configuration files<br />
# General Configuration files<br />
# Gameplay Configuration files<br />
# Yaml files for the event system<br />
<br />
<br />
# Yaml files for units<br />
# Yaml files for translated strings<br />
# Art<br />
# The Wargroove palette<br />
# Unit/commander portraits<br />
# Sets portraits to use the Wargroove palette<br />
<br />
# Art for units map/battle animations<br />
# Sets units to use the Wargroove palette<br />
# Lua scripts folder<br />
# Special Lua files that are initialized<br />
# Information about the mod<br />
|}<br />
==Creating the Mod Manifest File==<br />
The <code>manifest.yaml</code> file at the root of the mod folder determines the mod’s general settings. The fields are:<br />
*id: The id of the mod. This should be unchanging for all versions of your mod as the id is what the game uses to determine if two mods are the same mod but with different versions. This should also be relatively unique, as two mods with the same id will clash.<br />
*name: This is the name that players will see when they load the mod into their game. This does not have to stay the same throughout versions of the mod and does not have to be unique (although it probably should be to avoid confusion).<br />
*description: This is the description that players will see when they load the mod into their game. This does not have to stay the same throughout versions of the mod and does not have to be unique (although it probably should be to avoid confusion).<br />
*remove: A group of assets to remove from the map when using this mod. The three types of assets that can be removed are commanders, units, and factions.<br />
<br />
<br />
Example from tolstoy_mod’s <code>manifest.yaml</code>:<br />
<br />
---<br />
<br />
id: TolstoyMod<br />
name: "Tolstoy's Mod"<br />
author: "TolstoyFan1"<br />
description: "Adds My Tolstoy to the game which is the feature we've all been waiting for!<br />
remove: <br />
commander:<br />
- mercia<br />
unitClass:<br />
- soldier<br />
faction:<br />
- felheim<br />
<br />
...<br />
==Maps==<br />
Maps can be packaged along with mods for distribution. In order to do this, the map must use no other mods. If a map uses multiple mods, it needs to be distributed separately from the mod.<br />
<br />
While editing the map, go to the mods settings. Next to the mod you want to add the map to press “add to mod”. This will remove other active mods. Note, this means that you have to create the mod first (or at least an initial skeletal framework). Once a map is part of a mod it will be updated automatically with the mod.<br />
<br />
The next time <code>wargroove_mod_packer.exe</code> is run, the map will be automatically packaged along with the mod. You should see them in the <code>assets_src/maps</code> folder after packaging.<br />
==Units==<br />
Units are made up of multiple parts:<br />
:#Unit Class Configuration<br />
:#Unit Configuration<br />
:#Weapons Configuration<br />
:#(optional) Commander Configuration<br />
:#Art and sound effects<br />
<br />
For example, the soldier unit has a unit class config of “soldier” and individual unit configurations for each faction (Cherrystone, Floran, Heavensong, Felheim). It also has the weapon “sword”. Various art and sounds are referred to in the configuration file. <br />
<br />
Typically, we store the weapons, unit class, and unit configuration in a single file.<br />
===Unit Class Configuration===<br />
The unit class defines the information that all soldiers share, such as their cost, movement, and weapons.<br />
<br />
unitClasses:<br />
- id: soldier<br />
name: unit_class_name_soldier<br />
cost: 100<br />
movement: walking<br />
moveRange: 4<br />
damageMultiplier: 1<br />
aiPriority: 1.0<br />
weapons:<br />
- id: sword<br />
verbs:<br />
- capture<br />
- load<br />
tags:<br />
- soldier<br />
- type.ground.light<br />
battleUnitCount: 4<br />
passiveMultiplier: 1.5<br />
<br />
To use a new unit icon, the unit class must define the <code>classIconSpritesheet</code>. The value is <code>ui_<ModId></code> where ModName is the id of the mod. For example, in the Tolstoy mod, the line is: <code>classIconSpritesheet: ui_TolstoyMod</code>.<br />
<br />
{| class="mw-collapsible mw-collapsed wikitable"<br />
|Expand for a complete list of '''unit ids''' implemented in game <br />
|-<br />
|<br />
archer<br />
ballista<br />
balloon<br />
barracks<br />
city<br />
commander_caesar<br />
commander_darkmercia<br />
commander_elodie<br />
commander_emeric<br />
commander_greenfinger<br />
commander_koji<br />
commander_mercia<br />
commander_mercival<br />
commander_nuru<br />
commander_ragna<br />
commander_ryota<br />
commander_sedge<br />
commander_sigrid<br />
commander_tenri<br />
commander_valder<br />
crystal<br />
dog<br />
dragon<br />
drone<br />
garrison<br />
gate<br />
ghost_mercival<br />
giant<br />
harpoonship<br />
harpy<br />
hq<br />
knight<br />
mage<br />
merman<br />
port<br />
soldier<br />
spearman<br />
tower<br />
travelboat<br />
trebuchet<br />
turtle<br />
villager<br />
vine<br />
wagon<br />
warship<br />
water_city<br />
witch<br />
|}<br />
<br />
===Unit Configuration===<br />
The unit defines information that is faction specific, such as the name, animations, and sounds.<br />
<br />
[This example has been shortened slightly where there are ellipses.]<br />
units:<br />
- class: soldier<br />
faction: cherrystone<br />
name: unit_name_soldier_cherrystone<br />
mapAnimation: units/soldier/cherrystone/map_soldier_cherrystone<br />
battleAnimation: units/soldier/cherrystone/battle_soldier_cherrystone<br />
battleAnimationRiver: fx/river_overlay/battle_soldier_cherrystone_river<br />
smallPortrait: units/soldier/cherrystone/portrait_soldier_cherrystone_small.png<br />
mediumPortrait: units/soldier/cherrystone/portrait_soldier_cherrystone_medium.png<br />
mapSpeed: 4.0<br />
grabPos: [13, 14]<br />
sounds:<br />
attack: soldierAttackRed<br />
attackShout: soldierPreAttackRed<br />
attackMap: unitAttack<br />
captureShout: soldierPreAttackRed<br />
death: soldierDieRed<br />
deathMap: unitDie<br />
run: infantryHeavyEntry<br />
runMap: infantryHeavyMapEntry<br />
hit: hitOrganic<br />
hitMap: hitOrganic<br />
attacks:<br />
- id: primary<br />
hitSpark: fx/bs_stab_attack<br />
hitDelay: [0.45, 0.8]<br />
shouts:<br />
soldier_shout1: soldierShoutRed1<br />
soldier_shout2: soldierShoutRed2<br />
soldier_shout3: soldierShoutRed3<br />
[...]<br />
soldier_hit1: soldierHitRed1<br />
soldier_hit2: soldierHitRed2<br />
soldier_hit3: soldierHitRed3<br />
[...]<br />
crownbearer_panting: cutscene/crownbearerPanting<br />
crownbearer_yell: cutscene/crownbearerYell<br />
emotes:<br />
idle: idle<br />
idle_crownbearer: idle_crownbearer<br />
idle_crown: emote_idle_crown<br />
idle_crown_ragged: emote_idle_crown_ragged<br />
cushion: emote_cushion<br />
[...]<br />
alternativeRuns:<br />
- id: run_crown<br />
[...]<br />
===Weapon Configuration===<br />
The weapon defines information relevant to combat, such as damage, range, and restrictions.<br />
<br />
weapons:<br />
- id: sword<br />
rangeMin: 1<br />
rangeMax: 1<br />
canMoveAndAttack: true<br />
baseDamage:<br />
land: 1<br />
tagDamage:<br />
archer: 0.65<br />
soldier: 0.55<br />
villager: 0.55<br />
spearman: 0.35<br />
dog: 0.45<br />
wagon: 0.35<br />
knight: 0.15<br />
trebuchet: 0.3<br />
merman: 0.55<br />
mage: 0.55<br />
structure: 0.35<br />
commander: 0.10<br />
ballista: 0.35<br />
giant: 0.05<br />
===Adding/Modifying a Unit Class===<br />
Units can be added, modified, or completely overwritten.<br />
====Adding a Unit====<br />
A unit can be added by creating a unit with a new id. An example in the Tolstoy mod is <code>assets/art/config/units/commander_tolstoy.yaml</code>. A unit needs the four basic components of a unit class configuration, unit configurations, and any weapons. In addition, new art and sounds can be used.<br />
====Modifying a Unit Class====<br />
To only change part of a unit (for example, to add the “pet” verb to soldiers”), instead of creating a new entry in “unitClasses”, a new entry in the “modifyingUnitClasses” is created with the id of the modified class.<br />
<br />
<br />
modifyingUnitClasses:<br />
- id: soldier<br />
# replace: # This replaces the sections, so the soldier can only pet<br />
# verbs:<br />
# - pet<br />
add:<br />
verbs:<br />
- pet # This adds “pet” to the soldier verbs<br />
# remove:<br />
# verbs:<br />
# - capture # This removes<br />
<br />
Sections in “modifyingUnitClasses” are replace, add, and remove. Under these, the categories refer to the categories in the unit class table.<br />
====Overwriting a Unit====<br />
To completely overwrite a unit, it’s the same process as adding a new unit. If the id is set to an existing unit (such as “soldier”), then it will overwrite the existing configuration.<br />
===Adding/Modifying a Commander===<br />
Commanders are units with additional configuration files and art/sound assets. The additional configuration files that need to be created are:<br />
:#A commander configuration under config/gameplay (see example: <code>tolstoy_mod/assets_src/config/gameplay/commanders.yaml</code>)<br />
:#A groove configuration under config/gameplay (see example: <code>tolstoy_mod/assets_src/config/gameplay/grooves.yaml</code>)<br />
:#A verb configuration for the commander’s groove under config/gameplay (see example: <code>tolstoy_mod/assets_src/config/gameplay/verbs.yaml</code>)<br />
===Adding a Faction===<br />
Factions are defined in assets_src/config/gameplay/factions.yaml.<br />
<br />
Example: tolstoy_mod/assets_src/config/gameplay/factions.yaml<br />
<br />
factions:<br />
- id: tolstoy # The faction id<br />
name: faction_name_tolstoy # The visible name of the faction<br />
stdColour: blue # The default colour of the faction<br />
altColour: yellow <br />
# The colour of the faction is the default is not available<br />
skinColours: [ "typeII", "typeIII", "typeIV", "typeV", "typeVI" ]<br />
# The skin colours of units in the faction<br />
Once a new faction is added, units can have their faction set to the new faction in the configuration files.<br />
==Biomes and Terrain==<br />
===Adding a Biome===<br />
A biome has two components.<br />
:#Biome config: This has the basic information of a biome (see <code>biome_mod/assets_src/config/gameplay/tilesets/grass2.yaml</code>)<br />
:#Tilesets: Tilesets can be added to a biome in two different ways. Either a new tile needs to be created, or an appending tileset configuration can be created.<br />
::#New tileset: see “Adding a Terrain Tile” below<br />
::#Appending tileset: For a new biome, it’s possible to add existing tile types. See <code>biome_mod/assets_src/config/gameplay/tilesets/grass2.yaml</code>. In this, the grass2 biome is being added to all existing tile types. In the example it uses the default grass images but these can be changed.<br />
===Adding a Terrain Tile===<br />
See example <code>terrain_mod/assets_src/config/gameplay/tilesets/flowers.yaml</code>. <br />
==Lua Scripts==<br />
All Lua files must exist under assets_<code>src/lua/</code>. Lua files under <code>assets_src/lua/initialized</code> will have <code>init()</code> called on them. This can be used for setting up conditions and actions as well as replacing game functions.<br />
===Custom Events (Conditions and Actions)===<br />
Events are made up of conditions and actions. Conditions and actions have three components:<br />
:1. Yaml Configuration: This specifies the name of the event and parameter types.<br />
<br />
::Examples:<br />
::<code>tolstoy_mod/assets_src/config/gameplay/triggers/actions.yaml</code><br />
::<code>tolstoy_mod/assets_src/config/gameplay/triggers/conditions.yaml</code><br />
<br />
:2. Lua File: This specifies the actual actions and rules of the event. This file must have an <code>init()</code> function and be in the folder <code>assets_src/lua/initialized</code>.<br />
<br />
::Examples:<br />
::<code>tolstoy_mod/assets_src/lua/initialized/actions.lua</code><br />
::<code>tolstoy_mod/assets_src/lua/initialized/conditions.lua</code><br />
<br />
<br />
:3. Strings: Each event has three strings. A name, a description, and a “readable” description. The readable description has places for user chosen values.<br />
<br />
::Example readable strings:<br />
::“Add set state {3} to {4} for unit type(s) {0} at location {1} owned by player {2}.” becomes “Add set state cute to ‘true’ for unit type(s) ‘dog’ at location ‘any’ owned by player ‘1’.”<br />
<br />
::Examples:<br />
::<code>tolstoy_mod/assets_src/config/strings/en-GB.yaml</code><br />
===Modifying Existing Lua===<br />
Existing lua systems (such as the combat system) can be modified with initialized lua files. See example <code>tolstoy_mod/assets_src/lua/initialized/combat.lua</code>.<br />
===Critical Hit Conditions===<br />
In Wargroove, critical hit conditions are called “passive conditions”. Each unit type has one; for example, the soldier does a critical hit when they are standing next to their commander. Adding a new condition works the same as modifying existing lua. See <code>tolstoy_mod/assets_src/lua/initialized/passive_conditions.lua</code>.<br />
===Verbs===<br />
Verbs are actions that units can take, such as attack, capture, and reinforce. Verbs have three components:<br />
:1. Yaml Configuration: This specifies the name of the verb, the lua file associated with it, and various parameters such as splash radius, the icon, and colours.<br />
::<code>tolstoy_mod/assets_src/config/gameplay/verbs.yaml</code><br />
:2. Lua File: This is what is actually run when a verb is used. This is also where AI rules for using the verb are specified.<br />
::<code>tolstoy_mod/assets_src/lua/lua_mod/verbs/pet.lua</code><br />
:3. String: A verb has a name associated with it.<br />
::<code>tolstoy_mod/assets_src/config/strings/en-GB.yaml</code><br />
===Grooves===<br />
Grooves are essential special verbs used by commanders. The only difference is an additional groove configuration. Grooves have four components:<br />
:1. Groove yaml configuration: this has information such as groove charge time and the associated verb.<br />
::<code>tolstoy_mod/assets_src/config/gameplay/grooves.yaml</code><br />
:2. Verb yaml Configuration: This specifies the name of the groove’s verb, the lua file associated with it, and various parameters such as splash radius, the icon, and colours.<br />
::<code>tolstoy_mod/assets_src/config/gameplay/verbs.yaml</code><br />
:3. Lua File: This is what is actually run when a verb is used. This is also where AI rules for using the verb are specified.<br />
::<code>tolstoy_mod/assets_src/lua/lua_mod/verbs/groove_tolstoy.lua</code><br />
:4. String: A verb has a name associated with it.<br />
::<code>tolstoy_mod/assets_src/config/strings/en-GB.yaml</code><br />
==Cutscenes==<br />
The Tolstoy mod has examples of these.<br />
*Sound Effects: defined in <code>config/gameplay/cutscene/cutscene_sfx.yaml</code><br />
*Visual Effects: defined in <code>config/gameplay/cutscene/cutscene_vfx.yaml</code><br />
*Props: defined in <code>config/gameplay/cutscene/cutscene_props.yaml</code><br />
*Backgrounds: defined in <code>config/gameplay/cutscene/cutscene_backgrounds.yaml</code><br />
*Shouts: defined in the unit class configuration file for the unit with the shout.<br />
*Emotes: defined in the unit class configuration file for the unit with the emote.<br />
*Alternative run: defined in the unit class file for the unit with the run. This is for characters who might have different versions of their runs, for example Sigrid has a regular run and a float.<br />
units: <br />
- class: commander_tolstoy<br />
alternativeRuns:<br />
- id: run_sniff # Refers to a tag in the battle .ase file<br />
sound: sniff # Can set an alternative run sound<br />
<br />
*Cutscene idle: If your character has an alternative idle that you want to use in cutscenes. For example, in cutscenes Caesar does not have his crossbow soldiers.<br />
units: <br />
- class: commander_tolstoy<br />
[...]<br />
cutsceneIdle: capture_idle # Tag in the battle ase file<br />
<br />
*Cutscene pre-idle: If your character has a pre-idle animation that you want to include in the cutscene (or want to not use the regular combat pre-idle animation). This can be set to nothing. For example, Caesar doesn’t do his battle pre-idle in cutscenes (as it has crossbow soldiers). <br />
units: <br />
- class: commander_tolstoy<br />
[...]<br />
cutscenePreIdle: "" # None (or a tag in the battle .ase file)<br />
<br />
*Cutscene hit: If your character has a hit animation you want to use in the cutscene. For example, Caesar doesn’t do his battle hit in cutscenes (as it has crossbow soldiers).<br />
units: <br />
- class: commander_tolstoy<br />
[...]<br />
cutsceneHit: hit_foot # A tag in the battle .ase file<br />
==Removing Units, Commanders, and Factions==<br />
In order to remove units, commanders, and factions they must be specified in the mod’s <code>manifest.yaml</code> file.<br />
<br />
id: TolstoyMod<br />
name: "Tolstoy's Mod"<br />
description: "Adds Tolstoy to the game which is the feature we've all been waiting for."<br />
remove:<br />
commander:<br />
- mercia<br />
unitClass:<br />
- soldier<br />
faction:<br />
- felheim<br />
<br />
This mod removes Mercia as a commander, the Soldier unit, and the Felhem faction. The remove id matches the id field of the asset being removed.<br />
==Game Strings==<br />
In many configuration files, there are references to strings. These strings are keys that refer to a language file, so that translation is easier. For example, in the faction configuration the entry name: <code>faction_name_tolstoy</code> refers to the key “faction_name_tolstoy” that can be found in <code>tolstoy_mod/ssets_src/config/gameplay/strings/en-GB.yaml</code>.<br />
<br />
There are a number of supported languages. To add another one to your mod, you just add the corresponding language yaml file in the same folder as the en-GB file. The language files are:<br />
*de-DE: German<br />
*en-GB: English<br />
*es-ES: Spanish<br />
*fr-FR: French<br />
*it-IT: Italian<br />
*ja-JP: Japanese<br />
*ko-KR: Korean<br />
*pt-BR: Portuguese<br />
*ru-RU: Russian<br />
*zh-Hans: Chinese Simplified<br />
*zh-Hant: Chinese Traditional<br />
==Colours==<br />
Colours are defined in <code>config/art/colours.yaml</code>. These are referred to by various configuration files, such as <code>tolstoy_mod/assets_src/config/gameplay/verbs.yaml</code> when it refers to target and outline colours.<br />
<br />
=Mod Creation: Art and Sound=<br />
==Art==<br />
There are two basic types of art assets in Wargroove, animated Aseprite files and static png files. In addition, an art asset can support palette swapping, which is what happens when commanders change faction colours.<br />
<br />
===Wargroove Palette===<br />
All art assets that has army or skin colours (such as battle and map unit animations) '''must''' use the colours found in the wargroove palette.<br />
<br />
[[File:WargroovePalette.png]]<br />
<br />
The palette has three sections: army colour, skin colour, and other. Colours from the army colour section will be changed depending on the player's chosen army colour. Skin colour will be changed depending on the unit's skin colour. The other colours will never be changed. New colours cannot be added to the palette, as it is full.<br />
<br />
===Aseprite Files===<br />
In order to create an aseprite file, you have to buy Aseprite (sorry!). It’s really awesome though so you won’t regret it. Animations work with Aseprite tags.<br />
<br />
[[File:Modding Guide 3.png]]<br />
<br />
The tags are referred to by the game, and can also be referred to in new Lua scripts.<br />
===Png Files===<br />
Assets such as portraits and UI are not animated, and thus do not have to be Aseprite files.<br />
===Meta Files===<br />
Art files can have a corresponding meta file. The metafile is the same name as the art asset with “.meta” at the end. So for the <code>battle_tolstoy.ase</code> file its meta is <code>battle_tolstoy.ase.meta</code>. The most important purpose of a meta file is to set the pivot of the art asset.<br />
<br />
---<br />
pivotX: 150<br />
pivotY: 86<br />
...<br />
===Palette Swapping===<br />
Some art assets change colours depending on the faction they are assigned to.<br />
<br />
For palette swapped images, they must use the colours found in the wargroove palette. Otherwise the packaging step will fail.<br />
{| class=wikitable<br />
|-<br />
|Portraits<br />
|Required<br />
|-<br />
|Units<br />
|Required<br />
|-<br />
|Attack Special FX<br />
|Optional, can be set in a meta file<br />
|}<br />
<br />
In the mod, files are set to palette swap by using meta files. For portraits and units, in their folders contain a file named <code>_dir.meta</code> which is generated by the mod packaging tool. <br />
<br />
---<br />
- data:<br />
palette: image/palettes/wargroove_palette.png<br />
material: Wargroove/PaletteSwap<br />
atlas: portraits<br />
...<br />
<br />
This files applies the settings to all files in the directory tree.<br />
<br />
The wargroove palette must be in the mod at <code>image/palettes/wargroove_palette.png</code>.<br />
===Ranged Attack Special FX===<br />
Optionally, ranged attack effects can be palette swapped. For example, the harpy attack changes colour depending on faction. To support this, the meta file contains instructions to use the palette and the pallete swap material.<br />
<br />
---<br />
pivotX: 145<br />
pivotY: -4<br />
palette: image/palettes/wargroove_palette.png<br />
material: Wargroove/PaletteSwap<br />
...<br />
<br />
===Overwriting the Wargroove Palette===<br />
<br />
The Wargroove palette can be overwritten, but this will also change the colours used in the rest of the game. To do this, in the <code>manifest.yaml</code> file, add: <code>overwritesPalette: true</code>. This will cause the version of the wargroove palette in <code>image/palettes/</code> to overwrite the game's default. New palettes must have colours placed in the same location as the old palette.<br />
<br />
==Sound==<br />
All sound assets in Wargroove are <code>.ogg</code> format. The game uses them files in 48khz frequency, and it’s recommended to save them at 50% quality VBR to save space. Also save them without any metatag info. For sound effects and voice lines, they should be saved in mono. For music and environmental soundscapes, they should be saved in stereo.<br />
===Music===<br />
Music .ogg files have a corresponding meta file, which is contained in the same folder is the same name but with a “.meta” on the end. So for <code>campaign.ogg</code>, its meta file is <code>campaign.ogg.meta</code> and specifies that it is streaming and its loop point.<br />
<br />
---<br />
streaming: true<br />
loopPoint: 498462<br />
...<br />
<br />
Music also has two configuration files. One is <code>music.yaml</code> which is under <code>assets_src/config/gameplay/yaml</code>.<br />
<br />
---<br />
music:<br />
- id: main_theme<br />
name: music_name_main_theme<br />
audioEvent: music/main_theme<br />
...<br />
<br />
Another is an audio event configuration under <code>assets_src/audio_event/music</code>.<br />
<br />
---<br />
actions:<br />
- type: play<br />
clips: [ music/maintheme.ogg ]<br />
group: music<br />
loop: true<br />
...<br />
<br />
===SFX===<br />
Sound effects have additional configuration files. Sound effects can be defined in the assets_src/audio_event folder. Configuration files can combine sounds into larger effects. For example, the metaAttack.yaml sound event actually contains three sounds.<br />
<br />
---<br />
actions:<br />
- type: play<br />
clips: [ sfx/mercia/merciaAttackFoley.ogg ]<br />
group: sfx<br />
delay: 0.08<br />
- type: play<br />
clips: [ sfx/mercia/merciaAttackVoice1.ogg, sfx/mercia/merciaAttackVoice2.ogg, sfx/mercia/merciaAttackVoice3.ogg ]<br />
group: voice<br />
delay: 0.2<br />
- type: play<br />
clips: [ sfx/mercia/merciaAttackVoice4.ogg, sfx/mercia/merciaAttackVoice5.ogg ]<br />
group: voice<br />
delay: 1.1<br />
...<br />
<br />
Each sound specifies:<br />
*That it should be played<br />
*What clips it should use. If more than one is specifies it chooses one at random.<br />
*What type of effect it is (sfx or voice)<br />
*When it should play after the audio event starts.<br />
<br />
In addition, sounds can have a volume and pitch specified. These are specified by a single value or a range which they can vary between.<br />
<br />
---<br />
actions:<br />
- type: play<br />
clips: [ sfx/soldierPreAttack1.ogg, sfx/soldierPreAttack2.ogg, sfx/soldierPreAttack3.ogg, sfx/soldierPreAttack4.ogg, sfx/soldierPreAttack5.ogg, sfx/soldierPreAttack6.ogg, sfx/soldierPreAttack7.ogg, sfx/soldierPreAttack8.ogg, sfx/soldierPreAttack9.ogg ]<br />
group: voice<br />
pitch: [ 0.9, 1.1 ]<br />
volume: [ 0.63, 0.7 ]<br />
...<br />
<br />
=Mod Packaging and Distribution=<br />
==Packaging==<br />
To package a mod, run the executable from your command line.<br />
<br />
wargroove_mod_packer.exe <path_to_mod><br />
<br />
The packaged mod will automatically be put into the <code>mods</code> folder of your Wargroove app data which is probably at <code>%appdata%\Roaming\Chucklefish\Wargroove\mods</code>.<br />
==Distribution==<br />
At the moment, we have not integrated Steam Workshop so it’s a manual process. Once you have packaged your mod, it will be moved to your application folder, which is probably at <code>%appdata%\Roaming\Chucklefish\Wargroove\mods</code>. The folder that’s created will have the same id as your mod, and can be placed in any user’s mods folder for usage.</div>Ckrakauerhttps://wargroovewiki.com/mediawiki/index.php?title=Guide:Modding&diff=3697Guide:Modding2019-08-21T14:43:13Z<p>Ckrakauer: /* Overwriting the Wargroove Palette */</p>
<hr />
<div>[[File:Wargroove header modding.png|center]]<br />
<br />
<br />
{{TOC right|noautonum}}<span style="color:red">'''Modding is in beta, so please ask questions on [https://discord.gg/eW3hnAF Discord] and report bugs to the [https://community.playstarbound.com/threads/wargroove-modding-beta-known-issues-and-fixes.156978/ support forums].'''</span><br />
<br />
This documentation details what's involved with setting up and implementing mods for Wargroove. Guide credit goes to [[Chucklefish]] programmer [https://twitter.com/ckrakauer Caryn Krakauer]<br />
<br />
A lot of documentation refers to the “Tolstoy” mod. [https://www.instagram.com/tinytolstoy/ Tolstoy] is a dog, not the famous Russian author.<br />
<br />
=Mod Usage=<br />
Before using any mods, especially during the modding beta, make sure to '''back up your save files'''! They're likely located at %APPDATA%\Chucklefish\Wargroove\save\<br />
==Mod File Location==<br />
Mods are stored in your application folder, which is probably at <code>%appdata%\Roaming\Chucklefish\Wargroove\mods</code>. My folder with the example mods looks like this:<br />
<br />
[[File:Modding Guide 2.png]]<br />
<br />
Each folder contains the <code>.dat</code> files for the individual mod.<br />
<br />
The EXE and example mods are located at <code>C:\Program Files (x86)\Steam\steamapps\common\Wargroove\modpacker_bin</code><br />
<br />
==Using Mods in Maps==<br />
Mods are per map/campaign and can be selected on map creation and on map selection. In addition, maps can be packaged along with mods or used separately.<br />
===Adding Mods to a Map===<br />
Create a map as normal. In the map editor menu, select the “mods” option. This will bring up the list of currently available mods. When selecting “save and reload map” this will also remove any broken units and tiles, such as if a unit type no longer exists that was placed on the map.<br />
===Using a Mod on an Unmodded Map===<br />
Mods can be used on any skirmish map. In the ‘Match Settings” view when setting up the map, select the “mods” option and you will be given the list of mods. The user can turn on new mods and also turn off currently active mods. If any changes would break the map (such as a unit type being removed that is placed on the map) the changes to mods will revert.<br />
===Updating a Modded Map===<br />
If a mod that a map relies on is updated, the map also needs to be updated. If the map is part of the mod this happens automatically on packing the mod. If not, the next time the map is opened for edit the game will ask which mods should be updated. If a mod is not updated, it will remove all units and events that rely on the mod. It’s a good idea to back up a map before updating a mod.<br />
==Using Mods Online==<br />
Maps that are packaged within mods can be used for online play. These maps can be used online if and only if all players have the same version of the mod installed.<br />
<br />
=Mod Creation: Requirements=<br />
Mods use a combination of Yaml, Lua, art, and sound files. It's definitely advisable to be familiar with the Yaml format, and Lua if there's any scripting. In addition, animations are done using Aseprite which is paid software (but very much worth it!).<br />
<br />
Aseprite is available from their website (https://www.aseprite.org/) along with itch.io, Humble Bundle, Steam, and Gumroad.<br />
Mod Creation: Configuration<br />
The basic steps are:<br />
:#Create a mod manifest file with basic information<br />
:#Create configuration, art, and sound files<br />
:#Package the mod<br />
:#Create maps that use the mod<br />
:#Package the mod to include the maps<br />
:#Give the mod to internet friends!<br />
<br />
Mods are created from a collection of yaml files, lua files, image files, and sound files. Once a mod is created and added to a user’s game, they can create new maps/campaigns using the mod and apply the mod to existing maps/campaigns.<br />
<br />
We have included a few example mods as well as a lot of example config files, lua files, and some image assets. The easiest way to get started is to take a look at these examples while going through this document.<br />
<br />
The basic structure of a mod looks like this:<br />
{|<br />
|<br />
mod<br />
- assets_src<br />
- audio<br />
- music<br />
- sfx<br />
- audio_event<br />
- config <br />
- gameplay<br />
- triggers<br />
- actions.yaml<br />
- conditions.yaml<br />
- units<br />
- strings<br />
- image<br />
- palettes<br />
- portraits<br />
- _dir.meta<br />
- ui <br />
- units<br />
- _dir.meta<br />
- lua<br />
- initialized<br />
- manifest.yaml<br />
|<br />
# The top level folder<br />
# Contains all assets<br />
# Audio files<br />
<br />
<br />
# Audio configuration files<br />
# General Configuration files<br />
# Gameplay Configuration files<br />
# Yaml files for the event system<br />
<br />
<br />
# Yaml files for units<br />
# Yaml files for translated strings<br />
# Art<br />
# The Wargroove palette<br />
# Unit/commander portraits<br />
# Sets portraits to use the Wargroove palette<br />
<br />
# Art for units map/battle animations<br />
# Sets units to use the Wargroove palette<br />
# Lua scripts folder<br />
# Special Lua files that are initialized<br />
# Information about the mod<br />
|}<br />
==Creating the Mod Manifest File==<br />
The <code>manifest.yaml</code> file at the root of the mod folder determines the mod’s general settings. The fields are:<br />
*id: The id of the mod. This should be unchanging for all versions of your mod as the id is what the game uses to determine if two mods are the same mod but with different versions. This should also be relatively unique, as two mods with the same id will clash.<br />
*name: This is the name that players will see when they load the mod into their game. This does not have to stay the same throughout versions of the mod and does not have to be unique (although it probably should be to avoid confusion).<br />
*description: This is the description that players will see when they load the mod into their game. This does not have to stay the same throughout versions of the mod and does not have to be unique (although it probably should be to avoid confusion).<br />
*remove: A group of assets to remove from the map when using this mod. The three types of assets that can be removed are commanders, units, and factions.<br />
<br />
<br />
Example from tolstoy_mod’s <code>manifest.yaml</code>:<br />
<br />
---<br />
<br />
id: TolstoyMod<br />
name: "Tolstoy's Mod"<br />
author: "TolstoyFan1"<br />
description: "Adds My Tolstoy to the game which is the feature we've all been waiting for!<br />
remove: <br />
commander:<br />
- mercia<br />
unitClass:<br />
- soldier<br />
faction:<br />
- felheim<br />
<br />
...<br />
==Maps==<br />
Maps can be packaged along with mods for distribution. In order to do this, the map must use no other mods. If a map uses multiple mods, it needs to be distributed separately from the mod.<br />
<br />
While editing the map, go to the mods settings. Next to the mod you want to add the map to press “add to mod”. This will remove other active mods. Note, this means that you have to create the mod first (or at least an initial skeletal framework). Once a map is part of a mod it will be updated automatically with the mod.<br />
<br />
The next time <code>wargroove_mod_packer.exe</code> is run, the map will be automatically packaged along with the mod. You should see them in the <code>assets_src/maps</code> folder after packaging.<br />
==Units==<br />
Units are made up of multiple parts:<br />
:#Unit Class Configuration<br />
:#Unit Configuration<br />
:#Weapons Configuration<br />
:#(optional) Commander Configuration<br />
:#Art and sound effects<br />
<br />
For example, the soldier unit has a unit class config of “soldier” and individual unit configurations for each faction (Cherrystone, Floran, Heavensong, Felheim). It also has the weapon “sword”. Various art and sounds are referred to in the configuration file. <br />
<br />
Typically, we store the weapons, unit class, and unit configuration in a single file.<br />
===Unit Class Configuration===<br />
The unit class defines the information that all soldiers share, such as their cost, movement, and weapons.<br />
<br />
unitClasses:<br />
- id: soldier<br />
name: unit_class_name_soldier<br />
cost: 100<br />
movement: walking<br />
moveRange: 4<br />
damageMultiplier: 1<br />
aiPriority: 1.0<br />
weapons:<br />
- id: sword<br />
verbs:<br />
- capture<br />
- load<br />
tags:<br />
- soldier<br />
- type.ground.light<br />
battleUnitCount: 4<br />
passiveMultiplier: 1.5<br />
<br />
{| class="mw-collapsible mw-collapsed wikitable"<br />
|Expand for a complete list of '''unit ids''' implemented in game <br />
|-<br />
|<br />
archer<br />
ballista<br />
balloon<br />
barracks<br />
city<br />
commander_caesar<br />
commander_darkmercia<br />
commander_elodie<br />
commander_emeric<br />
commander_greenfinger<br />
commander_koji<br />
commander_mercia<br />
commander_mercival<br />
commander_nuru<br />
commander_ragna<br />
commander_ryota<br />
commander_sedge<br />
commander_sigrid<br />
commander_tenri<br />
commander_valder<br />
crystal<br />
dog<br />
dragon<br />
drone<br />
garrison<br />
gate<br />
ghost_mercival<br />
giant<br />
harpoonship<br />
harpy<br />
hq<br />
knight<br />
mage<br />
merman<br />
port<br />
soldier<br />
spearman<br />
tower<br />
travelboat<br />
trebuchet<br />
turtle<br />
villager<br />
vine<br />
wagon<br />
warship<br />
water_city<br />
witch<br />
|}<br />
<br />
===Unit Configuration===<br />
The unit defines information that is faction specific, such as the name, animations, and sounds.<br />
<br />
[This example has been shortened slightly where there are ellipses.]<br />
units:<br />
- class: soldier<br />
faction: cherrystone<br />
name: unit_name_soldier_cherrystone<br />
mapAnimation: units/soldier/cherrystone/map_soldier_cherrystone<br />
battleAnimation: units/soldier/cherrystone/battle_soldier_cherrystone<br />
battleAnimationRiver: fx/river_overlay/battle_soldier_cherrystone_river<br />
smallPortrait: units/soldier/cherrystone/portrait_soldier_cherrystone_small.png<br />
mediumPortrait: units/soldier/cherrystone/portrait_soldier_cherrystone_medium.png<br />
mapSpeed: 4.0<br />
grabPos: [13, 14]<br />
sounds:<br />
attack: soldierAttackRed<br />
attackShout: soldierPreAttackRed<br />
attackMap: unitAttack<br />
captureShout: soldierPreAttackRed<br />
death: soldierDieRed<br />
deathMap: unitDie<br />
run: infantryHeavyEntry<br />
runMap: infantryHeavyMapEntry<br />
hit: hitOrganic<br />
hitMap: hitOrganic<br />
attacks:<br />
- id: primary<br />
hitSpark: fx/bs_stab_attack<br />
hitDelay: [0.45, 0.8]<br />
shouts:<br />
soldier_shout1: soldierShoutRed1<br />
soldier_shout2: soldierShoutRed2<br />
soldier_shout3: soldierShoutRed3<br />
[...]<br />
soldier_hit1: soldierHitRed1<br />
soldier_hit2: soldierHitRed2<br />
soldier_hit3: soldierHitRed3<br />
[...]<br />
crownbearer_panting: cutscene/crownbearerPanting<br />
crownbearer_yell: cutscene/crownbearerYell<br />
emotes:<br />
idle: idle<br />
idle_crownbearer: idle_crownbearer<br />
idle_crown: emote_idle_crown<br />
idle_crown_ragged: emote_idle_crown_ragged<br />
cushion: emote_cushion<br />
[...]<br />
alternativeRuns:<br />
- id: run_crown<br />
[...]<br />
===Weapon Configuration===<br />
The weapon defines information relevant to combat, such as damage, range, and restrictions.<br />
<br />
weapons:<br />
- id: sword<br />
rangeMin: 1<br />
rangeMax: 1<br />
canMoveAndAttack: true<br />
baseDamage:<br />
land: 1<br />
tagDamage:<br />
archer: 0.65<br />
soldier: 0.55<br />
villager: 0.55<br />
spearman: 0.35<br />
dog: 0.45<br />
wagon: 0.35<br />
knight: 0.15<br />
trebuchet: 0.3<br />
merman: 0.55<br />
mage: 0.55<br />
structure: 0.35<br />
commander: 0.10<br />
ballista: 0.35<br />
giant: 0.05<br />
===Adding/Modifying a Unit Class===<br />
Units can be added, modified, or completely overwritten.<br />
====Adding a Unit====<br />
A unit can be added by creating a unit with a new id. An example in the Tolstoy mod is <code>assets/art/config/units/commander_tolstoy.yaml</code>. A unit needs the four basic components of a unit class configuration, unit configurations, and any weapons. In addition, new art and sounds can be used.<br />
====Modifying a Unit Class====<br />
To only change part of a unit (for example, to add the “pet” verb to soldiers”), instead of creating a new entry in “unitClasses”, a new entry in the “modifyingUnitClasses” is created with the id of the modified class.<br />
<br />
<br />
modifyingUnitClasses:<br />
- id: soldier<br />
# replace: # This replaces the sections, so the soldier can only pet<br />
# verbs:<br />
# - pet<br />
add:<br />
verbs:<br />
- pet # This adds “pet” to the soldier verbs<br />
# remove:<br />
# verbs:<br />
# - capture # This removes<br />
<br />
Sections in “modifyingUnitClasses” are replace, add, and remove. Under these, the categories refer to the categories in the unit class table.<br />
====Overwriting a Unit====<br />
To completely overwrite a unit, it’s the same process as adding a new unit. If the id is set to an existing unit (such as “soldier”), then it will overwrite the existing configuration.<br />
===Adding/Modifying a Commander===<br />
Commanders are units with additional configuration files and art/sound assets. The additional configuration files that need to be created are:<br />
:#A commander configuration under config/gameplay (see example: <code>tolstoy_mod/assets_src/config/gameplay/commanders.yaml</code>)<br />
:#A groove configuration under config/gameplay (see example: <code>tolstoy_mod/assets_src/config/gameplay/grooves.yaml</code>)<br />
:#A verb configuration for the commander’s groove under config/gameplay (see example: <code>tolstoy_mod/assets_src/config/gameplay/verbs.yaml</code>)<br />
===Adding a Faction===<br />
Factions are defined in assets_src/config/gameplay/factions.yaml.<br />
<br />
Example: tolstoy_mod/assets_src/config/gameplay/factions.yaml<br />
<br />
factions:<br />
- id: tolstoy # The faction id<br />
name: faction_name_tolstoy # The visible name of the faction<br />
stdColour: blue # The default colour of the faction<br />
altColour: yellow <br />
# The colour of the faction is the default is not available<br />
skinColours: [ "typeII", "typeIII", "typeIV", "typeV", "typeVI" ]<br />
# The skin colours of units in the faction<br />
Once a new faction is added, units can have their faction set to the new faction in the configuration files.<br />
==Biomes and Terrain==<br />
===Adding a Biome===<br />
A biome has two components.<br />
:#Biome config: This has the basic information of a biome (see <code>biome_mod/assets_src/config/gameplay/tilesets/grass2.yaml</code>)<br />
:#Tilesets: Tilesets can be added to a biome in two different ways. Either a new tile needs to be created, or an appending tileset configuration can be created.<br />
::#New tileset: see “Adding a Terrain Tile” below<br />
::#Appending tileset: For a new biome, it’s possible to add existing tile types. See <code>biome_mod/assets_src/config/gameplay/tilesets/grass2.yaml</code>. In this, the grass2 biome is being added to all existing tile types. In the example it uses the default grass images but these can be changed.<br />
===Adding a Terrain Tile===<br />
See example <code>terrain_mod/assets_src/config/gameplay/tilesets/flowers.yaml</code>. <br />
==Lua Scripts==<br />
All Lua files must exist under assets_<code>src/lua/</code>. Lua files under <code>assets_src/lua/initialized</code> will have <code>init()</code> called on them. This can be used for setting up conditions and actions as well as replacing game functions.<br />
===Custom Events (Conditions and Actions)===<br />
Events are made up of conditions and actions. Conditions and actions have three components:<br />
:1. Yaml Configuration: This specifies the name of the event and parameter types.<br />
<br />
::Examples:<br />
::<code>tolstoy_mod/assets_src/config/gameplay/triggers/actions.yaml</code><br />
::<code>tolstoy_mod/assets_src/config/gameplay/triggers/conditions.yaml</code><br />
<br />
:2. Lua File: This specifies the actual actions and rules of the event. This file must have an <code>init()</code> function and be in the folder <code>assets_src/lua/initialized</code>.<br />
<br />
::Examples:<br />
::<code>tolstoy_mod/assets_src/lua/initialized/actions.lua</code><br />
::<code>tolstoy_mod/assets_src/lua/initialized/conditions.lua</code><br />
<br />
<br />
:3. Strings: Each event has three strings. A name, a description, and a “readable” description. The readable description has places for user chosen values.<br />
<br />
::Example readable strings:<br />
::“Add set state {3} to {4} for unit type(s) {0} at location {1} owned by player {2}.” becomes “Add set state cute to ‘true’ for unit type(s) ‘dog’ at location ‘any’ owned by player ‘1’.”<br />
<br />
::Examples:<br />
::<code>tolstoy_mod/assets_src/config/strings/en-GB.yaml</code><br />
===Modifying Existing Lua===<br />
Existing lua systems (such as the combat system) can be modified with initialized lua files. See example <code>tolstoy_mod/assets_src/lua/initialized/combat.lua</code>.<br />
===Critical Hit Conditions===<br />
In Wargroove, critical hit conditions are called “passive conditions”. Each unit type has one; for example, the soldier does a critical hit when they are standing next to their commander. Adding a new condition works the same as modifying existing lua. See <code>tolstoy_mod/assets_src/lua/initialized/passive_conditions.lua</code>.<br />
===Verbs===<br />
Verbs are actions that units can take, such as attack, capture, and reinforce. Verbs have three components:<br />
:1. Yaml Configuration: This specifies the name of the verb, the lua file associated with it, and various parameters such as splash radius, the icon, and colours.<br />
::<code>tolstoy_mod/assets_src/config/gameplay/verbs.yaml</code><br />
:2. Lua File: This is what is actually run when a verb is used. This is also where AI rules for using the verb are specified.<br />
::<code>tolstoy_mod/assets_src/lua/lua_mod/verbs/pet.lua</code><br />
:3. String: A verb has a name associated with it.<br />
::<code>tolstoy_mod/assets_src/config/strings/en-GB.yaml</code><br />
===Grooves===<br />
Grooves are essential special verbs used by commanders. The only difference is an additional groove configuration. Grooves have four components:<br />
:1. Groove yaml configuration: this has information such as groove charge time and the associated verb.<br />
::<code>tolstoy_mod/assets_src/config/gameplay/grooves.yaml</code><br />
:2. Verb yaml Configuration: This specifies the name of the groove’s verb, the lua file associated with it, and various parameters such as splash radius, the icon, and colours.<br />
::<code>tolstoy_mod/assets_src/config/gameplay/verbs.yaml</code><br />
:3. Lua File: This is what is actually run when a verb is used. This is also where AI rules for using the verb are specified.<br />
::<code>tolstoy_mod/assets_src/lua/lua_mod/verbs/groove_tolstoy.lua</code><br />
:4. String: A verb has a name associated with it.<br />
::<code>tolstoy_mod/assets_src/config/strings/en-GB.yaml</code><br />
==Cutscenes==<br />
The Tolstoy mod has examples of these.<br />
*Sound Effects: defined in <code>config/gameplay/cutscene/cutscene_sfx.yaml</code><br />
*Visual Effects: defined in <code>config/gameplay/cutscene/cutscene_vfx.yaml</code><br />
*Props: defined in <code>config/gameplay/cutscene/cutscene_props.yaml</code><br />
*Backgrounds: defined in <code>config/gameplay/cutscene/cutscene_backgrounds.yaml</code><br />
*Shouts: defined in the unit class configuration file for the unit with the shout.<br />
*Emotes: defined in the unit class configuration file for the unit with the emote.<br />
*Alternative run: defined in the unit class file for the unit with the run. This is for characters who might have different versions of their runs, for example Sigrid has a regular run and a float.<br />
units: <br />
- class: commander_tolstoy<br />
alternativeRuns:<br />
- id: run_sniff # Refers to a tag in the battle .ase file<br />
sound: sniff # Can set an alternative run sound<br />
<br />
*Cutscene idle: If your character has an alternative idle that you want to use in cutscenes. For example, in cutscenes Caesar does not have his crossbow soldiers.<br />
units: <br />
- class: commander_tolstoy<br />
[...]<br />
cutsceneIdle: capture_idle # Tag in the battle ase file<br />
<br />
*Cutscene pre-idle: If your character has a pre-idle animation that you want to include in the cutscene (or want to not use the regular combat pre-idle animation). This can be set to nothing. For example, Caesar doesn’t do his battle pre-idle in cutscenes (as it has crossbow soldiers). <br />
units: <br />
- class: commander_tolstoy<br />
[...]<br />
cutscenePreIdle: "" # None (or a tag in the battle .ase file)<br />
<br />
*Cutscene hit: If your character has a hit animation you want to use in the cutscene. For example, Caesar doesn’t do his battle hit in cutscenes (as it has crossbow soldiers).<br />
units: <br />
- class: commander_tolstoy<br />
[...]<br />
cutsceneHit: hit_foot # A tag in the battle .ase file<br />
==Removing Units, Commanders, and Factions==<br />
In order to remove units, commanders, and factions they must be specified in the mod’s <code>manifest.yaml</code> file.<br />
<br />
id: TolstoyMod<br />
name: "Tolstoy's Mod"<br />
description: "Adds Tolstoy to the game which is the feature we've all been waiting for."<br />
remove:<br />
commander:<br />
- mercia<br />
unitClass:<br />
- soldier<br />
faction:<br />
- felheim<br />
<br />
This mod removes Mercia as a commander, the Soldier unit, and the Felhem faction. The remove id matches the id field of the asset being removed.<br />
==Game Strings==<br />
In many configuration files, there are references to strings. These strings are keys that refer to a language file, so that translation is easier. For example, in the faction configuration the entry name: <code>faction_name_tolstoy</code> refers to the key “faction_name_tolstoy” that can be found in <code>tolstoy_mod/ssets_src/config/gameplay/strings/en-GB.yaml</code>.<br />
<br />
There are a number of supported languages. To add another one to your mod, you just add the corresponding language yaml file in the same folder as the en-GB file. The language files are:<br />
*de-DE: German<br />
*en-GB: English<br />
*es-ES: Spanish<br />
*fr-FR: French<br />
*it-IT: Italian<br />
*ja-JP: Japanese<br />
*ko-KR: Korean<br />
*pt-BR: Portuguese<br />
*ru-RU: Russian<br />
*zh-Hans: Chinese Simplified<br />
*zh-Hant: Chinese Traditional<br />
==Colours==<br />
Colours are defined in <code>config/art/colours.yaml</code>. These are referred to by various configuration files, such as <code>tolstoy_mod/assets_src/config/gameplay/verbs.yaml</code> when it refers to target and outline colours.<br />
<br />
=Mod Creation: Art and Sound=<br />
==Art==<br />
There are two basic types of art assets in Wargroove, animated Aseprite files and static png files. In addition, an art asset can support palette swapping, which is what happens when commanders change faction colours.<br />
<br />
===Wargroove Palette===<br />
All art assets that has army or skin colours (such as battle and map unit animations) '''must''' use the colours found in the wargroove palette.<br />
<br />
[[File:WargroovePalette.png]]<br />
<br />
The palette has three sections: army colour, skin colour, and other. Colours from the army colour section will be changed depending on the player's chosen army colour. Skin colour will be changed depending on the unit's skin colour. The other colours will never be changed. New colours cannot be added to the palette, as it is full.<br />
<br />
===Aseprite Files===<br />
In order to create an aseprite file, you have to buy Aseprite (sorry!). It’s really awesome though so you won’t regret it. Animations work with Aseprite tags.<br />
<br />
[[File:Modding Guide 3.png]]<br />
<br />
The tags are referred to by the game, and can also be referred to in new Lua scripts.<br />
===Png Files===<br />
Assets such as portraits and UI are not animated, and thus do not have to be Aseprite files.<br />
===Meta Files===<br />
Art files can have a corresponding meta file. The metafile is the same name as the art asset with “.meta” at the end. So for the <code>battle_tolstoy.ase</code> file its meta is <code>battle_tolstoy.ase.meta</code>. The most important purpose of a meta file is to set the pivot of the art asset.<br />
<br />
---<br />
pivotX: 150<br />
pivotY: 86<br />
...<br />
===Palette Swapping===<br />
Some art assets change colours depending on the faction they are assigned to.<br />
<br />
For palette swapped images, they must use the colours found in the wargroove palette. Otherwise the packaging step will fail.<br />
{| class=wikitable<br />
|-<br />
|Portraits<br />
|Required<br />
|-<br />
|Units<br />
|Required<br />
|-<br />
|Attack Special FX<br />
|Optional, can be set in a meta file<br />
|}<br />
<br />
In the mod, files are set to palette swap by using meta files. For portraits and units, in their folders contain a file named <code>_dir.meta</code> which is generated by the mod packaging tool. <br />
<br />
---<br />
- data:<br />
palette: image/palettes/wargroove_palette.png<br />
material: Wargroove/PaletteSwap<br />
atlas: portraits<br />
...<br />
<br />
This files applies the settings to all files in the directory tree.<br />
<br />
The wargroove palette must be in the mod at <code>image/palettes/wargroove_palette.png</code>.<br />
===Ranged Attack Special FX===<br />
Optionally, ranged attack effects can be palette swapped. For example, the harpy attack changes colour depending on faction. To support this, the meta file contains instructions to use the palette and the pallete swap material.<br />
<br />
---<br />
pivotX: 145<br />
pivotY: -4<br />
palette: image/palettes/wargroove_palette.png<br />
material: Wargroove/PaletteSwap<br />
...<br />
<br />
===Overwriting the Wargroove Palette===<br />
<br />
The Wargroove palette can be overwritten, but this will also change the colours used in the rest of the game. To do this, in the <code>manifest.yaml</code> file, add: <code>overwritesPalette: true</code>. This will cause the version of the wargroove palette in <code>image/palettes/</code> to overwrite the game's default. New palettes must have colours placed in the same location as the old palette.<br />
<br />
==Sound==<br />
All sound assets in Wargroove are <code>.ogg</code> format. The game uses them files in 48khz frequency, and it’s recommended to save them at 50% quality VBR to save space. Also save them without any metatag info. For sound effects and voice lines, they should be saved in mono. For music and environmental soundscapes, they should be saved in stereo.<br />
===Music===<br />
Music .ogg files have a corresponding meta file, which is contained in the same folder is the same name but with a “.meta” on the end. So for <code>campaign.ogg</code>, its meta file is <code>campaign.ogg.meta</code> and specifies that it is streaming and its loop point.<br />
<br />
---<br />
streaming: true<br />
loopPoint: 498462<br />
...<br />
<br />
Music also has two configuration files. One is <code>music.yaml</code> which is under <code>assets_src/config/gameplay/yaml</code>.<br />
<br />
---<br />
music:<br />
- id: main_theme<br />
name: music_name_main_theme<br />
audioEvent: music/main_theme<br />
...<br />
<br />
Another is an audio event configuration under <code>assets_src/audio_event/music</code>.<br />
<br />
---<br />
actions:<br />
- type: play<br />
clips: [ music/maintheme.ogg ]<br />
group: music<br />
loop: true<br />
...<br />
<br />
===SFX===<br />
Sound effects have additional configuration files. Sound effects can be defined in the assets_src/audio_event folder. Configuration files can combine sounds into larger effects. For example, the metaAttack.yaml sound event actually contains three sounds.<br />
<br />
---<br />
actions:<br />
- type: play<br />
clips: [ sfx/mercia/merciaAttackFoley.ogg ]<br />
group: sfx<br />
delay: 0.08<br />
- type: play<br />
clips: [ sfx/mercia/merciaAttackVoice1.ogg, sfx/mercia/merciaAttackVoice2.ogg, sfx/mercia/merciaAttackVoice3.ogg ]<br />
group: voice<br />
delay: 0.2<br />
- type: play<br />
clips: [ sfx/mercia/merciaAttackVoice4.ogg, sfx/mercia/merciaAttackVoice5.ogg ]<br />
group: voice<br />
delay: 1.1<br />
...<br />
<br />
Each sound specifies:<br />
*That it should be played<br />
*What clips it should use. If more than one is specifies it chooses one at random.<br />
*What type of effect it is (sfx or voice)<br />
*When it should play after the audio event starts.<br />
<br />
In addition, sounds can have a volume and pitch specified. These are specified by a single value or a range which they can vary between.<br />
<br />
---<br />
actions:<br />
- type: play<br />
clips: [ sfx/soldierPreAttack1.ogg, sfx/soldierPreAttack2.ogg, sfx/soldierPreAttack3.ogg, sfx/soldierPreAttack4.ogg, sfx/soldierPreAttack5.ogg, sfx/soldierPreAttack6.ogg, sfx/soldierPreAttack7.ogg, sfx/soldierPreAttack8.ogg, sfx/soldierPreAttack9.ogg ]<br />
group: voice<br />
pitch: [ 0.9, 1.1 ]<br />
volume: [ 0.63, 0.7 ]<br />
...<br />
<br />
=Mod Packaging and Distribution=<br />
==Packaging==<br />
To package a mod, run the executable from your command line.<br />
<br />
wargroove_mod_packer.exe <path_to_mod><br />
<br />
The packaged mod will automatically be put into the <code>mods</code> folder of your Wargroove app data which is probably at <code>%appdata%\Roaming\Chucklefish\Wargroove\mods</code>.<br />
==Distribution==<br />
At the moment, we have not integrated Steam Workshop so it’s a manual process. Once you have packaged your mod, it will be moved to your application folder, which is probably at <code>%appdata%\Roaming\Chucklefish\Wargroove\mods</code>. The folder that’s created will have the same id as your mod, and can be placed in any user’s mods folder for usage.</div>Ckrakauerhttps://wargroovewiki.com/mediawiki/index.php?title=Guide:Modding&diff=3696Guide:Modding2019-08-20T15:38:34Z<p>Ckrakauer: /* Overwriting the Wargroove Palette */</p>
<hr />
<div>[[File:Wargroove header modding.png|center]]<br />
<br />
<br />
{{TOC right|noautonum}}<span style="color:red">'''Modding is in beta, so please ask questions on [https://discord.gg/eW3hnAF Discord] and report bugs to the [https://community.playstarbound.com/threads/wargroove-modding-beta-known-issues-and-fixes.156978/ support forums].'''</span><br />
<br />
This documentation details what's involved with setting up and implementing mods for Wargroove. Guide credit goes to [[Chucklefish]] programmer [https://twitter.com/ckrakauer Caryn Krakauer]<br />
<br />
A lot of documentation refers to the “Tolstoy” mod. [https://www.instagram.com/tinytolstoy/ Tolstoy] is a dog, not the famous Russian author.<br />
<br />
=Mod Usage=<br />
Before using any mods, especially during the modding beta, make sure to '''back up your save files'''! They're likely located at %APPDATA%\Chucklefish\Wargroove\save\<br />
==Mod File Location==<br />
Mods are stored in your application folder, which is probably at <code>%appdata%\Roaming\Chucklefish\Wargroove\mods</code>. My folder with the example mods looks like this:<br />
<br />
[[File:Modding Guide 2.png]]<br />
<br />
Each folder contains the <code>.dat</code> files for the individual mod.<br />
<br />
The EXE and example mods are located at <code>C:\Program Files (x86)\Steam\steamapps\common\Wargroove\modpacker_bin</code><br />
<br />
==Using Mods in Maps==<br />
Mods are per map/campaign and can be selected on map creation and on map selection. In addition, maps can be packaged along with mods or used separately.<br />
===Adding Mods to a Map===<br />
Create a map as normal. In the map editor menu, select the “mods” option. This will bring up the list of currently available mods. When selecting “save and reload map” this will also remove any broken units and tiles, such as if a unit type no longer exists that was placed on the map.<br />
===Using a Mod on an Unmodded Map===<br />
Mods can be used on any skirmish map. In the ‘Match Settings” view when setting up the map, select the “mods” option and you will be given the list of mods. The user can turn on new mods and also turn off currently active mods. If any changes would break the map (such as a unit type being removed that is placed on the map) the changes to mods will revert.<br />
===Updating a Modded Map===<br />
If a mod that a map relies on is updated, the map also needs to be updated. If the map is part of the mod this happens automatically on packing the mod. If not, the next time the map is opened for edit the game will ask which mods should be updated. If a mod is not updated, it will remove all units and events that rely on the mod. It’s a good idea to back up a map before updating a mod.<br />
==Using Mods Online==<br />
Maps that are packaged within mods can be used for online play. These maps can be used online if and only if all players have the same version of the mod installed.<br />
<br />
=Mod Creation: Requirements=<br />
Mods use a combination of Yaml, Lua, art, and sound files. It's definitely advisable to be familiar with the Yaml format, and Lua if there's any scripting. In addition, animations are done using Aseprite which is paid software (but very much worth it!).<br />
<br />
Aseprite is available from their website (https://www.aseprite.org/) along with itch.io, Humble Bundle, Steam, and Gumroad.<br />
Mod Creation: Configuration<br />
The basic steps are:<br />
:#Create a mod manifest file with basic information<br />
:#Create configuration, art, and sound files<br />
:#Package the mod<br />
:#Create maps that use the mod<br />
:#Package the mod to include the maps<br />
:#Give the mod to internet friends!<br />
<br />
Mods are created from a collection of yaml files, lua files, image files, and sound files. Once a mod is created and added to a user’s game, they can create new maps/campaigns using the mod and apply the mod to existing maps/campaigns.<br />
<br />
We have included a few example mods as well as a lot of example config files, lua files, and some image assets. The easiest way to get started is to take a look at these examples while going through this document.<br />
<br />
The basic structure of a mod looks like this:<br />
{|<br />
|<br />
mod<br />
- assets_src<br />
- audio<br />
- music<br />
- sfx<br />
- audio_event<br />
- config <br />
- gameplay<br />
- triggers<br />
- actions.yaml<br />
- conditions.yaml<br />
- units<br />
- strings<br />
- image<br />
- palettes<br />
- portraits<br />
- _dir.meta<br />
- ui <br />
- units<br />
- _dir.meta<br />
- lua<br />
- initialized<br />
- manifest.yaml<br />
|<br />
# The top level folder<br />
# Contains all assets<br />
# Audio files<br />
<br />
<br />
# Audio configuration files<br />
# General Configuration files<br />
# Gameplay Configuration files<br />
# Yaml files for the event system<br />
<br />
<br />
# Yaml files for units<br />
# Yaml files for translated strings<br />
# Art<br />
# The Wargroove palette<br />
# Unit/commander portraits<br />
# Sets portraits to use the Wargroove palette<br />
<br />
# Art for units map/battle animations<br />
# Sets units to use the Wargroove palette<br />
# Lua scripts folder<br />
# Special Lua files that are initialized<br />
# Information about the mod<br />
|}<br />
==Creating the Mod Manifest File==<br />
The <code>manifest.yaml</code> file at the root of the mod folder determines the mod’s general settings. The fields are:<br />
*id: The id of the mod. This should be unchanging for all versions of your mod as the id is what the game uses to determine if two mods are the same mod but with different versions. This should also be relatively unique, as two mods with the same id will clash.<br />
*name: This is the name that players will see when they load the mod into their game. This does not have to stay the same throughout versions of the mod and does not have to be unique (although it probably should be to avoid confusion).<br />
*description: This is the description that players will see when they load the mod into their game. This does not have to stay the same throughout versions of the mod and does not have to be unique (although it probably should be to avoid confusion).<br />
*remove: A group of assets to remove from the map when using this mod. The three types of assets that can be removed are commanders, units, and factions.<br />
<br />
<br />
Example from tolstoy_mod’s <code>manifest.yaml</code>:<br />
<br />
---<br />
<br />
id: TolstoyMod<br />
name: "Tolstoy's Mod"<br />
author: "TolstoyFan1"<br />
description: "Adds My Tolstoy to the game which is the feature we've all been waiting for!<br />
remove: <br />
commander:<br />
- mercia<br />
unitClass:<br />
- soldier<br />
faction:<br />
- felheim<br />
<br />
...<br />
==Maps==<br />
Maps can be packaged along with mods for distribution. In order to do this, the map must use no other mods. If a map uses multiple mods, it needs to be distributed separately from the mod.<br />
<br />
While editing the map, go to the mods settings. Next to the mod you want to add the map to press “add to mod”. This will remove other active mods. Note, this means that you have to create the mod first (or at least an initial skeletal framework). Once a map is part of a mod it will be updated automatically with the mod.<br />
<br />
The next time <code>wargroove_mod_packer.exe</code> is run, the map will be automatically packaged along with the mod. You should see them in the <code>assets_src/maps</code> folder after packaging.<br />
==Units==<br />
Units are made up of multiple parts:<br />
:#Unit Class Configuration<br />
:#Unit Configuration<br />
:#Weapons Configuration<br />
:#(optional) Commander Configuration<br />
:#Art and sound effects<br />
<br />
For example, the soldier unit has a unit class config of “soldier” and individual unit configurations for each faction (Cherrystone, Floran, Heavensong, Felheim). It also has the weapon “sword”. Various art and sounds are referred to in the configuration file. <br />
<br />
Typically, we store the weapons, unit class, and unit configuration in a single file.<br />
===Unit Class Configuration===<br />
The unit class defines the information that all soldiers share, such as their cost, movement, and weapons.<br />
<br />
unitClasses:<br />
- id: soldier<br />
name: unit_class_name_soldier<br />
cost: 100<br />
movement: walking<br />
moveRange: 4<br />
damageMultiplier: 1<br />
aiPriority: 1.0<br />
weapons:<br />
- id: sword<br />
verbs:<br />
- capture<br />
- load<br />
tags:<br />
- soldier<br />
- type.ground.light<br />
battleUnitCount: 4<br />
passiveMultiplier: 1.5<br />
<br />
{| class="mw-collapsible mw-collapsed wikitable"<br />
|Expand for a complete list of '''unit ids''' implemented in game <br />
|-<br />
|<br />
archer<br />
ballista<br />
balloon<br />
barracks<br />
city<br />
commander_caesar<br />
commander_darkmercia<br />
commander_elodie<br />
commander_emeric<br />
commander_greenfinger<br />
commander_koji<br />
commander_mercia<br />
commander_mercival<br />
commander_nuru<br />
commander_ragna<br />
commander_ryota<br />
commander_sedge<br />
commander_sigrid<br />
commander_tenri<br />
commander_valder<br />
crystal<br />
dog<br />
dragon<br />
drone<br />
garrison<br />
gate<br />
ghost_mercival<br />
giant<br />
harpoonship<br />
harpy<br />
hq<br />
knight<br />
mage<br />
merman<br />
port<br />
soldier<br />
spearman<br />
tower<br />
travelboat<br />
trebuchet<br />
turtle<br />
villager<br />
vine<br />
wagon<br />
warship<br />
water_city<br />
witch<br />
|}<br />
<br />
===Unit Configuration===<br />
The unit defines information that is faction specific, such as the name, animations, and sounds.<br />
<br />
[This example has been shortened slightly where there are ellipses.]<br />
units:<br />
- class: soldier<br />
faction: cherrystone<br />
name: unit_name_soldier_cherrystone<br />
mapAnimation: units/soldier/cherrystone/map_soldier_cherrystone<br />
battleAnimation: units/soldier/cherrystone/battle_soldier_cherrystone<br />
battleAnimationRiver: fx/river_overlay/battle_soldier_cherrystone_river<br />
smallPortrait: units/soldier/cherrystone/portrait_soldier_cherrystone_small.png<br />
mediumPortrait: units/soldier/cherrystone/portrait_soldier_cherrystone_medium.png<br />
mapSpeed: 4.0<br />
grabPos: [13, 14]<br />
sounds:<br />
attack: soldierAttackRed<br />
attackShout: soldierPreAttackRed<br />
attackMap: unitAttack<br />
captureShout: soldierPreAttackRed<br />
death: soldierDieRed<br />
deathMap: unitDie<br />
run: infantryHeavyEntry<br />
runMap: infantryHeavyMapEntry<br />
hit: hitOrganic<br />
hitMap: hitOrganic<br />
attacks:<br />
- id: primary<br />
hitSpark: fx/bs_stab_attack<br />
hitDelay: [0.45, 0.8]<br />
shouts:<br />
soldier_shout1: soldierShoutRed1<br />
soldier_shout2: soldierShoutRed2<br />
soldier_shout3: soldierShoutRed3<br />
[...]<br />
soldier_hit1: soldierHitRed1<br />
soldier_hit2: soldierHitRed2<br />
soldier_hit3: soldierHitRed3<br />
[...]<br />
crownbearer_panting: cutscene/crownbearerPanting<br />
crownbearer_yell: cutscene/crownbearerYell<br />
emotes:<br />
idle: idle<br />
idle_crownbearer: idle_crownbearer<br />
idle_crown: emote_idle_crown<br />
idle_crown_ragged: emote_idle_crown_ragged<br />
cushion: emote_cushion<br />
[...]<br />
alternativeRuns:<br />
- id: run_crown<br />
[...]<br />
===Weapon Configuration===<br />
The weapon defines information relevant to combat, such as damage, range, and restrictions.<br />
<br />
weapons:<br />
- id: sword<br />
rangeMin: 1<br />
rangeMax: 1<br />
canMoveAndAttack: true<br />
baseDamage:<br />
land: 1<br />
tagDamage:<br />
archer: 0.65<br />
soldier: 0.55<br />
villager: 0.55<br />
spearman: 0.35<br />
dog: 0.45<br />
wagon: 0.35<br />
knight: 0.15<br />
trebuchet: 0.3<br />
merman: 0.55<br />
mage: 0.55<br />
structure: 0.35<br />
commander: 0.10<br />
ballista: 0.35<br />
giant: 0.05<br />
===Adding/Modifying a Unit Class===<br />
Units can be added, modified, or completely overwritten.<br />
====Adding a Unit====<br />
A unit can be added by creating a unit with a new id. An example in the Tolstoy mod is <code>assets/art/config/units/commander_tolstoy.yaml</code>. A unit needs the four basic components of a unit class configuration, unit configurations, and any weapons. In addition, new art and sounds can be used.<br />
====Modifying a Unit Class====<br />
To only change part of a unit (for example, to add the “pet” verb to soldiers”), instead of creating a new entry in “unitClasses”, a new entry in the “modifyingUnitClasses” is created with the id of the modified class.<br />
<br />
<br />
modifyingUnitClasses:<br />
- id: soldier<br />
# replace: # This replaces the sections, so the soldier can only pet<br />
# verbs:<br />
# - pet<br />
add:<br />
verbs:<br />
- pet # This adds “pet” to the soldier verbs<br />
# remove:<br />
# verbs:<br />
# - capture # This removes<br />
<br />
Sections in “modifyingUnitClasses” are replace, add, and remove. Under these, the categories refer to the categories in the unit class table.<br />
====Overwriting a Unit====<br />
To completely overwrite a unit, it’s the same process as adding a new unit. If the id is set to an existing unit (such as “soldier”), then it will overwrite the existing configuration.<br />
===Adding/Modifying a Commander===<br />
Commanders are units with additional configuration files and art/sound assets. The additional configuration files that need to be created are:<br />
:#A commander configuration under config/gameplay (see example: <code>tolstoy_mod/assets_src/config/gameplay/commanders.yaml</code>)<br />
:#A groove configuration under config/gameplay (see example: <code>tolstoy_mod/assets_src/config/gameplay/grooves.yaml</code>)<br />
:#A verb configuration for the commander’s groove under config/gameplay (see example: <code>tolstoy_mod/assets_src/config/gameplay/verbs.yaml</code>)<br />
===Adding a Faction===<br />
Factions are defined in assets_src/config/gameplay/factions.yaml.<br />
<br />
Example: tolstoy_mod/assets_src/config/gameplay/factions.yaml<br />
<br />
factions:<br />
- id: tolstoy # The faction id<br />
name: faction_name_tolstoy # The visible name of the faction<br />
stdColour: blue # The default colour of the faction<br />
altColour: yellow <br />
# The colour of the faction is the default is not available<br />
skinColours: [ "typeII", "typeIII", "typeIV", "typeV", "typeVI" ]<br />
# The skin colours of units in the faction<br />
Once a new faction is added, units can have their faction set to the new faction in the configuration files.<br />
==Biomes and Terrain==<br />
===Adding a Biome===<br />
A biome has two components.<br />
:#Biome config: This has the basic information of a biome (see <code>biome_mod/assets_src/config/gameplay/tilesets/grass2.yaml</code>)<br />
:#Tilesets: Tilesets can be added to a biome in two different ways. Either a new tile needs to be created, or an appending tileset configuration can be created.<br />
::#New tileset: see “Adding a Terrain Tile” below<br />
::#Appending tileset: For a new biome, it’s possible to add existing tile types. See <code>biome_mod/assets_src/config/gameplay/tilesets/grass2.yaml</code>. In this, the grass2 biome is being added to all existing tile types. In the example it uses the default grass images but these can be changed.<br />
===Adding a Terrain Tile===<br />
See example <code>terrain_mod/assets_src/config/gameplay/tilesets/flowers.yaml</code>. <br />
==Lua Scripts==<br />
All Lua files must exist under assets_<code>src/lua/</code>. Lua files under <code>assets_src/lua/initialized</code> will have <code>init()</code> called on them. This can be used for setting up conditions and actions as well as replacing game functions.<br />
===Custom Events (Conditions and Actions)===<br />
Events are made up of conditions and actions. Conditions and actions have three components:<br />
:1. Yaml Configuration: This specifies the name of the event and parameter types.<br />
<br />
::Examples:<br />
::<code>tolstoy_mod/assets_src/config/gameplay/triggers/actions.yaml</code><br />
::<code>tolstoy_mod/assets_src/config/gameplay/triggers/conditions.yaml</code><br />
<br />
:2. Lua File: This specifies the actual actions and rules of the event. This file must have an <code>init()</code> function and be in the folder <code>assets_src/lua/initialized</code>.<br />
<br />
::Examples:<br />
::<code>tolstoy_mod/assets_src/lua/initialized/actions.lua</code><br />
::<code>tolstoy_mod/assets_src/lua/initialized/conditions.lua</code><br />
<br />
<br />
:3. Strings: Each event has three strings. A name, a description, and a “readable” description. The readable description has places for user chosen values.<br />
<br />
::Example readable strings:<br />
::“Add set state {3} to {4} for unit type(s) {0} at location {1} owned by player {2}.” becomes “Add set state cute to ‘true’ for unit type(s) ‘dog’ at location ‘any’ owned by player ‘1’.”<br />
<br />
::Examples:<br />
::<code>tolstoy_mod/assets_src/config/strings/en-GB.yaml</code><br />
===Modifying Existing Lua===<br />
Existing lua systems (such as the combat system) can be modified with initialized lua files. See example <code>tolstoy_mod/assets_src/lua/initialized/combat.lua</code>.<br />
===Critical Hit Conditions===<br />
In Wargroove, critical hit conditions are called “passive conditions”. Each unit type has one; for example, the soldier does a critical hit when they are standing next to their commander. Adding a new condition works the same as modifying existing lua. See <code>tolstoy_mod/assets_src/lua/initialized/passive_conditions.lua</code>.<br />
===Verbs===<br />
Verbs are actions that units can take, such as attack, capture, and reinforce. Verbs have three components:<br />
:1. Yaml Configuration: This specifies the name of the verb, the lua file associated with it, and various parameters such as splash radius, the icon, and colours.<br />
::<code>tolstoy_mod/assets_src/config/gameplay/verbs.yaml</code><br />
:2. Lua File: This is what is actually run when a verb is used. This is also where AI rules for using the verb are specified.<br />
::<code>tolstoy_mod/assets_src/lua/lua_mod/verbs/pet.lua</code><br />
:3. String: A verb has a name associated with it.<br />
::<code>tolstoy_mod/assets_src/config/strings/en-GB.yaml</code><br />
===Grooves===<br />
Grooves are essential special verbs used by commanders. The only difference is an additional groove configuration. Grooves have four components:<br />
:1. Groove yaml configuration: this has information such as groove charge time and the associated verb.<br />
::<code>tolstoy_mod/assets_src/config/gameplay/grooves.yaml</code><br />
:2. Verb yaml Configuration: This specifies the name of the groove’s verb, the lua file associated with it, and various parameters such as splash radius, the icon, and colours.<br />
::<code>tolstoy_mod/assets_src/config/gameplay/verbs.yaml</code><br />
:3. Lua File: This is what is actually run when a verb is used. This is also where AI rules for using the verb are specified.<br />
::<code>tolstoy_mod/assets_src/lua/lua_mod/verbs/groove_tolstoy.lua</code><br />
:4. String: A verb has a name associated with it.<br />
::<code>tolstoy_mod/assets_src/config/strings/en-GB.yaml</code><br />
==Cutscenes==<br />
The Tolstoy mod has examples of these.<br />
*Sound Effects: defined in <code>config/gameplay/cutscene/cutscene_sfx.yaml</code><br />
*Visual Effects: defined in <code>config/gameplay/cutscene/cutscene_vfx.yaml</code><br />
*Props: defined in <code>config/gameplay/cutscene/cutscene_props.yaml</code><br />
*Backgrounds: defined in <code>config/gameplay/cutscene/cutscene_backgrounds.yaml</code><br />
*Shouts: defined in the unit class configuration file for the unit with the shout.<br />
*Emotes: defined in the unit class configuration file for the unit with the emote.<br />
*Alternative run: defined in the unit class file for the unit with the run. This is for characters who might have different versions of their runs, for example Sigrid has a regular run and a float.<br />
units: <br />
- class: commander_tolstoy<br />
alternativeRuns:<br />
- id: run_sniff # Refers to a tag in the battle .ase file<br />
sound: sniff # Can set an alternative run sound<br />
<br />
*Cutscene idle: If your character has an alternative idle that you want to use in cutscenes. For example, in cutscenes Caesar does not have his crossbow soldiers.<br />
units: <br />
- class: commander_tolstoy<br />
[...]<br />
cutsceneIdle: capture_idle # Tag in the battle ase file<br />
<br />
*Cutscene pre-idle: If your character has a pre-idle animation that you want to include in the cutscene (or want to not use the regular combat pre-idle animation). This can be set to nothing. For example, Caesar doesn’t do his battle pre-idle in cutscenes (as it has crossbow soldiers). <br />
units: <br />
- class: commander_tolstoy<br />
[...]<br />
cutscenePreIdle: "" # None (or a tag in the battle .ase file)<br />
<br />
*Cutscene hit: If your character has a hit animation you want to use in the cutscene. For example, Caesar doesn’t do his battle hit in cutscenes (as it has crossbow soldiers).<br />
units: <br />
- class: commander_tolstoy<br />
[...]<br />
cutsceneHit: hit_foot # A tag in the battle .ase file<br />
==Removing Units, Commanders, and Factions==<br />
In order to remove units, commanders, and factions they must be specified in the mod’s <code>manifest.yaml</code> file.<br />
<br />
id: TolstoyMod<br />
name: "Tolstoy's Mod"<br />
description: "Adds Tolstoy to the game which is the feature we've all been waiting for."<br />
remove:<br />
commander:<br />
- mercia<br />
unitClass:<br />
- soldier<br />
faction:<br />
- felheim<br />
<br />
This mod removes Mercia as a commander, the Soldier unit, and the Felhem faction. The remove id matches the id field of the asset being removed.<br />
==Game Strings==<br />
In many configuration files, there are references to strings. These strings are keys that refer to a language file, so that translation is easier. For example, in the faction configuration the entry name: <code>faction_name_tolstoy</code> refers to the key “faction_name_tolstoy” that can be found in <code>tolstoy_mod/ssets_src/config/gameplay/strings/en-GB.yaml</code>.<br />
<br />
There are a number of supported languages. To add another one to your mod, you just add the corresponding language yaml file in the same folder as the en-GB file. The language files are:<br />
*de-DE: German<br />
*en-GB: English<br />
*es-ES: Spanish<br />
*fr-FR: French<br />
*it-IT: Italian<br />
*ja-JP: Japanese<br />
*ko-KR: Korean<br />
*pt-BR: Portuguese<br />
*ru-RU: Russian<br />
*zh-Hans: Chinese Simplified<br />
*zh-Hant: Chinese Traditional<br />
==Colours==<br />
Colours are defined in <code>config/art/colours.yaml</code>. These are referred to by various configuration files, such as <code>tolstoy_mod/assets_src/config/gameplay/verbs.yaml</code> when it refers to target and outline colours.<br />
<br />
=Mod Creation: Art and Sound=<br />
==Art==<br />
There are two basic types of art assets in Wargroove, animated Aseprite files and static png files. In addition, an art asset can support palette swapping, which is what happens when commanders change faction colours.<br />
<br />
===Wargroove Palette===<br />
All art assets that has army or skin colours (such as battle and map unit animations) '''must''' use the colours found in the wargroove palette.<br />
<br />
[[File:WargroovePalette.png]]<br />
<br />
The palette has three sections: army colour, skin colour, and other. Colours from the army colour section will be changed depending on the player's chosen army colour. Skin colour will be changed depending on the unit's skin colour. The other colours will never be changed. New colours cannot be added to the palette, as it is full.<br />
<br />
===Aseprite Files===<br />
In order to create an aseprite file, you have to buy Aseprite (sorry!). It’s really awesome though so you won’t regret it. Animations work with Aseprite tags.<br />
<br />
[[File:Modding Guide 3.png]]<br />
<br />
The tags are referred to by the game, and can also be referred to in new Lua scripts.<br />
===Png Files===<br />
Assets such as portraits and UI are not animated, and thus do not have to be Aseprite files.<br />
===Meta Files===<br />
Art files can have a corresponding meta file. The metafile is the same name as the art asset with “.meta” at the end. So for the <code>battle_tolstoy.ase</code> file its meta is <code>battle_tolstoy.ase.meta</code>. The most important purpose of a meta file is to set the pivot of the art asset.<br />
<br />
---<br />
pivotX: 150<br />
pivotY: 86<br />
...<br />
===Palette Swapping===<br />
Some art assets change colours depending on the faction they are assigned to.<br />
<br />
For palette swapped images, they must use the colours found in the wargroove palette. Otherwise the packaging step will fail.<br />
{| class=wikitable<br />
|-<br />
|Portraits<br />
|Required<br />
|-<br />
|Units<br />
|Required<br />
|-<br />
|Attack Special FX<br />
|Optional, can be set in a meta file<br />
|}<br />
<br />
In the mod, files are set to palette swap by using meta files. For portraits and units, in their folders contain a file named <code>_dir.meta</code> which is generated by the mod packaging tool. <br />
<br />
---<br />
- data:<br />
palette: image/palettes/wargroove_palette.png<br />
material: Wargroove/PaletteSwap<br />
atlas: portraits<br />
...<br />
<br />
This files applies the settings to all files in the directory tree.<br />
<br />
The wargroove palette must be in the mod at <code>image/palettes/wargroove_palette.png</code>.<br />
===Ranged Attack Special FX===<br />
Optionally, ranged attack effects can be palette swapped. For example, the harpy attack changes colour depending on faction. To support this, the meta file contains instructions to use the palette and the pallete swap material.<br />
<br />
---<br />
pivotX: 145<br />
pivotY: -4<br />
palette: image/palettes/wargroove_palette.png<br />
material: Wargroove/PaletteSwap<br />
...<br />
<br />
===Overwriting the Wargroove Palette===<br />
<br />
COMING SOON!<br />
<br />
The Wargroove palette can be overwritten, but this will also change the colours used in the rest of the game. To do this, in the <code>manifest.yaml</code> file, add: <code>overwritesPalette: true</code>. This will cause the version of the wargroove palette in <code>image/palettes/</code> to overwrite the game's default. New palettes must have colours placed in the same location as the old palette.<br />
<br />
==Sound==<br />
All sound assets in Wargroove are <code>.ogg</code> format. The game uses them files in 48khz frequency, and it’s recommended to save them at 50% quality VBR to save space. Also save them without any metatag info. For sound effects and voice lines, they should be saved in mono. For music and environmental soundscapes, they should be saved in stereo.<br />
===Music===<br />
Music .ogg files have a corresponding meta file, which is contained in the same folder is the same name but with a “.meta” on the end. So for <code>campaign.ogg</code>, its meta file is <code>campaign.ogg.meta</code> and specifies that it is streaming and its loop point.<br />
<br />
---<br />
streaming: true<br />
loopPoint: 498462<br />
...<br />
<br />
Music also has two configuration files. One is <code>music.yaml</code> which is under <code>assets_src/config/gameplay/yaml</code>.<br />
<br />
---<br />
music:<br />
- id: main_theme<br />
name: music_name_main_theme<br />
audioEvent: music/main_theme<br />
...<br />
<br />
Another is an audio event configuration under <code>assets_src/audio_event/music</code>.<br />
<br />
---<br />
actions:<br />
- type: play<br />
clips: [ music/maintheme.ogg ]<br />
group: music<br />
loop: true<br />
...<br />
<br />
===SFX===<br />
Sound effects have additional configuration files. Sound effects can be defined in the assets_src/audio_event folder. Configuration files can combine sounds into larger effects. For example, the metaAttack.yaml sound event actually contains three sounds.<br />
<br />
---<br />
actions:<br />
- type: play<br />
clips: [ sfx/mercia/merciaAttackFoley.ogg ]<br />
group: sfx<br />
delay: 0.08<br />
- type: play<br />
clips: [ sfx/mercia/merciaAttackVoice1.ogg, sfx/mercia/merciaAttackVoice2.ogg, sfx/mercia/merciaAttackVoice3.ogg ]<br />
group: voice<br />
delay: 0.2<br />
- type: play<br />
clips: [ sfx/mercia/merciaAttackVoice4.ogg, sfx/mercia/merciaAttackVoice5.ogg ]<br />
group: voice<br />
delay: 1.1<br />
...<br />
<br />
Each sound specifies:<br />
*That it should be played<br />
*What clips it should use. If more than one is specifies it chooses one at random.<br />
*What type of effect it is (sfx or voice)<br />
*When it should play after the audio event starts.<br />
<br />
In addition, sounds can have a volume and pitch specified. These are specified by a single value or a range which they can vary between.<br />
<br />
---<br />
actions:<br />
- type: play<br />
clips: [ sfx/soldierPreAttack1.ogg, sfx/soldierPreAttack2.ogg, sfx/soldierPreAttack3.ogg, sfx/soldierPreAttack4.ogg, sfx/soldierPreAttack5.ogg, sfx/soldierPreAttack6.ogg, sfx/soldierPreAttack7.ogg, sfx/soldierPreAttack8.ogg, sfx/soldierPreAttack9.ogg ]<br />
group: voice<br />
pitch: [ 0.9, 1.1 ]<br />
volume: [ 0.63, 0.7 ]<br />
...<br />
<br />
=Mod Packaging and Distribution=<br />
==Packaging==<br />
To package a mod, run the executable from your command line.<br />
<br />
wargroove_mod_packer.exe <path_to_mod><br />
<br />
The packaged mod will automatically be put into the <code>mods</code> folder of your Wargroove app data which is probably at <code>%appdata%\Roaming\Chucklefish\Wargroove\mods</code>.<br />
==Distribution==<br />
At the moment, we have not integrated Steam Workshop so it’s a manual process. Once you have packaged your mod, it will be moved to your application folder, which is probably at <code>%appdata%\Roaming\Chucklefish\Wargroove\mods</code>. The folder that’s created will have the same id as your mod, and can be placed in any user’s mods folder for usage.</div>Ckrakauerhttps://wargroovewiki.com/mediawiki/index.php?title=Guide:Modding&diff=3695Guide:Modding2019-08-20T14:06:43Z<p>Ckrakauer: /* Art */</p>
<hr />
<div>[[File:Wargroove header modding.png|center]]<br />
<br />
<br />
{{TOC right|noautonum}}<span style="color:red">'''Modding is in beta, so please ask questions on [https://discord.gg/eW3hnAF Discord] and report bugs to the [https://community.playstarbound.com/threads/wargroove-modding-beta-known-issues-and-fixes.156978/ support forums].'''</span><br />
<br />
This documentation details what's involved with setting up and implementing mods for Wargroove. Guide credit goes to [[Chucklefish]] programmer [https://twitter.com/ckrakauer Caryn Krakauer]<br />
<br />
A lot of documentation refers to the “Tolstoy” mod. [https://www.instagram.com/tinytolstoy/ Tolstoy] is a dog, not the famous Russian author.<br />
<br />
=Mod Usage=<br />
Before using any mods, especially during the modding beta, make sure to '''back up your save files'''! They're likely located at %APPDATA%\Chucklefish\Wargroove\save\<br />
==Mod File Location==<br />
Mods are stored in your application folder, which is probably at <code>%appdata%\Roaming\Chucklefish\Wargroove\mods</code>. My folder with the example mods looks like this:<br />
<br />
[[File:Modding Guide 2.png]]<br />
<br />
Each folder contains the <code>.dat</code> files for the individual mod.<br />
<br />
The EXE and example mods are located at <code>C:\Program Files (x86)\Steam\steamapps\common\Wargroove\modpacker_bin</code><br />
<br />
==Using Mods in Maps==<br />
Mods are per map/campaign and can be selected on map creation and on map selection. In addition, maps can be packaged along with mods or used separately.<br />
===Adding Mods to a Map===<br />
Create a map as normal. In the map editor menu, select the “mods” option. This will bring up the list of currently available mods. When selecting “save and reload map” this will also remove any broken units and tiles, such as if a unit type no longer exists that was placed on the map.<br />
===Using a Mod on an Unmodded Map===<br />
Mods can be used on any skirmish map. In the ‘Match Settings” view when setting up the map, select the “mods” option and you will be given the list of mods. The user can turn on new mods and also turn off currently active mods. If any changes would break the map (such as a unit type being removed that is placed on the map) the changes to mods will revert.<br />
===Updating a Modded Map===<br />
If a mod that a map relies on is updated, the map also needs to be updated. If the map is part of the mod this happens automatically on packing the mod. If not, the next time the map is opened for edit the game will ask which mods should be updated. If a mod is not updated, it will remove all units and events that rely on the mod. It’s a good idea to back up a map before updating a mod.<br />
==Using Mods Online==<br />
Maps that are packaged within mods can be used for online play. These maps can be used online if and only if all players have the same version of the mod installed.<br />
<br />
=Mod Creation: Requirements=<br />
Mods use a combination of Yaml, Lua, art, and sound files. It's definitely advisable to be familiar with the Yaml format, and Lua if there's any scripting. In addition, animations are done using Aseprite which is paid software (but very much worth it!).<br />
<br />
Aseprite is available from their website (https://www.aseprite.org/) along with itch.io, Humble Bundle, Steam, and Gumroad.<br />
Mod Creation: Configuration<br />
The basic steps are:<br />
:#Create a mod manifest file with basic information<br />
:#Create configuration, art, and sound files<br />
:#Package the mod<br />
:#Create maps that use the mod<br />
:#Package the mod to include the maps<br />
:#Give the mod to internet friends!<br />
<br />
Mods are created from a collection of yaml files, lua files, image files, and sound files. Once a mod is created and added to a user’s game, they can create new maps/campaigns using the mod and apply the mod to existing maps/campaigns.<br />
<br />
We have included a few example mods as well as a lot of example config files, lua files, and some image assets. The easiest way to get started is to take a look at these examples while going through this document.<br />
<br />
The basic structure of a mod looks like this:<br />
{|<br />
|<br />
mod<br />
- assets_src<br />
- audio<br />
- music<br />
- sfx<br />
- audio_event<br />
- config <br />
- gameplay<br />
- triggers<br />
- actions.yaml<br />
- conditions.yaml<br />
- units<br />
- strings<br />
- image<br />
- palettes<br />
- portraits<br />
- _dir.meta<br />
- ui <br />
- units<br />
- _dir.meta<br />
- lua<br />
- initialized<br />
- manifest.yaml<br />
|<br />
# The top level folder<br />
# Contains all assets<br />
# Audio files<br />
<br />
<br />
# Audio configuration files<br />
# General Configuration files<br />
# Gameplay Configuration files<br />
# Yaml files for the event system<br />
<br />
<br />
# Yaml files for units<br />
# Yaml files for translated strings<br />
# Art<br />
# The Wargroove palette<br />
# Unit/commander portraits<br />
# Sets portraits to use the Wargroove palette<br />
<br />
# Art for units map/battle animations<br />
# Sets units to use the Wargroove palette<br />
# Lua scripts folder<br />
# Special Lua files that are initialized<br />
# Information about the mod<br />
|}<br />
==Creating the Mod Manifest File==<br />
The <code>manifest.yaml</code> file at the root of the mod folder determines the mod’s general settings. The fields are:<br />
*id: The id of the mod. This should be unchanging for all versions of your mod as the id is what the game uses to determine if two mods are the same mod but with different versions. This should also be relatively unique, as two mods with the same id will clash.<br />
*name: This is the name that players will see when they load the mod into their game. This does not have to stay the same throughout versions of the mod and does not have to be unique (although it probably should be to avoid confusion).<br />
*description: This is the description that players will see when they load the mod into their game. This does not have to stay the same throughout versions of the mod and does not have to be unique (although it probably should be to avoid confusion).<br />
*remove: A group of assets to remove from the map when using this mod. The three types of assets that can be removed are commanders, units, and factions.<br />
<br />
<br />
Example from tolstoy_mod’s <code>manifest.yaml</code>:<br />
<br />
---<br />
<br />
id: TolstoyMod<br />
name: "Tolstoy's Mod"<br />
author: "TolstoyFan1"<br />
description: "Adds My Tolstoy to the game which is the feature we've all been waiting for!<br />
remove: <br />
commander:<br />
- mercia<br />
unitClass:<br />
- soldier<br />
faction:<br />
- felheim<br />
<br />
...<br />
==Maps==<br />
Maps can be packaged along with mods for distribution. In order to do this, the map must use no other mods. If a map uses multiple mods, it needs to be distributed separately from the mod.<br />
<br />
While editing the map, go to the mods settings. Next to the mod you want to add the map to press “add to mod”. This will remove other active mods. Note, this means that you have to create the mod first (or at least an initial skeletal framework). Once a map is part of a mod it will be updated automatically with the mod.<br />
<br />
The next time <code>wargroove_mod_packer.exe</code> is run, the map will be automatically packaged along with the mod. You should see them in the <code>assets_src/maps</code> folder after packaging.<br />
==Units==<br />
Units are made up of multiple parts:<br />
:#Unit Class Configuration<br />
:#Unit Configuration<br />
:#Weapons Configuration<br />
:#(optional) Commander Configuration<br />
:#Art and sound effects<br />
<br />
For example, the soldier unit has a unit class config of “soldier” and individual unit configurations for each faction (Cherrystone, Floran, Heavensong, Felheim). It also has the weapon “sword”. Various art and sounds are referred to in the configuration file. <br />
<br />
Typically, we store the weapons, unit class, and unit configuration in a single file.<br />
===Unit Class Configuration===<br />
The unit class defines the information that all soldiers share, such as their cost, movement, and weapons.<br />
<br />
unitClasses:<br />
- id: soldier<br />
name: unit_class_name_soldier<br />
cost: 100<br />
movement: walking<br />
moveRange: 4<br />
damageMultiplier: 1<br />
aiPriority: 1.0<br />
weapons:<br />
- id: sword<br />
verbs:<br />
- capture<br />
- load<br />
tags:<br />
- soldier<br />
- type.ground.light<br />
battleUnitCount: 4<br />
passiveMultiplier: 1.5<br />
<br />
{| class="mw-collapsible mw-collapsed wikitable"<br />
|Expand for a complete list of '''unit ids''' implemented in game <br />
|-<br />
|<br />
archer<br />
ballista<br />
balloon<br />
barracks<br />
city<br />
commander_caesar<br />
commander_darkmercia<br />
commander_elodie<br />
commander_emeric<br />
commander_greenfinger<br />
commander_koji<br />
commander_mercia<br />
commander_mercival<br />
commander_nuru<br />
commander_ragna<br />
commander_ryota<br />
commander_sedge<br />
commander_sigrid<br />
commander_tenri<br />
commander_valder<br />
crystal<br />
dog<br />
dragon<br />
drone<br />
garrison<br />
gate<br />
ghost_mercival<br />
giant<br />
harpoonship<br />
harpy<br />
hq<br />
knight<br />
mage<br />
merman<br />
port<br />
soldier<br />
spearman<br />
tower<br />
travelboat<br />
trebuchet<br />
turtle<br />
villager<br />
vine<br />
wagon<br />
warship<br />
water_city<br />
witch<br />
|}<br />
<br />
===Unit Configuration===<br />
The unit defines information that is faction specific, such as the name, animations, and sounds.<br />
<br />
[This example has been shortened slightly where there are ellipses.]<br />
units:<br />
- class: soldier<br />
faction: cherrystone<br />
name: unit_name_soldier_cherrystone<br />
mapAnimation: units/soldier/cherrystone/map_soldier_cherrystone<br />
battleAnimation: units/soldier/cherrystone/battle_soldier_cherrystone<br />
battleAnimationRiver: fx/river_overlay/battle_soldier_cherrystone_river<br />
smallPortrait: units/soldier/cherrystone/portrait_soldier_cherrystone_small.png<br />
mediumPortrait: units/soldier/cherrystone/portrait_soldier_cherrystone_medium.png<br />
mapSpeed: 4.0<br />
grabPos: [13, 14]<br />
sounds:<br />
attack: soldierAttackRed<br />
attackShout: soldierPreAttackRed<br />
attackMap: unitAttack<br />
captureShout: soldierPreAttackRed<br />
death: soldierDieRed<br />
deathMap: unitDie<br />
run: infantryHeavyEntry<br />
runMap: infantryHeavyMapEntry<br />
hit: hitOrganic<br />
hitMap: hitOrganic<br />
attacks:<br />
- id: primary<br />
hitSpark: fx/bs_stab_attack<br />
hitDelay: [0.45, 0.8]<br />
shouts:<br />
soldier_shout1: soldierShoutRed1<br />
soldier_shout2: soldierShoutRed2<br />
soldier_shout3: soldierShoutRed3<br />
[...]<br />
soldier_hit1: soldierHitRed1<br />
soldier_hit2: soldierHitRed2<br />
soldier_hit3: soldierHitRed3<br />
[...]<br />
crownbearer_panting: cutscene/crownbearerPanting<br />
crownbearer_yell: cutscene/crownbearerYell<br />
emotes:<br />
idle: idle<br />
idle_crownbearer: idle_crownbearer<br />
idle_crown: emote_idle_crown<br />
idle_crown_ragged: emote_idle_crown_ragged<br />
cushion: emote_cushion<br />
[...]<br />
alternativeRuns:<br />
- id: run_crown<br />
[...]<br />
===Weapon Configuration===<br />
The weapon defines information relevant to combat, such as damage, range, and restrictions.<br />
<br />
weapons:<br />
- id: sword<br />
rangeMin: 1<br />
rangeMax: 1<br />
canMoveAndAttack: true<br />
baseDamage:<br />
land: 1<br />
tagDamage:<br />
archer: 0.65<br />
soldier: 0.55<br />
villager: 0.55<br />
spearman: 0.35<br />
dog: 0.45<br />
wagon: 0.35<br />
knight: 0.15<br />
trebuchet: 0.3<br />
merman: 0.55<br />
mage: 0.55<br />
structure: 0.35<br />
commander: 0.10<br />
ballista: 0.35<br />
giant: 0.05<br />
===Adding/Modifying a Unit Class===<br />
Units can be added, modified, or completely overwritten.<br />
====Adding a Unit====<br />
A unit can be added by creating a unit with a new id. An example in the Tolstoy mod is <code>assets/art/config/units/commander_tolstoy.yaml</code>. A unit needs the four basic components of a unit class configuration, unit configurations, and any weapons. In addition, new art and sounds can be used.<br />
====Modifying a Unit Class====<br />
To only change part of a unit (for example, to add the “pet” verb to soldiers”), instead of creating a new entry in “unitClasses”, a new entry in the “modifyingUnitClasses” is created with the id of the modified class.<br />
<br />
<br />
modifyingUnitClasses:<br />
- id: soldier<br />
# replace: # This replaces the sections, so the soldier can only pet<br />
# verbs:<br />
# - pet<br />
add:<br />
verbs:<br />
- pet # This adds “pet” to the soldier verbs<br />
# remove:<br />
# verbs:<br />
# - capture # This removes<br />
<br />
Sections in “modifyingUnitClasses” are replace, add, and remove. Under these, the categories refer to the categories in the unit class table.<br />
====Overwriting a Unit====<br />
To completely overwrite a unit, it’s the same process as adding a new unit. If the id is set to an existing unit (such as “soldier”), then it will overwrite the existing configuration.<br />
===Adding/Modifying a Commander===<br />
Commanders are units with additional configuration files and art/sound assets. The additional configuration files that need to be created are:<br />
:#A commander configuration under config/gameplay (see example: <code>tolstoy_mod/assets_src/config/gameplay/commanders.yaml</code>)<br />
:#A groove configuration under config/gameplay (see example: <code>tolstoy_mod/assets_src/config/gameplay/grooves.yaml</code>)<br />
:#A verb configuration for the commander’s groove under config/gameplay (see example: <code>tolstoy_mod/assets_src/config/gameplay/verbs.yaml</code>)<br />
===Adding a Faction===<br />
Factions are defined in assets_src/config/gameplay/factions.yaml.<br />
<br />
Example: tolstoy_mod/assets_src/config/gameplay/factions.yaml<br />
<br />
factions:<br />
- id: tolstoy # The faction id<br />
name: faction_name_tolstoy # The visible name of the faction<br />
stdColour: blue # The default colour of the faction<br />
altColour: yellow <br />
# The colour of the faction is the default is not available<br />
skinColours: [ "typeII", "typeIII", "typeIV", "typeV", "typeVI" ]<br />
# The skin colours of units in the faction<br />
Once a new faction is added, units can have their faction set to the new faction in the configuration files.<br />
==Biomes and Terrain==<br />
===Adding a Biome===<br />
A biome has two components.<br />
:#Biome config: This has the basic information of a biome (see <code>biome_mod/assets_src/config/gameplay/tilesets/grass2.yaml</code>)<br />
:#Tilesets: Tilesets can be added to a biome in two different ways. Either a new tile needs to be created, or an appending tileset configuration can be created.<br />
::#New tileset: see “Adding a Terrain Tile” below<br />
::#Appending tileset: For a new biome, it’s possible to add existing tile types. See <code>biome_mod/assets_src/config/gameplay/tilesets/grass2.yaml</code>. In this, the grass2 biome is being added to all existing tile types. In the example it uses the default grass images but these can be changed.<br />
===Adding a Terrain Tile===<br />
See example <code>terrain_mod/assets_src/config/gameplay/tilesets/flowers.yaml</code>. <br />
==Lua Scripts==<br />
All Lua files must exist under assets_<code>src/lua/</code>. Lua files under <code>assets_src/lua/initialized</code> will have <code>init()</code> called on them. This can be used for setting up conditions and actions as well as replacing game functions.<br />
===Custom Events (Conditions and Actions)===<br />
Events are made up of conditions and actions. Conditions and actions have three components:<br />
:1. Yaml Configuration: This specifies the name of the event and parameter types.<br />
<br />
::Examples:<br />
::<code>tolstoy_mod/assets_src/config/gameplay/triggers/actions.yaml</code><br />
::<code>tolstoy_mod/assets_src/config/gameplay/triggers/conditions.yaml</code><br />
<br />
:2. Lua File: This specifies the actual actions and rules of the event. This file must have an <code>init()</code> function and be in the folder <code>assets_src/lua/initialized</code>.<br />
<br />
::Examples:<br />
::<code>tolstoy_mod/assets_src/lua/initialized/actions.lua</code><br />
::<code>tolstoy_mod/assets_src/lua/initialized/conditions.lua</code><br />
<br />
<br />
:3. Strings: Each event has three strings. A name, a description, and a “readable” description. The readable description has places for user chosen values.<br />
<br />
::Example readable strings:<br />
::“Add set state {3} to {4} for unit type(s) {0} at location {1} owned by player {2}.” becomes “Add set state cute to ‘true’ for unit type(s) ‘dog’ at location ‘any’ owned by player ‘1’.”<br />
<br />
::Examples:<br />
::<code>tolstoy_mod/assets_src/config/strings/en-GB.yaml</code><br />
===Modifying Existing Lua===<br />
Existing lua systems (such as the combat system) can be modified with initialized lua files. See example <code>tolstoy_mod/assets_src/lua/initialized/combat.lua</code>.<br />
===Critical Hit Conditions===<br />
In Wargroove, critical hit conditions are called “passive conditions”. Each unit type has one; for example, the soldier does a critical hit when they are standing next to their commander. Adding a new condition works the same as modifying existing lua. See <code>tolstoy_mod/assets_src/lua/initialized/passive_conditions.lua</code>.<br />
===Verbs===<br />
Verbs are actions that units can take, such as attack, capture, and reinforce. Verbs have three components:<br />
:1. Yaml Configuration: This specifies the name of the verb, the lua file associated with it, and various parameters such as splash radius, the icon, and colours.<br />
::<code>tolstoy_mod/assets_src/config/gameplay/verbs.yaml</code><br />
:2. Lua File: This is what is actually run when a verb is used. This is also where AI rules for using the verb are specified.<br />
::<code>tolstoy_mod/assets_src/lua/lua_mod/verbs/pet.lua</code><br />
:3. String: A verb has a name associated with it.<br />
::<code>tolstoy_mod/assets_src/config/strings/en-GB.yaml</code><br />
===Grooves===<br />
Grooves are essential special verbs used by commanders. The only difference is an additional groove configuration. Grooves have four components:<br />
:1. Groove yaml configuration: this has information such as groove charge time and the associated verb.<br />
::<code>tolstoy_mod/assets_src/config/gameplay/grooves.yaml</code><br />
:2. Verb yaml Configuration: This specifies the name of the groove’s verb, the lua file associated with it, and various parameters such as splash radius, the icon, and colours.<br />
::<code>tolstoy_mod/assets_src/config/gameplay/verbs.yaml</code><br />
:3. Lua File: This is what is actually run when a verb is used. This is also where AI rules for using the verb are specified.<br />
::<code>tolstoy_mod/assets_src/lua/lua_mod/verbs/groove_tolstoy.lua</code><br />
:4. String: A verb has a name associated with it.<br />
::<code>tolstoy_mod/assets_src/config/strings/en-GB.yaml</code><br />
==Cutscenes==<br />
The Tolstoy mod has examples of these.<br />
*Sound Effects: defined in <code>config/gameplay/cutscene/cutscene_sfx.yaml</code><br />
*Visual Effects: defined in <code>config/gameplay/cutscene/cutscene_vfx.yaml</code><br />
*Props: defined in <code>config/gameplay/cutscene/cutscene_props.yaml</code><br />
*Backgrounds: defined in <code>config/gameplay/cutscene/cutscene_backgrounds.yaml</code><br />
*Shouts: defined in the unit class configuration file for the unit with the shout.<br />
*Emotes: defined in the unit class configuration file for the unit with the emote.<br />
*Alternative run: defined in the unit class file for the unit with the run. This is for characters who might have different versions of their runs, for example Sigrid has a regular run and a float.<br />
units: <br />
- class: commander_tolstoy<br />
alternativeRuns:<br />
- id: run_sniff # Refers to a tag in the battle .ase file<br />
sound: sniff # Can set an alternative run sound<br />
<br />
*Cutscene idle: If your character has an alternative idle that you want to use in cutscenes. For example, in cutscenes Caesar does not have his crossbow soldiers.<br />
units: <br />
- class: commander_tolstoy<br />
[...]<br />
cutsceneIdle: capture_idle # Tag in the battle ase file<br />
<br />
*Cutscene pre-idle: If your character has a pre-idle animation that you want to include in the cutscene (or want to not use the regular combat pre-idle animation). This can be set to nothing. For example, Caesar doesn’t do his battle pre-idle in cutscenes (as it has crossbow soldiers). <br />
units: <br />
- class: commander_tolstoy<br />
[...]<br />
cutscenePreIdle: "" # None (or a tag in the battle .ase file)<br />
<br />
*Cutscene hit: If your character has a hit animation you want to use in the cutscene. For example, Caesar doesn’t do his battle hit in cutscenes (as it has crossbow soldiers).<br />
units: <br />
- class: commander_tolstoy<br />
[...]<br />
cutsceneHit: hit_foot # A tag in the battle .ase file<br />
==Removing Units, Commanders, and Factions==<br />
In order to remove units, commanders, and factions they must be specified in the mod’s <code>manifest.yaml</code> file.<br />
<br />
id: TolstoyMod<br />
name: "Tolstoy's Mod"<br />
description: "Adds Tolstoy to the game which is the feature we've all been waiting for."<br />
remove:<br />
commander:<br />
- mercia<br />
unitClass:<br />
- soldier<br />
faction:<br />
- felheim<br />
<br />
This mod removes Mercia as a commander, the Soldier unit, and the Felhem faction. The remove id matches the id field of the asset being removed.<br />
==Game Strings==<br />
In many configuration files, there are references to strings. These strings are keys that refer to a language file, so that translation is easier. For example, in the faction configuration the entry name: <code>faction_name_tolstoy</code> refers to the key “faction_name_tolstoy” that can be found in <code>tolstoy_mod/ssets_src/config/gameplay/strings/en-GB.yaml</code>.<br />
<br />
There are a number of supported languages. To add another one to your mod, you just add the corresponding language yaml file in the same folder as the en-GB file. The language files are:<br />
*de-DE: German<br />
*en-GB: English<br />
*es-ES: Spanish<br />
*fr-FR: French<br />
*it-IT: Italian<br />
*ja-JP: Japanese<br />
*ko-KR: Korean<br />
*pt-BR: Portuguese<br />
*ru-RU: Russian<br />
*zh-Hans: Chinese Simplified<br />
*zh-Hant: Chinese Traditional<br />
==Colours==<br />
Colours are defined in <code>config/art/colours.yaml</code>. These are referred to by various configuration files, such as <code>tolstoy_mod/assets_src/config/gameplay/verbs.yaml</code> when it refers to target and outline colours.<br />
<br />
=Mod Creation: Art and Sound=<br />
==Art==<br />
There are two basic types of art assets in Wargroove, animated Aseprite files and static png files. In addition, an art asset can support palette swapping, which is what happens when commanders change faction colours.<br />
<br />
===Wargroove Palette===<br />
All art assets that has army or skin colours (such as battle and map unit animations) '''must''' use the colours found in the wargroove palette.<br />
<br />
[[File:WargroovePalette.png]]<br />
<br />
The palette has three sections: army colour, skin colour, and other. Colours from the army colour section will be changed depending on the player's chosen army colour. Skin colour will be changed depending on the unit's skin colour. The other colours will never be changed. New colours cannot be added to the palette, as it is full.<br />
<br />
===Aseprite Files===<br />
In order to create an aseprite file, you have to buy Aseprite (sorry!). It’s really awesome though so you won’t regret it. Animations work with Aseprite tags.<br />
<br />
[[File:Modding Guide 3.png]]<br />
<br />
The tags are referred to by the game, and can also be referred to in new Lua scripts.<br />
===Png Files===<br />
Assets such as portraits and UI are not animated, and thus do not have to be Aseprite files.<br />
===Meta Files===<br />
Art files can have a corresponding meta file. The metafile is the same name as the art asset with “.meta” at the end. So for the <code>battle_tolstoy.ase</code> file its meta is <code>battle_tolstoy.ase.meta</code>. The most important purpose of a meta file is to set the pivot of the art asset.<br />
<br />
---<br />
pivotX: 150<br />
pivotY: 86<br />
...<br />
===Palette Swapping===<br />
Some art assets change colours depending on the faction they are assigned to.<br />
<br />
For palette swapped images, they must use the colours found in the wargroove palette. Otherwise the packaging step will fail.<br />
{| class=wikitable<br />
|-<br />
|Portraits<br />
|Required<br />
|-<br />
|Units<br />
|Required<br />
|-<br />
|Attack Special FX<br />
|Optional, can be set in a meta file<br />
|}<br />
<br />
In the mod, files are set to palette swap by using meta files. For portraits and units, in their folders contain a file named <code>_dir.meta</code> which is generated by the mod packaging tool. <br />
<br />
---<br />
- data:<br />
palette: image/palettes/wargroove_palette.png<br />
material: Wargroove/PaletteSwap<br />
atlas: portraits<br />
...<br />
<br />
This files applies the settings to all files in the directory tree.<br />
<br />
The wargroove palette must be in the mod at <code>image/palettes/wargroove_palette.png</code>.<br />
===Ranged Attack Special FX===<br />
Optionally, ranged attack effects can be palette swapped. For example, the harpy attack changes colour depending on faction. To support this, the meta file contains instructions to use the palette and the pallete swap material.<br />
<br />
---<br />
pivotX: 145<br />
pivotY: -4<br />
palette: image/palettes/wargroove_palette.png<br />
material: Wargroove/PaletteSwap<br />
...<br />
<br />
===Overwriting the Wargroove Palette===<br />
The Wargroove palette can be overwritten, but this will also change the colours used in the rest of the game. To do this, in the <code>manifest.yaml</code> file, add: <code>overwritesPalette: true</code>. This will cause the version of the wargroove palette in <code>image/palettes/</code> to overwrite the game's default. New palettes must have colours placed in the same location as the old palette.<br />
<br />
==Sound==<br />
All sound assets in Wargroove are <code>.ogg</code> format. The game uses them files in 48khz frequency, and it’s recommended to save them at 50% quality VBR to save space. Also save them without any metatag info. For sound effects and voice lines, they should be saved in mono. For music and environmental soundscapes, they should be saved in stereo.<br />
===Music===<br />
Music .ogg files have a corresponding meta file, which is contained in the same folder is the same name but with a “.meta” on the end. So for <code>campaign.ogg</code>, its meta file is <code>campaign.ogg.meta</code> and specifies that it is streaming and its loop point.<br />
<br />
---<br />
streaming: true<br />
loopPoint: 498462<br />
...<br />
<br />
Music also has two configuration files. One is <code>music.yaml</code> which is under <code>assets_src/config/gameplay/yaml</code>.<br />
<br />
---<br />
music:<br />
- id: main_theme<br />
name: music_name_main_theme<br />
audioEvent: music/main_theme<br />
...<br />
<br />
Another is an audio event configuration under <code>assets_src/audio_event/music</code>.<br />
<br />
---<br />
actions:<br />
- type: play<br />
clips: [ music/maintheme.ogg ]<br />
group: music<br />
loop: true<br />
...<br />
<br />
===SFX===<br />
Sound effects have additional configuration files. Sound effects can be defined in the assets_src/audio_event folder. Configuration files can combine sounds into larger effects. For example, the metaAttack.yaml sound event actually contains three sounds.<br />
<br />
---<br />
actions:<br />
- type: play<br />
clips: [ sfx/mercia/merciaAttackFoley.ogg ]<br />
group: sfx<br />
delay: 0.08<br />
- type: play<br />
clips: [ sfx/mercia/merciaAttackVoice1.ogg, sfx/mercia/merciaAttackVoice2.ogg, sfx/mercia/merciaAttackVoice3.ogg ]<br />
group: voice<br />
delay: 0.2<br />
- type: play<br />
clips: [ sfx/mercia/merciaAttackVoice4.ogg, sfx/mercia/merciaAttackVoice5.ogg ]<br />
group: voice<br />
delay: 1.1<br />
...<br />
<br />
Each sound specifies:<br />
*That it should be played<br />
*What clips it should use. If more than one is specifies it chooses one at random.<br />
*What type of effect it is (sfx or voice)<br />
*When it should play after the audio event starts.<br />
<br />
In addition, sounds can have a volume and pitch specified. These are specified by a single value or a range which they can vary between.<br />
<br />
---<br />
actions:<br />
- type: play<br />
clips: [ sfx/soldierPreAttack1.ogg, sfx/soldierPreAttack2.ogg, sfx/soldierPreAttack3.ogg, sfx/soldierPreAttack4.ogg, sfx/soldierPreAttack5.ogg, sfx/soldierPreAttack6.ogg, sfx/soldierPreAttack7.ogg, sfx/soldierPreAttack8.ogg, sfx/soldierPreAttack9.ogg ]<br />
group: voice<br />
pitch: [ 0.9, 1.1 ]<br />
volume: [ 0.63, 0.7 ]<br />
...<br />
<br />
=Mod Packaging and Distribution=<br />
==Packaging==<br />
To package a mod, run the executable from your command line.<br />
<br />
wargroove_mod_packer.exe <path_to_mod><br />
<br />
The packaged mod will automatically be put into the <code>mods</code> folder of your Wargroove app data which is probably at <code>%appdata%\Roaming\Chucklefish\Wargroove\mods</code>.<br />
==Distribution==<br />
At the moment, we have not integrated Steam Workshop so it’s a manual process. Once you have packaged your mod, it will be moved to your application folder, which is probably at <code>%appdata%\Roaming\Chucklefish\Wargroove\mods</code>. The folder that’s created will have the same id as your mod, and can be placed in any user’s mods folder for usage.</div>Ckrakauerhttps://wargroovewiki.com/mediawiki/index.php?title=Guide:Modding&diff=3691Guide:Modding2019-08-13T13:07:23Z<p>Ckrakauer: /* Wargroove Palette */</p>
<hr />
<div>[[File:Wargroove header modding.png|center]]<br />
<br />
<br />
{{TOC right|noautonum}}<span style="color:red">'''Modding is in beta, so please ask questions on [https://discord.gg/HHxYqk8 Discord] and report bugs to the [https://community.playstarbound.com/threads/wargroove-modding-beta-known-issues-and-fixes.156978/ support forums].'''</span><br />
<br />
This documentation details what's involved with setting up and implementing mods for Wargroove. Guide credit goes to [[Chucklefish]] programmer [https://twitter.com/ckrakauer Caryn Krakauer]<br />
<br />
A lot of documentation refers to the “Tolstoy” mod. [https://www.instagram.com/tinytolstoy/ Tolstoy] is a dog, not the famous Russian author.<br />
<br />
=Mod Usage=<br />
Before using any mods, especially during the modding beta, make sure to '''back up your save files'''! They're likely located at %APPDATA%\Chucklefish\Wargroove\save\<br />
==Mod File Location==<br />
Mods are stored in your application folder, which is probably at <code>%appdata%\Roaming\Chucklefish\Wargroove\mods</code>. My folder with the example mods looks like this:<br />
<br />
[[File:Modding Guide 2.png]]<br />
<br />
Each folder contains the <code>.dat</code> files for the individual mod.<br />
<br />
The EXE and example mods are located at <code>C:\Program Files (x86)\Steam\steamapps\common\Wargroove\modpacker_bin</code><br />
<br />
==Using Mods in Maps==<br />
Mods are per map/campaign and can be selected on map creation and on map selection. In addition, maps can be packaged along with mods or used separately.<br />
===Adding Mods to a Map===<br />
Create a map as normal. In the map editor menu, select the “mods” option. This will bring up the list of currently available mods. When selecting “save and reload map” this will also remove any broken units and tiles, such as if a unit type no longer exists that was placed on the map.<br />
===Using a Mod on an Unmodded Map===<br />
Mods can be used on any skirmish map. In the ‘Match Settings” view when setting up the map, select the “mods” option and you will be given the list of mods. The user can turn on new mods and also turn off currently active mods. If any changes would break the map (such as a unit type being removed that is placed on the map) the changes to mods will revert.<br />
===Updating a Modded Map===<br />
If a mod that a map relies on is updated, the map also needs to be updated. If the map is part of the mod this happens automatically on packing the mod. If not, the next time the map is opened for edit the game will ask which mods should be updated. If a mod is not updated, it will remove all units and events that rely on the mod. It’s a good idea to back up a map before updating a mod.<br />
==Using Mods Online==<br />
Maps that are packaged within mods can be used for online play. These maps can be used online if and only if all players have the same version of the mod installed.<br />
<br />
=Mod Creation: Requirements=<br />
Mods use a combination of Yaml, Lua, art, and sound files. It's definitely advisable to be familiar with the Yaml format, and Lua if there's any scripting. In addition, animations are done using Aseprite which is paid software (but very much worth it!).<br />
<br />
Aseprite is available from their website (https://www.aseprite.org/) along with itch.io, Humble Bundle, Steam, and Gumroad.<br />
Mod Creation: Configuration<br />
The basic steps are:<br />
:#Create a mod manifest file with basic information<br />
:#Create configuration, art, and sound files<br />
:#Package the mod<br />
:#Create maps that use the mod<br />
:#Package the mod to include the maps<br />
:#Give the mod to internet friends!<br />
<br />
Mods are created from a collection of yaml files, lua files, image files, and sound files. Once a mod is created and added to a user’s game, they can create new maps/campaigns using the mod and apply the mod to existing maps/campaigns.<br />
<br />
We have included a few example mods. The easiest way to get started is to take a look at these examples while going through this document.<br />
<br />
The basic structure of a mod looks like this:<br />
{|<br />
|<br />
mod<br />
- assets_src<br />
- audio<br />
- music<br />
- sfx<br />
- audio_event<br />
- config <br />
- gameplay<br />
- triggers<br />
- actions.yaml<br />
- conditions.yaml<br />
- units<br />
- strings<br />
- image<br />
- palettes<br />
- portraits<br />
- _dir.meta<br />
- ui <br />
- units<br />
- _dir.meta<br />
- lua<br />
- initialized<br />
- manifest.yaml<br />
|<br />
# The top level folder<br />
# Contains all assets<br />
# Audio files<br />
<br />
<br />
# Audio configuration files<br />
# General Configuration files<br />
# Gameplay Configuration files<br />
# Yaml files for the event system<br />
<br />
<br />
# Yaml files for units<br />
# Yaml files for translated strings<br />
# Art<br />
# The Wargroove palette<br />
# Unit/commander portraits<br />
# Sets portraits to use the Wargroove palette<br />
<br />
# Art for units map/battle animations<br />
# Sets units to use the Wargroove palette<br />
# Lua scripts folder<br />
# Special Lua files that are initialized<br />
# Information about the mod<br />
|}<br />
==Creating the Mod Manifest File==<br />
The <code>manifest.yaml</code> file at the root of the mod folder determines the mod’s general settings. The fields are:<br />
*id: The id of the mod. This should be unchanging for all versions of your mod as the id is what the game uses to determine if two mods are the same mod but with different versions. This should also be relatively unique, as two mods with the same id will clash.<br />
*name: This is the name that players will see when they load the mod into their game. This does not have to stay the same throughout versions of the mod and does not have to be unique (although it probably should be to avoid confusion).<br />
*description: This is the description that players will see when they load the mod into their game. This does not have to stay the same throughout versions of the mod and does not have to be unique (although it probably should be to avoid confusion).<br />
*remove: A group of assets to remove from the map when using this mod. The three types of assets that can be removed are commanders, units, and factions.<br />
<br />
<br />
Example from tolstoy_mod’s <code>manifest.yaml</code>:<br />
<br />
---<br />
<br />
id: TolstoyMod<br />
name: "Tolstoy's Mod"<br />
author: "TolstoyFan1"<br />
description: "Adds My Tolstoy to the game which is the feature we've all been waiting for!<br />
remove: <br />
commander:<br />
- mercia<br />
unitClass:<br />
- soldier<br />
faction:<br />
- felheim<br />
<br />
...<br />
==Maps==<br />
Maps can be packaged along with mods for distribution. In order to do this, the map must use no other mods. If a map uses multiple mods, it needs to be distributed separately from the mod.<br />
<br />
While editing the map, go to the mods settings. Next to the mod you want to add the map to press “add to mod”. This will remove other active mods. Note, this means that you have to create the mod first (or at least an initial skeletal framework). Once a map is part of a mod it will be updated automatically with the mod.<br />
<br />
The next time <code>wargroove_mod_packer.exe</code> is run, the map will be automatically packaged along with the mod. You should see them in the <code>assets_src/maps</code> folder after packaging.<br />
==Units==<br />
Units are made up of multiple parts:<br />
:#Unit Class Configuration<br />
:#Unit Configuration<br />
:#Weapons Configuration<br />
:#(optional) Commander Configuration<br />
:#Art and sound effects<br />
<br />
For example, the soldier unit has a unit class config of “soldier” and individual unit configurations for each faction (Cherrystone, Floran, Heavensong, Felheim). It also has the weapon “sword”. Various art and sounds are referred to in the configuration file. <br />
<br />
Typically, we store the weapons, unit class, and unit configuration in a single file.<br />
===Unit Class Configuration===<br />
The unit class defines the information that all soldiers share, such as their cost, movement, and weapons.<br />
<br />
unitClasses:<br />
- id: soldier<br />
name: unit_class_name_soldier<br />
cost: 100<br />
movement: walking<br />
moveRange: 4<br />
damageMultiplier: 1<br />
aiPriority: 1.0<br />
weapons:<br />
- id: sword<br />
verbs:<br />
- capture<br />
- load<br />
tags:<br />
- soldier<br />
- type.ground.light<br />
battleUnitCount: 4<br />
passiveMultiplier: 1.5<br />
<br />
{| class="mw-collapsible mw-collapsed wikitable"<br />
|Expand for a complete list of '''unit ids''' implemented in game <br />
|-<br />
|<br />
archer<br />
ballista<br />
balloon<br />
barracks<br />
city<br />
commander_caesar<br />
commander_darkmercia<br />
commander_elodie<br />
commander_emeric<br />
commander_greenfinger<br />
commander_koji<br />
commander_mercia<br />
commander_mercival<br />
commander_nuru<br />
commander_ragna<br />
commander_ryota<br />
commander_sedge<br />
commander_sigrid<br />
commander_tenri<br />
commander_valder<br />
crystal<br />
dog<br />
dragon<br />
drone<br />
garrison<br />
gate<br />
ghost_mercival<br />
giant<br />
harpoonship<br />
harpy<br />
hq<br />
knight<br />
mage<br />
merman<br />
port<br />
soldier<br />
spearman<br />
tower<br />
travelboat<br />
trebuchet<br />
turtle<br />
villager<br />
vine<br />
wagon<br />
warship<br />
water_city<br />
witch<br />
|}<br />
<br />
===Unit Configuration===<br />
The unit defines information that is faction specific, such as the name, animations, and sounds.<br />
<br />
[This example has been shortened slightly where there are ellipses.]<br />
units:<br />
- class: soldier<br />
faction: cherrystone<br />
name: unit_name_soldier_cherrystone<br />
mapAnimation: units/soldier/cherrystone/map_soldier_cherrystone<br />
battleAnimation: units/soldier/cherrystone/battle_soldier_cherrystone<br />
battleAnimationRiver: fx/river_overlay/battle_soldier_cherrystone_river<br />
smallPortrait: units/soldier/cherrystone/portrait_soldier_cherrystone_small.png<br />
mediumPortrait: units/soldier/cherrystone/portrait_soldier_cherrystone_medium.png<br />
mapSpeed: 4.0<br />
grabPos: [13, 14]<br />
sounds:<br />
attack: soldierAttackRed<br />
attackShout: soldierPreAttackRed<br />
attackMap: unitAttack<br />
captureShout: soldierPreAttackRed<br />
death: soldierDieRed<br />
deathMap: unitDie<br />
run: infantryHeavyEntry<br />
runMap: infantryHeavyMapEntry<br />
hit: hitOrganic<br />
hitMap: hitOrganic<br />
attacks:<br />
- id: primary<br />
hitSpark: fx/bs_stab_attack<br />
hitDelay: [0.45, 0.8]<br />
shouts:<br />
soldier_shout1: soldierShoutRed1<br />
soldier_shout2: soldierShoutRed2<br />
soldier_shout3: soldierShoutRed3<br />
[...]<br />
soldier_hit1: soldierHitRed1<br />
soldier_hit2: soldierHitRed2<br />
soldier_hit3: soldierHitRed3<br />
[...]<br />
crownbearer_panting: cutscene/crownbearerPanting<br />
crownbearer_yell: cutscene/crownbearerYell<br />
emotes:<br />
idle: idle<br />
idle_crownbearer: idle_crownbearer<br />
idle_crown: emote_idle_crown<br />
idle_crown_ragged: emote_idle_crown_ragged<br />
cushion: emote_cushion<br />
[...]<br />
alternativeRuns:<br />
- id: run_crown<br />
[...]<br />
===Weapon Configuration===<br />
The weapon defines information relevant to combat, such as damage, range, and restrictions.<br />
<br />
weapons:<br />
- id: sword<br />
rangeMin: 1<br />
rangeMax: 1<br />
canMoveAndAttack: true<br />
baseDamage:<br />
land: 1<br />
tagDamage:<br />
archer: 0.65<br />
soldier: 0.55<br />
villager: 0.55<br />
spearman: 0.35<br />
dog: 0.45<br />
wagon: 0.35<br />
knight: 0.15<br />
trebuchet: 0.3<br />
merman: 0.55<br />
mage: 0.55<br />
structure: 0.35<br />
commander: 0.10<br />
ballista: 0.35<br />
giant: 0.05<br />
===Adding/Modifying a Unit Class===<br />
Units can be added, modified, or completely overwritten.<br />
====Adding a Unit====<br />
A unit can be added by creating a unit with a new id. An example in the Tolstoy mod is <code>assets/art/config/units/commander_tolstoy.yaml</code>. A unit needs the four basic components of a unit class configuration, unit configurations, and any weapons. In addition, new art and sounds can be used.<br />
====Modifying a Unit Class====<br />
To only change part of a unit (for example, to add the “pet” verb to soldiers”), instead of creating a new entry in “unitClasses”, a new entry in the “modifyingUnitClasses” is created with the id of the modified class.<br />
<br />
<br />
modifyingUnitClasses:<br />
- id: soldier<br />
# replace: # This replaces the sections, so the soldier can only pet<br />
# verbs:<br />
# - pet<br />
add:<br />
verbs:<br />
- pet # This adds “pet” to the soldier verbs<br />
# remove:<br />
# verbs:<br />
# - capture # This removes<br />
<br />
Sections in “modifyingUnitClasses” are replace, add, and remove. Under these, the categories refer to the categories in the unit class table.<br />
====Overwriting a Unit====<br />
To completely overwrite a unit, it’s the same process as adding a new unit. If the id is set to an existing unit (such as “soldier”), then it will overwrite the existing configuration.<br />
===Adding/Modifying a Commander===<br />
Commanders are units with additional configuration files and art/sound assets. The additional configuration files that need to be created are:<br />
:#A commander configuration under config/gameplay (see example: <code>tolstoy_mod/assets_src/config/gameplay/commanders.yaml</code>)<br />
:#A groove configuration under config/gameplay (see example: <code>tolstoy_mod/assets_src/config/gameplay/grooves.yaml</code>)<br />
:#A verb configuration for the commander’s groove under config/gameplay (see example: <code>tolstoy_mod/assets_src/config/gameplay/verbs.yaml</code>)<br />
===Adding a Faction===<br />
Factions are defined in assets_src/config/gameplay/factions.yaml.<br />
<br />
Example: tolstoy_mod/assets_src/config/gameplay/factions.yaml<br />
<br />
factions:<br />
- id: tolstoy # The faction id<br />
name: faction_name_tolstoy # The visible name of the faction<br />
stdColour: blue # The default colour of the faction<br />
altColour: yellow <br />
# The colour of the faction is the default is not available<br />
skinColours: [ "typeII", "typeIII", "typeIV", "typeV", "typeVI" ]<br />
# The skin colours of units in the faction<br />
Once a new faction is added, units can have their faction set to the new faction in the configuration files.<br />
==Biomes and Terrain==<br />
===Adding a Biome===<br />
A biome has two components.<br />
:#Biome config: This has the basic information of a biome (see <code>biome_mod/assets_src/config/gameplay/tilesets/grass2.yaml</code>)<br />
:#Tilesets: Tilesets can be added to a biome in two different ways. Either a new tile needs to be created, or an appending tileset configuration can be created.<br />
::#New tileset: see “Adding a Terrain Tile” below<br />
::#Appending tileset: For a new biome, it’s possible to add existing tile types. See <code>biome_mod/assets_src/config/gameplay/tilesets/grass2.yaml</code>. In this, the grass2 biome is being added to all existing tile types. In the example it uses the default grass images but these can be changed.<br />
===Adding a Terrain Tile===<br />
See example <code>terrain_mod/assets_src/config/gameplay/tilesets/flowers.yaml</code>. <br />
==Lua Scripts==<br />
All Lua files must exist under assets_<code>src/lua/</code>. Lua files under <code>assets_src/lua/initialized</code> will have <code>init()</code> called on them. This can be used for setting up conditions and actions as well as replacing game functions.<br />
===Custom Events (Conditions and Actions)===<br />
Events are made up of conditions and actions. Conditions and actions have three components:<br />
:1. Yaml Configuration: This specifies the name of the event and parameter types.<br />
<br />
::Examples:<br />
::<code>tolstoy_mod/assets_src/config/gameplay/triggers/actions.yaml</code><br />
::<code>tolstoy_mod/assets_src/config/gameplay/triggers/conditions.yaml</code><br />
<br />
:2. Lua File: This specifies the actual actions and rules of the event. This file must have an <code>init()</code> function and be in the folder <code>assets_src/lua/initialized</code>.<br />
<br />
::Examples:<br />
::<code>tolstoy_mod/assets_src/lua/initialized/actions.lua</code><br />
::<code>tolstoy_mod/assets_src/lua/initialized/conditions.lua</code><br />
<br />
<br />
:3. Strings: Each event has three strings. A name, a description, and a “readable” description. The readable description has places for user chosen values.<br />
<br />
::Example readable strings:<br />
::“Add set state {3} to {4} for unit type(s) {0} at location {1} owned by player {2}.” becomes “Add set state cute to ‘true’ for unit type(s) ‘dog’ at location ‘any’ owned by player ‘1’.”<br />
<br />
::Examples:<br />
::<code>tolstoy_mod/assets_src/config/strings/en-GB.yaml</code><br />
===Modifying Existing Lua===<br />
Existing lua systems (such as the combat system) can be modified with initialized lua files. See example <code>tolstoy_mod/assets_src/lua/initialized/combat.lua</code>.<br />
===Critical Hit Conditions===<br />
In Wargroove, critical hit conditions are called “passive conditions”. Each unit type has one; for example, the soldier does a critical hit when they are standing next to their commander. Adding a new condition works the same as modifying existing lua. See <code>tolstoy_mod/assets_src/lua/initialized/passive_conditions.lua</code>.<br />
===Verbs===<br />
Verbs are actions that units can take, such as attack, capture, and reinforce. Verbs have three components:<br />
:1. Yaml Configuration: This specifies the name of the verb, the lua file associated with it, and various parameters such as splash radius, the icon, and colours.<br />
::<code>tolstoy_mod/assets_src/config/gameplay/verbs.yaml</code><br />
:2. Lua File: This is what is actually run when a verb is used. This is also where AI rules for using the verb are specified.<br />
::<code>tolstoy_mod/assets_src/lua/lua_mod/verbs/pet.lua</code><br />
:3. String: A verb has a name associated with it.<br />
::<code>tolstoy_mod/assets_src/config/strings/en-GB.yaml</code><br />
===Grooves===<br />
Grooves are essential special verbs used by commanders. The only difference is an additional groove configuration. Grooves have four components:<br />
:1. Groove yaml configuration: this has information such as groove charge time and the associated verb.<br />
::<code>tolstoy_mod/assets_src/config/gameplay/grooves.yaml</code><br />
:2. Verb yaml Configuration: This specifies the name of the groove’s verb, the lua file associated with it, and various parameters such as splash radius, the icon, and colours.<br />
::<code>tolstoy_mod/assets_src/config/gameplay/verbs.yaml</code><br />
:3. Lua File: This is what is actually run when a verb is used. This is also where AI rules for using the verb are specified.<br />
::<code>tolstoy_mod/assets_src/lua/lua_mod/verbs/groove_tolstoy.lua</code><br />
:4. String: A verb has a name associated with it.<br />
::<code>tolstoy_mod/assets_src/config/strings/en-GB.yaml</code><br />
==Cutscenes==<br />
The Tolstoy mod has examples of these.<br />
*Sound Effects: defined in <code>config/gameplay/cutscene/cutscene_sfx.yaml</code><br />
*Visual Effects: defined in <code>config/gameplay/cutscene/cutscene_vfx.yaml</code><br />
*Props: defined in <code>config/gameplay/cutscene/cutscene_props.yaml</code><br />
*Backgrounds: defined in <code>config/gameplay/cutscene/cutscene_backgrounds.yaml</code><br />
*Shouts: defined in the unit class configuration file for the unit with the shout.<br />
*Emotes: defined in the unit class configuration file for the unit with the emote.<br />
*Alternative run: defined in the unit class file for the unit with the run. This is for characters who might have different versions of their runs, for example Sigrid has a regular run and a float.<br />
units: <br />
- class: commander_tolstoy<br />
alternativeRuns:<br />
- id: run_sniff # Refers to a tag in the battle .ase file<br />
sound: sniff # Can set an alternative run sound<br />
<br />
*Cutscene idle: If your character has an alternative idle that you want to use in cutscenes. For example, in cutscenes Caesar does not have his crossbow soldiers.<br />
units: <br />
- class: commander_tolstoy<br />
[...]<br />
cutsceneIdle: capture_idle # Tag in the battle ase file<br />
<br />
*Cutscene pre-idle: If your character has a pre-idle animation that you want to include in the cutscene (or want to not use the regular combat pre-idle animation). This can be set to nothing. For example, Caesar doesn’t do his battle pre-idle in cutscenes (as it has crossbow soldiers). <br />
units: <br />
- class: commander_tolstoy<br />
[...]<br />
cutscenePreIdle: "" # None (or a tag in the battle .ase file)<br />
<br />
*Cutscene hit: If your character has a hit animation you want to use in the cutscene. For example, Caesar doesn’t do his battle hit in cutscenes (as it has crossbow soldiers).<br />
units: <br />
- class: commander_tolstoy<br />
[...]<br />
cutsceneHit: hit_foot # A tag in the battle .ase file<br />
==Removing Units, Commanders, and Factions==<br />
In order to remove units, commanders, and factions they must be specified in the mod’s <code>manifest.yaml</code> file.<br />
<br />
id: TolstoyMod<br />
name: "Tolstoy's Mod"<br />
description: "Adds Tolstoy to the game which is the feature we've all been waiting for."<br />
remove:<br />
commander:<br />
- mercia<br />
unitClass:<br />
- soldier<br />
faction:<br />
- felheim<br />
<br />
This mod removes Mercia as a commander, the Soldier unit, and the Felhem faction. The remove id matches the id field of the asset being removed.<br />
==Game Strings==<br />
In many configuration files, there are references to strings. These strings are keys that refer to a language file, so that translation is easier. For example, in the faction configuration the entry name: <code>faction_name_tolstoy</code> refers to the key “faction_name_tolstoy” that can be found in <code>tolstoy_mod/ssets_src/config/gameplay/strings/en-GB.yaml</code>.<br />
<br />
There are a number of supported languages. To add another one to your mod, you just add the corresponding language yaml file in the same folder as the en-GB file. The language files are:<br />
*de-DE: German<br />
*en-GB: English<br />
*es-ES: Spanish<br />
*fr-FR: French<br />
*it-IT: Italian<br />
*ja-JP: Japanese<br />
*ko-KR: Korean<br />
*pt-BR: Portuguese<br />
*ru-RU: Russian<br />
*zh-Hans: Chinese Simplified<br />
*zh-Hant: Chinese Traditional<br />
==Colours==<br />
Colours are defined in <code>config/art/colours.yaml</code>. These are referred to by various configuration files, such as <code>tolstoy_mod/assets_src/config/gameplay/verbs.yaml</code> when it refers to target and outline colours.<br />
=Mod Creation: Art and Sound=<br />
==Art==<br />
There are two basic types of art assets in Wargroove, animated Aseprite files and static png files. In addition, an art asset can support palette swapping, which is what happens when commanders change faction colours.<br />
<br />
===Wargroove Palette===<br />
All art assets that has army or skin colours (such as battle and map unit animations) '''must''' use the colours found in the wargroove palette.<br />
<br />
[[File:WargroovePalette.png]]<br />
<br />
The palette has three sections: army colour, skin colour, and other. Colours from the army colour section will be changed depending on the player's chosen army colour. Skin colour will be changed depending on the unit's skin colour. The other colours will never be changed. New colours cannot be added to the palette, as it is full.<br />
<br />
===Aseprite Files===<br />
In order to create an aseprite file, you have to buy Aseprite (sorry!). It’s really awesome though so you won’t regret it. Animations work with Aseprite tags.<br />
<br />
[[File:Modding Guide 3.png]]<br />
<br />
The tags are referred to by the game, and can also be referred to in new Lua scripts.<br />
===Png Files===<br />
Assets such as portraits and UI are not animated, and thus do not have to be Aseprite files.<br />
===Meta Files===<br />
Art files can have a corresponding meta file. The metafile is the same name as the art asset with “.meta” at the end. So for the <code>battle_tolstoy.ase</code> file its meta is <code>battle_tolstoy.ase.meta</code>. The most important purpose of a meta file is to set the pivot of the art asset.<br />
<br />
---<br />
pivotX: 150<br />
pivotY: 86<br />
...<br />
===Palette Swapping===<br />
Some art assets change colours depending on the faction they are assigned to.<br />
<br />
For palette swapped images, they must use the colours found in the wargroove palette. Otherwise the packaging step will fail.<br />
{| class=wikitable<br />
|-<br />
|Portraits<br />
|Required<br />
|-<br />
|Units<br />
|Required<br />
|-<br />
|Attack Special FX<br />
|Optional, can be set in a meta file<br />
|}<br />
<br />
In the mod, files are set to palette swap by using meta files. For portraits and units, in their folders contain a file named <code>_dir.meta</code> which is generated by the mod packaging tool. <br />
<br />
---<br />
- data:<br />
palette: image/palettes/wargroove_palette.png<br />
material: Wargroove/PaletteSwap<br />
atlas: portraits<br />
...<br />
<br />
This files applies the settings to all files in the directory tree.<br />
<br />
The wargroove palette must be in the mod at <code>image/palettes/wargroove_palette.png</code>.<br />
===Ranged Attack Special FX===<br />
Optionally, ranged attack effects can be palette swapped. For example, the harpy attack changes colour depending on faction. To support this, the meta file contains instructions to use the palette and the pallete swap material.<br />
<br />
---<br />
pivotX: 145<br />
pivotY: -4<br />
palette: image/palettes/wargroove_palette.png<br />
material: Wargroove/PaletteSwap<br />
...<br />
<br />
==Sound==<br />
All sound assets in Wargroove are <code>.ogg</code> format. The game uses them files in 48khz frequency, and it’s recommended to save them at 50% quality VBR to save space. Also save them without any metatag info. For sound effects and voice lines, they should be saved in mono. For music and environmental soundscapes, they should be saved in stereo.<br />
===Music===<br />
Music .ogg files have a corresponding meta file, which is contained in the same folder is the same name but with a “.meta” on the end. So for <code>campaign.ogg</code>, its meta file is <code>campaign.ogg.meta</code> and specifies that it is streaming and its loop point.<br />
<br />
---<br />
streaming: true<br />
loopPoint: 498462<br />
...<br />
<br />
Music also has two configuration files. One is <code>music.yaml</code> which is under <code>assets_src/config/gameplay/yaml</code>.<br />
<br />
---<br />
music:<br />
- id: main_theme<br />
name: music_name_main_theme<br />
audioEvent: music/main_theme<br />
...<br />
<br />
Another is an audio event configuration under <code>assets_src/audio_event/music</code>.<br />
<br />
---<br />
actions:<br />
- type: play<br />
clips: [ music/maintheme.ogg ]<br />
group: music<br />
loop: true<br />
...<br />
<br />
===SFX===<br />
Sound effects have additional configuration files. Sound effects can be defined in the assets_src/audio_event folder. Configuration files can combine sounds into larger effects. For example, the metaAttack.yaml sound event actually contains three sounds.<br />
<br />
---<br />
actions:<br />
- type: play<br />
clips: [ sfx/mercia/merciaAttackFoley.ogg ]<br />
group: sfx<br />
delay: 0.08<br />
- type: play<br />
clips: [ sfx/mercia/merciaAttackVoice1.ogg, sfx/mercia/merciaAttackVoice2.ogg, sfx/mercia/merciaAttackVoice3.ogg ]<br />
group: voice<br />
delay: 0.2<br />
- type: play<br />
clips: [ sfx/mercia/merciaAttackVoice4.ogg, sfx/mercia/merciaAttackVoice5.ogg ]<br />
group: voice<br />
delay: 1.1<br />
...<br />
<br />
Each sound specifies:<br />
*That it should be played<br />
*What clips it should use. If more than one is specifies it chooses one at random.<br />
*What type of effect it is (sfx or voice)<br />
*When it should play after the audio event starts.<br />
<br />
In addition, sounds can have a volume and pitch specified. These are specified by a single value or a range which they can vary between.<br />
<br />
---<br />
actions:<br />
- type: play<br />
clips: [ sfx/soldierPreAttack1.ogg, sfx/soldierPreAttack2.ogg, sfx/soldierPreAttack3.ogg, sfx/soldierPreAttack4.ogg, sfx/soldierPreAttack5.ogg, sfx/soldierPreAttack6.ogg, sfx/soldierPreAttack7.ogg, sfx/soldierPreAttack8.ogg, sfx/soldierPreAttack9.ogg ]<br />
group: voice<br />
pitch: [ 0.9, 1.1 ]<br />
volume: [ 0.63, 0.7 ]<br />
...<br />
<br />
=Mod Packaging and Distribution=<br />
==Packaging==<br />
To package a mod, run the executable from your command line.<br />
<br />
wargroove_mod_packer.exe <path_to_mod><br />
<br />
The packaged mod will automatically be put into the <code>mods</code> folder of your Wargroove app data which is probably at <code>%appdata%\Roaming\Chucklefish\Wargroove\mods</code>.<br />
==Distribution==<br />
At the moment, we have not integrated Steam Workshop so it’s a manual process. Once you have packaged your mod, it will be moved to your application folder, which is probably at <code>%appdata%\Roaming\Chucklefish\Wargroove\mods</code>. The folder that’s created will have the same id as your mod, and can be placed in any user’s mods folder for usage.</div>Ckrakauerhttps://wargroovewiki.com/mediawiki/index.php?title=File:WargroovePalette.png&diff=3690File:WargroovePalette.png2019-08-13T13:06:40Z<p>Ckrakauer: The palette used in wargroove.</p>
<hr />
<div>The palette used in wargroove.</div>Ckrakauer