Armoured Commander II Campaign Modding Guide

Guide to the data structure for campaigns, for players who wish to mod existing campaigns or create their own in Armoured Commander II.

Introduction

Campaigns are JSON files that should be placed within the “/mods/campaigns” subdirectory within the main install directory (“…/Steam/steamapps/common/Armoured Commander II/mods/campaigns”).

If a modded campaign in this folder has the same filename as an official campaign, it will replace that campaign in the game. Otherwise, any modded campaign file that can be loaded and parsed will be added to the New Campaign menu. Note that each campaign in the mod directory must have a unique filename, which distinguishes it from other possible campaigns.

Do not keep modded campaigns in the game’s own /campaigns folder, especially if you’re using the same filename as a standard campaign; there’s a chance that the file will be overwritten in a future update. The contents of the /mods folders will never be touched during an update.

The structure of the campaign must be as outlined below. Syntax errors in what the JSON importer expects to find will result in an error when trying to enter the New Campaign menu. The first syntax error encountered will be displayed in a pop-up message, and the campaign will not be added to the menu.

If the campaign has other sorts of errors, such as typos or incorrect data in the data fields, it will load the campaign into the menu, but it may cause crashes or other unexpected behaviour later on.

You can always consult one of the game’s standard campaigns for examples on correct formatting.

1. General Campaign Information

The JSON file as a whole must start and end with squiggly brackets {} as the overall data

structure is that of a dictionary. These fields are required in every campaign:

Field

Contents

Format

“name”

The name of the campaign

String, maximum ~40 characters

“start_date”

The earliest possible combat day in the campaign

ISO date separated by periods, eg. “1939.09.01”

“end_date”

The latest possible combat day in the campaign

ISO date separated by periods

“player_nation”

The nation that the player is fighting for

String, must be one of the keys defined in /data/nation_defs.json

“enemy_nations”

List of nations of the enemy forces

List of Strings, each must be a key in nation_defs.json

“region”

Region in which the campaign takes place

Must be one of the pre-designated regions, consult existing campaigns for examples

“desc”

A narrative description of the entire campaign

String

“player_unit_list”

List of units that the player can possibly command

List of Strings, each one must be a unit_id in /data/unit_type_defs.json, also it should probably be an armoured vehicle of some sort

“player_squad_list”

Dictionary of possible squadmates

Dictionary, where each key is a unit_id in player_unit_list, and has a list of units as its value

“tank_vp_modifiers”

Victory Point multipliers for player units

Dictionary, where each key exists in player_unit_list and each one has a float for its value (1.0 will be no VP change, 0.5 will be -50%, 1.5 +50%)

“campaign_skills”

List of skills automatically given to eligible player crew

List of Strings, each one must be a key in /data/skill_defs.json

“player_air_support”

Unit types that can arrive for player air support

List of Strings, each one must be a key in unit_defs.json, should also be a unit of the category “Airplane”

“player_arty_support”

Unit types that can be used for player artillery support

List of Strings, each one must be a key in unit_defs.json, should also be a unit of the category “Artillery Gun”

“player_unit_support”

Unit types that can be requested for player unit support

Dictionary, where each key is a list of units

“friendly_transported_units”

Unit types that can be passengers in friendly units

Dictionary, where each key is a unit somewhere in a player_unit_support category, and each of those keys has a dictionary of unit_ids with their spawn change as their value

“enemy_air_support”

Unit types that can arrive for enemy air support

List of Strings, each one must be a key in unit_defs.json, should also be a unit of the category “Airplane”

“enemy_arty_support”

Unit types that can be used for enemy artillery support

List of Strings, each one must be a key in unit_defs.json, should also be a unit of the category “Artillery Gun”

“enemy_unit_list”

List of nations and unit types that may be spawned

Dictionary, where each key is a Nation, and each has as its value a list of strings, each one of which is a unit in unit_defs.json

“enemy_unit_class_odds”

Unit classes and the odds that they will be spawned

Dictionary, where each key is a unit class, and each has as its value an integer between 1 and 100

“enemy_transported_units”

Unit types that can be passengers in enemy units

Same structure as friendly_transported_units

“decorations_list”

Possible decorations awarded to commander at end of campaign

Dictionary, where each key is a Victory Point amount, with a String value that is the name of the decoration

“combat_days”

How many combat days to generate for the campaign

Integer of at least 1, at most the total of the calendar days defined below

2. Combat Calendar Week Definitions

The calendar_weeks field must have a value that is a list of dictionaries. Each of these

dictionaries defines a week (or a slightly shorter period) in the campaign calendar, and

each one has a similar structure, with the exception of refitting weeks. Most of the fields

in each dictionary are required, if one is optional then it will be tagged as such.

Field

Contents

Format

“start_date”

The starting date for this calendar week

ISO date separated by periods, should not be earlier than the start date of the campaign, and make sure that it does not fall earlier than the end of the previous week

“end_date”

OPTIONAL – if this “week” is to be shorter than 7 full days, define the last day here

ISO date separated by periods

“location”

Geographic location for this combat week

Decimal latitude and longitude

“combat_chance”

The odds that a given day from this week will be added to the combat calendar

Integer between 1 and 100

“average_resistance”

The average enemy resistance level for hex zones in the Campaign Day map

Integer between 1 and 10

“week_title”

Title for this week in the campaign

String, maximum ~40 characters

“week_description”

A narrative description of this week

String, maximum ~242 characters

“mission_odds”

Odds of different mission types for each combat day

Dictionary, each key must be one of the mission types, and each has a value of an integer between 1 and 100; not all possible mission types must be included as keys

“enemy_nations”

Enemy nations that may be encountered this week

List of Strings, each must correspond to a key in nation_defs.json

“air_support_level”

OPTIONAL – base level of air support for each combat day

Float between 0.0 and 100.0

“arty_support_level”

OPTIONAL – base level of artillery support for each combat day

Float between 0.0 and 100.0

“unit_support_level”

OPTIONAL – base level of unit support for each combat day

Float between 0.0 and 100.0

“terrain_odds_modifier”

OPTIONAL – modify odds of Campaign Day map zone terrain for this week only

Dictionary, where each key is a terrain type, and each has a value of an Integer between 0 and 100

“enemy_class_odds_modifier”

OPTIONAL – modify one or more enemy_unit_class_odds values permanently, for the rest of the campaign

Dictionary, where each key is a unit class, each of which has a value of an Integer between 0 and 100

Refitting periods only need three lines of data:

“start_date”

The starting date of the refitting period

ISO date separated by periods

“end_date”

The ending date for this refitting period, this date is used for rarity factor checks

ISO date separated by periods

“refitting”

Set to “TRUE”

This is it guys!! I am sure that you will love Armoured Commander II Campaign Modding Guide that we have shared with you. We are always open to discussion and suggestions from you. Just let us what you thought about the guide in the comment section.

Also, we would like to thank Rev. Sudasana. He is the one behind this wonderful guide.