Difference between revisions of "Modding"

From Airships Wiki
Jump to: navigation, search
(+track wheel and leg attributes >minFootY not defined, dunno what it does)
m (Spacing)
 
(19 intermediate revisions by the same user not shown)
Line 10: Line 10:
=== <u>Official Resources</u> ===
=== <u>Official Resources</u> ===


* [http://zarkonnen.com/airships/modding_guide Modding Introduction]
* [http://zarkonnen.com/airships/modding_guide Official Modding Guide]
* [http://zarkonnen.com/airships/how_to_draw_graphics/ Mod Graphic Drawing Tutorial]
** [http://zarkonnen.com/airships/modding_guide/introduction Modding Introduction]
* [http://zarkonnen.com/airships/peasant_revolt_mod/ Monster Nest Mod Example]
** [http://zarkonnen.com/airships/modding_guide/special_eras Special Eras]
* [http://zarkonnen.com/airships/modding_guide/bonusable_values Bonusable Values Guide]
** [http://zarkonnen.com/airships/modding_guide/workhouse City Upgrades]
* [http://zarkonnen.com/airships/modding_guide/special_eras Special Eras Modding Guide]
** [http://zarkonnen.com/airships/modding_guide/peasant_revolt Monster Nests]
* [http://zarkonnen.com/airships/modding_guide/crew_animation Crew Animation Guide]
** [http://zarkonnen.com/airships/modding_guide/crew_animation Crew Animation]
** [http://zarkonnen.com/airships/modding_guide/bonusable_values Bonusable Values]


=== <u>Other Resources</u> ===
=== <u>Other Resources</u> ===
Line 42: Line 43:
<div style="width:35%">
<div style="width:35%">
  <code>"AttributeValueList": { "value1", "value2", "value3" },</code>
  <code>"AttributeValueList": { "value1", "value2", "value3" },</code>
Or
<code>"AttributeValueList": [ "value1", "value2", "value3" ],</code>
Or
<code>"AttributeValueList": [ {"value1", "value2"}, {"value3", "value4"} ],</code>
Or
<code>"AttributeValueList": { "value1": ["value2"], ["value3"] },</code>
</div>
</div>


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


Range values used in "maxRange", "optimumRange", "maxUpRange", etc. Will use either pixels or meters for measurement.


In game, 7 pixels corresponds to 1 meter. So converting the JSON value to ingame range is just dividing the pixel value by 7 and rounding down.
Pixels for value:
- "maxXRange"
- "minXRange"
- "maxRange"
- "shootTroopsRange"
- "maxUpRange"
- "minUpRange"
- "maxDownRange"
- "minDownRange"
Meters for value:
- "optimumRange"


== Attribute List ==
== Attribute List ==
Line 69: Line 103:
{
{
   "name": "value",
   "name": "value",
}
</pre>
</div>
; patch
:Applies any code in the module file to an existing module with the same name.
:Primarily used by mods that need to overwrite or add code to existing modules.
<div style="width:55%">
<pre>
{
  "patch": t/f,
}
}
</pre>
</pre>
Line 98: Line 144:




; remove
; deriveFrom
:Removes the specified "name" from the game.
:Copies all the code used by the input module to the current module.
:Example use is removing modules from a conflicting mod.
:Used when the current module is the same as the input module and you only need to change one thing like appearance.
:Don't repeat yourself if you don't need to!
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "name": "value",
   "deriveFrom": "value",
  "remove": t/f,
}
}
</pre>
</pre>
Line 111: Line 157:




; categories
; variants
:In-Game Editor Module Category. Setting this value blank will make the module valid without appearing in-game.
:Defines what modules are variants of the current module.
:Vanilla categories: BASIC, COMMAND_AND_CREW, LIFT, PROPULSION, RESOURCES, WEAPONS, TROOPS, AIRCRAFT, STRUCTURAL, SOLID_SHAPES, STRUTS, DECORATIONS
<div style="width:55%">
:Custom categories can be added by creating a ModuleCategory folder and creating a json file inside. See data/ModuleCategory/categories.json for reference.
<pre>
<div style="width:55%">
<pre>
{
{
   "categories": [ "value" ],
   "variants": [ "value" ],
}
}
</pre>
</pre>
Line 124: Line 168:




; availableFor
; variantType
:Types of craft the Module is enabled for In-Game Editor. Engine defaults to all.
:Defines how the variants differ from the current module.
:Default types: AIRSHIP, LANDSHIP, BUILDING
:Current types: SIZES, ROTATED
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "availableFor": [ "value" ],
   "variantType": "value",
}
}
</pre>
</pre>
Line 136: Line 180:




; required
; remove
:Required Technology, City, or Charge bonus to build the Module in Single Player.
:Removes the specified "name" from the game.
:See data/Tech/ folder for Technology bonus files.
:Example use is removing modules from a conflicting mod.
:See data/Charge/ folder for Charge bonus files.
:Miscellaneous bonus files: strategicEras.json, eraModifiers.json, specials.json, upgrades.json
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "required": "value",
   "name": "value",
  "remove": t/f,
}
}
</pre>
</pre>
Line 150: Line 193:




; w
; categories
:Width of the Module in Tiles.
: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.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "w": value,
   "categories": [ "value" ],
}
}
</pre>
</pre>
Line 161: Line 206:




; h
; sort
:Height of the Module in Tiles.
:Determines the numerical position the module appears in on the editor list.
<div style="width:55%">
:The lower the number, the higher up in the list and vice versa.
<div style="width:55%">
<pre>
<pre>
{
{
   "h": value,
   "sort": value,
}
}
</pre>
</pre>
Line 172: Line 218:




; Module Definition Attributes
; availableFor
:Specifies the Modules property for AI Logic.
:Types of craft the Module is enabled for In-Game Editor. Engine defaults to all.
:Default types: AIRSHIP, LANDSHIP, BUILDING
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "isExplosive": t/f, //Rockets, Bomb Bays, Grenades, etc.
   "availableFor": [ "value" ],
  "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.
}
}
</pre>
</pre>
Line 188: Line 230:




; aiMaxY
; required
:Sets the maximum height this module can go. Used to limit monster AI.
: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
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "aiMaxY": value,
   "required": "value",
}
}
</pre>
</pre>
Line 199: Line 244:




; createsExceptionalCombatEventAfterMs
; w
:This String is often used with Monsters. Triggers the AI for the Module after a specified number of Milliseconds.
:Width of the Module in Tiles.
:ex. A Module with Capture Troops will Capture. A Module with a Weapon will Fire. A Module with Legs will begin to Walk. etc.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "createsExceptionalCombatEventAfterMs": value,
   "w": value,
}
}
</pre>
</pre>
Line 211: Line 255:




; countsAsActiveCrew
; h
: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.
:Height of the Module in Tiles.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "countsAsActiveCrew": t/f,
   "h": value,
}
}
</pre>
</pre>
Line 222: Line 266:




; instantlyDestroyed
; Module Definition Attributes
: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.
:Specifies the Modules property for AI Logic.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "instantlyDestroyed": t/f,
   "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.
}
}
</pre>
</pre>
Line 233: Line 282:




----
; aiMaxY
 
:Sets the maximum height this module can go. Used to limit monster AI.
===<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%">
<div style="width:55%">
<pre>
<pre>
{
{
   "drawDoors": t/f,
   "aiMaxY": value,
}
}
</pre>
</pre>
Line 248: Line 293:




; framesAreVariants
; createsExceptionalCombatEventAfterMs
:Uses given "frames" to randomize the "appearance" of a module.
: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.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "framesAreVariants": t/f,
   "createsExceptionalCombatEventAfterMs": value,
}
}
</pre>
</pre>
Line 259: Line 305:




; appearance
; countsAsActiveCrew
:In-game graphic of the Module.
: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.
:"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%">
<div style="width:55%">
<pre>
<pre>
{
{
   "appearance": { //One frame.
   "countsAsActiveCrew": t/f,
    "src": "value",
}
    "x": value,
</pre>
    "y": value,
</div>
    "w": value,
    "h": value
  },
},


OR


{
; instantlyDestroyed
  "appearance": { //More than one frame.
: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.
    "src": "value",
<div style="width:55%">
    "interval": value,
<pre>
    "frames": [
{
      { "x": value, "y": value, "w": value, "h": value },
  "instantlyDestroyed": t/f,
      { "x": value, "y": value, "w": value, "h": value }
    ]
  },
}
}
</pre>
</pre>
Line 294: Line 327:




; externalAppearances
; nonCombat
:Exterior graphic of the Module.
:Determines whether or not the ship the module is attached to appears in combat or not.
:"src" is the spritesheet filename without extension (.PNG).
:If the attached ship is intercepted it is instantly destroyed.
:"x" & "y" are the location on the module in Tiles.
:Used by the Supply Ships.
:Refer to appearance for more information.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "externalAppearances": [ //One frame.
   "nonCombat": t/f,
    {
}
      "x": value,
</pre>
      "y": value,
</div>
      "appearance": {
 
        "src": "value",
 
        "x": value,
----
        "y": value,
        "w": value,
        "h": value
      }
    },
  ],
}


OR
===<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>
{
{
   "externalAppearances": [ //More than one frame.
   "drawDoors": t/f,
    {
      "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>
</pre>
Line 339: Line 355:




; damagedExternalAppearances, destroyedExternalAppearances
; framesAreVariants
:Damaged and destroyed graphics of a Module.
:Uses given "frames" to randomize the "appearance" of a module.
:Identical to externalAppearances in implementation, but define different frames for when a module is damaged or destroyed.
<div style="width:55%">
:Refer to externalAppearances for more information.
<pre>
{
  "framesAreVariants": t/f,
}
</pre>
</div>




; depletedResourceAppearances
; appearance
:Resource-dependant graphics of a module.
:In-game graphic of the 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).
:"src" is a spritesheet reference by filename without extension (.PNG).
:"x" & "y" are the location on the spritesheet in Tiles.
:"x" & "y" are the location on the spritesheet in Tiles.
:"w" & "h" are the width and height of the module 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%">
<div style="width:55%">
<pre>
<pre>
{
{
   "appearance"
   "appearance": { //One frame.
   ...
    "src": "value", 
   "depletedResourceAppearances": [
    "x": value,
     {
    "y": value,
      "src": "value",
    "w": value,
       "x": value,
    "h": 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>
</pre>
Line 370: Line 401:




; externalDrawPriority
; mask
:Forces the Game Engine to draw "externalAppearances" over the Armor and other Modules. (ex. Legs, Tracks, & Sails)
:Defines the armor placement and hitbox of a module by using a sprite.
:"x" and "y" are the top-left coordinates of the sprite.
:From there it will use the already-defined width and height.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "externalDrawPriority": t/f,
   "mask": { "x": value, "y": value },
}
}
</pre>
</pre>
Line 381: Line 414:




; lights
; externalAppearances
: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.
: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%">
<div style="width:55%">
<pre>
<pre>
{
{
   "lights": [ { //Normal lights.
   "externalAppearances": [ //One frame.
     "x": value,  
     {
    "y": value,  
      "x": value,
    "r": value,  
      "y": value,
    "g": value,  
      "appearance": {
    "b": value,  
        "src": "value",
    "radius": value
        "x": value,
   } ],
        "y": value,
        "w": value,
        "h": value  
      }
    },
   ],
}
}
OR
{
{
   "damagedLights": [ { //Damaged module lights.
   "externalAppearances": [ //More than one frame.
     "x": value,  
     {
    "y": value,  
      "x": value,
    "r": value,  
      "y": value,
    "g": value,  
      "appearance": {
    "b": value,  
        "src": "value",
    "radius": value
        "interval": value,
   } ],
        "frames": [
          { "x": value, "y": value, "w": value, "h": value },
          { "x": value, "y": value, "w": value, "h": value }
        ]
      }
    },
   ],
}
}
</pre>
</pre>
Line 409: Line 459:




; canParticlesStick
; damagedExternalAppearances, destroyedExternalAppearances
:This string is often used for monsters. Used to prevent particles from sticking to the module.
: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%">
<div style="width:55%">
<pre>
<pre>
{
{
   "canParticlesStick": t/f,
   "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>
</pre>
Line 420: Line 501:




; emitters
; lights
: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.
: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.
:See data\ParticleType folder for vanilla Particle types.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "emitters": [ { //Normal emitters.
   "lights": [ { //Normal lights.
     "x": value,  
     "x": value,  
     "y": value,  
     "y": value,  
     "type": "value",  
     "r": value,
     "emitProbability": value,  
    "g": value,  
     "inside": t/f
     "b": value,  
     "radius": value
   } ],
   } ],
}
}
{
{
   "damagedEmitters": [ { //Damaged module emitters.
   "damagedLights": [ { //Damaged module lights.
     "x": value,  
     "x": value,  
     "y": value,  
     "y": value,  
     "type": "value",  
     "r": value,  
     "emitProbability": value,  
     "g": value,  
     "inside": t/f
     "b": value,  
  } ],
     "radius": value
}
{
  "destroyedEmitters": [ { //Destroyed module emitters.
    "x": value,  
     "y": value,
    "type": "value",
    "emitProbability": value,
    "inside": t/f
   } ],
   } ],
}
}
Line 456: Line 529:




; windows
; canParticlesStick
:Windows on the Module; where "x" & "y" are coordinate in Tile.
:This string is often used for monsters. Used to prevent particles from sticking to the module.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "windows": [
   "canParticlesStick": t/f,
    {
      "x": value,
      "y": value
    },
    {
      "x": value,
      "y": value
    },
  ],
}
}
</pre>
</pre>
Line 476: Line 540:




; hitParticle
; emitters
:The Particle the Module creates when hit.
: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%">
<div style="width:55%">
<pre>
<pre>
{
{
   "hitParticle": "value",
   "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
  } ],
}
}
</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,
   "destroyedEmitters": [ { //Destroyed module emitters.
    "x": value,
    "y": value,
    "type": "value",
    "emitProbability": value,
    "inside": t/f
  } ],
}
}
</pre>
</pre>
Line 498: Line 576:




; destructionParticle
; windows
:Particle(s) created when the Module is destroyed.
:Windows on the Module; where "x" & "y" are coordinate in Tile.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "destructionParticle": "value",
   "windows": [
}
    {
</pre>
      "x": value,
</div>
      "y": value
    },
    {
      "x": value,
      "y": value
    },
  ],
}
</pre>
</div>




; destructionParticleDensity
; hitParticle
:Particle Density of "destructionParticle" value. (Only seen accompanying "destructionParticle".)
:The Particle the Module creates when hit.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "destructionParticleDensity": value,
   "hitParticle": "value",
}
}
</pre>
</pre>
Line 520: Line 607:




; hasGenericDestructionFragments
; destructionLength
:Removes generics explosive fragments that appear when a module is damaged/destroyed. Often used with with "damagedExternalAppearances" & "destroyedExternalAppearance".
: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%">
<div style="width:55%">
<pre>
<pre>
{
{
   "hasGenericDestructionFragments": t/f,
   "destructionLength": value,
}
}
</pre>
</pre>
Line 531: Line 618:




; fragmentsSpeedMult
; destructionParticle
:Speed multiplier of Fragments that are spawned when the Module is destroyed. Only seen accompanying "destructionParticle".
:Particle(s) created when the Module is destroyed.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "destructionParticle"
   "destructionParticle": "value",
  ...
  "fragmentsSpeedMult": value,
}
}
</pre>
</pre>
Line 544: Line 629:




; fragmentsDensity
; destructionParticleDensity
:Fragment Density of the Module when destroyed, creating multiple Fragments. Only seen accompanying "destructionParticle".
:Particle Density of "destructionParticle" value. (Only seen accompanying "destructionParticle".)
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "destructionParticle"
   "destructionParticleDensity": value,
  ...
  "fragmentsDensity": value,
}
}
</pre>
</pre>
Line 557: Line 640:




; fragmentsFireMult
; hasGenericDestructionFragments
:Speed multiplier of fire-spread speed through a module. Lower value equals slower fire spread and vice versa.
:Removes generics explosive fragments that appear when a module is damaged/destroyed. Often used with with "damagedExternalAppearances" & "destroyedExternalAppearance".
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "fragmentsFireMult": value,
   "hasGenericDestructionFragments": t/f,
}
}
</pre>
</pre>
Line 568: Line 651:




----
; 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>


===<u>Structure Attributes</u>===


; Placement Restrictors
; fragmentsDensity
:The Module cannot have another Module intersect with any Tile in the specified direction.
:Fragment Density of the Module when destroyed, creating multiple Fragments. Only seen accompanying "destructionParticle".
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
  //Entire side is restricted:
   "destructionParticle"
  "topOnly": t/f,
   ...
  "bottomOnly": t/f,
   "fragmentsDensity": value,
  "frontOnly": t/f,
   "backOnly": t/f,
 
   //Specific tile of a side is restricted:
  "topOnlyList": [ value ],
  "bottomOnlyList": [ value ],
  "frontOnlyList": [ value ],
   "backOnlyList": [ value ],
}
}
</pre>
</pre>
Line 593: Line 677:




; Module Doors
; fragmentsFireMult
:Defines which tiles connect to adjacent modules.
:Speed multiplier of fire-spread speed through a module. Lower value equals slower fire spread and vice versa.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "upDoors": [ value ],     //Defaults to no upDoors
   "fragmentsFireMult": value,
  "leftDoors": [ value ],  //Defaults to all tiles.
  "rightDoors": [ value ],  //Defaults to all tiles.
}
}
</pre>
</pre>
Line 606: Line 688:




; canOccupy
; drawAppearanceInside
:Tiles in the Module personnel can occupy by coordinate in Tile.
:Determines whether or not the game renders the internal sprite of the module.
:Used on module w/o an internal sprite like the rams or external weapons.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "canOccupy": [
   "drawAppearanceInside": t/f,
    { "x": value, "y": value },
  ]
}
}
</pre>
</pre>
Line 619: Line 700:




----
; drawExternalsWhenInside
 
:Determines whether or not the external appearance of a module is rendered when viewing the internal sprite.
===<u>Resource Attributes</u>===
:Used by external weapons.
 
<div style="width:55%">
; external
<pre>
:Specifies if the Module cannot be protected by armor. Removes all armor effects including graphics.
<div style="width:55%">
<pre>
{
{
   "external": t/f,
   "drawExternalsWhenInside": t/f,
}
}
</pre>
</pre>
Line 634: Line 712:




; armourType
; drawExternalsBelowDecals
:Forced/Built-In Amour Type for the Module. String is often used with Monsters & Hatches where the Armor is invisible or subjective.
:Determines whether or not the external appearance is rendered below decals.
:See data\ArmourType for armour type files.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "armourType": "value",
   "drawExternalsBelowDecals": t/f,
}
}
</pre>
</pre>
Line 646: Line 723:




; hp
; externalSubColor
:Modules Total Hit-Points; before adjacency, bonuses and armor.
:Specifies an RGB color on the sprite that can be changed to another color in the editor.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "hp": value,
   "externalSubColor": { "r": value, "g": value, "b": value },
}
}
</pre>
</pre>
Line 657: Line 734:




; explodeHP
; externalSubBaseColor
:HP required before the Module chances explosion; before adjacency, bonuses and armor.
:Defines the base color of the externalSubColor.
:The color of the material beneath the paint.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "explodeHP": value,
   "externalSubBaseColor": { "r": value, "g": value, "b": value },
}
}
</pre>
</pre>
Line 668: Line 746:




; 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
===<u>Structure Attributes</u>===
:damage = baseExplosionDamage / distSq^0.8
 
; Placement Restrictors
:The Module cannot have another Module intersect with any Tile in the specified direction.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "explodeDmg": value,
  //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>
</pre>
Line 681: Line 771:




; fireHP
; Module Doors
:HP required to chance engulfing the Module in fire.
:Defines which tiles connect to adjacent modules.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "fireHP": value,
   "upDoors": [ value ],     //Defaults to no upDoors
  "leftDoors": [ value ],  //Defaults to all tiles.
  "rightDoors": [ value ],  //Defaults to all tiles.
}
}
</pre>
</pre>
Line 692: Line 784:




; destroyedHP
; canOccupy
:HP required before a Module is destroyed. Often used for monsters, where this value indicates a specific HP.
:Tiles in the Module personnel can occupy by coordinate in Tile.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "destroyedHP": value,
   "canOccupy": [
    { "x": value, "y": value },
  ]
}
}
</pre>
</pre>
Line 703: Line 797:




; collisionDamageReceivedMult
; gunPortsCreateDrag
:Damage multiplier against the Module on Collision with another In-Game object.
:Defines whether or not the module creates drag.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "collisionDamageReceivedMult": value,
   "gunPortsCreateDrag": t/f,
}
}
</pre>
</pre>
Line 714: Line 808:




; destroyEntireShipOnDestruction
; producesHorizontalDrag
:Destroys the entire craft on destruction of the Module.
:Determines whether a module produces horizontal drag or not.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "destroyEntireShipOnDestruction": true,
   "producesHorizontalDrag": t/f,
}
}
</pre>
</pre>
Line 725: Line 819:




; moveDelay
; extraVerticalAirFriction
:Time it takes for crew to travel through the module.
:incomplete *
:Only used by the Shellwalker.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "moveDelay": value,
   "extraVerticalAirFriction": value,
}
}
</pre>
</pre>
Line 736: Line 831:




; weight
; targetAttractivenessMult
:Weight of the Module.
:Determines how likely the AI is to prioritize this module over another one.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "weight": value,
   "targetAttractivenessMult": value,
}
}
</pre>
</pre>
Line 747: Line 842:




; cost
----
:Cost of the Module.
 
===<u>Resource Attributes</u>===
 
; external
:Specifies if the Module cannot be protected by armor.
:Removes all armor effects including graphics.
:External modules do not produce drag.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "cost": value,
   "external": t/f,
}
}
</pre>
</pre>
Line 758: Line 859:




; coal
; armourType
:How much Coal the Module holds.
: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%">
<div style="width:55%">
<pre>
<pre>
{
{
   "coal": value,
   "armourType": "value",
}
}
</pre>
</pre>
Line 769: Line 871:




; coalReload
; hp
:Time in milliseconds the Module needs to be re-supplied with Coal.
:Modules Total Hit-Points; before adjacency, bonuses and armor.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "coalReload": value,
   "hp": value,
}
}
</pre>
</pre>
Line 780: Line 882:




; command
; explodeHP
:How much Command the Module generates.
:HP required before the Module chances explosion; before adjacency, bonuses and armor.
: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%">
<div style="width:55%">
<pre>
<pre>
{
{
   "command": value,
   "explodeHP": value,
}
}
</pre>
</pre>
Line 793: Line 893:




; lift
; explodeDmg
:How much lift the Module generates.
: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%">
<div style="width:55%">
<pre>
<pre>
{
{
   "lift": value,
   "explodeDmg": value,
}
}
</pre>
</pre>
Line 804: Line 906:




; propulsion
; fireHP
:How much propulsion the Module generates.
:HP required to chance engulfing the Module in fire.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "propulsion": value,
   "fireHP": value,
}
}
</pre>
</pre>
Line 815: Line 917:




; supplyProvided
; destroyedHP
:How much supply the Module generates.
:HP required before a Module is destroyed. Often used for monsters, where this value indicates a specific HP.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "supplyProvided": value,
   "destroyedHP": value,
}
}
</pre>
</pre>
Line 826: Line 928:




; ammo
; runsWhenDestroyed
:How much ammo the Module generates.
:The ship the Module was attached to will run away if the Module is destroyed.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "ammo": value,
   "runsWhenDestroyed": t/f,
}
}
</pre>
</pre>
Line 837: Line 939:




; water
; collisionDamageReceivedMult
:How much water the Module generates.
:Damage multiplier against the Module on Collision with another In-Game object.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "water": value,
   "collisionDamageReceivedMult": value,
}
}
</pre>
</pre>
Line 848: Line 950:




; structuralStressAmount
; destroyEntireShipOnDestruction
:Structural Integrity the Module adds or removes; can be a negative number, lessening the Structural Integrity penalty.
:Destroys the entire craft on destruction of the Module.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "structuralStressAmount": value,
   "destroyEntireShipOnDestruction": true,
}
}
</pre>
</pre>
Line 859: Line 961:




; sickbay
; moveDelay
:How many personnel may simultaneously heal in the Module.
:Time it takes for crew to travel through the module.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "sickbay": value,
   "moveDelay": value,
}
}
</pre>
</pre>
Line 870: Line 972:




; necromancy
; weight
:Allows the module to revive dead crewmates, paired with "sickbay".
:Weight of the Module.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "necromancy": t/f,
   "weight": value,
}
}
</pre>
</pre>
Line 881: Line 983:




; shipHPBonus
; firedWeightDecrease
:How much bonus HP the Module provides to attached Modules.
:How much the module's weight decreases after it's weapon is fired.
:Utilized by single-use weapons like Kinetic Bombs.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "shipHPBonus": value,
   "firedWeightDecrease": value,
}
}
</pre>
</pre>
Line 892: Line 995:




; adjacencyBonusStrength
; cost
:Additional HP provided through adjacency with another module.
:Cost of the Module.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "adjacencyBonusStrength": value,
   "cost": value,
}
}
</pre>
</pre>
Line 903: Line 1,006:




; accuracyBonus
; coal
:Accuracy bonus the Module provides, against deviation.
:How much Coal the Module holds.
:Deviation = Final Shot Calculation
:Example; Crow's Nest + Telescope + Computer = shot_deviation*(0.8)^3
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "accuracyBonus": value,
   "coal": value,
}
}
</pre>
</pre>
Line 916: Line 1,017:




; preventsBoarding
; coalReload
:Prevents Boarding of the Craft until the Module is destroyed.
:Time in milliseconds the Module needs to be re-supplied with Coal.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "preventsBoarding": t/f,
   "coalReload": value,
}
}
</pre>
</pre>
Line 927: Line 1,028:




; crew
; command
:Number of "sailor" required for the Module to function. Takes priority over "recommendedCrew".
: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%">
<div style="width:55%">
<pre>
<pre>
{
{
   "crew": value,
   "command": value,
}
}
</pre>
</pre>
Line 938: Line 1,041:




; hangarPositions
; extraCommandPointsRequired
:Positions Troops take within the Module, in Tiles. Most often seen on Aircraft Modules.
:incomplete *
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "hangarPositions": [
   "extraCommandPointsRequired": value,
    {"x": value, "y": value },
  ]
}
}
</pre>
</pre>
Line 951: Line 1,052:




; recommendedCrew
; fleetCommandBonus
:Recommended number of "sailor" for the module to function properly. For example; an additional "sailor" to deliver Ammunition or Coal. Takes priority over "optionalcrew".
:Applies a fleet-wide command resource bonus during combat.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "recommendedCrew": value,
   "fleetCommandBonus": value,
}
}
</pre>
</pre>
Line 962: Line 1,063:




; optionalCrew
; lift
:Number of "sailor" populating the Module if no other higher priority Module exists.
:How much lift the Module generates.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "optionalCrew": value,
   "lift": value,
}
}
</pre>
</pre>
Line 973: Line 1,074:




; fixedGuards
; usesSuspendium
:Number of "guard" required to protect the Module, takes priority over "recommendedGuards".
:Defines whether or not the module uses Suspendium.
:Used by the Suspendium Disruptor to target Suspendium modules.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "fixedGuards": value,
   "usesSuspendium": t/f,
}
}
</pre>
</pre>
Line 984: Line 1,086:




; recommendedGuards
; propulsion
:Number of "guard" recommended to protect the Module, taking priority over any module without the string.
:How much propulsion the Module generates.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "recommendedGuards": value,
   "propulsion": value,
}
}
</pre>
</pre>
Line 995: Line 1,097:




; maintenanceCost
; supplyProvided
:Maintenance Cost of the Module, applies against Income in Single Player.
:How much supply the Module generates.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "maintenanceCost": value,
   "supplyProvided": value,
}
}
</pre>
</pre>
Line 1,006: Line 1,108:




; quarters
; supplyRequired
:Number of personnel the "quartersType" generates.
:How much supply is required by the Module.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "quarters": value,
   "supplyRequired": value,
}
}
</pre>
</pre>
Line 1,017: Line 1,119:




; quartersType
; extraSupplyCapacity
:Troops the Module houses.
:Additional supply storage capacity for the Module.
:See data\CrewType for crew type files.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "quartersType": "value",
   "extraSupplyCapacity": value,
}
}
</pre>
</pre>
Line 1,029: Line 1,130:




----
; ammo
 
:How much ammo the Module generates.
===<u>Weapon Attributes</u>===
 
; hardness
:The damage of the physical Module in a collision scenario; intended for ramming.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "hardness": value,
   "ammo": value,
}
}
</pre>
</pre>
Line 1,044: Line 1,141:




; maxXRange
; water
:Maximum Range in pixels horizontally that the module can fire at a target.
:How much water the Module generates.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "maxXRange": value,
   "water": value,
}
}
</pre>
</pre>
Line 1,055: Line 1,152:




; minXRange
; repair
:Minimum Range in pixels horizontally that the module must be from the target to fire the weapon.
:How much repair tools the Module generates.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "minXRange": value,
   "repair": value,
}
}
</pre>
</pre>
Line 1,066: Line 1,163:




; maxUpRange
; structuralStressAmount
:Max Range in pixels that the Shot can reach vertically upwards.
:Structural Integrity the Module adds or removes; can be a negative number, lessening the Structural Integrity penalty.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "maxUpRange": value,
   "structuralStressAmount": value,
}
}
</pre>
</pre>
Line 1,077: Line 1,174:




; minUpRange
; sickbay
:Minimum Range in pixels vertically upwards that the module must be from the target to fire the weapon.
:How many personnel may simultaneously heal in the Module.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "minUpRange": value,
   "sickbay": value,
}
}
</pre>
</pre>
Line 1,088: Line 1,185:




; maxDownRange
; necromancy
:Max Range in pixels that the Shot can reach vertically downwards.
:Allows the module to revive dead crewmates, paired with "sickbay".
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "maxDownRange": value,
   "necromancy": t/f,
}
}
</pre>
</pre>
Line 1,099: Line 1,196:




; minDownRange
; shipHPBonus
:Minimum Range in pixels vertically downwards that the module must be from the target to fire the weapon.
:How much bonus HP the Module provides to attached Modules.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "minDownRange": value,
   "shipHPBonus": value,
}
}
</pre>
</pre>
Line 1,110: Line 1,207:




; shotSpeed
; adjacencyBonusStrength
:How fast the Shot travels its trajectory in Tiles per millisecond.
:Additional HP provided through adjacency with another module.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "shotSpeed": value,
   "adjacencyBonusStrength": value,
}
}
</pre>
</pre>
Line 1,121: Line 1,218:




; shotSpeedVariation
; accuracyBonus
:Variation of shotSpeed for each Shot fired in Tiles per millisecond.
: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%">
<div style="width:55%">
<pre>
<pre>
{
{
   "shotSpeedVariation": value,
   "accuracyBonus": value,
}
}
</pre>
</pre>
Line 1,132: Line 1,231:




; reload
; preventsBoarding
:Time in milliseconds between shots.
:Prevents Boarding of the Craft until the Module is destroyed.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "reload": value,
   "preventsBoarding": t/f,
}
}
</pre>
</pre>
Line 1,143: Line 1,242:




; clip
; preventsSurrender
:Number of Shots the Module can fire before needing a reload.
:Prevents Surrender of the Craft until the Module is destroyed.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "clip": value,
   "preventsSurrender": t/f,
}
}
</pre>
</pre>
Line 1,154: Line 1,253:




; ammoPerClip
; crew
:The ammo cost per clip reload. Not the amount of shots in a clip.
:Number of "sailor" required for the Module to function. Takes priority over "recommendedCrew".
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "ammoPerClip": value,
   "crew": value,
}
}
</pre>
</pre>
Line 1,165: Line 1,264:




; clipReloadTime
; hangarPositions
:Time it takes to reload the weapon, in milliseconds.
:Positions Troops take within the Module, in Tiles. Most often seen on Aircraft Modules.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "clipReloadTime": value,
   "hangarPositions": [
    {"x": value, "y": value },
  ]
}
}
</pre>
</pre>
Line 1,176: Line 1,277:




; inaccuracy
; recommendedCrew
:How inaccurate the Module is, before compensating "jitterMerge".
: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%">
<div style="width:55%">
<pre>
<pre>
{
{
   "inaccuracy": value,
   "recommendedCrew": value,
}
}
</pre>
</pre>
Line 1,187: Line 1,288:




; jitterMerge
; optionalCrew
: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.
:Number of "sailor" populating the Module if no other higher priority Module exists.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "jitterMerge": value,
   "optionalCrew": value,
}
}
</pre>
</pre>
Line 1,198: Line 1,299:




; numShots
; fixedGuards
:Number of projectiles in a single Shot. Example: the Grapeshot cannon.
:Number of "guard" required to protect the Module, takes priority over "recommendedGuards".
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "numShots": value,
   "fixedGuards": value,
}
}
</pre>
</pre>
Line 1,209: Line 1,310:




; multiShotJitter
; recommendedGuards
: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.
:Number of "guard" recommended to protect the Module, taking priority over any module without the string.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "multiShotJitter": value,
   "recommendedGuards": value,
}
}
</pre>
</pre>
Line 1,220: Line 1,321:




; blastDmg
; maintenanceCost
:Blast Damage caused by the Modules Shots.
:Maintenance Cost of the Module, applies against Income in Single Player.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "blastDmg": value,
   "maintenanceCost": value,
}
}
</pre>
</pre>
Line 1,231: Line 1,332:




; blastSplashRadius
; quarters
:Radius of the widened area of damage after a Shot hits the Target, in Pixels. Only seen accompanying "blastDmg".
:Number of personnel the "quartersType" generates.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "blastDmg"
   "quarters": value,
  ...
  "blastSplashRadius": value,
}
}
</pre>
</pre>
Line 1,244: Line 1,343:




; penDmg
; quartersType
:Penetration Damage caused by the Modules Shots.
:Troops the Module houses.
:See data\CrewType for crew type files.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "penDmg": value,
   "quartersType": "value",
}
}
</pre>
</pre>
Line 1,255: Line 1,355:




; directDmg
; planeLaunchSpeedBonus
:Direct Damage dealt to the Target Module, without Armour penalties.
:Modifies plane launch speed by the given value.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "directDmg": value,
   "planeLaunchSpeedBonus": value,
}
}
</pre>
</pre>
Line 1,266: Line 1,366:




; shootTroopsRange
; canGivePlaneCommands
:Specifies the Module can Target Troops and at what range.
:Allows the ship to which the module is attached to give orders to friendly aircraft.  
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "shootTroopsRange": value,
   "canGivePlaneCommands": t/f,
}
}
</pre>
</pre>
Line 1,277: Line 1,377:




; fixedInaccuracyVsTroops
; planeRearmBonus
:Fixed Inaccuracy against Troops.
:Modifies plane re-arming speed by the given value.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "fixedInaccuracyVsTroops": value,
   "planeRearmBonus": value,
}
}
</pre>
</pre>
Line 1,288: Line 1,388:




; recoilForce
; planeRepairBonus
:Reverse Propulsion caused by firing the Shot, in negative Tile value.
:Modifies plane repair speed by the given value.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "recoilForce": value,
   "planeRepairBonus": value,
}
}
</pre>
</pre>
Line 1,299: Line 1,399:




; fireArc
----
:Direction and arc the Module fires.
 
:Values: forwards (right), backwards (left), up, down
===<u>Weapon Attributes</u>===
 
; hardness
:The damage of the physical Module in a collision scenario; intended for ramming.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "fireArc": { "direction": "value", "degrees": value },
   "hardness": value,
}
}
</pre>
</pre>
Line 1,311: Line 1,414:




; optimumRange
; maxXRange
:Distance from the Module that is optimal for the weapon, indicating how the AI should react to the Module.
:Maximum Range in pixels horizontally that the module can fire at a target.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "optimumRange": value,
   "maxXRange": value,
}
}
</pre>
</pre>
Line 1,322: Line 1,425:




; muzzleCenterX
; minXRange
:Origin relative to the top left of the module indicating where the Shot spawns, X axis in Tiles.
:Minimum Range in pixels horizontally that the module must be from the target to fire the weapon.
:Position desired in pixels / Module width in pixels = "muzzleCenter" in Tiles
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "muzzleCenterX": value,
   "minXRange": value,
}
}
</pre>
</pre>
Line 1,334: Line 1,436:




; muzzleCenterY
; maxUpRange
:Origin relative to the top left of the module indicating where the Shot spawns, Y axis in Tiles.
:Max Range in pixels that the Shot can reach vertically upwards.
:Position desired in pixels / Module height in pixels = "muzzleCenter" in Tiles
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "muzzleCenterY": value,
   "maxUpRange": value,
}
}
</pre>
</pre>
Line 1,346: Line 1,447:




; muzzleLength
; minUpRange
:How far from the point indicated by "muzzleCenter" strings the shot should spawn, in Tiles.
:Minimum Range in pixels vertically upwards that the module must be from the target to fire the weapon.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "muzzleLength": value,
   "minUpRange": value,
}
}
</pre>
</pre>
Line 1,357: Line 1,458:




----
; maxDownRange
 
:Max Range in pixels that the Shot can reach vertically downwards.
===<u>Weapon Appearance Attributes</u>===
<div style="width:55%">
<pre>
{
  "maxDownRange": value,
}
</pre>
</div>


; weaponAppearance
:In-Game graphic of the Shot & Barrel.
:<u>"shot":</u>
:"src" is a spritesheet reference by filename without extension (.PNG)
:"x" & "y" is the location on the spritesheet in pixels
:"w" & "h" are the pixel dimensions of the graphic In-Game - where center is rotation.


:"shotAnimationInterval" is Time in milliseconds one "frames" cycles to the next.
; 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>


:<u>"shotFrames":</u>
:"src" is a spritesheet reference by filename without extension (.PNG)
:"x" & "y" is the location on the spritesheet in pixels
:"w" & "h" are the pixel dimensions of the graphic In-Game.


:<u>"barrelAnimation":</u>
; optimumRange
:Where "interval" is time in milliseconds one "frames" cycles to the next
:Distance from the Module in meters that is optimal for the weapon, indicating how the AI should react to the Module.
:"loop" indicates the weapon's animation should reset after having been fired
<div style="width:55%">
:"finishLoopCycle" indicates whether the animation should always complete its loop after being started
<pre>
:"loopConstantly" indicates "frames" will cycle continuously
{
:"msPerShot" is the amount of animation in milliseconds that one Shot causes
  "optimumRange": value,
::<u>"frames":</u>  
}
::"src" is a spritesheet reference by filename without extension (.PNG)
</pre>
::"x" & "y" is the location on the spritesheet in pixels
</div>
::"w" & "h" are the pixel dimensions of the graphic In-Game.
 
:"loop" set to true & by itself, without "finishLoopCycle" & "loopConstantly";
:where firing the weapon will simply advance the animation by "msPerShot" frames.
:If set to false, the animation will reset to the first frame after every shot fired, resuming by playing msPerShot frames.
:Please keep in mind not all values are necessary and could have various results. ex. Removing "barrel" from the script.


:<u>"back"':</u>
; maxRange
:"src" is a spritesheet reference by filename without extension (.PNG)
:Maximum range in pixels the weapon can fire.
:"x" & "y" is the location on the spritesheet in pixels
<div style="width:55%">
:"w" & "h" are the pixel dimensions of the graphic In-Game.
<pre>
{
  "maxRange": value,
}
</pre>
</div>


:"hitExplosionSize" & "missExplosionSize" are the size of the In-Game explosion graphic, in Tiles.
:In decimal: ex. #.##


:"barrelX" is position horizontally from the top left the barrel of the Module in Pixels.
; shootTroopsRange
:Rotation position desired in pixels on the spritesheet X - ("w" aka Barrel Width Pixels / 2) = "barrelX"
:Specifies the Module can Target Troops and at what range in pixels.
:In decimal: ex. #.##
<div style="width:55%">
<pre>
{
  "shootTroopsRange": value,
}
</pre>
</div>


:"barrelY" is position vertically from the top left of the barrel in the Module in Pixels.
:Rotation position desired in pixels on the spritesheet Y - ("h" aka Barrel Height Pixels / 2) = "barrelY"
:In decimal: ex. #.##


:"recoil" is pixels the "barrel" graphic moves when a Shot is fired.
; fixedInaccuracyVsTroops
 
:Fixed Inaccuracy against Troops.
:"shotEmitter" generates stationary particles from Shots; "type" the Particle Type, and "emitProbabality" spawns per millisecond.
:In decimal: ex. #.##
 
:<u>"exhaust"</u> is animated particles from the Shot:
:"type" is the Particle Type
:"p" is the probability per miliseconds
:"backOffset" is how far backward (left) they are spawned from the center in pixels
:"angleRange" is the radians it will animate from center (0 being perfect line, pie 180 degrees, 2pie any direction)
:"randomOffset" is the offset in pixels any direction
:"speedMin" & "speedMax" are the speed at which the exhaust moves in pixels per millisecond.
 
:Note: While frames are present in the script; values are not necessary and may cause errors in achieving a desired animation result. ie "barrel" vs "barrelAnimation"
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "weaponAppearance": {
   "fixedInaccuracyVsTroops": value,
    "shot": { "src": "value", "x": value, "y": value, "w": value, "h": value },
}
    "shotAnimationInterval": 1000,
</pre>
    "shotFrames": [
</div>
      { "src": "value", "x": value, "y": value, "w": value, "h": value },
 
      { "src": "value", "x": value, "y": value, "w": value, "h": value }
 
    ],
; shotSpeed
    "barrel": { "src": "value", "x": value, "y": value, "w": value, "h": value },
:How fast the Shot travels its trajectory in Tiles per millisecond.
    "barrelAnimation": {
<div style="width:55%">
      "interval": 1000,
<pre>
      "loop": true,
{
      "finishLoopCycle": false,
  "shotSpeed": value,
      "loopConstantly": true,
}
      "msPerShot": 1000,
</pre>
      "frames": [
</div>
        { "src": "value", "x": value, "y": value, "w": value, "h": value },
        { "src": "value", "x": value, "y": value, "w": value, "h": value }
      ]
    },
    "back": { "src": "value", "x": value, "y": value, "w": value, "h": value },
    "hitExplosionSize": value,
    "missExplosionSize": value,
    "barrelX": value,
    "barrelY": value,
    "recoil": value,
    "shotEmitter": { "type": "value", "emitProbability": value },
    "exhaust": {
      "type": "value",
      "p": value,
      "backOffset": value,
      "angleRange": value,
      "randomOffset": value,
      "speedMin": value,
      "speedMax": value
    }
  },
}
</pre>
</div>




; muzzleFlash
; shotSpeedVariation
:Removes In-Game graphic for the muzzle flash for the module.
:Variation of shotSpeed for each Shot fired in Tiles per millisecond.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "muzzleFlash": t/f,
   "shotSpeedVariation": value,
}
}
</pre>
</pre>
Line 1,475: Line 1,546:




 
; reload
----
:Time in milliseconds between shots.
 
===<u>Audio Attributes</u>===
 
; doesCreak
:Defines whether the module can creak. Primarily used to prevent monsters from creaking.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "doesCreak": t/f,
   "reload": value,
}
}
</pre>
</pre>
Line 1,491: Line 1,557:




; soundEvery
; clip
:How often the Shot sound is looped while the Shot is continuously firing, in Milliseconds.
:Number of Shots the Module can fire before needing a reload.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "soundEvery": value,
   "clip": value,
}
}
</pre>
</pre>
Line 1,502: Line 1,568:




; fireSound
; ammoPerClip
:<u>"fireSound":</u>
:The ammo cost per clip reload. Not the amount of shots in a clip.
:"layers" is the number of varying Sound Tracks that exist in the Sound Mix
:"variations" are different Audio/Sounds nested within a specific "layer" without extension (.OGG)
:"volume" is the Minimum and Maximum Volume modifier the "variations" could play at
:"pitch" is the Minimum and Maximum Pitch modifier the "variations" could be altered to.
:"distance" defines the volume with respect to the distance from the module, see distance attribute for more information.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "fireSound":
   "ammoPerClip": value,
    "layers": [ {
}
      "variations": [ "value" ],  
</pre>
      "volume": { "min": value, "max": value }, OR { "value": value, "distance": [...] },
</div>
      "pitch": { "min": value, "max": value }, OR { "min": value, "max": value, "distance": [...] },
 
    } ],
 
; clipReloadTime
:Time it takes to reload the weapon, in milliseconds.
<div style="width:55%">
<pre>
{
  "clipReloadTime": value,
}
}
</pre>
</pre>
Line 1,523: Line 1,590:




; distance
; canResupplyInCombat
:Defines the volume with respect to the distance from the module
:Determines whether the weapon can be reloaded during combat.
:"value1" is the distance (0 is closest to module)
:"value2" is the volume value (1 to 0)
:"distance" is attached to "volume" or "pitch" attributes:
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
    "volume": {
  "canResupplyInCombat": t/f,
        "value": value,
}
        "distance": [
</pre>
            value1, value2,
</div>
            value1, value2,
 
            value1, value2
 
        ]
; inaccuracy
    }
:How inaccurate the Module is, before compensating "jitterMerge".
   
<div style="width:55%">
    "pitch": {
<pre>
        "min": value, "max": value,
{
        "distance": [
  "inaccuracy": value,
            value1, value2,
            value1, value2,
            value1, value2
        ]
    }
}
}
</pre>
</pre>
Line 1,553: Line 1,612:




; runningLoop
; inaccuracyFromWeather
:<u>"runningLoop":</u>
:Determines if a weapon's accuracy is affected by weather conditions.
:"layers" is the number of varying Sound Tracks that exist in the Sound Mix
:"variations" are different Audio/Sounds nested within a specific "layer" without extension (.OGG)
:"volume" the Minimum and Maximum Volume modifier the "variations" could play at
::"onViewingSide" defines the volume between the internal and external view of a module, where value1 = 1 (internal) or 0 (external), and value2 is the volume value
::"xSpeed" & "ySpeed" define the volume with respect to X and Y movement, where value1 is the movement in the X or Y axis, and value2 is the volume value
:"pitch" the Minimum and Maximum Pitch modifier the "variations" could be altered to
::"xSpeed" & "ySpeed" define the volume with respect to X and Y movement, where value1 is the movement in the X or Y axis, and value2 is the volume value
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "runningLoop": {  
  "inaccuracyFromWeather": t/f,
     "layers": [ {  
}
       "variations": [ "value" ],  
</pre>
       "volume": {  
</div>
         "value": value,  
 
         "onViewingSide": [  
 
             value1, value2,  
; jitterMerge
             value1, value2  
: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.
         ],  
:Zarkonnen - 'Deviation from the intended target coordinate is calculated independently for the x-axis and y-axis, so it does all of this twice. It calculates the deviation magnitude and then multiplies this with a random gaussian value that has an average of 0 and a standard deviation of 1.
         "xSpeed": [  
 
             value1, value2,  
:x = targetX + gaussian() * deviationMagnitude
             value1, value2,  
:y = targetY + gaussian() * deviationMagnitude
             value1, value2  
 
         ],
:The basic deviation magnitude is calculated as follows:
         "ySpeed": [  
::weapon inaccuracy * distance to target in pixels * 16
             value1, value2,  
:This is then modified by:
             value1, value2,  
::The "precise gunnery" bonus, if present and applicable, halves the deviation magnitude.
             value1, value2  
::The accuracy bonus from crow's nests, telescopes and targeting computers. Each of them is only applied once, so if you have two telescopes it counts as if it were one. The bonuses are added together, so if you have all three, you have 10% (Crow's Nest) + 30% (Telescope) + 30% (Targeting Computer) = 70% bonus, which means the deviation magnitude is reduced by 70%.
         ],
::Shooting at ships in fog triples the deviation magnitude.
       },   
::Various WeatherEffects can increase the deviation magnitude. For example, dawn doubles the deviation magnitude when shooting from left to right, and night doubles it under all conditions.
       "pitch": {  
 
         "value": value,  
:OptimumRange has no effect on these calculations and is only used by the AI to position its ships.
         "xSpeed": [  
 
             value1, value2,  
:JitterMerge works by taking the previous deviation and mixing it with the new deviation. So if the jitterMerge is 0.5, the final deviation will be half the newly calculated one and half the previous one. This means that weapons like Gatling guns have their deviation drift around rather than being completely different each time, which would look odd.'
             value1, value2,  
<div style="width:55%">
             value1, value2  
<pre>
         ],
{
         "ySpeed": [  
  "jitterMerge": value,
             value1, value2,  
}
             value1, value2,  
</pre>
             value1, value2  
</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>
 
 
; splashFriendlyFire
:Determines whether the blastDmg's splash deals friendly damage (Friendly ships and the Current ship).
<div style="width:55%">
<pre>
{
  "splashFriendlyFire": t/f,
}
</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>
 
 
; destroySuspendiumInRadius
:The radius around the shot hit where Suspendium is instantly destroyed.
<div style="width:55%">
<pre>
{
  "destroySuspendiumInRadius": value,
}
</pre>
</div>
 
 
; recoilForce
:Reverse Propulsion caused by firing the Shot, in negative Tile value.
<div style="width:55%">
<pre>
{
  "recoilForce": value,
}
</pre>
</div>
 
 
; impactForce
:Reverse Propulsion generated on an enemy ship when the shot hits them.
<div style="width:55%">
<pre>
{
  "impactForce": 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>
 
 
; obeysFireMode
:Determines whether the weapon obeys the ship's fire mode.
<div style="width:55%">
<pre>
{
  "obeysFireMode": t/f,
}
</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>
 
 
; guidanceSystem
:An attribute for creating missile-type weapons.
:"launchAngle" *
:"launchSpeed" *
:"launchLength" *
:"acceleration" *
:"topSpeed" *
:"turnSpeed" *
:"proximityFuseDistance" *
:"missileLockTime" *
:"missileLockLossAngle" *
<div style="width:55%">
<pre>
{
  "guidanceSystem": {
    "launchAngle": value,
    "launchSpeed": value,
    "launchLength": value,
    "acceleration": value,
    "topSpeed": value,
    "turnSpeed": value,
    "proximityFuseDistance": value,
    "missileLockTime": value,
    "missileLockLossAngle": value
  }
}
</pre>
</div>
 
 
; tetherSpec
:The appearance and stats of the tether used by the module.
:<u>"color":</u>
:"r", "g", "b" define the rgb color value of the tether's rope.
 
:"maxRange" *
:"tearForce" *
:"minLength" *
:"shrinkSpeed" *
:"k" *
:"anchorX" *
:"anchorY" *
:"width" *
 
:<u>"ripSound":</u>
:"layers" *
:"variations" *
:"volume" *
:"pitch" *
 
:"ripParticle" *
<div style="width:55%">
<pre>
{
  "tetherSpec": {
    "color": {"r": value, "g": value, "b": value},
    "maxRange": value,
    "tearForce": value,
    "minLength": value
    "shrinkSpeed": value,
    "k": value,
    "anchorX": value,
    "anchorY": value,
    "width": value,
    "ripSound": {
      "layers": [
        {
          "variations": [ "value" ],
          "volume":  {
            "min": value,
            "max": value
          },
          "pitch": {
            "min": value,
            "max": value
          }
        }
      ]
    },
    "ripParticle": "value"
  },
}
</pre>
</div>
 
 
; beamSpec
:The appearance and stats of the beam used by the module.
:"fadeInTime" *
:"steadyTime" *
:"fadeOutTime" *
:"moveDistance" *
 
:<u>"lightClr":</u>
:"r", "g", "b" *
 
:"lightRadius" *
 
:<u>"emitBloomClr":</u>
:"r", "g", "b" *
 
:"emitBloomRadius" *
:"hitParticle" *
:"hitParticleProbability" *
 
:<u>"subBeams":</u>
:"clr":
::"r", "g", "b" *
::"a" *
:"width" *
:"flickerAmount" *
:"prevFlickerProportion" *
:"texture":
::"src" *
::"x", "y" *
::"w", "h" *
:"textureSpeed" *
<div style="width:55%">
<pre>
{
  "beamSpec": {
    "fadeInTime": value,
    "steadyTime": value,
    "fadeOutTime": value,
    "moveDistance": value,
    "lightClr": { "r": value "g": value, "b": value },
    "lightRadius": value,
    "emitBloomClr": { "r": value, "g": value, "b": value },
    "emitBloomRadius": value,
    "hitParticle": "value",
    "hitParticleProbability": value,
    "subBeams": [
      {
        "clr": { "r": value, "g": value, "b": value, "a": value},
        "width": value
        "flickerAmount": value,
        "prevFlickerProportion": value,
        "texture": { "src": "value", "x": value, "y": value, "w": value, "h": value },
        "textureSpeed": value
      },
    ]
  },
}
</pre>
</div>
 
 
----
 
===<u>Weapon Appearance Attributes</u>===
 
; weaponAppearance
:In-Game graphic of the Shot & Barrel.
:<u>"shot":</u>
:"src" is a spritesheet reference by filename without extension (.PNG)
:"x" & "y" is the location on the spritesheet in pixels
:"w" & "h" are the pixel dimensions of the graphic In-Game - where center is rotation.
 
:"shotAnimationInterval" is Time in milliseconds one "frames" cycles to the next.
 
:<u>"shotFrames":</u>
:"src" is a spritesheet reference by filename without extension (.PNG)
:"x" & "y" is the location on the spritesheet in pixels
:"w" & "h" are the pixel dimensions of the graphic In-Game.
 
:<u>"barrelAnimation":</u>
:Where "interval" is time in milliseconds one "frames" cycles to the next
:"loop" indicates the weapon's animation should reset after having been fired
:"finishLoopCycle" indicates whether the animation should always complete its loop after being started
:"loopConstantly" indicates "frames" will cycle continuously
:"msPerShot" is the amount of animation in milliseconds that one Shot causes
::<u>"frames":</u>
::"src" is a spritesheet reference by filename without extension (.PNG)
::"x" & "y" is the location on the spritesheet in pixels
::"w" & "h" are the pixel dimensions of the graphic In-Game.
:"loop" set to true & by itself, without "finishLoopCycle" & "loopConstantly";
:where firing the weapon will simply advance the animation by "msPerShot" frames.
:If set to false, the animation will reset to the first frame after every shot fired, resuming by playing msPerShot frames.
:Please keep in mind not all values are necessary and could have various results. ex. Removing "barrel" from the script.
 
:<u>"back"':</u>
:"src" is a spritesheet reference by filename without extension (.PNG)
:"x" & "y" is the location on the spritesheet in pixels
:"w" & "h" are the pixel dimensions of the graphic In-Game.
 
:"hitExplosionSize" & "missExplosionSize" are the size of the In-Game explosion graphic, in Tiles.
:In decimal: ex. #.##
 
:"barrelX" is position horizontally from the top left the barrel of the Module in Pixels.
:Rotation position desired in pixels on the spritesheet X - ("w" aka Barrel Width Pixels / 2) = "barrelX"
:In decimal: ex. #.##
 
:"barrelY" is position vertically from the top left of the barrel in the Module in Pixels.
:Rotation position desired in pixels on the spritesheet Y - ("h" aka Barrel Height Pixels / 2) = "barrelY"
:In decimal: ex. #.##
 
:"recoil" is pixels the "barrel" graphic moves when a Shot is fired.
 
:"shotEmitter" generates stationary particles from Shots; "type" the Particle Type, and "emitProbabality" spawns per millisecond.
:In decimal: ex. #.##
 
:<u>"exhaust"</u> is animated particles from the Shot:
:"type" is the Particle Type
:"p" is the probability per miliseconds
:"backOffset" is how far backward (left) they are spawned from the center in pixels
:"angleRange" is the radians it will animate from center (0 being perfect line, pie 180 degrees, 2pie any direction)
:"randomOffset" is the offset in pixels any direction
:"speedMin" & "speedMax" are the speed at which the exhaust moves in pixels per millisecond.
 
:<u>"barrelLoadStages":</u> *
:"src" *
:"x", "y" *
:"w", "h" *
 
:"fireVibrate" *
:"fireVibrateDecay" *
 
:<u>"shells":</u> *
:"img":
::"src" *
::"x", "y" *
::"w", "h" *
:"internalImg":
::"src" *
::"x", "y" *
::"w", "h" *
:"pivotX" *
:"pivotY" *
:"x", "y" *
:"openAngle" *
:"startOpenTimeBeforeFiring" *
:"endOpenTimeBeforeFiring" *
:"startCloseTimeAfterFiring" *
:"endCloseTimeAfterFiring" *
:"shellClosedPenAbsorb", "shellClosedBlastAbsorb" *
:"openEmitters", "closeEmitters": *
::"type" *
::"emitPoints" *
:"openSound", "closeSound": *
::"variations" *
::"volume" *
::"pitch" *
 
:Note: While frames are present in the script; values are not necessary and may cause errors in achieving a desired animation result. ie "barrel" vs "barrelAnimation"
<div style="width:55%">
<pre>
{
  "weaponAppearance": {
    "shot": { "src": "value", "x": value, "y": value, "w": value, "h": value },
    "shotAnimationInterval": 1000,
    "shotFrames": [
      { "src": "value", "x": value, "y": value, "w": value, "h": value },
      { "src": "value", "x": value, "y": value, "w": value, "h": value }
    ],
    "barrel": { "src": "value", "x": value, "y": value, "w": value, "h": value },
    "barrelAnimation": {
      "interval": 1000,
      "loop": true,
      "finishLoopCycle": false,
      "loopConstantly": true,
      "msPerShot": 1000,
      "frames": [
        { "src": "value", "x": value, "y": value, "w": value, "h": value },
        { "src": "value", "x": value, "y": value, "w": value, "h": value }
      ]
    },
    "back": { "src": "value", "x": value, "y": value, "w": value, "h": value },
    "hitExplosionSize": value,
    "missExplosionSize": value,
    "barrelX": value,
    "barrelY": value,
    "recoil": value,
    "shotEmitter": { "type": "value", "emitProbability": value },
    "exhaust": {
      "type": "value",
      "p": value,
      "backOffset": value,
      "angleRange": value,
      "randomOffset": value,
      "speedMin": value,
      "speedMax": value
    }
    "barrelLoadStages": [
      { "src": "value", "x": value, "y": value, "w": value, "h": value },
      { "src": "value", "x": value, "y": value, "w": value, "h": value }
    ],
    "fireVibrate": value,
    "fireVibrateDecay": value,
    "shells": [
      {
        "img": { "src": "value", "x": value, "y": value, "w": value, "h": value },
        "internalImg": { "src": "value", "x": value, "y": value, "w": value, "h": value },
        "pivotX": value,
        "pivotY": value,
        "x": value,
        "y": value,
        "openAngle": value,
        "startOpenTimeBeforeFiring": value,
        "endOpenTimeBeforeFiring": value,
        "startCloseTimeAfterFiring": value,
        "endCloseTimeAfterFiring": value,
        "shellClosedPenAbsorb": value,
        "shellClosedBlastAbsorb": value,
        "openEmitters": [
          {
            "type": "value",
            "emitPoints": [ value, value ]
          }
        ],
        "closeEmitters": [
          {
            "type": "value",
            "emitPoints": [ value, value ]
          }
        ],
        "openSound": {
          "layers": [
            {
              "variations": [ "value" ],
              "volume": { "min": value, "max": value },
              "pitch": { "min": value, "max": value }
            }
          ]
        }
        "closeSound": {
          "layers": [
            {
              "variations": [ "value" ],
              "volume": { "min": value, "max": value },
              "pitch": { "min": value, "max": value }
            }
          ]
        },
      },
    ],
  },
}
</pre>
</div>
 
 
; muzzleFlash
:Removes In-Game graphic for the muzzle flash for the module.
<div style="width:55%">
<pre>
{
  "muzzleFlash": t/f,
}
</pre>
</div>
 
 
; impactParticle
:The particle that is emitted when the weapon's projectile hits a target.
<div style="width:55%">
<pre>
{
  "impactParticle": "value",
}
</pre>
</div>
 
 
; numImpactParticles
:The amount of impact particles generated when the weapon's projectile hits a target.
<div style="width:55%">
<pre>
{
  "numImpactParticles": value,
}
</pre>
</div>
 
 
; onlyShowBarrelIfLoaded
:Only shows the barrel of the weapon (see weaponAppearance) when the weapon is fully loaded.
<div style="width:55%">
<pre>
{
  "onlyShowBarrelIfLoaded": t/f,
}
</pre>
</div>
 
 
----
 
===<u>Audio Attributes</u>===
 
; doesCreak
:Defines whether the module can creak. Primarily used to prevent monsters from creaking.
<div style="width:55%">
<pre>
{
  "doesCreak": t/f,
}
</pre>
</div>
 
 
; destructionSound
:The sound the module makes when it is destroyed; primarily used by monsters.
:"layers" is the number of varying Sound Tracks that exist in the Sound Mix
:"variations" are different Audio/Sounds nested within a specific "layer" without extension (.OGG)
:"volume" is the Minimum and Maximum Volume modifier the "variations" could play at
:"pitch" is the Minimum and Maximum Pitch modifier the "variations" could be altered to.
:"distance" defines the volume with respect to the distance from the module, see distance attribute for more information.
<div style="width:55%">
<pre>
{
  "destructionSound": {
    "layers": [ {
    "variations": ["value"],
    "volume": value,
    "pitch": { "min": value, "max": value }
  } ] }
}
</pre>
</div>
 
 
; playDestructionSoundAtStartOfDestruction
:Plays the destructionSound of the module at the start of its destruction rather than at the end of it.
<div style="width:55%">
<pre>
{
  "playDestructionSoundAtStartOfDestruction": t/f,
}
</pre>
</div>
 
 
; soundEvery
:How often the Shot sound is looped while the Shot is continuously firing, in Milliseconds.
<div style="width:55%">
<pre>
{
  "soundEvery": value,
}
</pre>
</div>
 
 
; fireSound
:The sound the weapon makes whenever it fires.
:"layers" is the number of varying Sound Tracks that exist in the Sound Mix
:"variations" are different Audio/Sounds nested within a specific "layer" without extension (.OGG)
:"volume" is the Minimum and Maximum Volume modifier the "variations" could play at
:"pitch" is the Minimum and Maximum Pitch modifier the "variations" could be altered to.
:"distance" defines the volume with respect to the distance from the module, see distance attribute for more information.
<div style="width:55%">
<pre>
{
  "fireSound": 
    "layers": [ {
      "variations": [ "value" ],
      "volume": { "min": value, "max": value }, OR { "value": value, "distance": [...] },
      "pitch": { "min": value, "max": value }, OR { "min": value, "max": value, "distance": [...] },
    } ],
}
</pre>
</div>
 
 
; hitSound
:The sound the projectile of the weapon makes when it hits a target.
:"layers" is the number of varying Sound Tracks that exist in the Sound Mix
:"variations" are different Audio/Sounds nested within a specific "layer" without extension (.OGG)
:"volume" is the Minimum and Maximum Volume modifier the "variations" could play at
:"pitch" is the Minimum and Maximum Pitch modifier the "variations" could be altered to.
<div style="width:55%">
<pre>
{
  "hitSound": {
    "layers": [ {
    "variations": ["value"],
    "volume": value,
    "pitch": { "min": value, "max": value }
  } ] }
}
</pre>
</div>
 
 
; distance
:Defines the volume with respect to the distance from the module
:"value1" is the distance (0 is closest to module)
:"value2" is the volume value (1 to 0)
:"distance" is attached to "volume" or "pitch" attributes:
<div style="width:55%">
<pre>
{
    "volume": {
        "value": value,
        "distance": [
            value1, value2,
            value1, value2,
            value1, value2
        ]
    }
   
    "pitch": {
        "min": value, "max": value,
        "distance": [
            value1, value2,
            value1, value2,
            value1, value2
        ]
    }
}
</pre>
</div>
 
 
; runningLoop
:<u>"runningLoop":</u>
:"layers" is the number of varying Sound Tracks that exist in the Sound Mix
:"variations" are different Audio/Sounds nested within a specific "layer" without extension (.OGG)
:"volume" the Minimum and Maximum Volume modifier the "variations" could play at
::"onViewingSide" defines the volume between the internal and external view of a module, where value1 = 1 (internal) or 0 (external), and value2 is the volume value
::"xSpeed" & "ySpeed" define the volume with respect to X and Y movement, where value1 is the movement in the X or Y axis, and value2 is the volume value
:"pitch" the Minimum and Maximum Pitch modifier the "variations" could be altered to
::"xSpeed" & "ySpeed" define the volume with respect to X and Y movement, where value1 is the movement in the X or Y axis, and value2 is the volume value
<div style="width:55%">
<pre>
{
   "runningLoop": {  
     "layers": [ {  
       "variations": [ "value" ],  
       "volume": {  
         "value": value,  
         "onViewingSide": [  
             value1, value2,  
             value1, value2  
         ],  
         "xSpeed": [  
             value1, value2,  
             value1, value2,  
             value1, value2  
         ],
         "ySpeed": [  
             value1, value2,  
             value1, value2,  
             value1, value2  
         ],
       },   
       "pitch": {  
         "value": value,  
         "xSpeed": [  
             value1, value2,  
             value1, value2,  
             value1, value2  
         ],
         "ySpeed": [  
             value1, value2,  
             value1, value2,  
             value1, value2  
         ],
       }  
       }  
     } ]  
     } ]  
  },
}
</pre>
</div>
 
 
----
 
===<u>Track, Wheel, & Leg Attributes</u>===
 
; springs
:Springs on the Module controlling how close the module can get to the ground through kinematic (bouncy) calculation
:"xOffset" is the location in Tiles on the X axis
:"length" is how far from the bottom of the Module the calculation exists in Pixels
:"minCompressedLength" is the length the calculation is allowed to reduce (a.k.a. spring) in Pixels
:"k" is the the kinematic strength (a.k.a. bounciness).
<div style="width:55%">
<pre>
{
  "springs": [ {
    "xOffset": value,
    "length": value,
    "minCompressedLength": value,
    "k": value
  } ],
}
</pre>
</div>
 
 
; wheels
:Wheels on the Module
:"xOffset" is the location in Tiles on the X Axis
:"maxYOffset" is the max amount the wheel can displace in Pixels on the Y Axis
:"radius" is the distance from the center of the Wheel in Pixels
:"segmentStride" is how much the element animates/rotates in Pixels while moving.
 
:<u>"wheel":</u>
:"src" is a spritesheet reference by filename without extension (.PNG)
:"x" & "y" are the location on the spritesheet in Pixels
:"w" & "h" are the width and the height of the Wheel in Pixels.
 
:<u>"lowerLink":</u>
:"src" is a spritesheet reference by filename without extension (.PNG)
:"x" & "y" are the location on the spritesheet in Pixels
:"w" & "h" are the width and the height of the Wheel in Pixels.
 
:<u>"upperLink":</u>
:"src" is a spritesheet reference by filename without extension (.PNG)
:"x" & "y" are the location on the spritesheet in Pixels
:"w" & "h" are the width and the height of the Wheel in Pixels.
<div style="width:55%">
<pre>
{
  "wheels": [ {
    "xOffset": value,
    "maxYOffset": value,
    "radius": value,
    "segmentStride": value,
    "wheel": {
      "src": "value",
      "x": value,
      "y": value,
      "w": value,
      "h": value
    },
    "lowerLink": {
      "src": "value",
      "x": value,
      "y": value,
      "w": value,
      "h": value
    },
    "upperLink": {
      "src": "value",
      "x": value,
      "y": value,
      "w": value,
      "h": value
    }
  } ],
}
</pre>
</div>
 
 
; legs
:<u>"legs":</u>
:"back" specifies the graphic that appears in front or behind the module
:"xOffset" position on the Module in Tiles on the X Axis
:"yOffset" position on the Module in Tiles on the Y Axis
:"limbLength" the animation length of a single limb (of an equally length 2-limb Leg)
:"footWidth" animation Width of the Foot calculated for animation & collision
:"footHeight" animation Height of the Foot calculated for animation & collision
:"stepLength" distance covered in while animating in Pixels
:"maxStepTime" the duration a movement animation cycles in milliseconds
:"bendForwards" specifies whether the Leg is bending forwards or backwards in reference to the module
:"minFootY" *
 
:See springs attribute for further information on springs.
 
:<u>"upperLeg":</u>
:"src" is a spritesheet reference by filename without extension (.PNG)
:"x" & "y" are the location on the spritesheet in Pixels
:"w" & "h" are the width and height of the Leg on the spritesheet in Pixels.
 
:<u>"lowerLeg":</u>
:"src" is a spritesheet reference by filename without extension (.PNG)
:"x" & "y" are the location on the spritesheet in Pixels
:"w" & "h" are the width and height of the Leg on the spritesheet in Pixels.
 
:<u>"foot":</u>
:"src" is a spritesheet reference by filename without extension (.PNG)
:"x" & "y" are the location on the spritesheet in Pixels
:"w" & "h" are the width and height of the Leg on the spritesheet in Pixels.
 
:<u>"beginStepSound":</u>
:"layers" is the number of varying Sound Tracks that exist in the Sound Mix
:"variations" are different Audio/Sounds nested within a specific "layer" without extension (.OGG)
:"volume" the Minimum and Maximum Volume modifier the "variations" could play at
:"pitch" the Minimum and Maximum Pitch modifier the "variations" could be altered to
 
:"footDownSound" uses the same script layout as "beginStepSound".
<div style="width:55%">
<pre>
{
  "legs": [ {
    "back": false,
    "xOffset": value,
    "yOffset": value,
    "limbLength": value,
    "footWidth": value,
    "footHeight": value,
    "stepLength": value,
    "maxStepTime": value,
    "bendForwards": false,
    "minFootY": value,
    "spring": {
      "xOffset": value,
      "length": value,
      "minCompressedLength": value,
      "k": value
    },
    "upperLeg": { "src": "value", "x": value, "y": value, "w": value, "h": value },
    "lowerLeg": { "src": "value", "x": value, "y": value, "w": value, "h": value },
    "foot": { "src": "value", "x": value, "y": value, "w": value, "h": value }
    "beginStepSound": {
      "layers": [ {
        "variations": [ "value" ],
        "volume": { "min": value, "max": value },
        "pitch": { "min": value, "max": value }
      ] },
    "footDownSound": {
      "layers": [ {
        "variations": [ "value" ],
        "volume": { "min": value, "max": value },
        "pitch": { "min": value, "max": value }
      ] }
  } ],
}
</pre>
</div>
 
 
----
 
===<u>Tentacle Attributes</u>===
 
 
; tentacles
:[incomplete]
 
:<u>"tentacles":</u>
:"numSegments" is the number of "index" elements that make up the tentacle
:"baseAngle" *
:"baseXOffset" & "baseYOffset" *
:"baseStiffness" *
:"tipSitffness" *
:"baseLength" *
:"tipLength" *
:"baseWidth" *
:"tipWidth" *
:"speed" *
:"snatchesCrew" specifies the Tentacle grabs crew
:"mouthXOffset" & "mouthYOffset" *
:"attacksHull" specifies the Tentacle attacks craft & structures
:"attackPenDmg" is Penetration Damage inflicted by a Tentacle Attack
:"attackBlastDmg" is Blast Damage inflicted by a Tentacle Attack
:"wavesAround" *
:"suckerDirection" *
 
:<u>"segmentImg":</u>
:"src" is a spritesheet reference by filename without extension (.PNG)
:"x" & "y" location on the spritesheet in Tiles
:"w" & "h" of the module in Tiles
 
:<u>"segmentImgVerticallyFlipped":</u>
:"src" is a spritesheet reference by filename without extension (.PNG)
:"x" & "y" location on the spritesheet in Tiles
:"w" & "h" of the Module in Tiles
 
:<u>"segmentImgOverrides":</u>
:"index" is a "numSegments" value.
 
:<u>"img":</u>
:"src" is a spritesheet reference by filename without extension (.PNG)
:"x" & "y" location on the spritesheet in Tiles
:"w" & "h" of the module in Tiles.
 
:<u>"imgVerticallyFlipped":</u>
:"src" is a spritesheet reference by filename without extension (.PNG)
:"x" & "y" location on the spritesheet in Tiles
:"w" & "h" of the module in Tiles.
 
:"imgLength" *
:"minNextTargetPause" & "maxNextTargetPause" the min and max time in Milliseconds *
:"attackSprayParticle" Particle spawned *
:"attackSprayP" *
:"attackImpactParticle" Particle spawned then the Tentacle strikes an object
:"numAttackImpactParticles" number of particles spawned when the Tentacle strikes an object
 
:<u>"snatchSound" & "attackSound":</u>
:"layers" is the number of varying Sound Tracks that exist in the Sound Mix
:"variations" are different Audio/Sounds nested within a specific "layer" without extension (.OGG)
:"volume" the Minimum and Maximum Volume modifier the "variations" could play at
:"pitch" the Minimum and Maximum Pitch modifier the "variations" could be altered to
:See audio section for more details.
<div style="width:55%">
<pre>
{
  "tentacles": [ {
    "numSegments": value,
    "baseAngle": value,
    "baseXOffset": value,
    "baseYOffset": value,
    "baseStiffness": value,
    "tipStiffness": value,
    "baseLength": value,
    "tipLength": value,
    "baseWidth": value,
    "tipWidth": value,
    "speed": value,
    "snatchesCrew": false,
    "mouthXOffset": value,
    "mouthYOffset": value,
    "attacksHull": true,
    "attackPenDmg": value,
    "attackBlastDmg": value,
    "wavesAround": true,
    "suckerDirection": false,
    "segmentImg": { "src": "value", "x": value, "y": value, "w": value, "h": value },
    "segmentImgVerticallyFlipped": { "src": "value", "x": value, "y": value, "w": value, "h": value },
    "segmentImgOverrides": [ {
        "index": 0,
        "img": { "src": "value", "x": value, "y": value, "w": value, "h": value },
        "imgVerticallyFlipped": { "src": "value", "x": value, "y": value, "w": value, "h": value }
      },
      "index": 0,
      "img": { "src": "monsters2", "x": value, "y": value, "w": value, "h": value },
      "imgVerticallyFlipped": { "src": "value", "x": value, "y": value, "w": value, "h": value }
    } ],
    "imgLength": value,
    "minNextTargetPause": value,
    "maxNextTargetPause": value,
    "attackSprayParticle": "value",
    "attackSprayP": value,
    "attackImpactParticle": "value",
    "numAttackImpactParticles": value,
    "snatchSound": {
      "layers": [ {
        "variations": [ "value" ],
        "volume": { ... },
        "pitch": { ... }
      } ]
    },
    "attackSound": {
      "layers": [ {
        "variations": [ "value" ],
        "volume": { ... },
        "pitch": { ... }
      } ]
    }
   },
   },
}
}
Line 1,605: Line 2,668:




----
; tentacleDeathSpasms
 
:Causes tentacles to spasm when the ship is destroyed.
===<u>Track, Wheel, & Leg Attributes</u>===
 
; springs
:Springs on the Module controlling how close the module can get to the ground through kinematic (bouncy) calculation
:"xOffset" is the location in Tiles on the X axis
:"length" is how far from the bottom of the Module the calculation exists in Pixels
:"minCompressedLength" is the length the calculation is allowed to reduce (a.k.a. spring) in Pixels
:"k" is the the kinematic strength (a.k.a. bounciness).
<div style="width:55%">
<pre>
{
  "springs": [ {
    "xOffset": value,
    "length": value,
    "minCompressedLength": value,
    "k": value
  } ],
}
</pre>
</div>
 
 
; wheels
:Wheels on the Module
:"xOffset" is the location in Tiles on the X Axis
:"maxYOffset" is the max amount the wheel can displace in Pixels on the Y Axis
:"radius" is the distance from the center of the Wheel in Pixels
:"segmentStride" is how much the element animates/rotates in Pixels while moving.
 
:<u>"wheel":</u>
:"src" is a spritesheet reference by filename without extension (.PNG)
:"x" & "y" are the location on the spritesheet in Pixels
:"w" & "h" are the width and the height of the Wheel in Pixels.
 
:<u>"lowerLink":</u>
:"src" is a spritesheet reference by filename without extension (.PNG)
:"x" & "y" are the location on the spritesheet in Pixels
:"w" & "h" are the width and the height of the Wheel in Pixels.
 
:<u>"upperLink":</u>
:"src" is a spritesheet reference by filename without extension (.PNG)
:"x" & "y" are the location on the spritesheet in Pixels
:"w" & "h" are the width and the height of the Wheel in Pixels.
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "wheels": [ {
   "tentacleDeathSpasms": t/f,
    "xOffset": value,
    "maxYOffset": value,
    "radius": value,
    "segmentStride": value,
    "wheel": {
      "src": "value",
      "x": value,
      "y": value,
      "w": value,
      "h": value
    },
    "lowerLink": {
      "src": "value",
      "x": value,
      "y": value,
      "w": value,
      "h": value
    },
    "upperLink": {
      "src": "value",
      "x": value,
      "y": value,
      "w": value,
      "h": value
    }
  } ],
}
}
</pre>
</pre>
Line 1,685: Line 2,679:




; legs
; tentacleFans
:<u>"legs":</u>
:[incomplete]
:"back" specifies the graphic that appears in front or behind the module
:"xOffset" position on the Module in Tiles on the X Axis
:"yOffset" position on the Module in Tiles on the Y Axis
:"limbLength" the animation length of a single limb (of an equally length 2-limb Leg)
:"footWidth" animation Width of the Foot calculated for animation & collision
:"footHeight" animation Height of the Foot calculated for animation & collision
:"stepLength" distance covered in while animating in Pixels
:"maxStepTime" the duration a movement animation cycles in milliseconds
:"bendForwards" specifies whether the Leg is bending forwards or backwards in reference to the module
:"minFootY" //incomplete
 
:See springs attribute for further information on springs.
 
:<u>"upperLeg":</u>
:"src" is a spritesheet reference by filename without extension (.PNG)
:"x" & "y" are the location on the spritesheet in Pixels
:"w" & "h" are the width and height of the Leg on the spritesheet in Pixels.
 
:<u>"lowerLeg":</u>
:"src" is a spritesheet reference by filename without extension (.PNG)
:"x" & "y" are the location on the spritesheet in Pixels
:"w" & "h" are the width and height of the Leg on the spritesheet in Pixels.
 
:<u>"foot":</u>
:"src" is a spritesheet reference by filename without extension (.PNG)
:"x" & "y" are the location on the spritesheet in Pixels
:"w" & "h" are the width and height of the Leg on the spritesheet in Pixels.
 
:<u>"beginStepSound":</u>
:"layers" is the number of varying Sound Tracks that exist in the Sound Mix
:"variations" are different Audio/Sounds nested within a specific "layer" without extension (.OGG)
:"volume" the Minimum and Maximum Volume modifier the "variations" could play at
:"pitch" the Minimum and Maximum Pitch modifier the "variations" could be altered to


:"footDownSound" uses the same script layout as "beginStepSound".
:"number" *
:"seed" *
:"startDegrees" *
:"endDegrees" *
:"centerX" *
:"centerY" *
:"jitterX" *
:"jitterY" *
:"tentacleAngleJitterDegrees" *
:"sizeMultMin" *
:"sizeMultMax" *
:"distMin" *
:"distMax" *
:See "tentacles" for more information on "tentacle"
<div style="width:55%">
<div style="width:55%">
<pre>
<pre>
{
{
   "legs": [ {
   "number": value,
    "back": false,
  "seed": value,
    "xOffset": value,
  "startDegrees": value,
    "yOffset": value,
  "endDegrees": value,
    "limbLength": value,
  "centerX": value,
    "footWidth": value,
  "centerY": value,
    "footHeight": value,
  "jitterX": value,
    "stepLength": value,
  "jitterY": value,
    "maxStepTime": value,
  "tentacleAngleJitterDegrees": value,
    "bendForwards": false,
  "sizeMultMin": value,
    "minFootY": value,
  "sizeMultMax": value,
    "spring": {
  "distMin": value,
      "xOffset": value,
  "distMax": value,
      "length": value,
  "tentacle": { ... }
      "minCompressedLength": value,
      "k": value
    },
    "upperLeg": { "src": "value", "x": value, "y": value, "w": value, "h": value },
    "lowerLeg": { "src": "value", "x": value, "y": value, "w": value, "h": value },
    "foot": { "src": "value", "x": value, "y": value, "w": value, "h": value }
    "beginStepSound": {
      "layers": [ {
        "variations": [ "value" ],
        "volume": { "min": value, "max": value },
        "pitch": { "min": value, "max": value }
      ] },
    "footDownSound": {  
      "layers": [ {
        "variations": [ "value" ],
        "volume": { "min": value, "max": value },
        "pitch": { "min": value, "max": value }
      ] }
  } ],
}
}
</pre>
</pre>
</div>
</div>
----
===<u>Tentacle Attributes</u>===




[[Category:Modding]]
[[Category:Modding]]

Latest revision as of 00:55, 3 August 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" },

Or

"AttributeValueList": [ "value1", "value2", "value3" ],

Or

"AttributeValueList": [ {"value1", "value2"}, {"value3", "value4"} ],

Or

"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.

Range values used in "maxRange", "optimumRange", "maxUpRange", etc. Will use either pixels or meters for measurement.


In game, 7 pixels corresponds to 1 meter. So converting the JSON value to ingame range is just dividing the pixel value by 7 and rounding down.


Pixels for value:

- "maxXRange"

- "minXRange"

- "maxRange"

- "shootTroopsRange"

- "maxUpRange"

- "minUpRange"

- "maxDownRange"

- "minDownRange"


Meters for value:

- "optimumRange"

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",
}


patch
Applies any code in the module file to an existing module with the same name.
Primarily used by mods that need to overwrite or add code to existing modules.
{
  "patch": t/f,
}


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


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


deriveFrom
Copies all the code used by the input module to the current module.
Used when the current module is the same as the input module and you only need to change one thing like appearance.
Don't repeat yourself if you don't need to!
{
  "deriveFrom": "value",
}


variants
Defines what modules are variants of the current module.
{
  "variants": [ "value" ],
}


variantType
Defines how the variants differ from the current module.
Current types: SIZES, ROTATED
{
  "variantType": "value",
}


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" ],
}


sort
Determines the numerical position the module appears in on the editor list.
The lower the number, the higher up in the list and vice versa.
{
  "sort": 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,
}


nonCombat
Determines whether or not the ship the module is attached to appears in combat or not.
If the attached ship is intercepted it is instantly destroyed.
Used by the Supply Ships.
{
  "nonCombat": 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 } 
    ]
  },
}


mask
Defines the armor placement and hitbox of a module by using a sprite.
"x" and "y" are the top-left coordinates of the sprite.
From there it will use the already-defined width and height.
{
  "mask": { "x": value, "y": 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,
}


drawAppearanceInside
Determines whether or not the game renders the internal sprite of the module.
Used on module w/o an internal sprite like the rams or external weapons.
{
  "drawAppearanceInside": t/f,
}


drawExternalsWhenInside
Determines whether or not the external appearance of a module is rendered when viewing the internal sprite.
Used by external weapons.
{
  "drawExternalsWhenInside": t/f,
}


drawExternalsBelowDecals
Determines whether or not the external appearance is rendered below decals.
{
  "drawExternalsBelowDecals": t/f,
}


externalSubColor
Specifies an RGB color on the sprite that can be changed to another color in the editor.
{
  "externalSubColor": { "r": value, "g": value, "b": value },
}


externalSubBaseColor
Defines the base color of the externalSubColor.
The color of the material beneath the paint.
{
  "externalSubBaseColor": { "r": value, "g": value, "b": 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 },
  ]
}


gunPortsCreateDrag
Defines whether or not the module creates drag.
{
  "gunPortsCreateDrag": t/f,
}


producesHorizontalDrag
Determines whether a module produces horizontal drag or not.
{
  "producesHorizontalDrag": t/f,
}


extraVerticalAirFriction
incomplete *
Only used by the Shellwalker.
{
  "extraVerticalAirFriction": value,
}


targetAttractivenessMult
Determines how likely the AI is to prioritize this module over another one.
{
  "targetAttractivenessMult": value,
}



Resource Attributes

external
Specifies if the Module cannot be protected by armor.
Removes all armor effects including graphics.
External modules do not produce drag.
{
  "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,
}


runsWhenDestroyed
The ship the Module was attached to will run away if the Module is destroyed.
{
  "runsWhenDestroyed": t/f,
}


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,
}


firedWeightDecrease
How much the module's weight decreases after it's weapon is fired.
Utilized by single-use weapons like Kinetic Bombs.
{
  "firedWeightDecrease": 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,
}


extraCommandPointsRequired
incomplete *
{
  "extraCommandPointsRequired": value,
}


fleetCommandBonus
Applies a fleet-wide command resource bonus during combat.
{
  "fleetCommandBonus": value,
}


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


usesSuspendium
Defines whether or not the module uses Suspendium.
Used by the Suspendium Disruptor to target Suspendium modules.
{
  "usesSuspendium": t/f,
}


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


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


supplyRequired
How much supply is required by the Module.
{
  "supplyRequired": value,
}


extraSupplyCapacity
Additional supply storage capacity for the Module.
{
  "extraSupplyCapacity": value,
}


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


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


repair
How much repair tools the Module generates.
{
  "repair": 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,
}


preventsSurrender
Prevents Surrender of the Craft until the Module is destroyed.
{
  "preventsSurrender": 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",
}


planeLaunchSpeedBonus
Modifies plane launch speed by the given value.
{
  "planeLaunchSpeedBonus": value,
}


canGivePlaneCommands
Allows the ship to which the module is attached to give orders to friendly aircraft.
{
  "canGivePlaneCommands": t/f,
}


planeRearmBonus
Modifies plane re-arming speed by the given value.
{
  "planeRearmBonus": value,
}


planeRepairBonus
Modifies plane repair speed by the given value.
{
  "planeRepairBonus": 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,
}


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


maxRange
Maximum range in pixels the weapon can fire.
{
  "maxRange": value,
}


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


fixedInaccuracyVsTroops
Fixed Inaccuracy against Troops.
{
  "fixedInaccuracyVsTroops": 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,
}


canResupplyInCombat
Determines whether the weapon can be reloaded during combat.
{
  "canResupplyInCombat": t/f,
}


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


inaccuracyFromWeather
Determines if a weapon's accuracy is affected by weather conditions.
{
  "inaccuracyFromWeather": t/f,
}


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.
Zarkonnen - 'Deviation from the intended target coordinate is calculated independently for the x-axis and y-axis, so it does all of this twice. It calculates the deviation magnitude and then multiplies this with a random gaussian value that has an average of 0 and a standard deviation of 1.
x = targetX + gaussian() * deviationMagnitude
y = targetY + gaussian() * deviationMagnitude
The basic deviation magnitude is calculated as follows:
weapon inaccuracy * distance to target in pixels * 16
This is then modified by:
The "precise gunnery" bonus, if present and applicable, halves the deviation magnitude.
The accuracy bonus from crow's nests, telescopes and targeting computers. Each of them is only applied once, so if you have two telescopes it counts as if it were one. The bonuses are added together, so if you have all three, you have 10% (Crow's Nest) + 30% (Telescope) + 30% (Targeting Computer) = 70% bonus, which means the deviation magnitude is reduced by 70%.
Shooting at ships in fog triples the deviation magnitude.
Various WeatherEffects can increase the deviation magnitude. For example, dawn doubles the deviation magnitude when shooting from left to right, and night doubles it under all conditions.
OptimumRange has no effect on these calculations and is only used by the AI to position its ships.
JitterMerge works by taking the previous deviation and mixing it with the new deviation. So if the jitterMerge is 0.5, the final deviation will be half the newly calculated one and half the previous one. This means that weapons like Gatling guns have their deviation drift around rather than being completely different each time, which would look odd.'
{
  "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,
}


splashFriendlyFire
Determines whether the blastDmg's splash deals friendly damage (Friendly ships and the Current ship).
{
  "splashFriendlyFire": t/f,
}


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


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


destroySuspendiumInRadius
The radius around the shot hit where Suspendium is instantly destroyed.
{
  "destroySuspendiumInRadius": value,
}


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


impactForce
Reverse Propulsion generated on an enemy ship when the shot hits them.
{
  "impactForce": value,
}


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


obeysFireMode
Determines whether the weapon obeys the ship's fire mode.
{
  "obeysFireMode": t/f,
}


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,
}


guidanceSystem
An attribute for creating missile-type weapons.
"launchAngle" *
"launchSpeed" *
"launchLength" *
"acceleration" *
"topSpeed" *
"turnSpeed" *
"proximityFuseDistance" *
"missileLockTime" *
"missileLockLossAngle" *
{
  "guidanceSystem": {
    "launchAngle": value,
    "launchSpeed": value,
    "launchLength": value,
    "acceleration": value,
    "topSpeed": value,
    "turnSpeed": value,
    "proximityFuseDistance": value,
    "missileLockTime": value,
    "missileLockLossAngle": value
  }
}


tetherSpec
The appearance and stats of the tether used by the module.
"color":
"r", "g", "b" define the rgb color value of the tether's rope.
"maxRange" *
"tearForce" *
"minLength" *
"shrinkSpeed" *
"k" *
"anchorX" *
"anchorY" *
"width" *
"ripSound":
"layers" *
"variations" *
"volume" *
"pitch" *
"ripParticle" *
{
  "tetherSpec": {
    "color": {"r": value, "g": value, "b": value},
    "maxRange": value,
    "tearForce": value,
    "minLength": value
    "shrinkSpeed": value,
    "k": value,
    "anchorX": value,
    "anchorY": value,
    "width": value,
    "ripSound": {
      "layers": [
        {
          "variations": [ "value" ],
          "volume":  {
            "min": value,
            "max": value
          },
          "pitch": {
            "min": value,
            "max": value
          }
        }
      ]
    },
    "ripParticle": "value"
  },
}


beamSpec
The appearance and stats of the beam used by the module.
"fadeInTime" *
"steadyTime" *
"fadeOutTime" *
"moveDistance" *
"lightClr":
"r", "g", "b" *
"lightRadius" *
"emitBloomClr":
"r", "g", "b" *
"emitBloomRadius" *
"hitParticle" *
"hitParticleProbability" *
"subBeams":
"clr":
"r", "g", "b" *
"a" *
"width" *
"flickerAmount" *
"prevFlickerProportion" *
"texture":
"src" *
"x", "y" *
"w", "h" *
"textureSpeed" *
{
  "beamSpec": {
    "fadeInTime": value,
    "steadyTime": value,
    "fadeOutTime": value,
    "moveDistance": value,
    "lightClr": { "r": value "g": value, "b": value },
    "lightRadius": value,
    "emitBloomClr": { "r": value, "g": value, "b": value },
    "emitBloomRadius": value,
    "hitParticle": "value",
    "hitParticleProbability": value,
    "subBeams": [
      {
        "clr": { "r": value, "g": value, "b": value, "a": value},
        "width": value
        "flickerAmount": value,
        "prevFlickerProportion": value,
        "texture": { "src": "value", "x": value, "y": value, "w": value, "h": value },
        "textureSpeed": value
      },
    ]
  },
}



Weapon Appearance Attributes

weaponAppearance
In-Game graphic of the Shot & Barrel.
"shot":
"src" is a spritesheet reference by filename without extension (.PNG)
"x" & "y" is the location on the spritesheet in pixels
"w" & "h" are the pixel dimensions of the graphic In-Game - where center is rotation.
"shotAnimationInterval" is Time in milliseconds one "frames" cycles to the next.
"shotFrames":
"src" is a spritesheet reference by filename without extension (.PNG)
"x" & "y" is the location on the spritesheet in pixels
"w" & "h" are the pixel dimensions of the graphic In-Game.
"barrelAnimation":
Where "interval" is time in milliseconds one "frames" cycles to the next
"loop" indicates the weapon's animation should reset after having been fired
"finishLoopCycle" indicates whether the animation should always complete its loop after being started
"loopConstantly" indicates "frames" will cycle continuously
"msPerShot" is the amount of animation in milliseconds that one Shot causes
"frames":
"src" is a spritesheet reference by filename without extension (.PNG)
"x" & "y" is the location on the spritesheet in pixels
"w" & "h" are the pixel dimensions of the graphic In-Game.
"loop" set to true & by itself, without "finishLoopCycle" & "loopConstantly";
where firing the weapon will simply advance the animation by "msPerShot" frames.
If set to false, the animation will reset to the first frame after every shot fired, resuming by playing msPerShot frames.
Please keep in mind not all values are necessary and could have various results. ex. Removing "barrel" from the script.
"back"':
"src" is a spritesheet reference by filename without extension (.PNG)
"x" & "y" is the location on the spritesheet in pixels
"w" & "h" are the pixel dimensions of the graphic In-Game.
"hitExplosionSize" & "missExplosionSize" are the size of the In-Game explosion graphic, in Tiles.
In decimal: ex. #.##
"barrelX" is position horizontally from the top left the barrel of the Module in Pixels.
Rotation position desired in pixels on the spritesheet X - ("w" aka Barrel Width Pixels / 2) = "barrelX"
In decimal: ex. #.##
"barrelY" is position vertically from the top left of the barrel in the Module in Pixels.
Rotation position desired in pixels on the spritesheet Y - ("h" aka Barrel Height Pixels / 2) = "barrelY"
In decimal: ex. #.##
"recoil" is pixels the "barrel" graphic moves when a Shot is fired.
"shotEmitter" generates stationary particles from Shots; "type" the Particle Type, and "emitProbabality" spawns per millisecond.
In decimal: ex. #.##
"exhaust" is animated particles from the Shot:
"type" is the Particle Type
"p" is the probability per miliseconds
"backOffset" is how far backward (left) they are spawned from the center in pixels
"angleRange" is the radians it will animate from center (0 being perfect line, pie 180 degrees, 2pie any direction)
"randomOffset" is the offset in pixels any direction
"speedMin" & "speedMax" are the speed at which the exhaust moves in pixels per millisecond.
"barrelLoadStages": *
"src" *
"x", "y" *
"w", "h" *
"fireVibrate" *
"fireVibrateDecay" *
"shells": *
"img":
"src" *
"x", "y" *
"w", "h" *
"internalImg":
"src" *
"x", "y" *
"w", "h" *
"pivotX" *
"pivotY" *
"x", "y" *
"openAngle" *
"startOpenTimeBeforeFiring" *
"endOpenTimeBeforeFiring" *
"startCloseTimeAfterFiring" *
"endCloseTimeAfterFiring" *
"shellClosedPenAbsorb", "shellClosedBlastAbsorb" *
"openEmitters", "closeEmitters": *
"type" *
"emitPoints" *
"openSound", "closeSound": *
"variations" *
"volume" *
"pitch" *
Note: While frames are present in the script; values are not necessary and may cause errors in achieving a desired animation result. ie "barrel" vs "barrelAnimation"
{
  "weaponAppearance": {
    "shot": { "src": "value", "x": value, "y": value, "w": value, "h": value },
    "shotAnimationInterval": 1000,
    "shotFrames": [
      { "src": "value", "x": value, "y": value, "w": value, "h": value },
      { "src": "value", "x": value, "y": value, "w": value, "h": value }
    ],
    "barrel": { "src": "value", "x": value, "y": value, "w": value, "h": value },
    "barrelAnimation": {
      "interval": 1000,
      "loop": true,
      "finishLoopCycle": false,
      "loopConstantly": true,
      "msPerShot": 1000,
      "frames": [
        { "src": "value", "x": value, "y": value, "w": value, "h": value },
        { "src": "value", "x": value, "y": value, "w": value, "h": value }
      ]
    },
    "back": { "src": "value", "x": value, "y": value, "w": value, "h": value },
    "hitExplosionSize": value,
    "missExplosionSize": value,
    "barrelX": value,
    "barrelY": value,
    "recoil": value,
    "shotEmitter": { "type": "value", "emitProbability": value },
    "exhaust": {
      "type": "value",
      "p": value,
      "backOffset": value,
      "angleRange": value,
      "randomOffset": value,
      "speedMin": value,
      "speedMax": value
    }
    "barrelLoadStages": [
      { "src": "value", "x": value, "y": value, "w": value, "h": value },
      { "src": "value", "x": value, "y": value, "w": value, "h": value }
    ],
    "fireVibrate": value,
    "fireVibrateDecay": value,
    "shells": [
      {
        "img": { "src": "value", "x": value, "y": value, "w": value, "h": value },
        "internalImg": { "src": "value", "x": value, "y": value, "w": value, "h": value },
        "pivotX": value,
        "pivotY": value,
        "x": value,
        "y": value,
        "openAngle": value,
        "startOpenTimeBeforeFiring": value,
        "endOpenTimeBeforeFiring": value,
        "startCloseTimeAfterFiring": value,
        "endCloseTimeAfterFiring": value,
        "shellClosedPenAbsorb": value,
        "shellClosedBlastAbsorb": value,
        "openEmitters": [
          {
            "type": "value",
            "emitPoints": [ value, value ]
          }
        ],
        "closeEmitters": [
          {
            "type": "value",
            "emitPoints": [ value, value ]
          }
        ],
        "openSound": {
          "layers": [
            {
              "variations": [ "value" ],
              "volume": { "min": value, "max": value },
              "pitch": { "min": value, "max": value }
            }
          ]
        }
        "closeSound": {
          "layers": [
            {
              "variations": [ "value" ],
              "volume": { "min": value, "max": value },
              "pitch": { "min": value, "max": value }
            }
          ]
        },
      },
    ],
  },
}


muzzleFlash
Removes In-Game graphic for the muzzle flash for the module.
{
  "muzzleFlash": t/f,
}


impactParticle
The particle that is emitted when the weapon's projectile hits a target.
{
  "impactParticle": "value",
}


numImpactParticles
The amount of impact particles generated when the weapon's projectile hits a target.
{
  "numImpactParticles": value,
}


onlyShowBarrelIfLoaded
Only shows the barrel of the weapon (see weaponAppearance) when the weapon is fully loaded.
{
  "onlyShowBarrelIfLoaded": t/f,
}



Audio Attributes

doesCreak
Defines whether the module can creak. Primarily used to prevent monsters from creaking.
{
  "doesCreak": t/f,
}


destructionSound
The sound the module makes when it is destroyed; primarily used by monsters.
"layers" is the number of varying Sound Tracks that exist in the Sound Mix
"variations" are different Audio/Sounds nested within a specific "layer" without extension (.OGG)
"volume" is the Minimum and Maximum Volume modifier the "variations" could play at
"pitch" is the Minimum and Maximum Pitch modifier the "variations" could be altered to.
"distance" defines the volume with respect to the distance from the module, see distance attribute for more information.
{
  "destructionSound": { 
    "layers": [ {
    "variations": ["value"],
    "volume": value,
    "pitch": { "min": value, "max": value }
  } ] }
}


playDestructionSoundAtStartOfDestruction
Plays the destructionSound of the module at the start of its destruction rather than at the end of it.
{
  "playDestructionSoundAtStartOfDestruction": t/f,
}


soundEvery
How often the Shot sound is looped while the Shot is continuously firing, in Milliseconds.
{
  "soundEvery": value,
}


fireSound
The sound the weapon makes whenever it fires.
"layers" is the number of varying Sound Tracks that exist in the Sound Mix
"variations" are different Audio/Sounds nested within a specific "layer" without extension (.OGG)
"volume" is the Minimum and Maximum Volume modifier the "variations" could play at
"pitch" is the Minimum and Maximum Pitch modifier the "variations" could be altered to.
"distance" defines the volume with respect to the distance from the module, see distance attribute for more information.
{
  "fireSound":  
    "layers": [ { 
      "variations": [ "value" ], 
      "volume": { "min": value, "max": value }, OR { "value": value, "distance": [...] },
      "pitch": { "min": value, "max": value }, OR { "min": value, "max": value, "distance": [...] },
    } ],
}


hitSound
The sound the projectile of the weapon makes when it hits a target.
"layers" is the number of varying Sound Tracks that exist in the Sound Mix
"variations" are different Audio/Sounds nested within a specific "layer" without extension (.OGG)
"volume" is the Minimum and Maximum Volume modifier the "variations" could play at
"pitch" is the Minimum and Maximum Pitch modifier the "variations" could be altered to.
{
  "hitSound": { 
    "layers": [ {
    "variations": ["value"],
    "volume": value,
    "pitch": { "min": value, "max": value }
  } ] }
}


distance
Defines the volume with respect to the distance from the module
"value1" is the distance (0 is closest to module)
"value2" is the volume value (1 to 0)
"distance" is attached to "volume" or "pitch" attributes:
{
    "volume": {
        "value": value,
        "distance": [
            value1, value2,
            value1, value2,
            value1, value2
        ]
    }
    
    "pitch": {
        "min": value, "max": value,
        "distance": [
            value1, value2,
            value1, value2,
            value1, value2
        ]
    }
}


runningLoop
"runningLoop":
"layers" is the number of varying Sound Tracks that exist in the Sound Mix
"variations" are different Audio/Sounds nested within a specific "layer" without extension (.OGG)
"volume" the Minimum and Maximum Volume modifier the "variations" could play at
"onViewingSide" defines the volume between the internal and external view of a module, where value1 = 1 (internal) or 0 (external), and value2 is the volume value
"xSpeed" & "ySpeed" define the volume with respect to X and Y movement, where value1 is the movement in the X or Y axis, and value2 is the volume value
"pitch" the Minimum and Maximum Pitch modifier the "variations" could be altered to
"xSpeed" & "ySpeed" define the volume with respect to X and Y movement, where value1 is the movement in the X or Y axis, and value2 is the volume value
{
  "runningLoop": { 
    "layers": [ { 
      "variations": [ "value" ], 
      "volume": { 
        "value": value, 
        "onViewingSide": [ 
            value1, value2, 
            value1, value2 
        ], 
        "xSpeed": [ 
            value1, value2, 
            value1, value2, 
            value1, value2 
        ],
        "ySpeed": [ 
            value1, value2, 
            value1, value2, 
            value1, value2 
        ],
      },  
      "pitch": { 
        "value": value, 
        "xSpeed": [ 
            value1, value2, 
            value1, value2, 
            value1, value2 
        ],
        "ySpeed": [ 
            value1, value2, 
            value1, value2, 
            value1, value2 
        ],
      } 
    } ] 
  },
}



Track, Wheel, & Leg Attributes

springs
Springs on the Module controlling how close the module can get to the ground through kinematic (bouncy) calculation
"xOffset" is the location in Tiles on the X axis
"length" is how far from the bottom of the Module the calculation exists in Pixels
"minCompressedLength" is the length the calculation is allowed to reduce (a.k.a. spring) in Pixels
"k" is the the kinematic strength (a.k.a. bounciness).
{
  "springs": [ {
    "xOffset": value,
    "length": value,
    "minCompressedLength": value,
    "k": value
  } ],
}


wheels
Wheels on the Module
"xOffset" is the location in Tiles on the X Axis
"maxYOffset" is the max amount the wheel can displace in Pixels on the Y Axis
"radius" is the distance from the center of the Wheel in Pixels
"segmentStride" is how much the element animates/rotates in Pixels while moving.
"wheel":
"src" is a spritesheet reference by filename without extension (.PNG)
"x" & "y" are the location on the spritesheet in Pixels
"w" & "h" are the width and the height of the Wheel in Pixels.
"lowerLink":
"src" is a spritesheet reference by filename without extension (.PNG)
"x" & "y" are the location on the spritesheet in Pixels
"w" & "h" are the width and the height of the Wheel in Pixels.
"upperLink":
"src" is a spritesheet reference by filename without extension (.PNG)
"x" & "y" are the location on the spritesheet in Pixels
"w" & "h" are the width and the height of the Wheel in Pixels.
{
  "wheels": [ {
    "xOffset": value,
    "maxYOffset": value,
    "radius": value,
    "segmentStride": value,
    "wheel": {
      "src": "value",
      "x": value,
      "y": value,
      "w": value,
      "h": value
    },
    "lowerLink": {
      "src": "value",
      "x": value,
      "y": value,
      "w": value,
      "h": value
    },
    "upperLink": {
      "src": "value",
      "x": value,
      "y": value,
      "w": value,
      "h": value
    }
  } ],
}


legs
"legs":
"back" specifies the graphic that appears in front or behind the module
"xOffset" position on the Module in Tiles on the X Axis
"yOffset" position on the Module in Tiles on the Y Axis
"limbLength" the animation length of a single limb (of an equally length 2-limb Leg)
"footWidth" animation Width of the Foot calculated for animation & collision
"footHeight" animation Height of the Foot calculated for animation & collision
"stepLength" distance covered in while animating in Pixels
"maxStepTime" the duration a movement animation cycles in milliseconds
"bendForwards" specifies whether the Leg is bending forwards or backwards in reference to the module
"minFootY" *
See springs attribute for further information on springs.
"upperLeg":
"src" is a spritesheet reference by filename without extension (.PNG)
"x" & "y" are the location on the spritesheet in Pixels
"w" & "h" are the width and height of the Leg on the spritesheet in Pixels.
"lowerLeg":
"src" is a spritesheet reference by filename without extension (.PNG)
"x" & "y" are the location on the spritesheet in Pixels
"w" & "h" are the width and height of the Leg on the spritesheet in Pixels.
"foot":
"src" is a spritesheet reference by filename without extension (.PNG)
"x" & "y" are the location on the spritesheet in Pixels
"w" & "h" are the width and height of the Leg on the spritesheet in Pixels.
"beginStepSound":
"layers" is the number of varying Sound Tracks that exist in the Sound Mix
"variations" are different Audio/Sounds nested within a specific "layer" without extension (.OGG)
"volume" the Minimum and Maximum Volume modifier the "variations" could play at
"pitch" the Minimum and Maximum Pitch modifier the "variations" could be altered to
"footDownSound" uses the same script layout as "beginStepSound".
{
  "legs": [ {
    "back": false,
    "xOffset": value,
    "yOffset": value,
    "limbLength": value,
    "footWidth": value,
    "footHeight": value,
    "stepLength": value,
    "maxStepTime": value,
    "bendForwards": false,
    "minFootY": value,
    "spring": {
      "xOffset": value,
      "length": value,
      "minCompressedLength": value,
      "k": value
    },
    "upperLeg": { "src": "value", "x": value, "y": value, "w": value, "h": value },
    "lowerLeg": { "src": "value", "x": value, "y": value, "w": value, "h": value },
    "foot": { "src": "value", "x": value, "y": value, "w": value, "h": value }
    "beginStepSound": { 
      "layers": [ { 
        "variations": [ "value" ], 
        "volume": { "min": value, "max": value }, 
        "pitch": { "min": value, "max": value } 
      ] },
    "footDownSound": { 
      "layers": [ { 
        "variations": [ "value" ], 
        "volume": { "min": value, "max": value }, 
        "pitch": { "min": value, "max": value } 
      ] }
  } ],
}



Tentacle Attributes

tentacles
[incomplete]
"tentacles":
"numSegments" is the number of "index" elements that make up the tentacle
"baseAngle" *
"baseXOffset" & "baseYOffset" *
"baseStiffness" *
"tipSitffness" *
"baseLength" *
"tipLength" *
"baseWidth" *
"tipWidth" *
"speed" *
"snatchesCrew" specifies the Tentacle grabs crew
"mouthXOffset" & "mouthYOffset" *
"attacksHull" specifies the Tentacle attacks craft & structures
"attackPenDmg" is Penetration Damage inflicted by a Tentacle Attack
"attackBlastDmg" is Blast Damage inflicted by a Tentacle Attack
"wavesAround" *
"suckerDirection" *
"segmentImg":
"src" is a spritesheet reference by filename without extension (.PNG)
"x" & "y" location on the spritesheet in Tiles
"w" & "h" of the module in Tiles
"segmentImgVerticallyFlipped":
"src" is a spritesheet reference by filename without extension (.PNG)
"x" & "y" location on the spritesheet in Tiles
"w" & "h" of the Module in Tiles
"segmentImgOverrides":
"index" is a "numSegments" value.
"img":
"src" is a spritesheet reference by filename without extension (.PNG)
"x" & "y" location on the spritesheet in Tiles
"w" & "h" of the module in Tiles.
"imgVerticallyFlipped":
"src" is a spritesheet reference by filename without extension (.PNG)
"x" & "y" location on the spritesheet in Tiles
"w" & "h" of the module in Tiles.
"imgLength" *
"minNextTargetPause" & "maxNextTargetPause" the min and max time in Milliseconds *
"attackSprayParticle" Particle spawned *
"attackSprayP" *
"attackImpactParticle" Particle spawned then the Tentacle strikes an object
"numAttackImpactParticles" number of particles spawned when the Tentacle strikes an object
"snatchSound" & "attackSound":
"layers" is the number of varying Sound Tracks that exist in the Sound Mix
"variations" are different Audio/Sounds nested within a specific "layer" without extension (.OGG)
"volume" the Minimum and Maximum Volume modifier the "variations" could play at
"pitch" the Minimum and Maximum Pitch modifier the "variations" could be altered to
See audio section for more details.
{
  "tentacles": [ {
    "numSegments": value,
    "baseAngle": value,
    "baseXOffset": value,
    "baseYOffset": value,
    "baseStiffness": value,
    "tipStiffness": value,
    "baseLength": value,
    "tipLength": value,
    "baseWidth": value,
    "tipWidth": value,
    "speed": value,
    "snatchesCrew": false,
    "mouthXOffset": value,
    "mouthYOffset": value,
    "attacksHull": true,
    "attackPenDmg": value,
    "attackBlastDmg": value,
    "wavesAround": true,
    "suckerDirection": false,
    "segmentImg": { "src": "value", "x": value, "y": value, "w": value, "h": value },
    "segmentImgVerticallyFlipped": { "src": "value", "x": value, "y": value, "w": value, "h": value },
    "segmentImgOverrides": [ {
        "index": 0,
        "img": { "src": "value", "x": value, "y": value, "w": value, "h": value },
        "imgVerticallyFlipped": { "src": "value", "x": value, "y": value, "w": value, "h": value }
      },
      "index": 0,
      "img": { "src": "monsters2", "x": value, "y": value, "w": value, "h": value },
      "imgVerticallyFlipped": { "src": "value", "x": value, "y": value, "w": value, "h": value }
    } ],
    "imgLength": value,
    "minNextTargetPause": value,
    "maxNextTargetPause": value,
    "attackSprayParticle": "value",
    "attackSprayP": value,
    "attackImpactParticle": "value",
    "numAttackImpactParticles": value,
    "snatchSound": { 
      "layers": [ { 
        "variations": [ "value" ], 
        "volume": { ... }, 
        "pitch": { ... } 
      } ] 
    },
    "attackSound": { 
      "layers": [ { 
        "variations": [ "value" ], 
        "volume": { ... }, 
        "pitch": { ... } 
      } ] 
    }
  },
}


tentacleDeathSpasms
Causes tentacles to spasm when the ship is destroyed.
{
  "tentacleDeathSpasms": t/f,
}


tentacleFans
[incomplete]
"number" *
"seed" *
"startDegrees" *
"endDegrees" *
"centerX" *
"centerY" *
"jitterX" *
"jitterY" *
"tentacleAngleJitterDegrees" *
"sizeMultMin" *
"sizeMultMax" *
"distMin" *
"distMax" *
See "tentacles" for more information on "tentacle"
{
  "number": value,
  "seed": value,
  "startDegrees": value,
  "endDegrees": value,
  "centerX": value,
  "centerY": value,
  "jitterX": value,
  "jitterY": value,
  "tentacleAngleJitterDegrees": value,
  "sizeMultMin": value,
  "sizeMultMax": value,
  "distMin": value,
  "distMax": value,
  "tentacle": { ... }
}