Difference between revisions of "Modding"

From Airships Wiki
Jump to: navigation, search
(Modding page rework part 1)
(+appearance +structure +resource +weapon (part 2 modding))
Line 57: Line 57:


== Attribute List ==
== Attribute List ==
----


===<u>Core Attributes</u>===
===<u>Core Attributes</u>===
Line 175: Line 177:
<pre>
<pre>
{
{
   "isExplosive": t/f,   //Rockets, Bomb Bays, Grenades, etc.
   "isExplosive": t/f, //Rockets, Bomb Bays, Grenades, etc.
   "isSail": t/f,      //Sails.
   "isSail": t/f,      //Sails.
   "isWeapon": t/f,    //Required for all weapon modules.
   "isWeapon": t/f,    //Required for all weapon modules.
Line 230: Line 232:
</div>
</div>


----


===<u>Appearance Attributes</u>===
===<u>Appearance Attributes</u>===
; drawDoors
:Specifies the Game Engine should not draw 1 Pixel vertical lines on the left and right edges of the Module.
<div style="width:55%">
<pre>
{
  "drawDoors": t/f,
}
</pre>
</div>
; framesAreVariants
:Uses given "frames" to randomize the "appearance" of a module.
<div style="width:55%">
<pre>
{
  "framesAreVariants": t/f,
}
</pre>
</div>
; appearance
:In-game graphic of the Module.
:"src" is a spritesheet reference by filename without extension (.PNG).
:"x" & "y" are the location on the spritesheet in Tiles.
:"w" & "h" are the width and height of the module in Tiles.
:"interval" is the time in milliseconds one "frames" cycles to the next "frames".
:"frames" start on the first frame, increment down the list, and loop back to the first "frames".
<div style="width:55%">
<pre>
{
  "appearance": { //One frame.
    "src": "value", 
    "x": value,
    "y": value,
    "w": value,
    "h": value
  },
},
OR
{
  "appearance": { //More than one frame.
    "src": "value",
    "interval": value,
    "frames": [
      { "x": value, "y": value, "w": value, "h": value },
      { "x": value, "y": value, "w": value, "h": value }
    ]
  },
}
</pre>
</div>
; externalAppearances
:Exterior graphic of the Module.
:"src" is the spritesheet filename without extension (.PNG).
:"x" & "y" are the location on the module in Tiles.
:Refer to appearance for more information.
<div style="width:55%">
<pre>
{
  "externalAppearances": [ //One frame.
    {
      "x": value,
      "y": value,
      "appearance": {
        "src": "value",
        "x": value,
        "y": value,
        "w": value,
        "h": value
      }
    },
  ],
}
OR
{
  "externalAppearances": [ //More than one frame.
    {
      "x": value,
      "y": value,
      "appearance": {
        "src": "value",
        "interval": value,
        "frames": [
          { "x": value, "y": value, "w": value, "h": value },
          { "x": value, "y": value, "w": value, "h": value }
        ]
      }
    },
  ],
}
</pre>
</div>
; damagedExternalAppearances, destroyedExternalAppearances
:Damaged and destroyed graphics of a Module.
:Identical to externalAppearances in implementation, but define different frames for when a module is damaged or destroyed.
:Refer to externalAppearances for more information.
; depletedResourceAppearances
:Resource-dependant graphics of a module.
:Used alongside "appearance" to change the graphic of a module depending on how much of a resource is left. Used in the Coal Store, Small Coal Store, Fire Extinguisher, and Fire Point.
:"src" is a spritesheet reference by filename without extension (.PNG).
:"x" & "y" are the location on the spritesheet in Tiles.
:"w" & "h" are the width and height of the module in Tiles.
<div style="width:55%">
<pre>
{
  "appearance"
  ...
  "depletedResourceAppearances": [
    {
      "src": "value",
      "x": value,
      "y": value,
      "w": value,
      "h": value
    },
  ]
}
</pre>
</div>
; externalDrawPriority
:Forces the Game Engine to draw "externalAppearances" over the Armor and other Modules. (ex. Legs, Tracks, & Sails)
<div style="width:55%">
<pre>
{
  "externalDrawPriority": t/f,
}
</pre>
</div>
; lights
:Lights on the interior of the Module, where "r" "g" & "b" are values on the color model, "radius" size of the light in pixels, and "x" & "y" location of the light on the module in Tiles.
<div style="width:55%">
<pre>
{
  "lights": [ { //Normal lights.
    "x": value,
    "y": value,
    "r": value,
    "g": value,
    "b": value,
    "radius": value
  } ],
}
{
  "damagedLights": [ { //Damaged module lights.
    "x": value,
    "y": value,
    "r": value,
    "g": value,
    "b": value,
    "radius": value
  } ],
}
</pre>
</div>
; canParticlesStick
:This string is often used for monsters. Used to prevent particles from sticking to the module.
<div style="width:55%">
<pre>
{
  "canParticlesStick": t/f,
}
</pre>
</div>
; emitters
:In-Game emitter graphic, generates stationary particles; where "x" & "y" location the particles spawn in Tiles, "type" the Particle Type, "emitProbabality" spawns per Millisecond, and "inside" specifying the particles should spawn within the interior of the Module.
:See data\ParticleType folder for vanilla Particle types.
<div style="width:55%">
<pre>
{
  "emitters": [ { //Normal emitters.
    "x": value,
    "y": value,
    "type": "value",
    "emitProbability": value,
    "inside": t/f
  } ],
}
{
  "damagedEmitters": [ { //Damaged module emitters.
    "x": value,
    "y": value,
    "type": "value",
    "emitProbability": value,
    "inside": t/f
  } ],
}
{
  "destroyedEmitters": [ { //Destroyed module emitters.
    "x": value,
    "y": value,
    "type": "value",
    "emitProbability": value,
    "inside": t/f
  } ],
}
</pre>
</div>
; windows
:Windows on the Module; where "x" & "y" are coordinate in Tile.
<div style="width:55%">
<pre>
{
  "windows": [
    {
      "x": value,
      "y": value
    },
    {
      "x": value,
      "y": value
    },
  ],
}
</pre>
</div>
; hitParticle
:The Particle the Module creates when hit.
<div style="width:55%">
<pre>
{
  "hitParticle": "value",
}
</pre>
</div>
; destructionLength
:Duration of a modules destruction, in Milliseconds, before being removed from battle. Often used with animated "destroyedExternalAppearance" with exception of the Kraken.
<div style="width:55%">
<pre>
{
  "destructionLength": value,
}
</pre>
</div>
; destructionParticle
:Particle(s) created when the Module is destroyed.
<div style="width:55%">
<pre>
{
  "destructionParticle": "value",
}
</pre>
</div>
; destructionParticleDensity
:Particle Density of "destructionParticle" value. (Only seen accompanying "destructionParticle".)
<div style="width:55%">
<pre>
{
  "destructionParticleDensity": value,
}
</pre>
</div>
; hasGenericDestructionFragments
:Removes generics explosive fragments that appear when a module is damaged/destroyed. Often used with with "damagedExternalAppearances" & "destroyedExternalAppearance".
<div style="width:55%">
<pre>
{
  "hasGenericDestructionFragments": t/f,
}
</pre>
</div>
; fragmentsSpeedMult
:Speed multiplier of Fragments that are spawned when the Module is destroyed. Only seen accompanying "destructionParticle".
<div style="width:55%">
<pre>
{
  "destructionParticle"
  ...
  "fragmentsSpeedMult": value,
}
</pre>
</div>
; fragmentsDensity
:Fragment Density of the Module when destroyed, creating multiple Fragments. Only seen accompanying "destructionParticle".
<div style="width:55%">
<pre>
{
  "destructionParticle"
  ...
  "fragmentsDensity": value,
}
</pre>
</div>
; fragmentsFireMult
:Speed multiplier of fire-spread speed through a module. Lower value equals slower fire spread and vice versa.
<div style="width:55%">
<pre>
{
  "fragmentsFireMult": value,
}
</pre>
</div>
----
===<u>Structure Attributes</u>===
; Placement Restrictors
:The Module cannot have another Module intersect with any Tile in the specified direction.
<div style="width:55%">
<pre>
{
  //Entire side is restricted:
  "topOnly": t/f,
  "bottomOnly": t/f,
  "frontOnly": t/f,
  "backOnly": t/f,
  //Specific tile of a side is restricted:
  "topOnlyList": [ value ],
  "bottomOnlyList": [ value ],
  "frontOnlyList": [ value ],
  "backOnlyList": [ value ],
}
</pre>
</div>
; Module Doors
:Defines which tiles connect to adjacent modules.
<div style="width:55%">
<pre>
{
  "upDoors": [ value ],    //Defaults to no upDoors
  "leftDoors": [ value ],  //Defaults to all tiles.
  "rightDoors": [ value ],  //Defaults to all tiles.
}
</pre>
</div>
; canOccupy
:Tiles in the Module personnel can occupy by coordinate in Tile.
<div style="width:55%">
<pre>
{
  "canOccupy": [
    { "x": value, "y": value },
  ]
}
</pre>
</div>
----
===<u>Resource Attributes</u>===
; external
:Specifies if the Module cannot be protected by armor. Removes all armor effects including graphics.
<div style="width:55%">
<pre>
{
  "external": t/f,
}
</pre>
</div>
; armourType
:Forced/Built-In Amour Type for the Module. String is often used with Monsters & Hatches where the Armor is invisible or subjective.
:See data\ArmourType for armour type files.
<div style="width:55%">
<pre>
{
  "armourType": "value",
}
</pre>
</div>
; hp
:Modules Total Hit-Points; before adjacency, bonuses and armor.
<div style="width:55%">
<pre>
{
  "hp": value,
}
</pre>
</div>
; explodeHP
:HP required before the Module chances explosion; before adjacency, bonuses and armor.
<div style="width:55%">
<pre>
{
  "explodeHP": value,
}
</pre>
</div>
; explodeDmg
:Explode Damage inflicted by the Module to surrounding Modules when destroyed. Does not affect other vehicles. Damage caused by the Module is calculated by the following:
:distSq = (explodingModuleCenterX - targetModuleCenterX)^2 + (explodingModuleCenterY - targetModuleCenterY)^2
:damage = baseExplosionDamage / distSq^0.8
<div style="width:55%">
<pre>
{
  "explodeDmg": value,
}
</pre>
</div>
; fireHP
:HP required to chance engulfing the Module in fire.
<div style="width:55%">
<pre>
{
  "fireHP": value,
}
</pre>
</div>
; destroyedHP
:HP required before a Module is destroyed. Often used for monsters, where this value indicates a specific HP.
<div style="width:55%">
<pre>
{
  "destroyedHP": value,
}
</pre>
</div>
; collisionDamageReceivedMult
:Damage multiplier against the Module on Collision with another In-Game object.
<div style="width:55%">
<pre>
{
  "collisionDamageReceivedMult": value,
}
</pre>
</div>
; destroyEntireShipOnDestruction
:Destroys the entire craft on destruction of the Module.
<div style="width:55%">
<pre>
{
  "destroyEntireShipOnDestruction": true,
}
</pre>
</div>
; moveDelay
:Time it takes for crew to travel through the module.
<div style="width:55%">
<pre>
{
  "moveDelay": value,
}
</pre>
</div>
; weight
:Weight of the Module.
<div style="width:55%">
<pre>
{
  "weight": value,
}
</pre>
</div>
; cost
:Cost of the Module.
<div style="width:55%">
<pre>
{
  "cost": value,
}
</pre>
</div>
; coal
:How much Coal the Module holds.
<div style="width:55%">
<pre>
{
  "coal": value,
}
</pre>
</div>
; coalReload
:Time in milliseconds the Module needs to be re-supplied with Coal.
<div style="width:55%">
<pre>
{
  "coalReload": value,
}
</pre>
</div>
; command
:How much Command the Module generates.
:Command Points; 8000 + "Number of Crew" x 800 + "Number of Tiles" x 80
:Command Points generated per millisecond; (total command points from modules x 1.5) x 4
<div style="width:55%">
<pre>
{
  "command": value,
}
</pre>
</div>
; lift
:How much lift the Module generates.
<div style="width:55%">
<pre>
{
  "lift": value,
}
</pre>
</div>
; propulsion
:How much propulsion the Module generates.
<div style="width:55%">
<pre>
{
  "propulsion": value,
}
</pre>
</div>
; supplyProvided
:How much supply the Module generates.
<div style="width:55%">
<pre>
{
  "supplyProvided": value,
}
</pre>
</div>
; ammo
:How much ammo the Module generates.
<div style="width:55%">
<pre>
{
  "ammo": value,
}
</pre>
</div>
; water
:How much water the Module generates.
<div style="width:55%">
<pre>
{
  "water": value,
}
</pre>
</div>
; structuralStressAmount
:Structural Integrity the Module adds or removes; can be a negative number, lessening the Structural Integrity penalty.
<div style="width:55%">
<pre>
{
  "structuralStressAmount": value,
}
</pre>
</div>
; sickbay
:How many personnel may simultaneously heal in the Module.
<div style="width:55%">
<pre>
{
  "sickbay": value,
}
</pre>
</div>
; necromancy
:Allows the module to revive dead crewmates, paired with "sickbay".
<div style="width:55%">
<pre>
{
  "necromancy": t/f,
}
</pre>
</div>
; shipHPBonus
:How much bonus HP the Module provides to attached Modules.
<div style="width:55%">
<pre>
{
  "shipHPBonus": value,
}
</pre>
</div>
; adjacencyBonusStrength
:Additional HP provided through adjacency with another module.
<div style="width:55%">
<pre>
{
  "adjacencyBonusStrength": value,
}
</pre>
</div>
; accuracyBonus
:Accuracy bonus the Module provides, against deviation.
:Deviation = Final Shot Calculation
:Example; Crow's Nest + Telescope + Computer = shot_deviation*(0.8)^3
<div style="width:55%">
<pre>
{
  "accuracyBonus": value,
}
</pre>
</div>
; preventsBoarding
:Prevents Boarding of the Craft until the Module is destroyed.
<div style="width:55%">
<pre>
{
  "preventsBoarding": t/f,
}
</pre>
</div>
; crew
:Number of "sailor" required for the Module to function. Takes priority over "recommendedCrew".
<div style="width:55%">
<pre>
{
  "crew": value,
}
</pre>
</div>
; hangarPositions
:Positions Troops take within the Module, in Tiles. Most often seen on Aircraft Modules.
<div style="width:55%">
<pre>
{
  "hangarPositions": [
    {"x": value, "y": value },
  ]
}
</pre>
</div>
; recommendedCrew
:Recommended number of "sailor" for the module to function properly. For example; an additional "sailor" to deliver Ammunition or Coal. Takes priority over "optionalcrew".
<div style="width:55%">
<pre>
{
  "recommendedCrew": value,
}
</pre>
</div>
; optionalCrew
:Number of "sailor" populating the Module if no other higher priority Module exists.
<div style="width:55%">
<pre>
{
  "optionalCrew": value,
}
</pre>
</div>
; fixedGuards
:Number of "guard" required to protect the Module, takes priority over "recommendedGuards".
<div style="width:55%">
<pre>
{
  "fixedGuards": value,
}
</pre>
</div>
; recommendedGuards
:Number of "guard" recommended to protect the Module, taking priority over any module without the string.
<div style="width:55%">
<pre>
{
  "recommendedGuards": value,
}
</pre>
</div>
; maintenanceCost
:Maintenance Cost of the Module, applies against Income in Single Player.
<div style="width:55%">
<pre>
{
  "maintenanceCost": value,
}
</pre>
</div>
; quarters
:Number of personnel the "quartersType" generates.
<div style="width:55%">
<pre>
{
  "quarters": value,
}
</pre>
</div>
; quartersType
:Troops the Module houses.
:See data\CrewType for crew type files.
<div style="width:55%">
<pre>
{
  "quartersType": "value",
}
</pre>
</div>
----
===<u>Weapon Attributes</u>===
; hardness
:The damage of the physical Module in a collision scenario; intended for ramming.
<div style="width:55%">
<pre>
{
  "hardness": value,
}
</pre>
</div>
; maxXRange
:Maximum Range in pixels horizontally that the module can fire at a target.
<div style="width:55%">
<pre>
{
  "maxXRange": value,
}
</pre>
</div>
; minXRange
:Minimum Range in pixels horizontally that the module must be from the target to fire the weapon.
<div style="width:55%">
<pre>
{
  "minXRange": value,
}
</pre>
</div>
; maxUpRange
:Max Range in pixels that the Shot can reach vertically upwards.
<div style="width:55%">
<pre>
{
  "maxUpRange": value,
}
</pre>
</div>
; minUpRange
:Minimum Range in pixels vertically upwards that the module must be from the target to fire the weapon.
<div style="width:55%">
<pre>
{
  "minUpRange": value,
}
</pre>
</div>
; maxDownRange
:Max Range in pixels that the Shot can reach vertically downwards.
<div style="width:55%">
<pre>
{
  "maxDownRange": value,
}
</pre>
</div>
; minDownRange
:Minimum Range in pixels vertically downwards that the module must be from the target to fire the weapon.
<div style="width:55%">
<pre>
{
  "minDownRange": value,
}
</pre>
</div>
; shotSpeed
:How fast the Shot travels its trajectory in Tiles per millisecond.
<div style="width:55%">
<pre>
{
  "shotSpeed": value,
}
</pre>
</div>
; shotSpeedVariation
:Variation of shotSpeed for each Shot fired in Tiles per millisecond.
<div style="width:55%">
<pre>
{
  "shotSpeedVariation": value,
}
</pre>
</div>
; reload
:Time in milliseconds between shots.
<div style="width:55%">
<pre>
{
  "reload": value,
}
</pre>
</div>
; clip
:Number of Shots the Module can fire before needing a reload.
<div style="width:55%">
<pre>
{
  "clip": value,
}
</pre>
</div>
; ammoPerClip
:The ammo cost per clip reload. Not the amount of shots in a clip.
<div style="width:55%">
<pre>
{
  "ammoPerClip": value,
}
</pre>
</div>
; clipReloadTime
:Time it takes to reload the weapon, in milliseconds.
<div style="width:55%">
<pre>
{
  "clipReloadTime": value,
}
</pre>
</div>
; inaccuracy
:How inaccurate the Module is, before compensating "jitterMerge".
<div style="width:55%">
<pre>
{
  "inaccuracy": value,
}
</pre>
</div>
; jitterMerge
:How grouped Shots are, the bonus stacking in succession as the weapon remains firing. In percentage, 0.0 being extremely inaccurate and 1.0 always firing the same direction.
<div style="width:55%">
<pre>
{
  "jitterMerge": value,
}
</pre>
</div>
; numShots
:Number of projectiles in a single Shot. Example: the Grapeshot cannon.
<div style="width:55%">
<pre>
{
  "numShots": value,
}
</pre>
</div>
; multiShotJitter
:Jitter designed for "numShots". Only seen in the Grapeshot module. In percentage, 0.0 being extremely inaccurate and 1.0 always firing the same direction.
<div style="width:55%">
<pre>
{
  "multiShotJitter": value,
}
</pre>
</div>
; blastDmg
:Blast Damage caused by the Modules Shots.
<div style="width:55%">
<pre>
{
  "blastDmg": value,
}
</pre>
</div>
; blastSplashRadius
:Radius of the widened area of damage after a Shot hits the Target, in Pixels. Only seen accompanying "blastDmg".
<div style="width:55%">
<pre>
{
  "blastDmg"
  ...
  "blastSplashRadius": value,
}
</pre>
</div>
; penDmg
:Penetration Damage caused by the Modules Shots.
<div style="width:55%">
<pre>
{
  "penDmg": value,
}
</pre>
</div>
; directDmg
:Direct Damage dealt to the Target Module, without Armour penalties.
<div style="width:55%">
<pre>
{
  "directDmg": value,
}
</pre>
</div>
; shootTroopsRange
:Specifies the Module can Target Troops and at what range.
<div style="width:55%">
<pre>
{
  "shootTroopsRange": value,
}
</pre>
</div>
; fixedInaccuracyVsTroops
:Fixed Inaccuracy against Troops.
<div style="width:55%">
<pre>
{
  "fixedInaccuracyVsTroops": value,
}
</pre>
</div>
; recoilForce
:Reverse Propulsion caused by firing the Shot, in negative Tile value.
<div style="width:55%">
<pre>
{
  "recoilForce": value,
}
</pre>
</div>
; fireArc
:Direction and arc the Module fires.
:Values: forwards (right), backwards (left), up, down
<div style="width:55%">
<pre>
{
  "fireArc": { "direction": "value", "degrees": value },
}
</pre>
</div>
; optimumRange
:Distance from the Module that is optimal for the weapon, indicating how the AI should react to the Module.
<div style="width:55%">
<pre>
{
  "optimumRange": value,
}
</pre>
</div>
; muzzleCenterX
:Origin relative to the top left of the module indicating where the Shot spawns, X axis in Tiles.
:Position desired in pixels / Module width in pixels = "muzzleCenter" in Tiles
<div style="width:55%">
<pre>
{
  "muzzleCenterX": value,
}
</pre>
</div>
; muzzleCenterY
:Origin relative to the top left of the module indicating where the Shot spawns, Y axis in Tiles.
:Position desired in pixels / Module height in pixels = "muzzleCenter" in Tiles
<div style="width:55%">
<pre>
{
  "muzzleCenterY": value,
}
</pre>
</div>
; muzzleLength
:How far from the point indicated by "muzzleCenter" strings the shot should spawn, in Tiles.
<div style="width:55%">
<pre>
{
  "muzzleLength": value,
}
</pre>
</div>
----
===<u>Weapon Appearance Attributes</u>===
----
===<u>Audio Attributes</u>===
----
===<u>Track, Wheel, & Leg Attributes</u>===
----
===<u>Tentacle Attributes</u>===





Revision as of 05:39, 5 February 2023

Underconstruction.png This page is under construction. Please help review and edit this page.

The game can be modded using JSON files.

Watch this video on modding to get started: Airships Modding Tutorial Video


Modding Resources

Official Resources

Other Resources

(Contains useful information about specific attributes, but is otherwise outdated)

(To poke around the game's loadables)


JSON Information

The basic structure of an attribute is:

"Attribute": "value",

Where "Attribute" will be the attribute you want to add and "Value" is the value you want to set the attribute to.


There are three types of attributes used in ACTS modding:

"value" = string value
value = numerical value
t/f = true or false value


Some attributes can be given a list of values as well:

"AttributeValueList": { "value1", "value2", "value3" },


Appearance Attributes will require a spritesheet to get their graphics from.

1 Tile = 16 pixels, spritesheets are 63 x 63 tiles, or 1024 x 1024 pixels (Note that spritesheets are 63 x 63 because they start from 0. Meaning that x & y go from 0-63.)

When attributes require a coordinate on the spritesheet, the format is ( x , y ) or horizontal then vertical.

Both horizontal and vertical start from ( 0 , 0 ) on the top left and go to ( 63 , 63 ) on the bottom right.


Attribute List


Core Attributes

name
Module name referenced by the en.properties file and "flippedFrom" & "verticallyFlippedVersion" attributes.
In-Game displays this name in red when no language value is given.
{
  "name": "value",
}


flippedFrom
Creates horizontally flipped variation of referenced "name".
{
  "name": "value",
  "flippedFrom": "nameValue",
}


verticallyFlippedVersion
Creates vertically flipped variation of referenced "name".
{
  "name": "value",
  "verticallyFlippedVersion": "nameValue",
}


remove
Removes the specified "name" from the game.
Example use is removing modules from a conflicting mod.
{
  "name": "value",
  "remove": t/f,
}


categories
In-Game Editor Module Category. Setting this value blank will make the module valid without appearing in-game.
Vanilla categories: BASIC, COMMAND_AND_CREW, LIFT, PROPULSION, RESOURCES, WEAPONS, TROOPS, AIRCRAFT, STRUCTURAL, SOLID_SHAPES, STRUTS, DECORATIONS
Custom categories can be added by creating a ModuleCategory folder and creating a json file inside. See data/ModuleCategory/categories.json for reference.
{
  "categories": [ "value" ],
}


availableFor
Types of craft the Module is enabled for In-Game Editor. Engine defaults to all.
Default types: AIRSHIP, LANDSHIP, BUILDING
{
  "availableFor": [ "value" ],
}


required
Required Technology, City, or Charge bonus to build the Module in Single Player.
See data/Tech/ folder for Technology bonus files.
See data/Charge/ folder for Charge bonus files.
Miscellaneous bonus files: strategicEras.json, eraModifiers.json, specials.json, upgrades.json
{
  "required": "value",
}


w
Width of the Module in Tiles.
{
  "w": value,
}


h
Height of the Module in Tiles.
{
  "h": value,
}


Module Definition Attributes
Specifies the Modules property for AI Logic.
{
  "isExplosive": t/f, //Rockets, Bomb Bays, Grenades, etc.
  "isSail": t/f,      //Sails.
  "isWeapon": t/f,    //Required for all weapon modules.
  "isGun": t/f,       //All guns (Rifles, Cannons, Turrets, Sponsons, etc.)
  "isCannon": t/f,    //Turrets, Cannons, Suspendium Cannons, Flak Cannons, etc.
  "isRam": t/f,       //Rams.
}


aiMaxY
Sets the maximum height this module can go. Used to limit monster AI.
{
  "aiMaxY": value,
}


createsExceptionalCombatEventAfterMs
This String is often used with Monsters. Triggers the AI for the Module after a specified number of Milliseconds.
ex. A Module with Capture Troops will Capture. A Module with a Weapon will Fire. A Module with Legs will begin to Walk. etc.
{
  "createsExceptionalCombatEventAfterMs": value,
}


countsAsActiveCrew
Specifies the Module acts as an Active Crew Member, capable of performing Module tasks without Troops occupying the Module, allowing Interior vision of the Module, and preventing Defeat of the craft under certain Conditions.
{
  "countsAsActiveCrew": t/f,
}


instantlyDestroyed
Instantly removes the Module from the battle on destruction, allowing for animated or simplified death sequences from other connected Modules. Most often used on Monster Modules.
{
  "instantlyDestroyed": t/f,
}



Appearance Attributes

drawDoors
Specifies the Game Engine should not draw 1 Pixel vertical lines on the left and right edges of the Module.
{
  "drawDoors": t/f,
}


framesAreVariants
Uses given "frames" to randomize the "appearance" of a module.
{
  "framesAreVariants": t/f,
}


appearance
In-game graphic of the Module.
"src" is a spritesheet reference by filename without extension (.PNG).
"x" & "y" are the location on the spritesheet in Tiles.
"w" & "h" are the width and height of the module in Tiles.
"interval" is the time in milliseconds one "frames" cycles to the next "frames".
"frames" start on the first frame, increment down the list, and loop back to the first "frames".
{
  "appearance": { //One frame.
    "src": "value",  
    "x": value, 
    "y": value, 
    "w": value, 
    "h": value
  },
},

OR

{
  "appearance": { //More than one frame.
    "src": "value", 
    "interval": value,
    "frames": [
      { "x": value, "y": value, "w": value, "h": value },
      { "x": value, "y": value, "w": value, "h": value } 
    ]
  },
}


externalAppearances
Exterior graphic of the Module.
"src" is the spritesheet filename without extension (.PNG).
"x" & "y" are the location on the module in Tiles.
Refer to appearance for more information.
{
  "externalAppearances": [ //One frame.
    {
      "x": value,
      "y": value,
      "appearance": {
        "src": "value",
        "x": value,
        "y": value,
        "w": value,
        "h": value 
      }
    },
  ],
}

OR

{
  "externalAppearances": [ //More than one frame.
    {
      "x": value,
      "y": value,
      "appearance": {
        "src": "value",
        "interval": value,
        "frames": [
          { "x": value, "y": value, "w": value, "h": value },
          { "x": value, "y": value, "w": value, "h": value } 
        ] 
      }
    },
  ],
}


damagedExternalAppearances, destroyedExternalAppearances
Damaged and destroyed graphics of a Module.
Identical to externalAppearances in implementation, but define different frames for when a module is damaged or destroyed.
Refer to externalAppearances for more information.


depletedResourceAppearances
Resource-dependant graphics of a module.
Used alongside "appearance" to change the graphic of a module depending on how much of a resource is left. Used in the Coal Store, Small Coal Store, Fire Extinguisher, and Fire Point.
"src" is a spritesheet reference by filename without extension (.PNG).
"x" & "y" are the location on the spritesheet in Tiles.
"w" & "h" are the width and height of the module in Tiles.
{
  "appearance"
  ...
  "depletedResourceAppearances": [
    {
      "src": "value",
      "x": value,
      "y": value,
      "w": value,
      "h": value
    },
  ]
}


externalDrawPriority
Forces the Game Engine to draw "externalAppearances" over the Armor and other Modules. (ex. Legs, Tracks, & Sails)
{
  "externalDrawPriority": t/f,
}


lights
Lights on the interior of the Module, where "r" "g" & "b" are values on the color model, "radius" size of the light in pixels, and "x" & "y" location of the light on the module in Tiles.
{
  "lights": [ { //Normal lights.
    "x": value, 
    "y": value, 
    "r": value, 
    "g": value, 
    "b": value, 
    "radius": value
  } ],
}
{
  "damagedLights": [ { //Damaged module lights.
    "x": value, 
    "y": value, 
    "r": value, 
    "g": value, 
    "b": value, 
    "radius": value
  } ],
}


canParticlesStick
This string is often used for monsters. Used to prevent particles from sticking to the module.
{
  "canParticlesStick": t/f,
}


emitters
In-Game emitter graphic, generates stationary particles; where "x" & "y" location the particles spawn in Tiles, "type" the Particle Type, "emitProbabality" spawns per Millisecond, and "inside" specifying the particles should spawn within the interior of the Module.
See data\ParticleType folder for vanilla Particle types.
{
  "emitters": [ { //Normal emitters.
    "x": value, 
    "y": value, 
    "type": "value", 
    "emitProbability": value, 
    "inside": t/f 
  } ],
}
{
  "damagedEmitters": [ { //Damaged module emitters.
    "x": value, 
    "y": value, 
    "type": "value", 
    "emitProbability": value, 
    "inside": t/f 
  } ],
}
{
  "destroyedEmitters": [ { //Destroyed module emitters.
    "x": value, 
    "y": value, 
    "type": "value", 
    "emitProbability": value, 
    "inside": t/f 
  } ],
}


windows
Windows on the Module; where "x" & "y" are coordinate in Tile.
{
  "windows": [ 
    { 
      "x": value, 
      "y": value 
    }, 
    { 
      "x": value, 
      "y": value 
    },
  ],
}


hitParticle
The Particle the Module creates when hit.
{
  "hitParticle": "value",
}


destructionLength
Duration of a modules destruction, in Milliseconds, before being removed from battle. Often used with animated "destroyedExternalAppearance" with exception of the Kraken.
{
  "destructionLength": value,
}


destructionParticle
Particle(s) created when the Module is destroyed.
{
  "destructionParticle": "value",
}


destructionParticleDensity
Particle Density of "destructionParticle" value. (Only seen accompanying "destructionParticle".)
{
  "destructionParticleDensity": value,
}


hasGenericDestructionFragments
Removes generics explosive fragments that appear when a module is damaged/destroyed. Often used with with "damagedExternalAppearances" & "destroyedExternalAppearance".
{
  "hasGenericDestructionFragments": t/f,
}


fragmentsSpeedMult
Speed multiplier of Fragments that are spawned when the Module is destroyed. Only seen accompanying "destructionParticle".
{
  "destructionParticle"
  ...
  "fragmentsSpeedMult": value,
}


fragmentsDensity
Fragment Density of the Module when destroyed, creating multiple Fragments. Only seen accompanying "destructionParticle".
{
  "destructionParticle"
  ...
  "fragmentsDensity": value,
}


fragmentsFireMult
Speed multiplier of fire-spread speed through a module. Lower value equals slower fire spread and vice versa.
{
  "fragmentsFireMult": value,
}



Structure Attributes

Placement Restrictors
The Module cannot have another Module intersect with any Tile in the specified direction.
{
  //Entire side is restricted:
  "topOnly": t/f,
  "bottomOnly": t/f,
  "frontOnly": t/f,
  "backOnly": t/f,

  //Specific tile of a side is restricted:
  "topOnlyList": [ value ],
  "bottomOnlyList": [ value ],
  "frontOnlyList": [ value ],
  "backOnlyList": [ value ],
}


Module Doors
Defines which tiles connect to adjacent modules.
{
  "upDoors": [ value ],     //Defaults to no upDoors
  "leftDoors": [ value ],   //Defaults to all tiles.
  "rightDoors": [ value ],  //Defaults to all tiles.
}


canOccupy
Tiles in the Module personnel can occupy by coordinate in Tile.
{
  "canOccupy": [
    { "x": value, "y": value },
  ]
}



Resource Attributes

external
Specifies if the Module cannot be protected by armor. Removes all armor effects including graphics.
{
  "external": t/f,
}


armourType
Forced/Built-In Amour Type for the Module. String is often used with Monsters & Hatches where the Armor is invisible or subjective.
See data\ArmourType for armour type files.
{
  "armourType": "value",
}


hp
Modules Total Hit-Points; before adjacency, bonuses and armor.
{
  "hp": value,
}


explodeHP
HP required before the Module chances explosion; before adjacency, bonuses and armor.
{
  "explodeHP": value,
}


explodeDmg
Explode Damage inflicted by the Module to surrounding Modules when destroyed. Does not affect other vehicles. Damage caused by the Module is calculated by the following:
distSq = (explodingModuleCenterX - targetModuleCenterX)^2 + (explodingModuleCenterY - targetModuleCenterY)^2
damage = baseExplosionDamage / distSq^0.8
{
  "explodeDmg": value,
}


fireHP
HP required to chance engulfing the Module in fire.
{
  "fireHP": value,
}


destroyedHP
HP required before a Module is destroyed. Often used for monsters, where this value indicates a specific HP.
{
  "destroyedHP": value,
}


collisionDamageReceivedMult
Damage multiplier against the Module on Collision with another In-Game object.
{
  "collisionDamageReceivedMult": value,
}


destroyEntireShipOnDestruction
Destroys the entire craft on destruction of the Module.
{
  "destroyEntireShipOnDestruction": true,
}


moveDelay
Time it takes for crew to travel through the module.
{
  "moveDelay": value,
}


weight
Weight of the Module.
{
  "weight": value,
}


cost
Cost of the Module.
{
  "cost": value,
}


coal
How much Coal the Module holds.
{
  "coal": value,
}


coalReload
Time in milliseconds the Module needs to be re-supplied with Coal.
{
  "coalReload": value,
}


command
How much Command the Module generates.
Command Points; 8000 + "Number of Crew" x 800 + "Number of Tiles" x 80
Command Points generated per millisecond; (total command points from modules x 1.5) x 4
{
  "command": value,
}


lift
How much lift the Module generates.
{
  "lift": value,
}


propulsion
How much propulsion the Module generates.
{
  "propulsion": value,
}


supplyProvided
How much supply the Module generates.
{
  "supplyProvided": value,
}


ammo
How much ammo the Module generates.
{
  "ammo": value,
}


water
How much water the Module generates.
{
  "water": value,
}


structuralStressAmount
Structural Integrity the Module adds or removes; can be a negative number, lessening the Structural Integrity penalty.
{
  "structuralStressAmount": value,
}


sickbay
How many personnel may simultaneously heal in the Module.
{
  "sickbay": value,
}


necromancy
Allows the module to revive dead crewmates, paired with "sickbay".
{
  "necromancy": t/f,
}


shipHPBonus
How much bonus HP the Module provides to attached Modules.
{
  "shipHPBonus": value,
}


adjacencyBonusStrength
Additional HP provided through adjacency with another module.
{
  "adjacencyBonusStrength": value,
}


accuracyBonus
Accuracy bonus the Module provides, against deviation.
Deviation = Final Shot Calculation
Example; Crow's Nest + Telescope + Computer = shot_deviation*(0.8)^3
{
  "accuracyBonus": value,
}


preventsBoarding
Prevents Boarding of the Craft until the Module is destroyed.
{
  "preventsBoarding": t/f,
}


crew
Number of "sailor" required for the Module to function. Takes priority over "recommendedCrew".
{
  "crew": value,
}


hangarPositions
Positions Troops take within the Module, in Tiles. Most often seen on Aircraft Modules.
{
  "hangarPositions": [
    {"x": value, "y": value },
  ]
}


recommendedCrew
Recommended number of "sailor" for the module to function properly. For example; an additional "sailor" to deliver Ammunition or Coal. Takes priority over "optionalcrew".
{
  "recommendedCrew": value,
}


optionalCrew
Number of "sailor" populating the Module if no other higher priority Module exists.
{
  "optionalCrew": value,
}


fixedGuards
Number of "guard" required to protect the Module, takes priority over "recommendedGuards".
{
  "fixedGuards": value,
}


recommendedGuards
Number of "guard" recommended to protect the Module, taking priority over any module without the string.
{
  "recommendedGuards": value,
}


maintenanceCost
Maintenance Cost of the Module, applies against Income in Single Player.
{
  "maintenanceCost": value,
}


quarters
Number of personnel the "quartersType" generates.
{
  "quarters": value,
}


quartersType
Troops the Module houses.
See data\CrewType for crew type files.
{
  "quartersType": "value",
}



Weapon Attributes

hardness
The damage of the physical Module in a collision scenario; intended for ramming.
{
  "hardness": value,
}


maxXRange
Maximum Range in pixels horizontally that the module can fire at a target.
{
  "maxXRange": value,
}


minXRange
Minimum Range in pixels horizontally that the module must be from the target to fire the weapon.
{
  "minXRange": value,
}


maxUpRange
Max Range in pixels that the Shot can reach vertically upwards.
{
  "maxUpRange": value,
}


minUpRange
Minimum Range in pixels vertically upwards that the module must be from the target to fire the weapon.
{
  "minUpRange": value,
}


maxDownRange
Max Range in pixels that the Shot can reach vertically downwards.
{
  "maxDownRange": value,
}


minDownRange
Minimum Range in pixels vertically downwards that the module must be from the target to fire the weapon.
{
  "minDownRange": value,
}


shotSpeed
How fast the Shot travels its trajectory in Tiles per millisecond.
{
  "shotSpeed": value,
}


shotSpeedVariation
Variation of shotSpeed for each Shot fired in Tiles per millisecond.
{
  "shotSpeedVariation": value,
}


reload
Time in milliseconds between shots.
{
  "reload": value,
}


clip
Number of Shots the Module can fire before needing a reload.
{
  "clip": value,
}


ammoPerClip
The ammo cost per clip reload. Not the amount of shots in a clip.
{
  "ammoPerClip": value,
}


clipReloadTime
Time it takes to reload the weapon, in milliseconds.
{
  "clipReloadTime": value,
}


inaccuracy
How inaccurate the Module is, before compensating "jitterMerge".
{
  "inaccuracy": value,
}


jitterMerge
How grouped Shots are, the bonus stacking in succession as the weapon remains firing. In percentage, 0.0 being extremely inaccurate and 1.0 always firing the same direction.
{
  "jitterMerge": value,
}


numShots
Number of projectiles in a single Shot. Example: the Grapeshot cannon.
{
  "numShots": value,
}


multiShotJitter
Jitter designed for "numShots". Only seen in the Grapeshot module. In percentage, 0.0 being extremely inaccurate and 1.0 always firing the same direction.
{
  "multiShotJitter": value,
}


blastDmg
Blast Damage caused by the Modules Shots.
{
  "blastDmg": value,
}


blastSplashRadius
Radius of the widened area of damage after a Shot hits the Target, in Pixels. Only seen accompanying "blastDmg".
{
  "blastDmg"
  ...
  "blastSplashRadius": value,
}


penDmg
Penetration Damage caused by the Modules Shots.
{
  "penDmg": value,
}


directDmg
Direct Damage dealt to the Target Module, without Armour penalties.
{
  "directDmg": value,
}


shootTroopsRange
Specifies the Module can Target Troops and at what range.
{
  "shootTroopsRange": value,
}


fixedInaccuracyVsTroops
Fixed Inaccuracy against Troops.
{
  "fixedInaccuracyVsTroops": value,
}


recoilForce
Reverse Propulsion caused by firing the Shot, in negative Tile value.
{
  "recoilForce": value,
}


fireArc
Direction and arc the Module fires.
Values: forwards (right), backwards (left), up, down
{
  "fireArc": { "direction": "value", "degrees": value },
}


optimumRange
Distance from the Module that is optimal for the weapon, indicating how the AI should react to the Module.
{
  "optimumRange": value,
}


muzzleCenterX
Origin relative to the top left of the module indicating where the Shot spawns, X axis in Tiles.
Position desired in pixels / Module width in pixels = "muzzleCenter" in Tiles
{
  "muzzleCenterX": value,
}


muzzleCenterY
Origin relative to the top left of the module indicating where the Shot spawns, Y axis in Tiles.
Position desired in pixels / Module height in pixels = "muzzleCenter" in Tiles
{
  "muzzleCenterY": value,
}


muzzleLength
How far from the point indicated by "muzzleCenter" strings the shot should spawn, in Tiles.
{
  "muzzleLength": value,
}



Weapon Appearance Attributes


Audio Attributes


Track, Wheel, & Leg Attributes


Tentacle Attributes