Merge branch 'v0.8'

master v0.8
Pacman Ghost 5 years ago
commit bab142243b
  1. 1
      .pylintrc
  2. BIN
      chapter-h/chapter-h-placeholders.zip
  3. 2
      setup.py
  4. 2
      vasl_templates/main_window.py
  5. 158
      vasl_templates/tools/make_chapter_h_placeholders.py
  6. 1303
      vasl_templates/tools/tests/fixtures/chapter-h-placeholders.txt
  7. 26
      vasl_templates/tools/tests/test_make_chapter_h_placeholders.py
  8. 2
      vasl_templates/tools/webdriver_stress_test.py
  9. 2
      vasl_templates/webapp/config/constants.py
  10. 28
      vasl_templates/webapp/data/default-template-pack/nationalities.json
  11. 7
      vasl_templates/webapp/data/default-template-pack/ob_ordnance.j2
  12. 2
      vasl_templates/webapp/data/default-template-pack/ob_ordnance_ma_notes.j2
  13. 7
      vasl_templates/webapp/data/default-template-pack/ob_vehicles.j2
  14. 2
      vasl_templates/webapp/data/default-template-pack/ob_vehicles_ma_notes.j2
  15. 16
      vasl_templates/webapp/data/expected-multiple-images.json
  16. 939
      vasl_templates/webapp/data/extensions/bfp-bj-v403.json
  17. 181
      vasl_templates/webapp/data/extensions/bfp-cobra-v403.json
  18. 543
      vasl_templates/webapp/data/extensions/bfp-pif-v403.json
  19. 7
      vasl_templates/webapp/data/extensions/bfp-v403.json
  20. 4
      vasl_templates/webapp/data/extensions/kgs-v1.1.json
  21. 5
      vasl_templates/webapp/data/ordnance/allied-minor/belgian.json
  22. 6
      vasl_templates/webapp/data/ordnance/allied-minor/common.json
  23. 9
      vasl_templates/webapp/data/ordnance/american.json
  24. 6
      vasl_templates/webapp/data/ordnance/axis-minor/bulgarian.json
  25. 6
      vasl_templates/webapp/data/ordnance/axis-minor/common.json
  26. 3
      vasl_templates/webapp/data/ordnance/axis-minor/croatian.json
  27. 9
      vasl_templates/webapp/data/ordnance/axis-minor/romanian.json
  28. 2
      vasl_templates/webapp/data/ordnance/axis-minor/slovakian.json
  29. 9
      vasl_templates/webapp/data/ordnance/british.json
  30. 8
      vasl_templates/webapp/data/ordnance/chinese.json
  31. 1
      vasl_templates/webapp/data/ordnance/chinese~gmd.json
  32. 9
      vasl_templates/webapp/data/ordnance/communist-forces/cvpa.json
  33. 24
      vasl_templates/webapp/data/ordnance/finnish.json
  34. 18
      vasl_templates/webapp/data/ordnance/french.json
  35. 7
      vasl_templates/webapp/data/ordnance/german.json
  36. 12
      vasl_templates/webapp/data/ordnance/italian.json
  37. 14
      vasl_templates/webapp/data/ordnance/japanese.json
  38. 9
      vasl_templates/webapp/data/ordnance/russian.json
  39. 2
      vasl_templates/webapp/data/ordnance/un-forces/british-commonwealth-forces-korea.json
  40. 3
      vasl_templates/webapp/data/ordnance/un-forces/common.json
  41. 9
      vasl_templates/webapp/data/ordnance/un-forces/us-rok-ounc.json
  42. 31
      vasl_templates/webapp/data/vasl-overrides.json
  43. 1
      vasl_templates/webapp/data/vehicles/chinese~gmd.json
  44. 14
      vasl_templates/webapp/file_server/utils.py
  45. 22
      vasl_templates/webapp/file_server/vasl_mod.py
  46. 7
      vasl_templates/webapp/main.py
  47. 32
      vasl_templates/webapp/snippets.py
  48. 37
      vasl_templates/webapp/static/css/edit-vo-dialog.css
  49. BIN
      vasl_templates/webapp/static/images/flags/anzac.png
  50. BIN
      vasl_templates/webapp/static/images/flags/burmese.png
  51. 0
      vasl_templates/webapp/static/images/flags/chinese~gmd.png
  52. BIN
      vasl_templates/webapp/static/images/flags/filipino.png
  53. BIN
      vasl_templates/webapp/static/images/flags/indonesian.png
  54. BIN
      vasl_templates/webapp/static/images/flags/polish.png
  55. BIN
      vasl_templates/webapp/static/images/flags/slovakian.png
  56. BIN
      vasl_templates/webapp/static/images/flags/thai.png
  57. BIN
      vasl_templates/webapp/static/images/spacer.png
  58. 46
      vasl_templates/webapp/static/main.js
  59. 14
      vasl_templates/webapp/static/simple_notes.js
  60. 225
      vasl_templates/webapp/static/snippets.js
  61. 9
      vasl_templates/webapp/static/sortable.js
  62. 3
      vasl_templates/webapp/static/user_settings.js
  63. 24
      vasl_templates/webapp/static/utils.js
  64. 2
      vasl_templates/webapp/static/vassal.js
  65. 83
      vasl_templates/webapp/static/vo.js
  66. 124
      vasl_templates/webapp/static/vo2.js
  67. 23
      vasl_templates/webapp/templates/edit-vo-dialog.html
  68. 1
      vasl_templates/webapp/templates/testing.html
  69. 59
      vasl_templates/webapp/templates/vo-notes-report.html
  70. 8
      vasl_templates/webapp/templates/vo-report.html
  71. 3
      vasl_templates/webapp/tests/fixtures/data/default-template-pack/ob_ordnance.j2
  72. 3
      vasl_templates/webapp/tests/fixtures/data/default-template-pack/ob_vehicles.j2
  73. 4
      vasl_templates/webapp/tests/fixtures/data/vehicles/german.json
  74. 4
      vasl_templates/webapp/tests/fixtures/vo-reports/landing-craft.txt
  75. 32
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/allied-minor-common/1940.txt
  76. 32
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/allied-minor-common/1941.txt
  77. 32
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/allied-minor-common/1942.txt
  78. 32
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/allied-minor-common/1943.txt
  79. 32
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/allied-minor-common/1944.txt
  80. 32
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/allied-minor-common/1945.txt
  81. 59
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1940.txt
  82. 59
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1941.txt
  83. 59
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1942.txt
  84. 59
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1943.txt
  85. 59
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1944.txt
  86. 59
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1945.txt
  87. 70
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1940.txt
  88. 70
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1941.txt
  89. 70
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1942.txt
  90. 70
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1943.txt
  91. 70
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1944.txt
  92. 70
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1945.txt
  93. 24
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/belgian/1940.txt
  94. 24
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/belgian/1941.txt
  95. 24
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/belgian/1942.txt
  96. 24
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/belgian/1943.txt
  97. 24
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/belgian/1944.txt
  98. 24
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/belgian/1945.txt
  99. 54
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1940.txt
  100. 54
      vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1941.txt
  101. Some files were not shown because too many files have changed in this diff Show More

@ -140,6 +140,7 @@ disable=print-statement,
wrong-import-position,
global-statement,
too-few-public-methods,
too-many-lines,
duplicate-code, # can't get it to shut up about @pytest.mark.skipif's :-/
no-else-return

@ -27,7 +27,7 @@ def parse_requirements( fname ):
setup(
name = "vasl_templates",
version = "0.7", # nb: also update constants.py
version = "0.8", # nb: also update constants.py
description = "Create HTML snippets for use in VASL.",
license = "AGPLv3",
url = "https://github.com/pacman-ghost/vasl-templates",

@ -86,7 +86,7 @@ class MainWindow( QWidget ):
self.restoreGeometry( val )
else :
self.resize( 1000, 600 )
self.setMinimumSize( 800, 500 )
self.setMinimumSize( 980, 520 )
# initialize the layout
layout = QVBoxLayout( self )

@ -5,9 +5,12 @@ import os
import zipfile
import json
import re
import glob
import click
nationalities = None
# ---------------------------------------------------------------------
@click.command()
@ -15,13 +18,30 @@ import click
def main( output_fname ): # pylint: disable=too-many-locals,too-many-branches
"""Create a ZIP file with placeholder files for each Chapter H note and multi-applicable note."""
def log( fmt, *args ): #pylint: disable=missing-docstring
print( fmt.format( *args ) )
return make_chapter_h_placeholders( output_fname, log=log )
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
def make_chapter_h_placeholders( output_fname, log=None \
): #pylint: disable=too-many-locals,too-many-statements,too-many-branches
"""Create a ZIP file with placeholder files for each Chapter H note and multi-applicable note."""
# initialize
if not output_fname:
raise RuntimeError( "Output ZIP file not specified." )
if os.path.isfile( output_fname ):
raise RuntimeError( "Output ZIP file exists." )
if not log:
def log_nothing( fmt, *args ): #pylint: disable=missing-docstring,unused-argument
pass
log = log_nothing
results = {}
# load the nationalities
fname = os.path.join( os.path.split(__file__)[0], "../webapp/data/default-template-pack/nationalities.json" )
global nationalities
nationalities = json.load( open( fname, "r" ) )
# load the vehicle/ordnance data files
base_dir = os.path.join( os.path.split(__file__)[0], "../webapp/data/" )
for vo_type in ("vehicles","ordnance"):
@ -37,7 +57,7 @@ def main( output_fname ): # pylint: disable=too-many-locals,too-many-branches
nat = os.path.split( dname2 )[1]
if nat in ("british-commonwealth-forces-korea","cvpa","kpa","us-rok-ounc","un-forces"):
continue
notes, ma_notes = load_vo_data( fname )
notes, ma_notes = load_vo_data( fname, nat )
if nat not in results:
results[ nat ] = {}
if nat == "landing-craft":
@ -45,19 +65,34 @@ def main( output_fname ): # pylint: disable=too-many-locals,too-many-branches
else:
results[ nat ][ vo_type ] = { "notes": notes, "ma_notes": ma_notes }
# load the extensions
base_dir = os.path.join( os.path.split(__file__)[0], "../webapp/data/extensions" )
for fname in glob.glob( os.path.join( base_dir, "*.json" ) ):
extn_data = load_vo_data_from_extension( fname )
for nat in extn_data:
for vo_type in extn_data[nat]:
for key in extn_data[nat][vo_type]:
if nat not in results:
results[nat] = {}
if vo_type not in results[nat]:
results[nat][vo_type] = {}
if key not in results[nat][vo_type]:
results[nat][vo_type][key] = []
results[nat][vo_type][key].extend( extn_data[nat][vo_type].get( key, [] ) )
# generate the placeholder files
with zipfile.ZipFile( output_fname, "w" ) as zip_file:
nats = sorted( results.keys() )
for nat in nats: #pylint: disable=too-many-nested-blocks
for vo_type in ("vehicles","ordnance"):
print( "Generating {} {}...".format( nat, vo_type ) )
log( "Generating {} {}...", nat, vo_type )
for note_type in ("notes","ma_notes"):
# get the next set of note ID's
vals = results[nat].get( vo_type, {} ).get( note_type )
if not vals:
continue
print( "- {}: {}".format( note_type, ", ".join( str(v) for v in vals ) ) )
log( "- {}: {}", note_type, ", ".join( str(v) for v in vals ) )
for val in vals:
@ -65,7 +100,7 @@ def main( output_fname ): # pylint: disable=too-many-locals,too-many-branches
if isinstance(val, str):
# NOTE: Filenames are always lower-case, unless the note ID itself is lower-case,
# in which case we indicate this with a trailing underscore
if re.search( r"^[A-Z][A-Za-z]?$", val ):
if re.search( r"^([-a-z]+:)?[A-Z][A-Za-z]?$", val ):
val = val.lower()
elif re.search( r"^[a-z]{1,2}?$", val ):
val += "_"
@ -75,23 +110,13 @@ def main( output_fname ): # pylint: disable=too-many-locals,too-many-branches
fname = "{}/{}/{}.{}".format( nat, vo_type, val, "png" if note_type == "notes" else "html" )
# add the placeholder file to the ZIP
fname = fname.replace( ":", "/" )
zip_file.writestr( fname, b"" )
print()
log( "" )
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MA_NOTE_REGEXES = [
re.compile( r"^([A-Z]{1,2})$" ),
re.compile( r"^([A-Z]{1,2})\u2020" ),
re.compile( r"^([a-z])$" ),
re.compile( r"^([a-z])\u2020" ),
re.compile( r"^([A-Z][a-z])$" ),
re.compile( r"^([A-Za-z])<sup>" ),
re.compile( r"^<s>([A-Za-z])</s>$" ),
]
def load_vo_data( fname ):
def load_vo_data( fname, nat ):
"""Load a vehicle/ordnance data file."""
# initialize
@ -100,19 +125,94 @@ def load_vo_data( fname ):
# load the file
vo_data = json.load( open( fname, "r" ) )
for vo_entry in vo_data:
if "note_number" in vo_entry:
notes.add(
_extract_note_number( vo_entry["note_number"] )
)
if "notes" in vo_entry and not _ignore_ma_notes(nat):
ma_notes.update(
_extract_ma_note_ids( vo_entry["notes"] )
)
# load the vehicle/ordnance's note number
mo = re.search( r"^\d+", vo_entry["note_number"] )
notes.add( int( mo.group() ) )
return sorted(notes), sorted(ma_notes)
# load the multi-applicable note ID's
for ma_note in vo_entry.get("notes",[]):
matches = [ regex.search(ma_note) for regex in MA_NOTE_REGEXES ]
matches = [ mo.group(1) for mo in matches if mo ]
assert len(matches) == 1
ma_notes.add( matches[0] )
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
return sorted(notes), sorted(ma_notes)
def load_vo_data_from_extension( fname ):
"""Load a vehicle/ordnance extension data file."""
# initialize
results = {}
# get the extension ID
data = json.load( open( fname, "r" ) )
extn_id = data["extensionId"]
# load the file
for nat in data:
if not isinstance( data[nat], dict ):
continue
results[nat] = {}
for vo_type in ("vehicles","ordnance"):
notes, ma_notes = set(), set()
for vo_entry in data[nat].get(vo_type,[]):
# load the vehicle/ordnance's note number
if "note_number" in vo_entry:
notes.add(
_extract_note_number( vo_entry["note_number"] )
)
if "notes" in vo_entry and not _ignore_ma_notes(nat,extn_id):
ma_notes.update(
_extract_ma_note_ids( vo_entry["notes"] )
)
results[ nat ][ vo_type ] = {
"notes": [ "{}:{}".format( extn_id, n ) for n in sorted(notes) ],
"ma_notes": [ "{}:{}".format( extn_id, n ) for n in sorted(ma_notes) ]
}
return results
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MA_NOTE_REGEXES = [
re.compile( r"^([A-Z]{1,2})$" ),
re.compile( r"^([A-Z]{1,2})\u2020" ),
re.compile( r"^([a-z])$" ),
re.compile( r"^([a-z])\u2020" ),
re.compile( r"^([A-Z][a-z])$" ),
re.compile( r"^([A-Za-z])<sup>" ),
re.compile( r"^<s>([A-Za-z])</s>$" ),
]
REDIRECTED_MA_NOTE_REGEX = re.compile(
r"^((Ge|Ru|US|Br|Fr|Jp|Ch|Gr|AllM|AxM) ([A-Z]{1,2}|[0-9]{1,2}|Note \d+|<s>P</s>))\u2020?(<sup>\d</sup>)?$"
)
def _extract_note_number( val ):
"""Extract a vehicle/ordnance's note number."""
mo = re.search( r"^\d+", val )
return int( mo.group() )
def _extract_ma_note_ids( val ):
"""Extract a vehicle/ordnance's multi-applicable note ID's."""
ma_note_ids = []
for ma_note in val:
if REDIRECTED_MA_NOTE_REGEX.search( ma_note ):
continue
matches = [ regex.search(ma_note) for regex in MA_NOTE_REGEXES ]
matches = [ mo.group(1) for mo in matches if mo ]
assert len(matches) == 1
ma_note_ids.append( matches[0] )
return ma_note_ids
def _ignore_ma_notes( nat, extn_id=None ):
if extn_id == "adf-bj" and nat == "american":
return True
if extn_id is None and nationalities.get( nat, {} ).get( "type" ) in ("allied-minor","axis-minor"):
return True
return False
# ---------------------------------------------------------------------

File diff suppressed because it is too large Load Diff

@ -0,0 +1,26 @@
"""Test generating the Chapter H placeholder files."""
import os
from zipfile import ZipFile
from vasl_templates.tools.make_chapter_h_placeholders import make_chapter_h_placeholders
from vasl_templates.webapp.utils import TempFile
# ---------------------------------------------------------------------
def test_make_chapter_h_placeholders():
"""Test generating the Chapter H placeholder files."""
with TempFile() as temp_file:
# generate the Chapter H placeholder files
make_chapter_h_placeholders( temp_file.name )
# get the expected results
fname = os.path.join( os.path.split(__file__)[0], "fixtures/chapter-h-placeholders.txt" )
expected = [ line.strip() for line in open(fname,"r") ]
# check the results
with ZipFile( temp_file.name, "r" ) as zip_file:
zip_fnames = sorted( zip_file.namelist() )
assert zip_fnames == expected

@ -13,9 +13,9 @@ import json
import logging
from collections import defaultdict
import click
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
import click
from vasl_templates.webapp.webdriver import WebDriver
from vasl_templates.webapp.tests.test_scenario_persistence import load_scenario

@ -4,7 +4,7 @@ import sys
import os
APP_NAME = "VASL Templates"
APP_VERSION = "v0.7" # nb: also update setup.py
APP_VERSION = "v0.8" # nb: also update setup.py
APP_DESCRIPTION = "Generate HTML for use in VASL scenarios."
if getattr( sys, "frozen", False ):

@ -44,12 +44,17 @@
"display_name": "Chinese",
"ob_colors": [ "#d3edfc","#91cdf5", "#e0a22b" ]
},
"chinese~gmd": {
"display_name": "Chinese GMD",
"ob_colors": [ "#d3edfc","#91cdf5", "#e0a22b" ]
},
"polish": {
"display_name": "Polish",
"ob_colors": [ "#a3ecd1","#82e3bd", "#61d8a6" ],
"ob_colors": [ "#ecd8b0","#e8cfa4", "#84e8c2" ],
"type": "allied-minor"
},
"belgian": {
"display_name": "Belgian",
"ob_colors": [ "#a3ecd1","#82e3bd", "#61d8a6" ],
@ -99,6 +104,27 @@
"display_name": "Bulgarian",
"ob_colors": [ "#3ceb7c","#1de256", "#0ed93c" ],
"type": "axis-minor"
},
"anzac": {
"display_name": "ANZAC",
"ob_colors": [ "#f6edda","#e5cea0", "#e5cea0" ]
},
"thai": {
"display_name": "Thai",
"ob_colors": [ "#3ceb7c","#1de256", "#0ed93c" ]
},
"indonesian": {
"display_name": "Indonesian",
"ob_colors": [ "#3ceb7c","#1de256", "#0ed93c" ]
},
"burmese": {
"display_name": "Burmese",
"ob_colors": [ "#3ceb7c","#1de256", "#0ed93c" ]
},
"filipino": {
"display_name": "Filipino",
"ob_colors": [ "#3ceb7c","#1de256", "#0ed93c" ]
}
}

@ -5,6 +5,7 @@
<style>
td { margin: 0 ; padding: 0 ; }
.note { margin-top: 2px ; font-size: 90% ; font-style: italic ; color: #808080 ; }
.comment { font-size: 90% ; font-style: italic ; color: #404040 ; }
sup { font-size: 75% ; }
</style>
</head>
@ -25,9 +26,10 @@ sup { font-size: 75% ; }
{%for ord in OB_ORDNANCE%}
<tr style="border-bottom:1px dotted #e0e0e0;">
<td valign="top" style="padding:2px 5px 5px;">
<b> {{ord.name}} </b>
<b>{{ord.name}}</b> {%if ord.elite%}&#x24ba;{%endif%}
{%if ord.image%} <br> <img src="{{ord.image}}"> {%endif%}
<div class="note">
{%if ord.extn_id%} &#x2756; {%endif%}
{%if ord.notes%}
{{ord.note_number}}, {{ord.notes | join(", ")}}
{%else%}
@ -35,7 +37,8 @@ sup { font-size: 75% ; }
{%endif%}
</div>
<td valign="top" style="padding:2px 5px;">
{%for cap in ord.capabilities%} <div> {{cap}} </div> {%endfor%}
{%for cap in ord.capabilities%} <div class="capability"> {{cap}} </div> {%endfor%}
{%for cmnt in ord.comments%} <div class="comment"> {{cmnt}} </div> {%endfor%}
{%endfor%}
</table>

@ -4,6 +4,8 @@
<meta charset="utf-8">
<style>
.ma-note .key { font-weight: bold ; }
.ma-note table { margin-left: 10px ; }
.ma-note td { padding: 0 ; }
.extra-notes-caption { border: 1px solid #e0e0e0 ; background: #fcfcfc ; font-weight: bold ; padding: 2px 5px ; }
ul { margin: 0 0 0 15px ; padding: 0 ; }
sup { font-size: 75% ; }

@ -5,6 +5,7 @@
<style>
td { margin: 0 ; padding: 0 ; }
.note { margin-top: 2px ; font-size: 90% ; font-style: italic ; color: #808080 ; }
.comment { font-size: 90% ; font-style: italic ; color: #404040 ; }
sup { font-size: 75% ; }
</style>
</head>
@ -25,9 +26,10 @@ sup { font-size: 75% ; }
{%for veh in OB_VEHICLES%}
<tr style="border-bottom:1px dotted #e0e0e0;">
<td valign="top" style="padding:2px 5px 5px;">
<b> {{veh.name}} </b>
<b>{{veh.name}}</b> {%if veh.elite%}&#x24ba;{%endif%}
{%if veh.image%} <br> <img src="{{veh.image}}"> {%endif%}
<div class="note">
{%if veh.extn_id%} &#x2756; {%endif%}
{%if veh.notes%}
{{veh.note_number}}, {{veh.notes | join(", ")}}
{%else%}
@ -35,7 +37,8 @@ sup { font-size: 75% ; }
{%endif%}
</div>
<td valign="top" style="padding:2px 5px;">
{%for cap in veh.capabilities%} <div> {{cap}} </div> {%endfor%}
{%for cap in veh.capabilities%} <div class="capability"> {{cap}} </div> {%endfor%}
{%for cmnt in veh.comments%} <div class="comment"> {{cmnt}} </div> {%endfor%}
{%endfor%}
</table>

@ -4,6 +4,8 @@
<meta charset="utf-8">
<style>
.ma-note .key { font-weight: bold ; }
.ma-note table { margin-left: 10px ; }
.ma-note td { padding: 0 ; }
.extra-notes-caption { border: 1px solid #e0e0e0 ; background: #fcfcfc ; font-weight: bold ; padding: 2px 5px ; }
ul { margin: 0 0 0 15px ; padding: 0 ; }
sup { font-size: 75% ; }

@ -10,6 +10,22 @@
"name": "76* INF FRC",
"front_images": [ "al/gun/alINF76", "al/gun/alINF76u" ],
"back_images": "al/gun/alINF76b"
},
"adf:1828": {
"name": "105 ART wz.29",
"front_images": "po/gun/poARTwz29-BFP.png",
"back_images": [ "po/gun/poARTwz29-BFP.png", "po/gun/poARTwz29-BFPb.png" ]
},
"adf:1829": {
"name": "120* ART wz09.31",
"front_images": "po/gun/poARTwz0931-BFP.png",
"back_images": [ "po/gun/poARTwz0931-BFP.png", "po/gun/poARTwz0931-BFPb.png" ]
},
"adf:1830": {
"name": "155 ART wz.17",
"front_images": "po/gun/poARTwz17-BFP.png",
"back_images": [ "po/gun/poARTwz17-BFP.png", "po/gun/poARTwz17-BFPb.png" ]
}
}

@ -0,0 +1,939 @@
{
"parentExtensionId": "adf",
"extensionId": "adf-bj",
"version": "4.03",
"id_range": [ 900, 999 ],
"japanese": {
"vehicles": [
{ "name": "FT-17M Ko(f)",
"type": "Tt",
"no_radio": "\u00ae",
"CS#": 2,
"note_number": "1\u2020",
"notes": [ "A", "Fr C", "Ru M\u2020" ],
"comments": [ "1 MP minimum road movement rate, even if CE." ],
"id": "ja/v:900",
"gpid": "adf:278"
},
{ "name": "FT-17C Ko(f)",
"type": "Tt",
"no_radio": "\u00ae",
"CS#": 2,
"note_number": "2\u2020",
"notes": [ "A", "B", "Fr C", "Ru M\u2020" ],
"comments": [ "1 MP minimum road movement rate, even if CE." ],
"id": "ja/v:901",
"gpid": "adf:280"
},
{ "name": "NC-27M Otsu(f)",
"type": "Tt",
"no_radio": "\u00ae",
"CS#": 2,
"note_number": "3\u2020",
"notes": [ "A", "Fr C", "Ge H\u2020" ],
"comments": [ "1 MP minimum road movement rate, even if CE." ],
"id": "ja/v:902",
"gpid": "adf:282"
},
{ "name": "NC-27C Otsu(f)",
"type": "Tt",
"no_radio": "\u00ae",
"CS#": 2,
"note_number": "4\u2020",
"notes": [ "A", "B", "Fr C", "Ge H\u2020" ],
"comments": [ "1 MP minimum road movement rate, even if CE." ],
"id": "ja/v:903",
"gpid": "adf:284"
},
{ "name": "Type 88 LAV(b)",
"type": "Tt",
"no_radio": "\u00ae",
"CS#": 2,
"note_number": "5",
"notes": [ "A", "AllM D", "Ch H\u2020" ] ,
"id": "ja/v:904",
"gpid": "adf:286"
},
{ "name": "VCL(b)",
"type": "Tt",
"no_radio": "\u00ae",
"CS#": 2,
"note_number": "6\u2020",
"notes": [ "A", "C", "Ru M\u2020<sup>1</sup>" ],
"id": "ja/v:905",
"gpid": "adf:288"
},
{ "name": "Type 98 Ke-Ni",
"type": "LT",
"no_radio": "\u00ae",
"CS#": 3,
"note_number": "7\u2020",
"notes": [ "Jp C" ],
"id": "ja/v:906",
"gpid": "adf:316"
},
{ "name": "Type 2 Ke-To",
"type": "LT",
"no_radio": "\u00ae",
"CS#": 3,
"note_number": "8\u2020",
"notes": [ "Jp C" ],
"id": "ja/v:907",
"gpid": "adf:318"
},
{ "name": "M3(a)",
"type": "LT",
"no_radio": "\u00ae",
"CS#": 4,
"note_number": "9",
"notes": [ "A", "B", "C", "Jp A\u2020", "US B\u2020<sup>1</sup>" ],
"id": "ja/v:908",
"gpid": "adf:320"
},
{ "name": "Stuart I(a)",
"type": "LT",
"no_radio": "\u00ae",
"CS#": 4,
"capabilities2": { "sD": 4 },
"note_number": "10",
"notes": [ "A", "B", "C", "Jp A\u2020" ],
"id": "ja/v:909",
"gpid": "adf:322"
},
{ "name": "Type 97B Shi-Ki",
"type": "MT",
"CS#": 4,
"capabilities2": { "sD": 6 },
"note_number": "11\u2020",
"comments": [ "Moved/Motion: Fire NA" ],
"id": "ja/v:910",
"gpid": "adf:324"
},
{ "name": "Type 3 Ka-Chi",
"type": "MT",
"CS#": 5,
"capabilities2": { "sD": 5 },
"note_number": "12",
"notes": [ "Jp 6\u2020" ],
"comments": [ "Refer to Japanese Note 6 on Pontoons for amphibious data and wreck." ],
"id": "ja/v:911",
"gpid": "adf:326"
},
{ "name": "Type 3 Ka-Chi (without pontoons)",
"type": "MT",
"CS#": 5,
"capabilities2": { "sD": 5 },
"note_number": "12",
"notes": [ "Jp 6\u2020" ],
"id": "ja/v:912",
"gpid": "adf:328"
},
{ "name": "Armored Eng Veh SS",
"type": "MTv",
"no_radio": "\u00ae",
"CS#": 5,
"capabilities2": { "sD": 7 },
"note_number": "13\u2020",
"comments": [ "Has 2 side FT with limited traverse.", "May remove wire as if a Dozer (B24.7)." ],
"id": "ja/v:913",
"gpid": "adf:331"
},
{ "name": "Type 2587(b)",
"type": "AC",
"no_radio": "\u00ae",
"CS#": 5,
"capabilities": [ "2 TK DR's\u2020" ],
"note_number": "14\u2020",
"notes": [ "Ch F\u2020" ],
"comments": [ "REV x4" ],
"id": "ja/v:914",
"gpid": "adf:333"
},
{ "name": "Marmon-Herrington III(b)",
"type": "AC",
"no_radio": "\u00ae",
"CS#": 4,
"capabilities": [ "2 TK DR's\u2020" ],
"note_number": "15\u2020",
"notes": [ "C", "Ch F\u2020" ],
"id": "ja/v:915",
"gpid": "adf:335"
},
{ "name": "Type 1 Ho-Ha",
"type": "ht",
"CS#": 5,
"note_number": "16\u2020",
"comments": [ "2MA&amp;2&amp;2" ],
"id": "ja/v:916",
"gpid": "adf:337"
},
{ "name": "M3A1 Scout Car(a)",
"no_radio": "\u00ae",
"CS#": 4,
"note_number": "17",
"notes": [ "A", "C", "AllM 34\u2020<sup>2</sup>", "Jp A\u2020<sup>1</sup>", "Ch F\u2020" ],
"comments": [ "Refer to Allied Minor Vehicle Note 34 [EXC: does not come with an inherent HS]." ],
"id": "ja/v:917",
"gpid": "adf:339"
},
{ "name": "Carrier A(b)",
"type": "APC",
"no_radio": "\u00ae",
"CS#": 3,
"note_number": "18",
"notes": [ "A", "C", "Br Note 64\u2020" ],
"comments": [ "The Inherent Crew is a 2-3-7 HS (D6.82).", "Refer to British Vehicle Note 64 for switching the BMG to an AAMG." ],
"id": "ja/v:918",
"gpid": "adf:341"
},
{ "name": "Type 2 Ho-I",
"type": "SPA",
"CS#": 5,
"capabilities2": { "WP": 5, "sD": 5 },
"note_number": "19",
"id": "ja/v:919",
"gpid": "adf:343"
},
{ "name": "Type 1 Ho-Ni II",
"type": "SPA",
"CS#": 5,
"capabilities2": { "H": 5 },
"note_number": "20\u2020",
"id": "ja/v:920",
"gpid": "adf:345"
},
{ "name": "M3 75 SPA(a)",
"type": "SPAht",
"no_radio": "\u00ae",
"CS#": 4,
"note_number": "21",
"notes": [ "B", "C", "US U", "Ru M\u2020" ],
"id": "ja/v:921",
"gpid": "adf:347"
},
{ "name": "Type 97B Chi-Ha",
"type": "SPA",
"CS#": 4,
"capabilities2": { "H": 9 },
"note_number": "22",
"id": "ja/v:922",
"gpid": "adf:349"
},
{ "name": "Type 3 Ho-Ni III",
"type": "TD",
"CS#": 5,
"capabilities2": { "WP": 5 },
"note_number": "23",
"id": "ja/v:923",
"gpid": "adf:351"
},
{ "name": "Type 97 AA Truck",
"type": "AAtr",
"CS#": 7,
"note_number": "24\u2020",
"comments": [ "MA: AA" ],
"id": "ja/v:924",
"gpid": "adf:353"
},
{ "name": "Type 98 MCT",
"type": "AAtr",
"CS#": 5,
"note_number": "25",
"notes": [ "Br H", "Ge A\u2020" ],
"comments": [ "Bnd FF NA VCA", "MA: AA", "(Un)load: Portee" ],
"id": "ja/v:925",
"gpid": "adf:355"
}
],
"ordnance": [
{ "name": "Type 45 (1912) 24cm Howitzer",
"type": "ART",
"capabilities": [ "NT", "NM", "No IF", "HE TK# 23", "Tow NA" ],
"note_number": "1\u2020",
"notes": [ "Jp D\u2020<sup>1</sup>" ],
"id": "ja/o:900",
"gpid": "adf:274"
},
{ "name": "Type 91 Vickers AA Gun",
"type": "AA",
"capabilities": [ "AP TK# 8" ],
"capabilities2": { "LF": [ "40(4)", "1 ROF", "B10"] },
"note_number": "2\u2020",
"id": "ja/o:901",
"gpid": "adf:275"
},
{ "name": "Type 91 Twin-mount Vickers AA Gun",
"type": "AA",
"capabilities": [ "AP TK# 8", "2 TK DR's\u2020" ],
"capabilities2": { "LF": [ "40(8)", "1 ROF", "B10" ] },
"note_number": "3\u2020",
"id": "ja/o:902",
"gpid": "adf:276"
},
{ "name": "Type 4 75mm AA",
"type": "AA",
"capabilities": [ "T" ],
"capabilities2": { "LF": [ "75", "1 ROF", "B11" ], "AP": [ [6,"44-"] ] },
"note_number": "4\u2020",
"notes": [ "Ch G"],
"id": "ja/o:903",
"gpid": "adf:277"
}
]
},
"chinese": {
"vehicles": [
{ "name": "FT-17(f)",
"type": "Tt",
"no_radio": "\u00ae",
"CS#": 2,
"note_number": "1\u2020",
"notes": [ "A", "Fr C", "Ru M\u2020" ],
"id": "ch/v:900",
"gpid": "adf:233"
},
{ "name": "Type 94 Lt Armored Vehicle(j)",
"type": "Tt",
"no_radio": "\u00ae",
"CS#": 2,
"note_number": "2",
"notes": [ "A", "D", "Ru M\u2020" ],
"id": "ch/v:901",
"gpid": "adf:235"
},
{ "name": "Type 97A Te-Ke(j)",
"type": "Tt",
"no_radio": "\u00ae",
"CS#": 2,
"note_number": "3",
"notes": [ "A", "D" ],
"id": "ch/v:902",
"gpid": "adf:237"
},
{ "name": "Type 97B Te-Ke(j)",
"type": "Tt",
"no_radio": "\u00ae",
"CS#": 2,
"note_number": "4",
"notes": [ "A", "C", "D" ],
"id": "ch/v:903",
"gpid": "adf:239"
},
{ "name": "Type 95 Ha-Go(j)",
"type": "LT",
"no_radio": "\u00ae",
"CS#": 3,
"note_number": "5",
"notes": [ "A", "B\u2020", "C", "D", "Jp 5\u2020<sup>1</sup>" ],
"id": "ch/v:904",
"gpid": "adf:241"
},
{ "name": "BT-5(r)",
"type": "LT",
"no_radio": "\u00ae",
"CS#": 3,
"note_number": "6",
"notes": [ "A", "B\u2020<sup>1</sup>", "Ru M\u2020" ],
"id": "ch/v:905",
"gpid": "adf:243"
},
{ "name": "Type 89A Chi-Ro(j)",
"type": "MT",
"no_radio": "\u00ae",
"CS#": 4,
"note_number": "7",
"notes": [ "A", "B\u2020", "C", "D" ],
"id": "ch/v:906",
"gpid": "adf:245"
},
{ "name": "Type 97A Chi-Ha(j)",
"type": "MT",
"no_radio": "\u00ae",
"CS#": 4,
"note_number": "8",
"notes": [ "A", "B\u2020", "C", "D" ],
"id": "ch/v:907",
"gpid": "adf:247"
},
{ "name": "Type 31 Armored Car",
"type": "AC",
"no_radio": "\u00ae",
"CS#": 3,
"note_number": "9\u2020",
"notes": [ "B\u2020<sup>1</sup>", "Ch F\u2020" ],
"id": "ch/v:908",
"gpid": "adf:249"
}
]
},
"dutch": {
"vehicles": [
{ "name": "Alvis-Straussler AC3D",
"type": "AC",
"no_radio": "\u00ae",
"CS#": 4,
"note_number": "1\u2020<sup>2</sup>",
"notes": [ "AllM V\u2020", "Ch F\u2020<sup>1</sup>" ],
"comments": [ "CMG uses AP TK 12.7 column." ],
"id": "du/v:900",
"gpid": "adf:10"
},
{ "name": "Braat Overvalwagen APC",
"type": "AC",
"no_radio": "\u00ae",
"CS#": 5,
"note_number": "2\u2020<sup>2</sup>",
"notes": [ "A\u2020<sup>1</sup>", "Ch F\u2020" ],
"comments": [ "CMG: VCA only", "Mounted Fire: Full FP" ],
"id": "du/v:901",
"gpid": "adf:12"
},
{ "name": "Braat Overvalwagen AA",
"type": "AC",
"no_radio": "\u00ae",
"CS#": 4,
"note_number": "3\u2020<sup>1</sup>",
"notes": [ "AllM AA\u2020<sup>2</sup>", "Ch F\u2020" ],
"comments": [ "AAMG uses AP TK 12.7 column." ],
"id": "du/v:902",
"gpid": "adf:14"
},
{ "name": "Kanonwagen Armored Car",
"type": "AC",
"no_radio": "\u00ae",
"CS#": 4,
"note_number": "4\u2020\u2020<sup>1</sup>",
"notes": [ "A\u2020<sup>2</sup>", "AllM V\u2020", "Ch F\u2020<sup>1</sup>" ],
"comments": [ "VCA MA: VCA &le; level NA", "CMG may only fire within VCA.", "Rear turret is unarmored when TCA = VCA." ],
"id": "du/v:903",
"gpid": "adf:16"
},
{ "name": "Stadswacht Overvalwagen APC",
"type": "AC",
"CS#": 6,
"note_number": "5\u2020<sup>1</sup>",
"notes": [ "Ch F\u2020" ],
"comments": [ "Mounted Fire: Full FP", "Passengers may fire 2 LMG's without losing inherent FP." ],
"id": "du/v:904",
"gpid": "adf:18"
},
{ "name": "PLA Wagen",
"type": "AAtr",
"CS#": 5,
"note_number": "6\u2020",
"notes": [ "AllM AA\u2020<sup>1</sup>" ],
"comments": [ "AP TK: use 12.7 column." ],
"id": "du/v:905",
"gpid": "adf:20"
}
],
"ordnance": [
{ "name": "Brandt 47mm Mortar",
"type": "MTR",
"note_number": "1",
"id": "du/o:900",
"gpid": "adf:1948"
},
{ "name": "Krupp 75mm M1933 Field Gun",
"type": "ART",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "C": "4\u2020" },
"note_number": "2",
"notes": [ "US C\u2020" ],
"id": "du/o:901",
"gpid": "adf:5"
},
{ "name": "Bofors 105mm M1924 Howitzer",
"type": "ART",
"capabilities": [ "T" ],
"capabilities2": { "LF": [ "NT", "B11" ] },
"note_number": "3",
"id": "du/o:902",
"gpid": "adf:6"
},
{ "name": "20mm Rheinmetall AA",
"type": "AA",
"capabilities": [ "T" ],
"capabilities2": { "LF": [ "20\u2020", "2 ROF", "B11", "NT" ] },
"note_number": "4",
"notes": [ "Gr C\u2020" ],
"id": "du/o:903",
"gpid": "adf:7"
},
{ "name": "Bofors 80mm M29/38",
"type": "AA",
"capabilities": [ "T" ],
"capabilities2": { "LF": [ "80\u2020", "1 ROF", "B11" ] },
"capabilities_other": [ "AP TK# 17" ],
"note_number": "6",
"notes": [ "AxM G\u2020" ],
"id": "du/o:904",
"gpid": "adf:9"
}
]
},
"thai": {
"vehicles": [
{ "name": "VCL Mk VI(b)",
"type": "Tt",
"no_radio": "\u00ae",
"CS#": 2,
"note_number": "1",
"notes": [ "A", "Ch H", "AllM D" ],
"id": "th/v:900",
"gpid": "adf:92"
},
{ "name": "Vickers 6-Ton MkE-B(b)",
"type": "LT",
"no_radio": "\u00ae",
"CS#": 3,
"note_number": "2",
"notes": [ "A" ],
"id": "th/v:901",
"gpid": "adf:94"
},
{ "name": "Type 83(j)",
"type": "LT",
"no_radio": "\u00ae",
"CS#": 3,
"note_number": "3",
"notes": [ "A", "E\u2020" ],
"comments": [ "Refer to Japanese Vehicle Note 5 for Rear MG CA restrictions." ],
"id": "th/v:902",
"gpid": "adf:96"
},
{ "name": "Vickers 6-Ton AA(b)",
"type": "SPAA",
"no_radio": "\u00ae",
"CS#": 3,
"capabilities": [ "AP TK# 8" ],
"note_number": "4",
"notes": [ "A", "AllM AA\u2020" ],
"id": "th/v:903",
"gpid": "adf:98"
},
{ "name": "Citroen-Kegresse P17(f)",
"type": "ht",
"CS#": 3,
"note_number": "5\u2020",
"notes": [ "A" ],
"id": "th/v:904",
"gpid": "adf:100"
},
{ "name": "Vickers Morris M1930(b)",
"type": "AC",
"no_radio": "\u00ae",
"CS#": 4,
"note_number": "6",
"notes": [ "Br X\u2020", "Ch F\u2020" ],
"comments": [ "REV x4" ],
"id": "th/v:905",
"gpid": "adf:102"
}
],
"ordnance": [
{ "name": "50mm Krupp M1906",
"type": "INF",
"capabilities": [ "NT", "QSU", "h-d" ],
"comments": [ "No Gunshield." ],
"note_number": "4",
"id": "th/o:900",
"gpid": "adf:81"
},
{ "name": "75mm Krupp M1908",
"type": "INF",
"capabilities": [ "NT", "QSU", "h-d" ],
"capabilities2": { "AP": 8, "WP": 5 },
"note_number": "5",
"id": "th/o:901",
"gpid": "adf:82"
},
{ "name": "Vickers 12.7mm AA Class D",
"type": "AA",
"capabilities": [ "T", "QSU" ],
"note_number": "8",
"id": "th/o:902",
"gpid": "adf:85"
},
{ "name": "Bofors M30 75mm AA",
"type": "AA",
"capabilities": [ "T" ],
"capabilities2": { "LF": [ "75", "1 ROF", "B11" ], "AP":6 },
"note_number": "9",
"notes": [ "Ch G\u2020"],
"id": "th/o:902",
"gpid": "adf:86"
}
]
},
"indonesian": {
"vehicles": [
{ "name": "Type 94 Light Armoured Vehicle (j)",
"type": "Tt",
"CS#": 2,
"note_number": "1",
"notes": [ "C", "Ru M\u2020" ],
"id": "ina/v:900",
"gpid": "adf:123"
},
{ "name": "Type 97A Te-Ke Light Armored Vehicle (j)",
"type": "Tt",
"CS#": 2,
"note_number": "2",
"notes": [ "C" ],
"id": "ina/v:901",
"gpid": "adf:125"
},
{ "name": "Type 97B Te-Ke Light Armored Vehicle (j)",
"type": "Tt",
"CS#": 2,
"note_number": "3",
"notes": [ "C" ],
"id": "ina/v:902",
"gpid": "adf:127"
},
{ "name": "Universal Carrier (b)",
"type": "Tt",
"CS#": 3,
"note_number": "4",
"notes": [ "C" ],
"id": "ina/v:903",
"gpid": "adf:129"
},
{ "name": "Type 95 Ha-Go(j)",
"type": "LT",
"CS#": 3,
"note_number": "5",
"notes": [ "B", "C", "D\u2020", "E\u2020<sup>1</sup>" ],
"comments": [ "Refer to Japanese Vehicle Note 5 for Rear MG CA restrictions." ],
"id": "ina/v:904",
"gpid": "adf:131"
},
{ "name": "VCL M1936 (b)",
"type": "aTt",
"CS#": 2,
"note_number": "6",
"notes": [ "C" ],
"id": "ina/v:905",
"gpid": "adf:133"
},
{ "name": "CTLS-4 (a)",
"type": "Tt",
"CS#": 2,
"note_number": "7",
"notes": [ "C", "Ru M\u2020", "AllM 26\u2020<sup>1</sup>" ],
"comments": [ "Port VCA NA (see Allied Minor Vehicle Note 26)." ],
"id": "ina/v:906",
"gpid": "adf:135"
},
{ "name": "Marmon-Herrington III Armored Car (b)",
"type": "AC",
"CS#": 4,
"capabilities": [ "2 TK DR's\u2020" ],
"note_number": "8",
"notes": [ "Ch F\u2020" ],
"id": "ina/v:907",
"gpid": "adf:137"
},
{ "name": "M3A1 Scout Car (a)",
"type": "SC",
"CS#": 4,
"note_number": "8",
"capabilities_other": [ "9PP" ],
"note_number": "9\u2020",
"notes": [ "D\u2020<sup>1</sup>", "AllM 34\u2020<sup>2</sup>" ],
"comments": [ "AP TK: use 12.7 column.", "Refer to Allied Minor Vehicle Note 34 [EXC: does not come with an inherent HS]." ],
"id": "ina/v:908",
"gpid": "adf:139"
},
{ "name": "Braat Overvalwagen AA",
"type": "AC",
"CS#": 4,
"note_number": "8",
"note_number": "10\u2020<sup>1</sup>",
"notes": [ "Ch F\u2020", "AllM AA\u2020<sup>1</sup>" ],
"comments": [ "AP TK: use 12.7 column." ],
"id": "ina/v:909",
"gpid": "adf:14"
},
{ "name": "Braat Overvalwagen APC",
"type": "AC",
"CS#": 5,
"note_number": "8",
"capabilities_other": [ "12PP" ],
"note_number": "11\u2020<sup>2</sup>",
"notes": [ "D\u2020<sup>1</sup>", "Ch F\u2020" ],
"comments": [ "CMG: VCA only", "Mounted Fire: Full FP" ],
"id": "ina/v:910",
"gpid": "adf:12"
},
{ "name": "Alvis-Straussler AC3D",
"type": "AC",
"CS#": 4,
"note_number": "8",
"note_number": "12\u2020<sup>1</sup>",
"notes": [ "D\u2020<sup>2</sup>", "Ru M\u2020" ],
"comments": [ "AP TK: use 12.7 column." ],
"id": "ina/v:911",
"gpid": "adf:10"
},
{ "name": "PLA Wagen",
"type": "AAtr",
"CS#": 5,
"note_number": "13\u2020<sup>1</sup>",
"notes": [ "AllM AA\u2020<sup>1</sup>", "Ch F\u2020" ],
"comments": [ "AP TK: use 12.7 column." ],
"id": "ina/v:912",
"gpid": "adf:147"
}
],
"ordnance": [
{ "name": "Type 89 Heavy Grenade Launcher",
"type": "MTR",
"capabilities2": { "WP": [ [5,5] ], "S": [ [6,5] ] },
"capabilities_other": [ "4PP" ],
"note_number": "1",
"id": "ina/o:900",
"gpid": "adf:75"
},
{ "name": "Type 97 Automatic Gun",
"type": "ATR",
"capabilities": [ "Long Range is NA" ],
"capabilities_other": [ "5PP" ],
"note_number": "2",
"notes": [ "Jp A" ],
"id": "ina/o:901",
"gpid": "adf:77"
},
{ "name": "Year-11 Flat-Trajectory INF Gun",
"type": "INF",
"capabilities_other": [ "5PP (3PP dm)" ],
"note_number": "3",
"notes": [ "Jp A" ],
"id": "ina/o:902",
"gpid": "adf:76"
},
{ "name": "Type 94 Rapid-Fire Gun",
"type": "AT",
"capabilities": [ "NT", "QSU", "h-d" ],
"note_number": "4",
"notes": [ "Jp A" ],
"id": "ina/o:903",
"gpid": "adf:87"
},
{ "name": "Type 1 Machine-Moved Gun",
"type": "AT",
"capabilities_other": [ "NT", "QSU" ],
"note_number": "5",
"id": "ina/o:904",
"gpid": "adf:88"
},
{ "name": "Year-38 Type Field Gun (Improved)",
"type": "ART",
"capabilities2": { "WP": [ [5,5] ] },
"capabilities_other": [ "NT", "QSU", "h-d", "AP TK#12" ],
"note_number": "6",
"id": "ina/o:905",
"gpid": "adf:89"
}
]
},
"anzac": {
"vehicles": [
{ "name": "Matilda Frog",
"type": "HTv",
"CS#": 5,
"capabilities2": { "sD": "6" },
"note_number": "1\u2020",
"id": "anz/v:900",
"gpid": "adf:211"
},
{ "name": "Matilda II(L)",
"type": "HT",
"CS#": 5,
"capabilities2": { "sD": "6" },
"note_number": "2\u2020",
"notes": [ "Br B\u2020<sup>1</sup>" ],
"id": "anz/v:901",
"gpid": [ "adf:213", "adf:215" ]
},
{ "name": "Matilda II CS(L)",
"type": "HT",
"CS#": 5,
"capabilities2": { "s": "9", "sD": "6" },
"note_number": "3\u2020",
"notes": [ "Br S\u2020<sup>1</sup>" ],
"id": "anz/v:902",
"gpid": [ "adf:217", "adf:219" ]
},
{ "name": "Valentine III CS",
"type": "HT",
"CS#": 5,
"capabilities2": { "s": "9", "sM": "8" },
"note_number": "4\u2020",
"notes": [ "Br S\u2020<sup>1</sup>" ],
"id": "anz/v:903",
"gpid": "adf:221"
}
]
},
"american": {
"vehicles": [
{ "name": "LVT(A)1(L)",
"type": "aLT",
"CS#": 6,
"capabilities2": { "C": [ [10,"P"], "\u2020<sup>2</sup>" ] },
"note_number": "1",
"notes": [ "US 46\u2020<sup>3</sup>", "C\u2020<sup>2</sup>", "G", "H", "P", "T\u2020", "X" ],
"comments": [ "Refer to U.S. Vehicle Note 46 and diagram for the AAMG." ],
"id": "am/v:900",
"gpid": "adf:196"
},
{ "name": "LVT(A)2F",
"type": "aAPCv",
"CS#": 7,
"note_number": "2",
"notes": [ "US H", "P", "Q\u2020<sup>1</sup>", "T\u2020<sup>1</sup>"],
"id": "am/v:901",
"gpid": "adf:198"
},
{ "name": "LVT4F",
"type": "aAPCv",
"cs#": 7,
"note_number": "3\u2020<sup>2</sup>",
"notes": [ "US 51\u2020", "D\u2020<sup>3</sup>", "H", "P", "T\u2020<sup>1</sup>"],
"id": "am/v:902",
"gpid": "adf:200"
},
{ "name": "LVT(A)2FS",
"type": "aAPCv",
"CS#": 7,
"note_number": "4\u2020<sup>1</sup>",
"notes": [ "US D\u2020<sup>2</sup>", "H", "P", "T\u2020"],
"id": "am/v:903",
"gpid": "adf:202"
},
{ "name": "LVT4(L)",
"type": "aAPC",
"CS#": 7,
"note_number": "5",
"notes": [ "US 51\u2020", "D\u2020<sup>4</sup>", "H", "Q\u2020<sup>3</sup>", "T\u2020<sup>1</sup>", "X\u2020<sup>2</sup>"],
"id": "am/v:904",
"gpid": "adf:205"
},
{ "name": "LVT(A)4(L)",
"type": "aLT",
"CS#": 6,
"capabilities2": { "C": [ [7,"P"], "\u2020<sup>3</sup>" ], "H": 8, "WP": 9 },
"note_number": "6",
"notes": [ "US 46\u2020<sup>2</sup>", "C\u2020<sup>3</sup>", "G", "H", "P", "T\u2020", "X\u2020<sup>1</sup>"],
"id": "am/v:905",
"gpid": "adf:207"
},
{ "name": "M3A1F",
"type": "LTv",
"CS#": 4,
"capabilities2": { "C": [ [7,"P"], "\u2020" ] },
"note_number": "7",
"notes": [ "US C\u2020", "G", "P" ],
"id": "am/v:906",
"gpid": "adf:152"
},
{ "name": "M5A1 Satan",
"CS#": 4,
"note_number": "8\u2020",
"notes": [ "US P" ],
"id": "am/v:907",
"gpid": "adf:158"
},
{ "name": "M4A2F",
"type": "MTv",
"cs#": 5,
"capabilities2": { "s": 5, "WP": 7, "sM": 5 },
"note_number": "9",
"notes": [ "US G", "P", "R" ],
"id": "am/v:908",
"gpid": "adf:168"
},
{ "name": "M4A2(L)F",
"type": "MTv",
"cs#": 6,
"capabilities2": { "s": 5, "WP": 7, "sM": 8 },
"note_number": "10",
"notes": [ "US G", "P", "R" ],
"id": "am/v:909",
"gpid": "adf:170"
},
{ "name": "Carrier .50cal(b)",
"type": "APC",
"CS#": 3,
"note_number": "11\u2020",
"id": "am/v:910",
"gpid": "adf:209"
}
],
"ordnance": [
{ "name": "20mm Oerlikon Mk4",
"type": "AA",
"capabilities": [ "T", "2 TK DR's\u2020" ],
"comments": [ "Multiple Hits (C3.8) are NA." ],
"note_number": "1\u2020",
"notes": [ "US P" ],
"id": "am/o:900",
"gpid": "adf:34"
}
]
}
}

@ -0,0 +1,181 @@
{
"parentExtensionId": "adf",
"extensionId": "adf-cobra",
"version": "4.03",
"id_range": [ 850, 899 ],
"comment": "These are F (flamethrower) and C (Culin) versions of the same vehicles (from Operation Cobra).",
"american": {
"vehicles": [
{ "name": "M5A1C",
"type": "LT",
"CS#": 4,
"capabilities": [ "C7\u2020<sup>2</sup>" ],
"note_number": "5\u2020",
"notes": [ "US C\u2020<sup>2</sup>", "US F\u2020<sup>1</sup>", "US G", "US N", "US Y", "A", "B" ],
"id": "am/v:850",
"gpid": "adf:154"
},
{ "name": "M4C",
"type": "MT",
"CS#": "5:brewup",
"capabilities2": { "s": [ [5,"J4+"] ], "WP": [ [7,"J4+"], "\u2020<sup>3</sup>" ], "sM": [ [5,"4+"] ] },
"note_number": "8\u2020",
"notes": [ "US F\u2020<sup>2</sup>", "US G", "US R\u2020<sup>1</sup>", "US Y", "US BB\u2020<sup>3</sup>", "A", "B" ],
"id": "am/v:851",
"gpid": "adf:160"
},
{ "name": "M4A1C",
"type": "MT",
"CS#": "5:brewup",
"capabilities2": { "s": [ [5,"J4+"] ], "WP": [ [7,"J4+"], "\u2020<sup>3</sup>" ], "sM": [ [5,"4+"] ] },
"note_number": "9\u2020",
"notes": [ "US F\u2020<sup>2</sup>", "US G", "US N", "US R\u2020<sup>1</sup>", "US Y", "US BB\u2020<sup>3</sup>", "A", "B" ],
"id": "am/v:852",
"gpid": "adf:164"
},
{ "name": "M4A3C",
"type": "MT",
"CS#": "5:brewup",
"capabilities2": { "s": [ [5,"J4+"] ], "WP": [ [7,"J4+"], "\u2020<sup>3</sup>" ], "sM": [ [4,"4+"] ] },
"note_number": "12\u2020",
"notes": [ "US F\u2020<sup>2</sup>", "US G", "US R\u2020<sup>1</sup>", "US Y", "US BB\u2020<sup>3</sup>", "A", "B" ],
"id": "am/v:853",
"gpid": "adf:172"
},
{ "name": "M4A3C(75)W",
"type": "MT",
"CS#": 6,
"capabilities2": { "s": 5, "WP": 7, "sM": 8 },
"note_number": "13\u2020",
"notes": [ "US F\u2020<sup>2</sup>", "US G", "US R\u2020<sup>1</sup>", "US Y", "A", "B" ],
"id": "am/v:854",
"gpid": "adf:176"
},
{ "name": "M4A1C(76)W",
"type": "MT",
"CS#": 6,
"capabilities2": { "A": [ [4,"A4"], [5,5], "\u2020<sup>2</sup>" ], "s": [ [5,5] ], "sM": 8 },
"note_number": "15\u2020",
"notes": [ "US A\u2020<sup>2</sup>", "US F\u2020<sup>1</sup>", "US G", "US <s>P</s>", "US Y", "A", "B" ],
"id": "am/v:855",
"gpid": "adf:180"
},
{ "name": "M4A3C(76)W",
"type": "MT",
"CS#": 6,
"capabilities2": { "A": [ [4,"A4"], [5,5], "\u2020<sup>2</sup>" ], "s": [ [5,5] ], "sM": 8 },
"note_number": "16\u2020",
"notes": [ "US A\u2020<sup>2</sup>", "US F\u2020<sup>1</sup>", "US G", "US <s>P</s>", "US Y", "A", "B" ],
"id": "am/v:856",
"gpid": "adf:184"
},
{ "name": "M4C(105)",
"type": "MT",
"CS#": 6,
"capabilities2": { "H": 9, "C": [ [7,"P"], "\u2020<sup>1</sup>" ], "s": 7, "WP": 9, "sM": 8 },
"note_number": "17\u2020",
"notes": [ "US C\u2020<sup>1</sup>", "US Y", "A", "B" ],
"id": "am/v:857",
"gpid": "adf:188"
},
{ "name": "M4A3C(105)",
"type": "MT",
"CS#": 6,
"capabilities2": { "H": 9, "C": [ [7,"P"], "\u2020<sup>1</sup>" ], "s": 7, "WP": 9, "sM": 8 },
"note_number": "17\u2020",
"notes": [ "US C\u2020<sup>1</sup>", "US Y", "A", "B" ],
"id": "am/v:858",
"gpid": "adf:190"
},
{ "name": "M10C GMC",
"type": "TD",
"CS#": 7,
"capabilities2": { "A": [ [5,"A4E"], [6,"5E"], "\u2020<sup>1</sup>" ], "s": [ [5,5] ], "sP": 5 },
"note_number": "23\u2020",
"notes": [ "US A\u2020<sup>1</sup>", "US N", "US Y", "A", "B" ],
"id": "am/v:859",
"gpid": "adf:192"
},
{ "name": "M8C HMC",
"type": "SPA",
"CS#": 5,
"capabilities2": { "H": 9, "C": [ [4,"4+"], "\u2020<sup>1</sup>" ], "WP": 9 },
"note_number": "43\u2020",
"notes": [ "US C\u2020<sup>1</sup>", "US Y", "A", "B" ],
"id": "am/v:860",
"gpid": "adf:194"
},
{ "name": "M5A1F",
"type": "LT",
"CS#": 4,
"capabilities": [ "C7\u2020<sup>2</sup>" ],
"note_number": "5\u2020",
"notes": [ "US C\u2020<sup>2</sup>", "US F\u2020<sup>1</sup>", "US G", "US N", "US Y", "C" ],
"id": "am/v:870",
"gpid": "adf:156"
},
{ "name": "M4F",
"type": "MT",
"CS#": "5:brewup",
"capabilities2": { "s": [ [5,"J4+"] ], "WP": [ [7,"J4+"], "\u2020<sup>3</sup>" ], "sM": [ [5,"4+"] ] },
"note_number": "8\u2020",
"notes": [ "US F\u2020<sup>2</sup>", "US G", "US R\u2020<sup>1</sup>", "US Y", "US BB\u2020<sup>3</sup>", "C" ],
"id": "am/v:871",
"gpid": "adf:162"
},
{ "name": "M4A1F",
"type": "MT",
"CS#": "5:brewup",
"capabilities2": { "s": [ [5,"J4+"] ], "WP": [ [7,"J4+"], "\u2020<sup>3</sup>" ], "sM": [ [5,"4+"] ] },
"note_number": "9\u2020",
"notes": [ "US F\u2020<sup>2</sup>", "US G", "US N", "US R\u2020<sup>1</sup>", "US Y", "US BB\u2020<sup>3</sup>", "C" ],
"id": "am/v:872",
"gpid": "adf:166"
},
{ "name": "M4A3F",
"type": "MT",
"CS#": "5:brewup",
"capabilities2": { "s": [ [5,"J4+"] ], "WP": [ [7,"J4+"], "\u2020<sup>3</sup>" ], "sM": [ [4,"4+"] ] },
"note_number": "12\u2020",
"notes": [ "US F\u2020<sup>2</sup>", "US G", "US R\u2020<sup>1</sup>", "US Y", "US BB\u2020<sup>3</sup>", "C" ],
"id": "am/v:873",
"gpid": "adf:174"
},
{ "name": "M4A3F(75)W",
"type": "MT",
"CS#": 6,
"capabilities2": { "s": 5, "WP": 7, "sM": 8 },
"note_number": "13\u2020",
"notes": [ "US F\u2020<sup>2</sup>", "US G", "US R\u2020<sup>1</sup>", "US Y", "C" ],
"id": "am/v:874",
"gpid": "adf:178"
},
{ "name": "M4A1F(76)W",
"type": "MT",
"CS#": 6,
"capabilities2": { "A": [ [4,"A4"], [5,5], "\u2020<sup>2</sup>" ], "s": [ [5,5] ], "sM": 8 },
"note_number": "15\u2020",
"notes": [ "US A\u2020<sup>2</sup>", "US F\u2020<sup>1</sup>", "US G", "US <s>P</s>", "US Y", "C" ],
"id": "am/v:875",
"gpid": "adf:182"
},
{ "name": "M4A3F(76)W",
"type": "MT",
"CS#": 6,
"capabilities2": { "A": [ [4,"A4"], [5,5], "\u2020<sup>2</sup>" ], "s": [ [5,5] ], "sM": 8 },
"note_number": "16\u2020",
"notes": [ "US A\u2020<sup>2</sup>", "US F\u2020<sup>1</sup>", "US G", "US <s>P</s>", "US Y", "C" ],
"id": "am/v:876",
"gpid": "adf:186"
}
]
}
}

@ -0,0 +1,543 @@
{
"parentExtensionId": "adf",
"extensionId": "adf-pif",
"version": "4.03",
"id_range": [ 800, 849 ],
"polish": {
"vehicles": [
{ "name": "TKS-AA",
"type": "Tt",
"no_radio": "\u00ae",
"CS#": 2,
"note_number": "1\u2020<sup>2</sup>",
"notes": [ "A\u2020<sup>1</sup>", "C\u2020", "AllM D" ],
"id": "po/v:800",
"gpid": "adf:919"
},
{ "name": "FT-18C (f)",
"type": "Tt",
"no_radio": "\u00ae",
"CS#": 2,
"capabilities2": { "AP": 9, "C": "5\u2020<sup>1</sup>" },
"comments": [ "Road Rate NA" ],
"note_number": "2\u2020",
"notes": [ "B", "D\u2020<sup>1</sup>", "Fr C" ],
"id": "po/v:801",
"gpid": "adf:907"
},
{ "name": "FT-17K (f)",
"type": "Tt",
"no_radio": "\u00ae",
"CS#": 2,
"capabilities2": { "AP": 9, "C": "5\u2020<sup>1</sup>" },
"comments": [ "Road Rate NA", "+4 ESB" ],
"note_number": "3\u2020",
"notes": [ "B", "D\u2020<sup>1</sup>", "Fr C" ],
"id": "po/v:802",
"gpid": "adf:1732"
},
{ "name": "TKS-D",
"type": "Tt",
"no_radio": "\u00ae",
"CS#": 2,
"comments": [ "12: Immob, 11: Stall" ],
"note_number": "4",
"notes": [ "C\u2020", "AllM D" ],
"id": "po/v:803",
"gpid": "adf:927"
},
{ "name": "TKD",
"type": "Tt",
"no_radio": "\u00ae",
"CS#": 2,
"capabilities2": { "C": "5\u2020<sup>1</sup>" },
"comments": [ "12: Immob, 11: Stall" ],
"note_number": "5\u2020<sup>1</sup>",
"notes": [ "C\u2020", "D\u2020<sup>1</sup>", "AllM D" ],
"id": "po/v:804",
"gpid": "adf:1614"
},
{ "name": "H39(f)",
"type": "LT",
"no_radio": "\u00ae",
"CS#": 2,
"capabilities2": { "AP": 10 },
"note_number": "6",
"notes": [ "B", "Fr A\u2020", "Fr C" ],
"id": "po/v:805",
"gpid": "adf:915"
},
{ "name": "7TPjw(L)",
"type": "LT",
"CS#": 3,
"note_number": "7",
"id": "po/v:806",
"gpid": "adf:891"
},
{ "name": "wz. 34 Half Track",
"type": "ht",
"cs#": 6,
"note_number": "8",
"id": "po/v:807",
"gpid": "adf:1065"
},
{ "name": "wz. 34 C4P",
"type": "ht",
"cs#": 5,
"note_number": "9",
"id": "po/v:808",
"gpid": "adf:1061"
},
{ "name": "PF621L",
"type": "tr",
"cs#": 6,
"note_number": "10",
"id": "po/v:809",
"gpid": "adf:1053"
},
{ "name": "PF621L AAtr",
"type": "AAtr",
"CS#": 6,
"comments": [ "MA: AA" ],
"note_number": "11\u2020",
"id": "po/v:810",
"gpid": "adf:1601"
},
{ "name": "Praga RV",
"type": "tr",
"CS#": 7,
"note_number": "12",
"id": "po/v:811",
"gpid": "adf:1057"
}
],
"ordnance": [
{ "name": "FK-A wz.38 Autocannon",
"type": "AT",
"capabilities": [ "T", "QSU" ],
"comments": [ "No Gunshield.", "Tow NA\u2020" ],
"note_number": "1",
"notes": [ "A", "AllM T\u2020" ],
"id": "po/o:800",
"gpid": "adf:833"
},
{ "name": "65mm wz.06",
"type": "INF",
"capabilities": [ "NT", "QSU", "C6\u2020", "h-d" ],
"comments": [ "No Gunshield." ],
"note_number": "2",
"notes": [ "B\u2020", "AllM A" ],
"id": "po/o:801",
"gpid": "adf:861"
},
{ "name": "75mm wz.02/26",
"type": "ART",
"capabilities": [ "NT", "QSU", "h-d" ],
"capabilities2": { "s": 6, "C": "6\u2020" },
"note_number": "3",
"notes": [ "B\u2020" ],
"id": "po/o:802",
"gpid": "adf:855"
},
{ "name": "75mm wz.97",
"type": "ART",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "s": 8, "C": "6\u2020" },
"note_number": "4",
"notes": [ "B\u2020" ],
"id": "po/o:803",
"gpid": "adf:854"
},
{ "name": "75mm wz.28",
"type": "ART",
"capabilities": [ "NT", "QSU", "h-d" ],
"capabilities2": { "s": 6, "AP": 5, "C": "6\u2020" },
"note_number": "5",
"notes": [ "B\u2020", "AllM A" ],
"id": "po/o:804",
"gpid": "adf:854"
},
{ "name": "76mm wz.02",
"type": "ART",
"capabilities": [ "NT", "QSU", "h-d" ],
"capabilities2": { "s": 8, "C": "6\u2020" },
"note_number": "6",
"notes": [ "B\u2020" ],
"id": "po/o:805",
"gpid": "adf:856"
},
{ "name": "100mm wz.14/19",
"type": "ART",
"capabilities": [ "NT" ],
"capabilities2": { "C": "6\u2020" },
"note_number": "7",
"notes": [ "B\u2020", "AllM A" ],
"id": "po/o:806",
"gpid": "adf:857"
},
{ "name": "105mm wz.29",
"type": "ART",
"capabilities": [ "NT" ],
"capabilities2": { "C": "4\u2020" },
"note_number": "8",
"notes": [ "B\u2020" ],
"id": "po/o:807",
"gpid": "adf:1828"
},
{ "name": "120mm wz.09/31",
"type": "ART",
"capabilities": [ "NT", "h-d" ],
"capabilities2": { "s": 6, "C": "5\u2020" },
"note_number": "9",
"notes": [ "B\u2020" ],
"id": "po/o:808",
"gpid": "adf:1829"
},
{ "name": "155mm wz.17",
"type": "ART",
"capabilities": [ "NT" ],
"capabilities2": { "s": 8 },
"note_number": "10",
"id": "po/o:809",
"gpid": "adf:1830"
}
]
},
"german": {
"vehicles": [
{ "name": "PzKpfw IA",
"type": "Tt",
"CS#": 2,
"capabilities2": { "sD": 6 },
"comments": [ "2 TK DR (MG)" ],
"note_number": "1\u2020",
"notes": [ "Ge N" ],
"id": "ge/v:800",
"gpid": "adf:1464"
},
{ "name": "PzKpfw ICV",
"type": "Tt",
"CS#": 3,
"capabilities2": { "sD": 5 },
"note_number": "2",
"notes": [ "A\u2020" ],
"id": "ge/v:801",
"gpid": "adf:1460"
},
{ "name": "PzKpfw IID",
"type": "LT",
"CS#": 3,
"capabilities2": { "sD": 6 },
"note_number": "3",
"id": "ge/v:802",
"gpid": "adf:1468"
},
{ "name": "PzKpfw II Bridgelayer",
"type": "LTv",
"CS#": 2,
"capabilities2": { "sD": 6 },
"note_number": "4\u2020",
"id": "ge/v:803",
"gpid": "adf:1833"
},
{ "name": "Pz-7TP",
"type": "LT",
"CS#": 3,
"note_number": "5",
"notes": [ "B\u2020" ],
"id": "ge/v:804",
"gpid": "adf:1456"
},
{ "name": "PSW M35",
"type": "AC",
"CS#": 5,
"comments": [ "REV x2" ],
"note_number": "6\u2020",
"id": "ge/v:805",
"gpid": "adf:1448"
},
{ "name": "SdKfz8 FlaK 18",
"type": "TDht",
"CS#": 6,
"capabilities2": { "A": [ [5,2], [4,3] ] },
"comments": [ "CE +3 VCA", "MA: Rear VCA NA" ],
"note_number": "7\u2020\u2020<sup>1</sup>",
"id": "ge/v:806",
"gpid": "adf:1472"
}
],
"ordnance": [
{ "name": "2cm Tankb&uuml;sche S-18",
"type": "ATR",
"capabilities_other": [ "5PP" ],
"comments": [ "No Long Range" ],
"note_number": "1\u2020",
"notes": [ "AxM A" ],
"id": "ge/o:800",
"gpid": "adf:1407"
},
{ "name": "4.7 cm PaK 36(t)",
"type": "AT",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "A": [ [5,1], [4,2] ] },
"note_number": "2\u2020",
"id": "ge/o:801",
"gpid": "adf:1480"
},
{ "name": "7.5 cm Geb G36",
"type": "ART",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "H": "7\u2020" },
"note_number": "3\u2020",
"notes": [ "Ge O" ],
"id": "ge/o:802",
"gpid": "adf:1481"
},
{ "name": "10.5 cm Geb H40",
"type": "ART",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "H": 8 },
"note_number": "4\u2020",
"notes": [ "Ge O" ],
"id": "ge/o:803",
"gpid": "adf:1482"
}
]
},
"russian": {
"vehicles": [
{ "name": "BT-2A",
"type": "LT",
"no_radio": "\u00ae",
"CS#": 3,
"capabilities2": { "C": "5\u2020<sup>2</sup>" },
"comments": [ "CMG 2:00 from MA" ],
"note_number": "1\u2020",
"notes": [ "C\u2020<sup>2</sup>", "Ru M\u2020<sup>1</sup>" ],
"id": "ru/v:800",
"gpid": "adf:1691"
},
{ "name": "BT-2A(L)",
"type": "LT",
"no_radio": "\u00ae",
"CS#": 3,
"capabilities2": { "C": "6\u2020<sup>2</sup>" },
"note_number": "2\u2020",
"notes": [ "C\u2020<sup>2</sup>", "Ru M\u2020<sup>1</sup>" ],
"id": "ru/v:801",
"gpid": "adf:1720"
},
{ "name": "BT-2B",
"type": "LT",
"no_radio": "\u00ae",
"CS#": 3,
"comments": [ "2 TK DR (MG)" ],
"note_number": "3\u2020",
"notes": [ "Ru M\u2020<sup>1</sup>" ],
"id": "ru/v:802",
"gpid": "adf:1722"
},
{ "name": "OT-26",
"type": "LTv",
"no_radio": "\u00ae",
"CS#": "2:brewup",
"note_number": "4\u2020<sup>1</sup>",
"notes": [ "Ru M\u2020" ],
"id": "ru/v:903",
"gpid": "adf:1728"
},
{ "name": "T-26 M31",
"type": "LT",
"no_radio": "\u00ae",
"CS#": 3,
"note_number": "5\u2020",
"notes": [ "Ru M\u2020<sup>1</sup>" ],
"id": "ru/v:804",
"gpid": "adf:1701"
},
{ "name": "T-26 M32",
"type": "LT",
"no_radio": "\u00ae",
"CS#": 3,
"capabilities2": { "C": "5\u2020<sup>2</sup>" },
"comments": [ "37*: Stbd", "MG: Port" ],
"note_number": "6\u2020",
"notes": [ "C\u2020<sup>2</sup>", "Ru M\u2020<sup>1</sup>" ],
"id": "ru/v:805",
"gpid": "adf:1703"
},
{ "name": "T-26 M32U",
"type": "LT",
"CS#": 3,
"capabilities2": { "C": "5\u2020<sup>2</sup>" },
"comments": [ "37*: Stbd", "MG: Port" ],
"note_number": "7\u2020",
"notes": [ "C\u2020<sup>2</sup>", "Ru M\u2020<sup>1</sup>" ],
"id": "ru/v:806",
"gpid": "adf:1709"
},
{ "name": "T-26 M32(L)",
"type": "LT",
"no_radio": "\u00ae",
"CS#": 3,
"capabilities2": { "C": "4\u2020<sup>2</sup>" },
"comments": [ "37*: Stbd", "MG: Port" ],
"note_number": "8\u2020",
"notes": [ "C\u2020<sup>2</sup>", "Ru M\u2020<sup>1</sup>" ],
"id": "ru/v:807",
"gpid": "adf:1707"
},
{ "name": "T-26 M32U(L)",
"type": "LT",
"CS#": 3,
"capabilities2": { "C": "4\u2020<sup>2</sup>" },
"comments": [ "37*: Stbd MG: Port" ],
"note_number": "9\u2020",
"notes": [ "C\u2020<sup>2</sup>", "Ru M\u2020<sup>1</sup>" ],
"id": "ru/v:808",
"gpid": "adf:1711"
},
{ "name": "T-26 M33",
"type": "LT",
"no_radio": "\u00ae",
"CS#": 3,
"capabilities2": { "C": 5 },
"comments": [ "C4 applies if equipped with optional CMG." ],
"note_number": "10\u2020<sup>3</sup>",
"notes": [ "Ru D\u2020<sup>2</sup>", "Ru I\u2020", "Ru M\u2020<sup>1</sup>" ],
"id": "ru/v:809",
"gpid": "adf:1713"
},
{ "name": "T-26 M33U",
"type": "LT",
"CS#": 3,
"capabilities2": { "C": "4\u2020<sup>1</sup>" },
"note_number": "11",
"notes": [ "C\u2020<sup>1</sup>", "Ru M\u2020" ],
"id": "ru/v:810",
"gpid": "adf:1716"
},
{ "name": "T-26 M39U",
"type": "LT",
"CS#": 3,
"capabilities2": { "C": "4\u2020<sup>1</sup>" },
"note_number": "12",
"notes": [ "C\u2020<sup>1</sup>", "Ru M\u2020" ],
"id": "ru/v:811",
"gpid": "adf:1718"
},
{ "name": "BT-5 M34",
"type": "LT",
"no_radio": "\u00ae",
"CS#": 3,
"capabilities2": { "C": "4\u2020<sup>2</sup>" },
"note_number": "13",
"notes": [ "C\u2020<sup>2</sup>", "Ru I\u2020", "Ru M\u2020<sup>1</sup>" ],
"id": "ru/v:812",
"gpid": "adf:1693"
},
{ "name": "BT-7 M37",
"type": "LT",
"no_radio": "\u00ae",
"CS#": 3,
"capabilities2": { "C": "4\u2020<sup>3</sup>" },
"note_number": "14",
"notes": [ "C\u2020<sup>3</sup>", "Ru D\u2020<sup>2</sup>", "Ru I\u2020", "Ru M\u2020<sup>1</sup>" ],
"id": "ru/v:813",
"gpid": "adf:1685"
},
{ "name": "T-26A",
"type": "LT",
"no_radio": "\u00ae",
"CS#": 3,
"capabilities2": { "AP": 7, "C": "6\u2020<sup>3</sup>", "s": 9 },
"note_number": "15\u2020",
"notes": [ "B", "C\u2020<sup>3</sup>", "Ru D\u2020<sup>2</sup>", "Ru M\u2020<sup>1</sup>" ],
"id": "ru/v:814",
"gpid": "adf:1695"
},
{ "name": "BT-7A",
"type": "LT",
"CS#": 3,
"capabilities2": { "AP": 7, "C": "6\u2020<sup>2</sup>", "s": 9 },
"note_number": "16\u2020",
"notes": [ "B", "C\u2020<sup>2</sup>", "Ru M\u2020<sup>1</sup>" ],
"id": "ru/v:815",
"gpid": "adf:1689"
},
{ "name": "BA-6",
"type": "AC",
"no_radio": "\u00ae",
"CS#": 4,
"capabilities2": { "A": [ [4,2], [5,3] ], "C": "4\u2020" },
"note_number": "17\u2020",
"id": "ru/v:816",
"gpid": "adf:1726"
},
{ "name": "SU-12",
"type": "SPAtr",
"CS#": 4,
"capabilities2": { "AP": 7, "C": "6\u2020<sup>2</sup>", "s": 8 },
"note_number": "18\u2020",
"notes": [ "B", "C\u2020<sup>2</sup>", "Ru F\u2020<sup>1</sup>" ],
"id": "ru/v:817",
"gpid": "adf:1724"
}
],
"ordnance": [
{ "name": "37mm PTP obr. 30",
"type": "AT",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "C": "5\u2020" },
"note_number": "1",
"notes": [ "B\u2020" ],
"id": "ru/o:800",
"gpid": "adf:1824"
},
{ "name": "37mm PP obr. 15R",
"type": "INF",
"capabilities": [ "NT", "QSU", "h-d" ],
"capabilities2": { "C": "5\u2020" },
"note_number": "2",
"notes": [ "B\u2020" ],
"id": "ru/o:801",
"gpid": "adf:1822"
},
{ "name": "76.2mm PP obr. 27",
"type": "INF",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "H": 6, "s": 8, "C": "6\u2020" },
"note_number": "3",
"notes": [ "A", "B\u2020", "Ru A" ],
"id": "ru/o:802",
"gpid": "adf:1823"
}
]
}
}

@ -0,0 +1,7 @@
{
"extensionId": "adf",
"version": "4.03",
"comment": "This is a dummy extension file that acts as a parent for the various BFP child files."
}

@ -3,6 +3,8 @@
"extensionId": "f97",
"version": "v1.1",
"russian": {
"vehicles": [
{
@ -19,3 +21,5 @@
]
}
}

@ -2,7 +2,8 @@
{ "name": "DBT",
"type": "MTR",
"capabilities_other": [ "3PP", "\u2020" ],
"capabilities_other": [ "3PP" ],
"comments": [ "\u2020" ],
"note_number": "6\u2020",
"notes": [ "A", "B", "D" ],
"id": "be/o:000",
@ -29,7 +30,7 @@
{ "name": "7.6cm FRC",
"type": "INF",
"capabilities": [ "NT", "QSU" ],
"capabilities_other": [ "\u2020" ],
"comments": [ "\u2020" ],
"note_number": "8\u2020",
"notes": [ "A", "B" ],
"id": "be/o:003",

@ -35,7 +35,8 @@
},
{ "name": "65mm wz.06",
"type": "INF",
"capabilities": [ "NT", "QSU", "no Gunshield", "h-d" ],
"capabilities": [ "NT", "QSU", "h-d" ],
"comments": [ "No Gunshield." ],
"note_number": "27\u2020",
"notes": [ "A", "Gr", "P", "Y" ],
"id": "alc/o:004",
@ -95,7 +96,8 @@
},
{ "name": "Mitrailleuse de 13.2 CAJ mle 30",
"type": "AA",
"capabilities": [ "T", "2 TK DR\u2020", "Towing NA\u2020<sup>1</sup>" ],
"capabilities": [ "T", "2 TK DR\u2020" ],
"comments": [ "Towing NA\u2020<sup>1</sup>" ],
"note_number": "34\u2020",
"notes": [ "T\u2020<sup>1</sup>", "B", "Gr", "Y" ],
"id": "alc/o:011",

@ -162,8 +162,9 @@
},
{ "name": "M1918M1 155mm Gun",
"type": "ART",
"capabilities": [ "NT", "RFNM", "AP4\u2020<sup>1</sup>", "no IF" ],
"capabilities": [ "NT", "RFNM", "AP4\u2020<sup>1</sup>" ],
"capabilities2": { "WP": 8 },
"comments": [ "No IF." ],
"note_number": "19\u2020",
"notes": [ "A\u2020<sup>1</sup>", "N" ],
"id": "am/o:018",
@ -171,8 +172,9 @@
},
{ "name": "M1A1 155mm Gun",
"type": "ART",
"capabilities": [ "NT", "RFNM", "AP4\u2020<sup>1</sup>", "no IF" ],
"capabilities": [ "NT", "RFNM", "AP4\u2020<sup>1</sup>" ],
"capabilities2": { "s": [ [7,5] ], "WP": 8 },
"comments": [ "No IF." ],
"note_number": "20\u2020",
"notes": [ "A\u2020<sup>1</sup>" ],
"id": "am/o:019",
@ -180,7 +182,8 @@
},
{ "name": "M1 8-in. Howitzer",
"type": "ART",
"capabilities": [ "NT", "RFNM", "no IF" ],
"capabilities": [ "NT", "RFNM" ],
"comments": [ "No IF." ],
"note_number": "21\u2020",
"id": "am/o:020",
"gpid": 898

@ -10,8 +10,9 @@
},
{ "name": "Madsen M-35",
"type": "AT",
"capabilities": [ "NT", "QSU", "no Gunshield" ],
"capabilities": [ "NT", "QSU" ],
"capabilities_other": [ "R2", "IFE=B10\u2020" ],
"comments": [ "No Gunshield." ],
"note_number": "38\u2020",
"notes": [ "T\u2020<sup>1</sup>" ],
"id": "bu/o:001",
@ -58,7 +59,8 @@
},
{ "name": "D/30 Krupp",
"type": "ART",
"capabilities": [ "NT", "RFNM", "no IF" ],
"capabilities": [ "NT", "RFNM" ],
"comments": [ "No IF." ],
"note_number": "43",
"id": "bu/o:007",
"gpid": 3781

@ -70,7 +70,8 @@
},
{ "name": "Bohler M35",
"type": "AT",
"capabilities": [ "NT", "QSU", "no Gunshield" ],
"capabilities": [ "NT", "QSU" ],
"comments": [ "No Gunshield." ],
"note_number": "52\u2020",
"notes": [ "A", "R", "H", "S" ],
"id": "axc/o:008",
@ -200,8 +201,9 @@
},
{ "name": "Skoda M15/16",
"type": "ART",
"capabilities": [ "NT", "no IF" ],
"capabilities": [ "NT" ],
"capabilities2": { "s": 6 },
"comments": [ "No IF." ],
"note_number": "67\u2020",
"notes": [ "S", "C" ],
"id": "axc/o:023",

@ -2,7 +2,8 @@
{ "name": "Canonne da 65/17",
"type": "INF",
"capabilities": [ "NT", "no Gunshield" ],
"capabilities": [ "NT" ],
"comments": [ "No Gunshield." ],
"note_number": "35",
"notes": [ "A" ],
"id": "cr/o:000",

@ -27,7 +27,8 @@
{ "name": "Resita M43",
"type": "AT",
"capabilities": [ "NT", "QSU" ],
"capabilities_other": [ "Blk TH", "AP TK#18\u2020" ],
"capabilities_other": [ "AP TK#18\u2020" ],
"comments": [ "Blk TH" ],
"note_number": "4\u2020",
"id": "ro/o:003",
"gpid": 3742
@ -43,7 +44,8 @@
},
{ "name": "Breda 47",
"type": "INF",
"capabilities": [ "NT", "QSU", "no Gunshield" ],
"capabilities": [ "NT", "QSU" ],
"comments": [ "No Gunshield." ],
"note_number": "6\u2020",
"notes": [ "A" ],
"id": "ro/o:005",
@ -142,8 +144,9 @@
},
{ "name": "Skoda M28 NOa",
"type": "ART",
"capabilities": [ "NM", "no IF" ],
"capabilities": [ "NM" ],
"capabilities_other": [ "ST" ],
"comments": [ "No IF." ],
"note_number": "18",
"id": "ro/o:017",
"gpid": 3756

@ -37,7 +37,7 @@
{ "name": "Skoda 47L40(t)",
"type": "AA",
"capabilities": [ "T", "QSU" ],
"capabilities_other": [ "AA Fire ROF 2\u2020" ],
"comments": [ "AA Fire ROF 2\u2020" ],
"note_number": "32\u2020",
"notes": [ "E" ],
"id": "sl/o:004",

@ -31,7 +31,7 @@
"type": "MTR",
"capabilities": [ "NT" ],
"capabilities2": { "s": 8, "WP": 7 },
"capabilities_other": [ "Towed\u2020" ],
"comments": [ "Towed\u2020" ],
"note_number": "3\u2020",
"notes": [ "N", "P" ],
"id": "br/o:003",
@ -168,8 +168,8 @@
},
{ "name": "OBL 7.2-in. Howitzer Mk I",
"type": "ART",
"capabilities": [ "NT", "no IF" ],
"capabilities_other": [ "Acq. NA\u2020" ],
"capabilities": [ "NT" ],
"comments": [ "No IF.", "Acq. NA\u2020" ],
"note_number": "18\u2020",
"notes": [ "N", "P" ],
"id": "br/o:019",
@ -177,7 +177,8 @@
},
{ "name": "OBL 7.2-in. Howitzer Mk VI",
"type": "ART",
"capabilities": [ "NT", "RFNM", "no IF" ],
"capabilities": [ "NT", "RFNM" ],
"comments": [ "No IF." ],
"note_number": "19\u2020",
"notes": [ "P" ],
"id": "br/o:020",

@ -2,7 +2,8 @@
{ "name": "Type 27 Grenade Launcher",
"type": "MTR",
"capabilities_other": [ "2PP", "Air Bursts NA\u2020" ],
"capabilities_other": [ "2PP" ],
"comments": [ "Air Bursts NA\u2020" ],
"note_number": "1\u2020",
"notes": [ "A" ],
"id": "ch/o:000",
@ -115,7 +116,7 @@
{ "name": "37mm PP obr. 15R",
"type": "ART",
"capabilities": [ "NT", "QSU", "h-d" ],
"capabilities_other": [ "Low Ammo\u2020" ],
"comments": [ "Low Ammo\u2020" ],
"note_number": "7\u2020",
"notes": [ "<s>B</s>" ],
"id": "ch/o:013",
@ -123,7 +124,8 @@
},
{ "name": "Cannone da 70/15",
"type": "ART",
"capabilities": [ "NT", "QSU", "Acq. NA\u2020", "Low Ammo\u2020", "h-d" ],
"capabilities": [ "NT", "QSU", "h-d" ],
"comments": [ "Acq. NA\u2020", "Low Ammo\u2020" ],
"note_number": "7\u2020",
"notes": [ "A", "<s>B</s>" ],
"id": "ch/o:014",

@ -81,7 +81,8 @@
{ "name": "57mm Type 36 Recoilless Rifle",
"type": "RCL",
"capabilities2": { "H": 6, "WP": 5 },
"capabilities_other": [ "3PP", "crewed\u2020" ],
"capabilities_other": [ "3PP" ],
"comments": [ "crewed\u2020" ],
"note_number": "26\u2020<sup>1</sup>",
"notes": [ "R\u2020" ],
"id": "cvpa/o:010",
@ -90,7 +91,8 @@
{ "name": "75mm Type 52 Recoilless Rifle",
"type": "RCL",
"capabilities2": { "H": 6, "WP": 5 },
"capabilities_other": [ "5PP", "crewed\u2020" ],
"capabilities_other": [ "5PP" ],
"comments": [ "crewed\u2020" ],
"note_number": "27",
"notes": [ "R\u2020" ],
"id": "cvpa/o:011",
@ -133,7 +135,8 @@
{ "name": "Type 93 Twin-Mount High-Angle Machine Gun",
"type": "AA",
"capabilities": [ "T" ],
"capabilities_other": [ "2 TK DR\u2020", "Towing NA\u2020" ],
"capabilities_other": [ "2 TK DR\u2020" ],
"comments": [ "Towing NA\u2020" ],
"note_number": "32\u2020",
"notes": [ "A" ],
"id": "cvpa/o:016",

@ -45,14 +45,16 @@
},
{ "name": "Boys ATR(b)",
"type": "ATR",
"capabilities_other": [ "1PP", "\"British\"\u2020" ],
"capabilities_other": [ "1PP" ],
"comments": [ "\"British\"\u2020" ],
"note_number": "6\u2020",
"id": "fi/o:005",
"gpid": null
},
{ "name": "Lahti ATR",
"type": "ATR",
"capabilities_other": [ "4PP", "Light AA fire in 44+\u2020", "B30.35\u2020" ],
"capabilities_other": [ "4PP", "B30.35\u2020" ],
"comments": [ "Light AA fire in 44+\u2020" ],
"note_number": "7\u2020",
"notes": [ "A" ],
"id": "fi/o:006",
@ -60,8 +62,9 @@
},
{ "name": "20 PstK/40",
"type": "AT",
"capabilities": [ "NT", "QSU", "Towing NA\u2020<sup>1</sup>" ],
"capabilities": [ "NT", "QSU" ],
"capabilities_other": [ "R2", "IFE=B10" ],
"comments": [ "Towing NA\u2020<sup>1</sup>" ],
"note_number": "8\u2020",
"notes": [ "C\u2020<sup>1</sup>" ],
"id": "fi/o:007",
@ -174,8 +177,8 @@
},
{ "name": "87 K/95",
"type": "ART",
"capabilities": [ "NT", "QSU", "no IF", "h-d" ],
"capabilities_other": [ "Acq. NA\u2020" ],
"capabilities": [ "NT", "QSU", "h-d" ],
"comments": [ "No IF.", "Acq. NA\u2020" ],
"note_number": "21",
"notes": [ "F\u2020" ],
"id": "fi/o:020",
@ -183,7 +186,8 @@
},
{ "name": "90 K/77",
"type": "ART",
"capabilities": [ "NT", "QSU", "no IF", "Acq. NA\u2020<sup>1</sup>", "h-d" ],
"capabilities": [ "NT", "QSU", "h-d" ],
"comments": [ "No IF.", "Acq. NA\u2020<sup>1</sup>" ],
"note_number": "22\u2020",
"notes": [ "F\u2020<sup>1</sup>" ],
"id": "fi/o:021",
@ -225,7 +229,8 @@
},
{ "name": "107 K/77(r)",
"type": "ART",
"capabilities": [ "NT", "no IF", "Acq. NA\u2020<sup>1</sup>", "h-d" ],
"capabilities": [ "NT", "h-d" ],
"comments": [ "No IF.", "Acq. NA\u2020<sup>1</sup>" ],
"note_number": "27\u2020",
"notes": [ "B", "F\u2020<sup>1</sup>" ],
"id": "fi/o:026",
@ -268,8 +273,9 @@
},
{ "name": "7.62 ItKK/31-40",
"type": "AA",
"capabilities": [ "T", "QSU", "Towing NA\u2020<sup>1</sup>" ],
"capabilities": [ "T", "QSU" ],
"capabilities_other": [ "2 TK DR\u2020" ],
"comments": [ "Towing NA\u2020<sup>1</sup>" ],
"note_number": "32\u2020",
"notes": [ "C\u2020<sup>1</sup>" ],
"id": "fi/o:031",
@ -297,7 +303,7 @@
"type": "AA",
"capabilities": [ "T" ],
"capabilities2": { "LF": [ "NT", "20\u2020<sup>1</sup>", "2 ROF" ] },
"capabilities_other": [ "Road MP = 1\u2020" ],
"comments": [ "Road MP = 1\u2020" ],
"note_number": "35\u2020",
"notes": [ "A", "D", "G\u2020<sup>1</sup>" ],
"id": "fi/o:034",

@ -2,7 +2,8 @@
{ "name": "LG de 50 mle 37(f)",
"type": "MTR",
"capabilities_other": [ "2PP", "crewed\u2020" ],
"capabilities_other": [ "2PP" ],
"comments": [ "crewed\u2020" ],
"note_number": "1",
"notes": [ "A", "B", "C\u2020", "E" ],
"id": "fr/o:000",
@ -54,7 +55,8 @@
"type": "AT",
"capabilities": [ "h-d" ],
"capabilities2": { "LF": [ "NT" ], "HE": 7, "s": 6 },
"capabilities_other": [ "ST", "no shield" ],
"capabilities_other": [ "ST" ],
"comments": [ "no shield" ],
"note_number": "7",
"notes": [ "E" ],
"id": "fr/o:006",
@ -62,7 +64,8 @@
},
{ "name": "Canon de 37 mle 16 TR",
"type": "INF",
"capabilities_other": [ "5PP (3PP dm)", "crewed\u2020" ],
"capabilities_other": [ "5PP (3PP dm)" ],
"comments": [ "crewed\u2020" ],
"note_number": "8\u2020<sup>1</sup>",
"notes": [ "A", "C\u2020" ],
"id": "fr/o:007",
@ -70,7 +73,8 @@
},
{ "name": "Canon de 65 M mle 06",
"type": "INF",
"capabilities": [ "NT", "QSU", "no Gunshield", "h-d" ],
"capabilities": [ "NT", "QSU", "h-d" ],
"comments": [ "No Gunshield." ],
"note_number": "9\u2020",
"notes": [ "A", "P" ],
"id": "fr/o:008",
@ -136,14 +140,16 @@
},
{ "name": "Canon de 155 GPF",
"type": "ART",
"capabilities": [ "NT", "RFNM", "no IF" ],
"capabilities": [ "NT", "RFNM" ],
"comments": [ "No IF." ],
"note_number": "17\u2020",
"id": "fr/o:016",
"gpid": 1685
},
{ "name": "Mitrailleuse de 13.2 CAJ mle 30",
"type": "AA",
"capabilities": [ "T", "2 TK DR\u2020<sup>1</sup>", "Towing NA\u2020<sup>1</sup>" ],
"capabilities": [ "T", "2 TK DR\u2020<sup>1</sup>" ],
"comments": [ "Towing NA\u2020<sup>1</sup>" ],
"note_number": "18\u2020<sup>1</sup>",
"notes": [ "B", "G\u2020", "V" ],
"id": "fr/o:017",

@ -37,7 +37,7 @@
{ "name": "2.8cm sPzB 41",
"type": "AT",
"capabilities": [ "NT", "QSU" ],
"capabilities_other": [ "uses APCR TK Table\u2020" ],
"comments": [ "uses APCR TK Table\u2020" ],
"note_number": "5\u2020",
"notes": [ "A\u2020", "N", "P" ],
"id": "ge/o:004",
@ -55,7 +55,7 @@
{ "name": "4.2cm lePaK 41",
"type": "AT",
"capabilities": [ "NT", "QSU" ],
"capabilities_other": [ "uses APCR TK Table\u2020" ],
"comments": [ "uses APCR TK Table\u2020" ],
"note_number": "7",
"notes": [ "A\u2020", "N<sup>T</sup>" ],
"id": "ge/o:006",
@ -202,8 +202,9 @@
},
{ "name": "17cm K 18",
"type": "ART",
"capabilities": [ "NT", "RFNM", "no IF" ],
"capabilities": [ "NT", "RFNM" ],
"capabilities2": { "AP": 6 },
"comments": [ "No IF." ],
"note_number": "24",
"notes": [ "N" ],
"id": "ge/o:023",

@ -35,8 +35,9 @@
},
{ "name": "Cannone da 47/32",
"type": "AT",
"capabilities": [ "NT", "QSU", "no Gunshield" ],
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "Towed": [ [null,"A1+"], "\u2020" ] },
"comments": [ "No Gunshield." ],
"note_number": "5\u2020",
"notes": [ "A", "C", "N" ],
"id": "it/o:004",
@ -44,8 +45,9 @@
},
{ "name": "Cannone da 65/17",
"type": "INF",
"capabilities": [ "NT", "no Gunshield" ],
"capabilities": [ "NT" ],
"capabilities2": { "H": [ [6,"S2+"], "\u2020<sup>1</sup>" ] },
"comments": [ "No Gunshield." ],
"note_number": "6\u2020",
"notes": [ "A", "C", "H\u2020<sup>1</sup>", "N" ],
"id": "it/o:005",
@ -53,7 +55,8 @@
},
{ "name": "Cannone da 70/15",
"type": "INF",
"capabilities": [ "NT", "QSU", "Acq. NA\u2020<sup>1</sup>", "no Gunshield", "h-d" ],
"capabilities": [ "NT", "QSU", "h-d" ],
"comments": [ "Acq. NA\u2020<sup>1</sup>", "No Gunshield." ],
"note_number": "7\u2020",
"notes": [ "A", "B\u2020<sup>1</sup>", "<s>R</s>" ],
"id": "it/o:006",
@ -122,8 +125,9 @@
},
{ "name": "Cannone da 149/35",
"type": "ART",
"capabilities": [ "NT", "RFNM", "no IF", "Acq. NA\u2020<sup>1</sup>" ],
"capabilities": [ "NT", "RFNM" ],
"capabilities2": { "s": 8 },
"comments": [ "No IF.", "Acq. NA\u2020<sup>1</sup>" ],
"note_number": "15\u2020",
"notes": [ "B\u2020<sup>1</sup>", "N", "<s>R</s>" ],
"id": "it/o:014",

@ -38,7 +38,8 @@
},
{ "name": "Type 97 Medium Close-Attack Gun",
"type": "MTR",
"capabilities": [ "NT", "Towing NA\u2020<sup>1</sup>" ],
"capabilities": [ "NT" ],
"comments": [ "Towing NA\u2020<sup>1</sup>" ],
"note_number": "5\u2020",
"notes": [ "A", "C\u2020<sup>1</sup>" ],
"id": "ja/o:004",
@ -46,7 +47,8 @@
},
{ "name": "Type 97 Automatic Gun",
"type": "ATR",
"capabilities_other": [ "5PP", "crew\u2020" ],
"capabilities_other": [ "5PP" ],
"comments": [ "crew\u2020" ],
"note_number": "6\u2020",
"notes": [ "A" ],
"id": "ja/o:005",
@ -69,7 +71,8 @@
},
{ "name": "Year-11 Type Flat-Trajectory Infantry Gun",
"type": "INF",
"capabilities_other": [ "5PP (3PP dm)", "crewed\u2020" ],
"capabilities_other": [ "5PP (3PP dm)" ],
"comments": [ "crewed\u2020" ],
"note_number": "9\u2020",
"notes": [ "A" ],
"id": "ja/o:008",
@ -146,7 +149,7 @@
"type": "ART",
"capabilities": [ "NT" ],
"capabilities2": { "AP": 5, "WP": 5 },
"capabilities_other": [ "Towing risk\u2020" ],
"comments": [ "Towing risk\u2020" ],
"note_number": "18\u2020",
"id": "ja/o:017",
"gpid": 3297
@ -162,7 +165,8 @@
},
{ "name": "Type 93 Twin-Mount High-Angle Machine Gun",
"type": "AA",
"capabilities": [ "T", "2 TK DR\u2020", "Towing NA\u2020<sup>1</sup>" ],
"capabilities": [ "T", "2 TK DR\u2020" ],
"comments": [ "Towing NA\u2020<sup>1</sup>" ],
"note_number": "20\u2020",
"notes": [ "A", "C\u2020<sup>1</sup>", "E" ],
"id": "ja/o:019",

@ -9,7 +9,8 @@
},
{ "name": "37mm PM-39",
"type": "MTR",
"capabilities_other": [ "1PP", "Air Bursts & Acq. NA" ],
"capabilities_other": [ "1PP" ],
"comments": [ "Air Bursts & Acq. NA" ],
"note_number": "1.1",
"notes": [ "A" ],
"id": "ru/o:001",
@ -42,7 +43,8 @@
},
{ "name": "160mm PM obr. 43",
"type": "MTR",
"capabilities": [ "NT", "no IF" ],
"capabilities": [ "NT" ],
"comments": [ "No IF." ],
"note_number": "5",
"id": "ru/o:005",
"gpid": 512
@ -189,7 +191,8 @@
},
{ "name": "203mm B-4 obr. 1931",
"type": "ART",
"capabilities": [ "NT", "RFNM", "no IF" ],
"capabilities": [ "NT", "RFNM" ],
"comments": [ "No IF." ],
"note_number": "23.1",
"id": "ru/o:024",
"gpid": 6995

@ -33,7 +33,7 @@
"type": "MTR",
"capabilities": [ "NT" ],
"capabilities2": { "s": 8, "WP": 7 },
"capabilities_other": [ "Towed\u2020" ],
"comments": [ "Towed\u2020" ],
"note_number": "17\u2020",
"notes": [ "N" ],
"id": "bcfk/o:003",

@ -40,7 +40,8 @@
{ "name": "M20(L) 75mm Recoilless Rifle",
"type": "RCL",
"capabilities2": { "WP": 7 },
"capabilities_other": [ "5PP", "H\u2020", "crewed\u2020" ],
"capabilities_other": [ "5PP", "H\u2020" ],
"comments": [ "crewed\u2020" ],
"note_number": "25\u2020",
"notes": [ "K", "M", "O", "P", "R" ],
"id": "unc/o:004",

@ -38,7 +38,8 @@
{ "name": "M18(L) 57mm Recoilless Rifle",
"type": "RCL",
"capabilities2": { "H": 7, "WP": 6, "C": 7 },
"capabilities_other": [ "3PP", "non-crewed\u2020" ],
"capabilities_other": [ "3PP" ],
"comments": [ "non-crewed\u2020" ],
"note_number": "5\u2020",
"notes": [ "C", "K", "O" ],
"id": "uro/o:004",
@ -73,8 +74,9 @@
},
{ "name": "M1A1 155mm Gun",
"type": "ART",
"capabilities": [ "NT", "RFNM", "no IF" ],
"capabilities": [ "NT", "RFNM" ],
"capabilities2": { "AP": 4, "s": 7, "WP": 8 },
"comments": [ "No IF." ],
"note_number": "9",
"notes": [ "Y" ],
"id": "uro/o:008",
@ -82,7 +84,8 @@
},
{ "name": "M1 8-in. Howitzer",
"type": "ART",
"capabilities": [ "NT", "RFNM", "no IF" ],
"capabilities": [ "NT", "RFNM" ],
"comments": [ "No IF." ],
"note_number": "10\u2020",
"notes": [ "Y" ],
"id": "uro/o:009",

@ -99,6 +99,37 @@
"updated": {
"back_images": "fiAA76LB.png"
}
},
"adf:1824": {
"expected": {
"name": "37L AT PTP obr. 30",
"front_images": "ru/gun/ruAT37L",
"back_images": "ru/gun/ruAT37Lb"
},
"updated": {
"front_images": "ru/gun/ru37LPTPobr30.png"
}
},
"adf:1822": {
"expected": {
"name": "37* INF PP obr. 15R",
"front_images": "ru/gun/ruINF37s",
"back_images": "ru/gun/ruINF37sb"
},
"updated": {
"front_images": "ru/gun/ru37PPobr15R.png"
}
},
"adf:1823": {
"expected": {
"name": "76* INF PP obr. 27",
"front_images": "ru/gun/ruINF76s",
"back_images": "ru/gun/ruINF76sb"
},
"updated": {
"front_images": "ru/gun/ru76PPobr27.png"
}
}
}

@ -31,14 +31,18 @@ def get_vo_gpids( data_dir, extns ): #pylint: disable=too-many-locals,too-many-b
gpids.add( get_effective_gpid( str(gpid) ) )
# process any extensions
if extns:
if extns: #pylint: disable=too-many-nested-blocks
for extn in extns:
extn_info = extn[1]
for vo_type in ["vehicles","ordnance"]:
if vo_type not in extn_info:
for nat in extn_info:
if not isinstance( extn_info[nat], dict ):
continue
for piece in extn_info[vo_type]:
gpids.update( piece["gpid"] )
for vo_type in ("vehicles","ordnance"):
for piece in extn_info[ nat ].get( vo_type, [] ):
if isinstance( piece["gpid"], list ):
gpids.update( piece["gpid"] )
else:
gpids.add( piece["gpid"] )
return gpids

@ -65,7 +65,7 @@ def set_vasl_mod( vmod_fname, msg_store ):
else:
_vasl_mod = None
def _load_vasl_extns( extn_dir ): #pylint: disable=too-many-locals,too-many-statements
def _load_vasl_extns( extn_dir ): #pylint: disable=too-many-locals,too-many-statements,too-many-branches
"""Locate VASL extensions and their corresponding vehicle/ordnance info files."""
if not extn_dir:
@ -90,7 +90,7 @@ def _load_vasl_extns( extn_dir ): #pylint: disable=too-many-locals,too-many-stat
_logger.debug( "- id=%s ; version=%s", extn_info["extensionId"], extn_info["version"] )
# figure out what filename extensions we will recognize
valid_fname_extns = app.config.get( "VASL_EXTENSION_FILENAME_EXTNS", ".mdx .zip" )
valid_fname_extns = app.config.get( "VASL_EXTENSION_FILENAME_EXTNS", ".mdx .vmdx .zip" )
valid_fname_extns = valid_fname_extns.replace( ";", " " ).replace( ",", " " ).split()
# process each VASL extension
@ -143,6 +143,12 @@ def _load_vasl_extns( extn_dir ): #pylint: disable=too-many-locals,too-many-stat
_logger.info( "Accepting VASL extension: %s (%s/%s)", os.path.split(extn_fname)[1], extn_id, extn_version )
extns.append( ( extn_fname, extn_info ) )
# add any child extensions
for extn_info2 in all_extn_info.values():
if extn_info2.get( "parentExtensionId" ) == extn_info["extensionId"] \
and extn_info2["version"] == extn_info["version"]:
extns.append( ( extn_fname, extn_info2 ) )
return extns
# ---------------------------------------------------------------------
@ -297,6 +303,9 @@ class VaslMod:
del vasl_overrides[ gpid ]
# save the loaded entry
for attr in ("front_images","back_images"):
if isinstance( piece[attr], list ) and not piece[attr]:
piece[attr] = None
self._pieces[ gpid ] = piece
target_gpids.remove( gpid )
_logger.debug( "- Loaded piece: %s", piece )
@ -327,6 +336,8 @@ class VaslMod:
def is_image_path( val ): #pylint: disable=missing-docstring
if val == "white X 60.png": # nb: a lot of Finnish pieces have this
return False
if "-malf-" in val:
return False
if val.endswith( (".gif",".png") ):
return True
if val.startswith( ("ru/","ge/","am/","br/","it/","ja/","ch/","sh/","fr/","al/","ax/","hu/","fi/") ):
@ -382,6 +393,13 @@ class VaslMod:
)
front_images.pop()
assert not back_images
elif front_images[-1].endswith( "-BFPb.png" ) and front_images[0] == front_images[-1][:-9]+"-BFP.png":
# nb: this is for Polish Guns (Poland In Flames)
_logger.debug( "Ignoring limbered images: gpid=%s, front=%s, back=%s",
gpid, front_images, back_images
)
front_images.pop()
assert not back_images
def delistify( val ): #pylint: disable=missing-docstring
if val is None:

@ -8,7 +8,7 @@ from flask import request, render_template, jsonify, send_file, redirect, url_fo
from vasl_templates.webapp import app
from vasl_templates.webapp.utils import MsgStore
from vasl_templates.webapp.config.constants import DATA_DIR
from vasl_templates.webapp.config.constants import BASE_DIR, DATA_DIR
startup_msg_store = MsgStore() # store messages generated during startup
_check_versions = True
@ -64,13 +64,12 @@ def get_license():
"""Get the license."""
# locate the license file
dname = os.path.split( __file__ )[0]
dname = BASE_DIR
fname = os.path.join( dname, "../../LICENSE.txt" ) # nb: if we're running from source
if not os.path.isfile( fname ):
fname = os.path.join( dname, "../../../LICENSE.txt" ) # nb: if we're running as a compiled binary
fname = os.path.join( dname, "LICENSE.txt" ) # nb: if we're running as a compiled binary
if not os.path.isfile( fname ):
# FUDGE! If we've been pip install'ed walk up the directory tree, looking for the license file :-/
dname = os.path.split( fname )[0]
while True:
# go up a directory
prev_dname = dname

@ -138,33 +138,41 @@ def make_snippet_image():
# ---------------------------------------------------------------------
_flag_image_cache = {}
_flag_image_cache_lock = threading.Lock()
@app.route( "/flags/<nat>" )
def get_flag( nat ):
"""Get a flag image."""
return _get_small_image(
"static/images/flags/", nat,
app.config.get( "DEFAULT_FLAG_HEIGHT", 11 )
)
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
_small_image_cache = {}
_small_image_cache_lock = threading.Lock()
def _get_small_image( base_dir, key, default_height ):
"""Get a small image (cached)."""
# validate the nationality
if not re.search( "^[-a-z]+$", nat ):
# locate the image file
if not re.search( "^[-a-z~]+$", key ):
abort( 404 )
fname = os.path.join( base_dir, key+".png" )
# check how we should resize the image
# NOTE: Resizing images in the HTML snippets looks dreadful (presumably
# because VASSAL's HTML engine is so ancient), so we do it ourself :-/
default_height = app.config.get( "DEFAULT_FLAG_HEIGHT", 11 )
height = int( request.args.get( "height", default_height ) )
if height <= 0:
abort( 400 )
with _flag_image_cache_lock:
with _small_image_cache_lock:
# check if we have the image in the cache
cache_key = ( nat, height )
if cache_key not in _flag_image_cache:
cache_key = ( key, height )
if cache_key not in _small_image_cache:
# nope - load it
fname = "static/images/flags/{}.png".format( nat )
with app.open_resource( fname, "rb" ) as fp:
img = Image.open( fp )
# resize the image
@ -177,8 +185,8 @@ def get_flag( nat ):
buf = io.BytesIO()
img.save( buf, format="PNG" )
buf.seek( 0 )
_flag_image_cache[ cache_key ] = buf.read()
_small_image_cache[ cache_key ] = buf.read()
# return the flag image
img_data =_flag_image_cache[ cache_key ]
img_data =_small_image_cache[ cache_key ]
return send_file( io.BytesIO(img_data), mimetype="image/png" )

@ -1,23 +1,24 @@
.ui-dialog.edit-vo .ui-dialog-content { overflow: hidden ; display: flex ; }
.ui-dialog.edit-vo .ui-dialog-content { overflow: hidden ; display: flex ; flex-direction: column ; }
.ui-dialog.edit-vo .ui-dialog-buttonpane { border: none ; margin-top: 0 !important ; padding-top: 0 !important ; }
.ui-dialog.edit-vo .capabilities { flex-grow: 1 ; display: flex ; flex-direction: column ; }
.ui-dialog.edit-vo .header { display: flex ; align-items: center ; margin-bottom: 0.5em ; }
.ui-dialog.edit-vo .header img.vasl-image { height: 3.5em ; margin-right: 0.5em ; }
.ui-dialog.edit-vo .header img.vasl-image.small-piece { height: 2.7em ; margin-left: 0.4em ; margin-right: 0.9em ; }
.ui-dialog.edit-vo .header .content { display: flex ; flex-direction: column ; justify-content: center ; }
.ui-dialog.edit-vo .header .content .vo-name { font-size: 125% ; }
.ui-dialog.edit-vo .header .content input.select-vo-image { width: 15px ; position: relative ; top: 10px ; }
.ui-dialog.edit-vo .capabilities .header { display: flex ; align-items: center ; margin-bottom: 0.5em ; }
.ui-dialog.edit-vo .capabilities .header img.vasl-image { height: 3.5em ; margin-right: 0.5em ; }
.ui-dialog.edit-vo .capabilities .header img.vasl-image.small-piece { height: 2.7em ; margin-left: 0.4em ; margin-right: 0.9em ; }
.ui-dialog.edit-vo .capabilities .header .content { display: flex ; flex-direction: column ; justify-content: center ; }
.ui-dialog.edit-vo .capabilities .header .content .vo-name { font-size: 125% ; }
.ui-dialog.edit-vo .capabilities .header .content input.select-vo-image { width: 15px ; position: relative ; top: 10px ; }
.ui-dialog.edit-vo .capabilities { flex-grow: 1 ; }
.ui-dialog.edit-vo .comments { flex-grow: 1 ; }
.ui-dialog.edit-vo .capabilities div.fieldset { flex-grow: 1 ; display: flex ; flex-direction: column ; align-items: stretch ; }
.ui-dialog.edit-vo .capabilities div.fieldset { margin: 0 ; padding: 5px 8px 8px 8px ; border: 1px solid #aaa ; }
.ui-dialog.edit-vo .capabilities div.fieldset-legend { color: #666 ; }
.ui-dialog.edit-vo .capabilities div.fieldset ul { flex-grow: 1 ; margin: 0 0 5px 0 ; list-style-type: none ; overflow-y: auto ; }
.ui-dialog.edit-vo .capabilities div.fieldset li { height: 1.5em ; margin: 2px ; padding: 2px 0px 2px 5px ; background: #eee ; }
.ui-dialog.edit-vo .capabilities div.fieldset li div { display: flex ; align-items: center ; }
.ui-dialog.edit-vo .capabilities div.fieldset li img.dragger { height: 1em ; margin-right: 5px ; }
.ui-dialog.edit-vo .capabilities div.fieldset li input[type='text'] { flex-grow: 1 ; margin-right: 1em ; }
.ui-dialog.edit-vo .fieldset { height: calc(100% - 40px) ; display: flex ; flex-direction: column ; align-items: stretch ; }
.ui-dialog.edit-vo .fieldset { margin: 0 ; padding: 5px 8px 8px 8px ; border: 1px solid #aaa ; }
.ui-dialog.edit-vo .fieldset-legend { color: #666 ; }
.ui-dialog.edit-vo .fieldset ul { flex-grow: 1 ; margin: 0 0 5px 0 ; list-style-type: none ; overflow-y: auto ; }
.ui-dialog.edit-vo .fieldset li { margin: 2px ; padding: 2px 0px 2px 5px ; background: #eee ; }
.ui-dialog.edit-vo .fieldset li div { display: flex ; align-items: center ; }
.ui-dialog.edit-vo .fieldset li img.dragger { height: 1em ; margin-right: 5px ; }
.ui-dialog.edit-vo .fieldset li input[type='text'] { flex-grow: 1 ; margin-right: 1em ; }
.ui-dialog.edit-vo .capabilities div.fieldset .footer { display: flex ; align-items: center ; }
.ui-dialog.edit-vo .capabilities div.fieldset .footer img.trash { margin: 3px 5px ; height: 24px ; }
.ui-dialog.edit-vo .fieldset .footer { display: flex ; align-items: center ; }
.ui-dialog.edit-vo .fieldset .footer img.trash { margin: 3px 5px ; height: 24px ; }

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 322 B

@ -186,21 +186,23 @@ $(document).ready( function () {
restrict_droplist_height( $sel ) ;
}
function format_player_droplist_item( opt ) {
var url = gImagesBaseUrl + "/flags/" + opt.id + ".png" ;
if ( ! opt.id )
return opt.text ;
var url = make_player_flag_url( opt.id ) ;
return $( "<div style='display:flex;align-items:center;'>" +
"<img src='" + url + "' style='height:0.9em;margin-right:0.25em;'>" +
" " + opt.text +
"</div>" ) ;
}
init_select2( $( "select[name='PLAYER_1']" ),
"9em", false, format_player_droplist_item
"9.5em", false, format_player_droplist_item
).on( "select2:open", function() {
on_player_droplist_open( $(this) ) ;
} ).on( "change", function() {
on_player_change_with_confirm( 1 ) ;
} ) ;
init_select2( $( "select[name='PLAYER_2']" ),
"9em", false, format_player_droplist_item
"9.5em", false, format_player_droplist_item
).on( "select2:open", function() {
on_player_droplist_open( $(this) ) ;
} ).on( "change", function() {
@ -315,7 +317,7 @@ $(document).ready( function () {
edit_template( $(this).data( "id" ) ) ;
} ).html( "<div><img src='" + gImagesBaseUrl + "/edit-template.png'>Edit</div>" )
.attr( "title", "Edit the template." )
.addClass( "ui-button" ) ;
.button( {} ) ;
// watch for changes to the scenario name
$("input[name='SCENARIO_NAME']").on( "input propertychange paste", function() {
@ -436,7 +438,12 @@ function init_snippet_button( $btn )
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
gPageLoadStatus = [ "main", "vehicle-listings", "ordnance-listings", "vehicle-notes", "ordnance-notes", "vasl-piece-info", "template-pack", "default-scenario" ] ;
gPageLoadStatus = [
"main",
"vehicle-listings", "ordnance-listings", "reset-scenario",
"vehicle-notes", "ordnance-notes",
"vasl-piece-info", "template-pack", "default-scenario"
] ;
function update_page_load_status( id )
{
@ -456,7 +463,10 @@ function update_page_load_status( id )
// NOTE: If the default scenario contains any vehicles or ordnance, it will look up the V/O listings,
// so we need to wait until those have arrived. Note that while the default scenario will normally
// be empty, having stuff in it is very useful during development.
do_on_new_scenario( false ) ;
if ( gPageLoadStatus.indexOf( "reset-scenario" ) !== -1 ) {
do_on_new_scenario( false ) ;
update_page_load_status( "reset-scenario" ) ;
}
}
function show_startup_msgs( msgs, msg_type ) {
@ -493,6 +503,12 @@ function update_page_load_status( id )
} ).fail( function( xhr, status, errorMsg ) {
showErrorMsg( "Can't get the startup messages:<div class='pre'>" + escapeHTML(errorMsg) + "</div>" ) ;
} ) ;
// preload the flag images (so that the player droplist renders immediately)
for ( var nat in gTemplatePack.nationalities ) {
$("body").append( $(
"<img src='" + make_player_flag_url(nat) + "' style='display:none;'>"
) ) ;
}
}
}
@ -573,6 +589,22 @@ function install_template_pack( data )
update_ob_tab_header( 1 ) ;
update_ob_tab_header( 2 ) ;
}
// update the snippet buttons
function update_button( $btn ) {
var template_id = $btn.attr( "data-id" ) ;
if ( template_id.substr( 0, 7 ) === "extras/" )
return ;
if ( template_id.match( /^ob_(vehicles|ordnance).*_[12]$/ ) )
template_id = template_id.substring( 0, template_id.length-2 ) ;
var enable = is_template_available( template_id ) ;
if ( $btn.parent().hasClass( "snippet-control" ) )
$btn.parent().controlgroup( enable ? "enable" : "disable" ) ;
else
$btn.button( enable ? "enable": "disable" ) ;
}
$( "button.generate" ).each( function() { update_button( $(this) ) ; } ) ;
$( "button.edit-template" ).each( function() { update_button( $(this) ) ; } ) ;
}
// --------------------------------------------------------------------
@ -648,7 +680,7 @@ function update_ob_tab_header( player_no )
// update the OB tab header for the specified player
var player_nat = $( "select[name='PLAYER_" + player_no + "']" ).val() ;
var display_name = get_nationality_display_name( player_nat ) ;
var image_url = gImagesBaseUrl + "/flags/" + player_nat + ".png" ;
var image_url = make_player_flag_url( player_nat ) ;
var $elem = $( "#tabs .ui-tabs-nav a[href='#tabs-ob" + player_no + "']" ) ;
$elem.html(
"<img src='" + image_url + "'>&nbsp;" +

@ -34,8 +34,8 @@ function _do_edit_simple_note( $sortable2, $entry, default_width )
dialogClass: "edit-simple_note",
title: ($entry ? "Edit " : "Add ") + SORTABLE_DISPLAY_NAMES[note_type][0],
modal: true,
minWidth: 400,
minHeight: 150,
minWidth: 600,
minHeight: 250,
create: function() {
init_dialog( $(this), "OK", true ) ;
},
@ -125,10 +125,12 @@ function _make_simple_note( note_type, caption )
var buf = [ "<div>" ] ;
if ( ["scenario_notes","ob_setups","ob_notes"].indexOf( note_type ) !== -1 ) {
var note_type0 = note_type.substring( 0, note_type.length-1 ) ;
buf.push(
"<img src='" + gImagesBaseUrl + "/snippet.png'",
" class='snippet' data-id='" + note_type0 + "' title='" + GENERATE_SNIPPET_HINT + "'>"
) ;
if ( is_template_available( note_type0 ) ) {
buf.push(
"<img src='" + gImagesBaseUrl + "/snippet.png'",
" class='snippet' data-id='" + note_type0 + "' title='" + GENERATE_SNIPPET_HINT + "'>"
) ;
}
}
buf.push( caption, "</div>" ) ;
var $content = $( buf.join("") ) ;

@ -14,6 +14,20 @@ var _DAY_OF_MONTH_POSTFIXES = { // nb: we assume English :-/
11: "th", 12: "th", 13: "th"
} ;
// NOTE: Blood & Jungle has a lot of multi-applicable notes that simply refer to other
// multi-applicable notes e.g. "Fr C" = "French Multi-Applicable Note C".
var BFP_MA_NOTE_REDIRECTS = {
"Br": "british",
"Ch": "chinese",
"Fr": "french",
"Ge": "german",
"Jp": "japanese",
"Ru": "russian",
"US": "american",
"AllM": "allied-minor",
"AxM": "axis-minor",
} ;
var gDefaultScenario = null ;
var gLastSavedScenario = null ;
var gLastSavedScenarioFilename = null ;
@ -89,6 +103,10 @@ function generate_snippet( $btn, evt, extra_params )
showErrorMsg( "Can't copy to the clipboard:<div class'pre'>" + escapeHTML(ex) + "</div>" ) ;
return ;
}
// NOTE: This notification will be shown even if there was an error generating the snippet,
// but the error message was copied to the clipboard, so it's still techincally correct... :-/
// We disabled the ability to generate a snippet if a template file is not present, so it should
// only be an issue if there was a problem processing the template.
showInfoMsg( "The HTML snippet has been copied to the clipboard." ) ;
}
@ -158,16 +176,27 @@ function make_snippet( $btn, params, extra_params, show_date_warnings )
set_vo_note( "ordnance" ) ;
// generate snippets for multi-applicable vehicle/ordnance notes
var pos ;
function add_ma_notes( ma_notes, keys, param_name, nat, vo_type ) {
if ( ! keys )
return ;
params[ param_name ] = [] ;
for ( var i=0 ; i < keys.length ; ++i ) {
var ma_note = ma_notes[ keys[i] ] ;
var ma_note = get_ma_note( nat, vo_type, keys[i] ) ;
var key = keys[i] ;
var extn_marker = "" ;
if ( nat === "italian" && vo_type === "ordnance" && keys[i] === "R" )
key = "<s>R</s>" ;
else {
pos = key.indexOf( ":" ) ;
if ( pos !== -1 ) {
extn_marker = "&#x2756; " ;
key = key.substring( pos+1 ) ;
}
}
params[ param_name ].push(
"<span class='key'>" +
(nat === "italian" && vo_type === "ordnance" && keys[i] === "R" ? "<s>R</s>" : keys[i]) + ":" +
"</span> " +
extn_marker +
"<span class='key'>" + key + ":" + "</span> " +
(ma_note || "Unavailable.")
) ;
}
@ -178,9 +207,9 @@ function make_snippet( $btn, params, extra_params, show_date_warnings )
var result = get_ma_notes_keys( nat, vo_entries, vo_type, null ) ;
if ( ! result )
return ;
// NOTE: If the V/O entries contain landing craft or common vehicles/ordnance, we get:
// NOTE: If the V/O entries contain landing craft, we get:
// [ m/a note keys, m/a note keys for the extras, nat ID for the extras, display caption for the extras, unrecognized keys ]
// where "extras" = landing craft or common vehicles/ordnance. Otherwise, we get:
// where "extras" = landing craft. Otherwise, we get:
// [ m/a note keys, null, null, null, unrecognized keys ]
add_ma_notes( get_ma_notes_for_nat(nat,vo_type), result[0], param_name, nat, vo_type ) ;
if ( result[1] ) {
@ -192,13 +221,6 @@ function make_snippet( $btn, params, extra_params, show_date_warnings )
}
}
}
function get_ma_notes_for_nat( nat, vo_type ) {
if ( nat === "landing-craft" && nat in gVehicleOrdnanceNotes.vehicles )
return gVehicleOrdnanceNotes.vehicles[ nat ][ "multi-applicable" ] ;
if ( vo_type in gVehicleOrdnanceNotes && nat in gVehicleOrdnanceNotes[vo_type] )
return gVehicleOrdnanceNotes[ vo_type ][ nat ][ "multi-applicable" ] ;
return {} ;
}
get_ma_notes( "vehicles", 1, "OB_VEHICLES_MA_NOTES_1" ) ;
get_ma_notes( "ordnance", 1, "OB_ORDNANCE_MA_NOTES_1" ) ;
get_ma_notes( "vehicles", 2, "OB_VEHICLES_MA_NOTES_2" ) ;
@ -304,6 +326,7 @@ function make_snippet( $btn, params, extra_params, show_date_warnings )
// add in any extra parameters
if ( extra_params )
$.extend( true, params, extra_params ) ;
params.IMAGES_BASE_URL = APP_URL_BASE + gImagesBaseUrl ;
// check that the players have different nationalities
if ( params.PLAYER_1 === params.PLAYER_2 )
@ -361,7 +384,12 @@ function get_vo_note_key( vo_entry )
return null ;
// nb: there are some note numbers of the form "1.2" :-/
var match = vo_entry.note_number.match( new RegExp( "^([0-9.]+)" ) ) ;
return match ? match[1] : null ;
if ( ! match )
return null ;
var key = match[1] ;
if ( vo_entry.extn_id )
key = vo_entry.extn_id + ":" + key ;
return key ;
}
function is_known_vo_note_key( vo_type, nat, key )
@ -378,7 +406,7 @@ function get_ma_notes_keys( nat, vo_entries, vo_type )
if ( ! vo_entries )
return null ;
// NOTE: We need to return 2 sets of referenced keys, one for the normal vehicle/ordnance notes
// and one for any landing craft/common vehicles, since they share common keys.
// and one for any landing craft, since they share common keys.
var keys = [ {}, {} ] ;
var unrecognized = [] ;
var regexes = [
@ -389,12 +417,11 @@ function get_ma_notes_keys( nat, vo_entries, vo_type )
new RegExp( "^([A-Z][a-z])$" ),
new RegExp( "^([A-Za-z])<sup>" ),
new RegExp( "^<s>([A-Za-z])</s>$" ),
// NOTE: There are BFP references like "Jp 5", but we ignore these since they are referring to
// a vehicle/ordnance *note*, not a multi-applicable note.
new RegExp( "^((Br|Ch|Fr|Ge|Jp|Ru|US|AllM|AxM) [A-Z]{1,2})(\\u2020(<sup>\\d</sup>)?)?$" ),
] ;
var EXTRA_NOTES_INFO = {
"alc/v": [ "allied-minor", "Allied Minor Common Vehicles" ],
"alc/o": [ "allied-minor", "Allied Minor Common Ordnance" ],
"axc/v": [ "axis-minor", "Axis Minor Common Vehicles" ],
"axc/o": [ "axis-minor", "Axis Minor Common Ordnance" ],
"sh/v": [ "landing-craft", "Landing Craft" ],
} ;
var extra_notes_info = [ null, null ] ;
@ -404,14 +431,24 @@ function get_ma_notes_keys( nat, vo_entries, vo_type )
if ( ! vo_entry.notes )
continue ;
for ( j=0 ; j < vo_entry.notes.length ; ++j ) {
if ( vo_entry.notes[j] === "US <s>P</s>" ) { // nb: can't do this with a regex
keys[0][ vo_entry.extn_id + ":US P" ] = true ;
continue ;
}
var rc = false ;
for ( k=0 ; k < regexes.length ; ++k ) {
var match = vo_entry.notes[j].match( regexes[k] ) ;
if ( match ) {
var vo_id = vo_entry.id.split( ":", 1 )[0] ;
var is_extra = ["allied-minor","axis-minor","landing-craft"].indexOf( nat ) === -1 &&
["alc/v","alc/o","axc/v","axc/o","sh/v"].indexOf( vo_id ) !== -1 ;
keys[ is_extra?1:0 ][ match[1] ] = true ;
var is_extra = ( nat !== "landing-craft" && vo_id === "sh/v" ) ;
var key = match[1] ;
if ( vo_entry.extn_id && !( vo_entry.extn_id === "adf-bj" && nat === "american" && key.length === 1 ) ) {
// NOTE: We include the extension ID as part of the key, except for BFP American vehicles,
// whose multi-applicable notes refer to the main American multi-applicable notes,
// not the BFP ones (there aren't any).
key = vo_entry.extn_id + ":" + key ;
}
keys[ is_extra?1:0 ][ key ] = true ;
if ( is_extra ) {
// NOTE: Only the Americans/British and Japanese have landing craft, while Axis Minor Powers
// will never have Allied Minor common vehicles/ordnance (and vice versa), so if we have
@ -429,8 +466,31 @@ function get_ma_notes_keys( nat, vo_entries, vo_type )
}
}
// delete duplicate keys e.g. if we have notes "X" and "Fr X", we want to include "X" but not "Fr X"
// *if* the player is French, otherwise we want to include both.
var keys0 = sort_ma_notes_keys( nat, Object.keys(keys[0]) ) ;
var keys0a = null ;
if ( keys0 ) {
var std_keys = {} ;
for ( i=0 ; i < keys0.length ; ++i ) {
if ( keys0[i].match( /^[A-Za-z]{1,2}$/ ) )
std_keys[ keys0[i] ] = true ;
}
keys0a = [] ;
for ( i=0 ; i < keys0.length ; ++i ) {
var pos = keys0[i].indexOf( ":" ) ;
if ( pos > 0 ) {
var val = keys0[i].substr( pos+1 ) ;
pos = val.indexOf( " " ) ;
if ( BFP_MA_NOTE_REDIRECTS[ val.substr(0,pos) ] == nat && val.substr(pos+1) in std_keys )
continue ;
}
keys0a.push( keys0[i] ) ;
}
}
return [
sort_ma_notes_keys( nat, Object.keys(keys[0]) ),
keys0a,
sort_ma_notes_keys( nat, Object.keys(keys[1]) ),
extra_notes_info[0], extra_notes_info[1],
unrecognized
@ -479,6 +539,52 @@ function sort_ma_notes_keys( nat, keys )
return keys ;
}
function get_ma_note( nat, vo_type, key )
{
var ma_notes ;
function redirect_ma_note( target, vo_type ) {
pos = target.indexOf( " " ) ;
var nat_redirect = BFP_MA_NOTE_REDIRECTS[ target.substring( 0, pos ) ] ;
if ( nat_redirect ) {
ma_notes = get_ma_notes_for_nat( nat_redirect, vo_type ) ;
return ma_notes[ target.substring( pos+1 ) ] ;
}
return null ;
}
// check for redirected notes
var ma_note = null ;
var pos = key.indexOf( ":" ) ;
if ( pos !== -1 )
ma_note = redirect_ma_note( key.substring(pos+1), vo_type ) ;
if ( ! ma_note ) {
// look for a normal note
ma_notes = get_ma_notes_for_nat( nat, vo_type ) ;
ma_note = ma_notes[ key ] ;
}
if ( ! ma_note ) {
// still couldn't find anything - if we're Allied/Axis Minor, try the common notes
if ( gTemplatePack.nationalities[ nat ].type === "allied-minor" )
ma_note = get_ma_notes_for_nat( "allied-minor", vo_type )[ key ] ;
else if ( gTemplatePack.nationalities[ nat ].type === "axis-minor" )
ma_note = get_ma_notes_for_nat( "axis-minor", vo_type )[ key ] ;
}
return ma_note ;
}
function get_ma_notes_for_nat( nat, vo_type )
{
// get the multi-applicable vehicle/ordnance notes for the specified nationality
if ( nat === "landing-craft" && nat in gVehicleOrdnanceNotes.vehicles )
return gVehicleOrdnanceNotes.vehicles[ "landing-craft" ][ "multi-applicable" ] ;
if ( vo_type in gVehicleOrdnanceNotes && nat in gVehicleOrdnanceNotes[vo_type] )
return gVehicleOrdnanceNotes[ vo_type ][ nat ][ "multi-applicable" ] ;
return {} ;
}
function _make_snippet_image_filename( snippet )
{
// generate the save filename for a generated snippet image
@ -542,16 +648,20 @@ function unload_snippet_params( unpack_scenario_date, template_id )
var $sortable2 = $( "#ob_" + vo_type + "-sortable_" + player_no ) ;
var objs = [] ;
$sortable2.children( "li" ).each( function() {
var vo_entry = $(this).data( "sortable2-data" ).vo_entry ;
var vo_image_id = $(this).data( "sortable2-data" ).vo_image_id ;
var data = $(this).data( "sortable2-data" ) ;
var vo_entry = data.vo_entry ;
var vo_image_id = data.vo_image_id ;
var elite = data.elite ;
var obj = {
id: vo_entry.id,
seq_id: $(this).data( "sortable2-data" ).id,
seq_id: data.id,
image_id: (vo_image_id !== null) ? vo_image_id[0]+"/"+vo_image_id[1] : null,
name: vo_entry.name,
note_number: vo_entry.note_number,
notes: vo_entry.notes
} ;
if ( vo_entry.extn_id )
obj.extn_id = vo_entry.extn_id ;
if ( gUserSettings["include-vasl-images-in-snippets"] ) {
var url = get_vo_image_url( vo_entry, vo_image_id ) ;
if ( url )
@ -574,7 +684,7 @@ function unload_snippet_params( unpack_scenario_date, template_id )
// we will show the warnings when we make the raw capabilities.
capabilities = make_capabilities(
false,
vo_entry, nat,
vo_entry, nat, elite,
params.SCENARIO_THEATER, params.SCENARIO_YEAR, params.SCENARIO_MONTH,
false
) ;
@ -583,12 +693,22 @@ function unload_snippet_params( unpack_scenario_date, template_id )
}
capabilities = make_capabilities(
true,
vo_entry, nat,
vo_entry, nat, elite,
params.SCENARIO_THEATER, params.SCENARIO_YEAR, params.SCENARIO_MONTH,
show_warnings
) ;
if ( capabilities )
if ( capabilities ) {
obj.raw_capabilities = capabilities ;
if ( elite )
obj.elite = true ;
}
var comments = $(this).data( "sortable2-data" ).custom_comments ;
if ( comments ) {
obj.comments = comments ;
obj.custom_comments = comments.slice() ;
} else {
obj.comments = vo_entry.comments ;
}
objs.push( obj ) ;
} ) ;
if ( objs.length > 0 )
@ -604,7 +724,7 @@ function unload_snippet_params( unpack_scenario_date, template_id )
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
function make_capabilities( raw, vo_entry, nat, scenario_theater, scenario_year, scenario_month, show_warnings )
function make_capabilities( raw, vo_entry, nat, elite, scenario_theater, scenario_year, scenario_month, show_warnings )
{
var capabilities = [] ;
@ -652,7 +772,7 @@ function make_capabilities( raw, vo_entry, nat, scenario_theater, scenario_year,
capabilities[ capabilities.length-1 ] += " [" + caps.join(", ") + "]" ;
continue ;
}
if ( $.inArray( key, ["HE","AP","A","D","C","H","B","s","sM","sD","sN","WP","IR","Towed"] ) === -1 ) {
if ( $.inArray( key, ["HE","AP","A","D","C","H","B","S","s","sM","sD","sN","WP","IR","Towed"] ) === -1 ) {
unexpected_caps.push( key ) ;
continue ;
}
@ -713,7 +833,18 @@ function make_capabilities( raw, vo_entry, nat, scenario_theater, scenario_year,
if ( crew_survival )
capabilities.push( crew_survival ) ;
return capabilities ;
// remove uninteresting capabilities
var capabilities2 = [] ;
for ( i=0 ; i < capabilities.length ; ++i ) {
if ( ["T","NT","ST"].indexOf( capabilities[i] ) === -1 )
capabilities2.push( capabilities[i] ) ;
}
// check for elite vehicles/ordnance
if ( elite )
adjust_capabilities_for_elite( capabilities2, +1 ) ;
return capabilities2 ;
}
function make_raw_capability( name, capability )
@ -825,6 +956,13 @@ function _check_capability_timestamp( capabilities, timestamp, nat, scenario_the
}
// parse the month/year the capability becomes available
var match = timestamp.match( /^(\d+)-$/ ) ;
if ( match ) {
if ( scenario_year < 1900 + parseInt(match[1]) )
return capabilities[0] ;
else
return "" ;
}
var month = MONTH_NAMES[ timestamp.substring(0,1) ] ;
if ( month )
timestamp = timestamp.substring( 1 ) ;
@ -888,6 +1026,21 @@ function make_crew_survival( vo_entry )
return crew_survival ;
}
function adjust_capabilities_for_elite( capabilities, delta )
{
// adjust the list of capabilities for elite status
// Pondicherry, India (FEB/19)
if ( ! capabilities )
return ;
for ( var i=0 ; i < capabilities.length ; ++i ) {
if ( capabilities[i].indexOf( "<sup>" ) !== -1 )
continue ; // nb: ignore raw capabilities (e.g. if the scenario date hasn't been set)
var match = capabilities[i].match( /^(A|M|H|C|D|HE|AP|WP|s|S|sD|sM|sN)([1-9][0-9]?)/ ) ;
if ( match )
capabilities[i] = match[1] + (parseInt(match[2]) + delta) + capabilities[i].substr(match[1].length+match[2].length) ;
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
function get_template( template_id, fixup )
@ -925,7 +1078,7 @@ function edit_template( template_id )
dialogClass: "edit-template",
title: "Editing template: " + escapeHTML(template_id),
modal: false,
minWidth: 400, minHeight: 200,
minWidth: 600, minHeight: 300,
create: function() {
init_dialog( $(this), "Close", true ) ;
},
@ -1127,7 +1280,7 @@ function do_load_scenario_data( params )
warnings.push( "Invalid V/O image ID for '" + params[key][i].name + "': " + params[key][i].image_id ) ;
}
if ( vo_entry )
do_add_vo( vo_type, player_no, vo_entry, vo_image_id, params[key][i].custom_capabilities, params[key][i].seq_id ) ;
do_add_vo( vo_type, player_no, vo_entry, vo_image_id, params[key][i].elite, params[key][i].custom_capabilities, params[key][i].custom_comments, params[key][i].seq_id ) ;
else
unknown_vo.push( vo_id || "(not set)" ) ;
}
@ -1286,6 +1439,10 @@ function unload_params_for_save( user_requested )
entry.image_id = params[key][i].image_id ;
if ( params[key][i].custom_capabilities )
entry.custom_capabilities = params[key][i].custom_capabilities ;
if ( params[key][i].elite )
entry.elite = true ;
if ( params[key][i].custom_comments )
entry.custom_comments = params[key][i].custom_comments ;
entries.push( entry ) ;
}
params[key] = entries ;

@ -6,6 +6,7 @@ SORTABLE_DISPLAY_NAMES = {
ob_vehicles: [ "vehicle", "vehicles", "a" ],
ob_ordnance: [ "ordnance", "ordnance", "an" ],
vo_capabilities: [ "capability", "capabilities", "a" ],
vo_comments: [ "comment", "comments", "a" ],
} ;
SORTABLE_HINTS = {
@ -77,7 +78,7 @@ $.fn.sortable2 = function( action, args )
$sortable2.data( "on_edit", args.edit ) ;
var $add_btn = find_helper( $sortable2, "add" ) ;
$add_btn.prepend( $( "<div><img src='" + gImagesBaseUrl + "/sortable-add.png' class='sortable-add'> Add</div>" ) )
.addClass( "ui-button" ) ;
.button( {} ) ;
var $add = find_helper( $sortable2, "add" ) ;
$add.prop( "title", "Add a new " + display_name[0] )
.click( args.add ) ;
@ -85,7 +86,7 @@ $.fn.sortable2 = function( action, args )
$sortable2.data( "on_reset", args.reset ) ;
var $reset_btn = find_helper( $sortable2, "reset" ) ;
$reset_btn.prepend( $( "<div><img src='" + gImagesBaseUrl + "/sortable-reset.png' class='sortable-reset'> Reset</div>" ) )
.addClass( "ui-button" ) ;
.button( {} ) ;
var $reset = find_helper( $sortable2, "reset" ) ;
$reset.prop( "title", "Reset the " + display_name[1] )
.click( args.reset ) ;
@ -167,8 +168,8 @@ $.fn.sortable2 = function( action, args )
var display_name = SORTABLE_DISPLAY_NAMES[ get_sortable2_type($sortable2) ] ;
var buf = [
"OK to delete this " + display_name[0] + "?",
"<div style='margin-top:1em;font-size:80%;font-style:italic;'>",
escapeHTML( caption ),
"<div style='margin:1em 0 0 1em;font-size:80%;font-style:italic;'>",
caption,
"</div>"
] ;
ask( "Delete "+display_name[0], buf.join(""), {

@ -46,9 +46,10 @@ function user_settings()
height: 250,
resizable: false,
create: function() {
init_dialog( $(this), "OK", false ) ;
init_dialog( $(this), "OK", true ) ;
},
open: function() {
on_dialog_open( $(this) ) ;
// load the current user settings
load_settings( $(this) ) ;
},

@ -25,6 +25,8 @@ function get_player_colors( player_no )
function get_player_colors_for_element( $elem )
{
// get the player colors (if any) for the specified element
if ( $elem.attr( "id" ).substr( 0, 18 ) === "ob_notes-sortable_" )
return null ;
var player_no = get_player_no_for_element( $elem ) ;
if ( player_no === null )
return null ;
@ -55,6 +57,14 @@ function get_scenario_date()
return scenario_date ;
}
function is_template_available( template_id )
{
// check if the specified template is available
if ( template_id.match( /^ob_(vehicles|ordnance).*_[12]$/ ) )
template_id = template_id.substring( 0, template_id.length-2 ) ;
return gTemplatePack.templates[ template_id ] !== undefined ;
}
// --------------------------------------------------------------------
function copyToClipboard( val )
@ -148,10 +158,16 @@ function init_dialog( $dlg, ok_button_text, auto_dismiss )
// allow Ctrl-Enter to dismiss the dialog
if ( auto_dismiss ) {
$dlg.find("input[type='text']").keydown( function(evt) {
$dlg.find( "input[type='text']" ).keydown( function(evt) {
auto_dismiss_dialog( $dlg, evt, ok_button_text ) ;
} ) ;
$dlg.find( "input[type='checkbox']" ).keydown( function(evt) {
auto_dismiss_dialog( $dlg, evt, ok_button_text ) ;
} ) ;
$dlg.find( "select" ).keydown( function(evt) {
auto_dismiss_dialog( $dlg, evt, ok_button_text ) ;
} ) ;
$dlg.find("textarea").keydown( function(evt) {
$dlg.find( "textarea" ).keydown( function(evt) {
auto_dismiss_dialog( $dlg, evt, ok_button_text ) ;
} ) ;
}
@ -198,6 +214,8 @@ function ask( title, msg, args )
modal: true,
closeOnEscape:false,
title: title,
minWidth: 250,
maxHeight: window.innerHeight,
create: function() {
init_dialog( $(this), "OK", false ) ;
// we handle ESCAPE ourself, to make it the same as clicking Cancel, not just closing the dialog
@ -316,7 +334,7 @@ function add_flag_to_dialog_titlebar( $dlg, player_no )
if ( ! player_nat )
return ;
var $titlebar = $dlg.dialog( "instance" ).uiDialogTitlebar ;
var url = gImagesBaseUrl + "/flags/" + player_nat + ".png" ;
var url = make_player_flag_url( player_nat ) ;
$titlebar.find( ".ui-dialog-title" ).prepend(
$( "<img src='" + url + "' class='flag'>" )
).css( { display: "flex", "align-items": "center" } ) ;

@ -174,6 +174,8 @@ function _generate_snippets()
function on_snippet_button( $btn, inactive ) {
var template_id = $btn.attr( "data-id" ) ;
if ( ! is_template_available( template_id ) )
return ;
if ( template_id.substr(0,7) === "extras/" ) {
// NOTE: We don't handle extras templates, since they can be parameterized. We would need to store
// the parameter values in the generated snippet, and extract them here so that we can re-generate

@ -3,27 +3,16 @@
function add_vo( vo_type, player_no )
{
// get the vehicles/ordnance already added
var $sortable2 = $( "#ob_" + vo_type + "-sortable_" + player_no ) ;
var vo_present = [];
$sortable2.children("li").each( function() {
var vo_entry = $(this).data( "sortable2-data" ).vo_entry ;
vo_present.push( vo_entry.id ) ;
} ) ;
// load the available vehicles/ordnance
var nat = $( "select[name='PLAYER_" + player_no + "']" ).val() ;
var entries = gVehicleOrdnanceListings[vo_type][nat] ;
if ( entries === undefined ) {
showErrorMsg( "There are no " + get_nationality_display_name(nat) + " " + vo_type + " listings." ) ;
showWarningMsg( "There are no " + get_nationality_display_name(nat) + " " + vo_type + " listings." ) ;
return ;
}
var buf = [] ;
for ( var i=0 ; i < entries.length ; ++i ) {
if ( vo_present.indexOf( entries[i].id ) !== -1 )
continue ;
for ( var i=0 ; i < entries.length ; ++i )
buf.push( "<option value='" + i + "'>" + entries[i].name + "</option>" ) ;
}
function format_vo_entry( opt ) {
if ( ! opt.id )
return opt.text ;
@ -70,15 +59,16 @@ function add_vo( vo_type, player_no )
} ) ;
// let the user select a vehicle/ordnance
var $sortable2 = $( "#ob_" + vo_type + "-sortable_" + player_no ) ;
function on_resize( $dlg ) {
$( ".select2-results ul" ).height( $dlg.height() - 50 ) ;
}
$("#select-vo").dialog( {
var $dlg = $("#select-vo").dialog( {
title: "Add " + SORTABLE_DISPLAY_NAMES["ob_"+vo_type][0],
dialogClass: "select-vo",
modal: true,
minWidth: 300,
minHeight: 300,
minWidth: 400,
minHeight: 350,
create: function() {
init_dialog( $(this), "OK", false ) ;
// handle ESCAPE
@ -104,21 +94,35 @@ function add_vo( vo_type, player_no )
resize: function() { on_resize( $(this) ) ; },
buttons: {
OK: function() {
// add the new vehicle/ordnance
// get the selected vehicle/ordnance
// FUDGE! $sel.select("data") returns the wrong thing if the entries are filtered?!?!
var $elem = $( "#select-vo .select2-results__option--highlighted" ) ;
if ( $elem.length === 0 )
return ;
var sel_index = $elem.children( ".vo-entry" ).data( "index" ) ;
var $img = $elem.find( "img[class='vasl-image']" ) ;
var vo_image_id = $img.data( "vo-image-id" ) ;
var usedIds = {};
var sel_entry = entries[ sel_index ] ;
var usedVoIds=[], usedSeqIds={} ;
$sortable2.find( "li" ).each( function() {
usedIds[ $(this).data( "sortable2-data" ).id ] = true ;
usedVoIds.push( $(this).data( "sortable2-data" ).vo_entry.id ) ;
usedSeqIds[ $(this).data( "sortable2-data" ).id ] = true ;
} ) ;
var seq_id = auto_assign_id( usedIds, "seq_id" ) ;
do_add_vo( vo_type, player_no, entries[sel_index], vo_image_id, null, seq_id ) ;
$(this).dialog( "close" ) ;
// check for duplicates
function add_sel_entry() {
var $img = $elem.find( "img[class='vasl-image']" ) ;
var vo_image_id = $img.data( "vo-image-id" ) ;
var seq_id = auto_assign_id( usedSeqIds, "seq_id" ) ;
do_add_vo( vo_type, player_no, sel_entry, vo_image_id, false, null, null, seq_id ) ;
$dlg.dialog( "close" ) ;
}
if ( usedVoIds.indexOf( sel_entry.id ) !== -1 ) {
var vo_type2 = SORTABLE_DISPLAY_NAMES[ "ob_" + vo_type ][0] ;
ask( "Add "+vo_type2, "<p>This "+vo_type2+" is already in the OB<p>Do you want to add it again?", {
ok: add_sel_entry,
} ) ;
return ;
}
// add the new vehicle/ordnance
add_sel_entry() ;
},
Cancel: function() { $(this).dialog( "close" ) ; },
},
@ -127,7 +131,7 @@ function add_vo( vo_type, player_no )
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
function do_add_vo( vo_type, player_no, vo_entry, vo_image_id, custom_capabilities, seq_id )
function do_add_vo( vo_type, player_no, vo_entry, vo_image_id, elite, custom_capabilities, custom_comments, seq_id )
{
// add the specified vehicle/ordnance
// NOTE: We set a fixed height for the sortable2 entries (based on the CSS settings in tabs-ob.css),
@ -145,10 +149,13 @@ function do_add_vo( vo_type, player_no, vo_entry, vo_image_id, custom_capabiliti
caption: vo_entry.name,
vo_entry: vo_entry,
vo_image_id: vo_image_id,
elite: elite,
fixed_height: fixed_height
} ;
if ( custom_capabilities )
data.custom_capabilities = custom_capabilities ;
if ( custom_comments )
data.custom_comments = custom_comments ;
data.id = seq_id ;
var buf = [ div_tag,
"<img class='vasl-image'>",
@ -173,11 +180,14 @@ function do_add_vo( vo_type, player_no, vo_entry, vo_image_id, custom_capabiliti
}
if ( vo_nat ) {
var template_id = (vo_type === "vehicles") ? "ob_vehicle_note" : "ob_ordnance_note" ;
buf.push(
"<img src='" + gImagesBaseUrl + "/snippet.png'",
" class='snippet' data-id='" + template_id + "' title='" + GENERATE_SNIPPET_HINT + "'>"
) ;
data.vo_note_url = APP_URL_BASE + "/" + vo_type + "/" + vo_nat + "/note/" + vo_note_key ;
if ( is_template_available( template_id ) ) {
buf.push(
"<img src='" + gImagesBaseUrl + "/snippet.png'",
" class='snippet' data-id='" + template_id + "' title='" + GENERATE_SNIPPET_HINT + "'>"
) ;
}
var url = APP_URL_BASE + "/" + vo_type + "/" + vo_nat + "/note/" ;
data.vo_note_url = url + vo_note_key ;
}
buf.push( "</div>" ) ;
var $content = $( buf.join("") ) ;
@ -199,9 +209,10 @@ function update_vo_sortable2_entry( $entry, snippet_params )
// initialize
if ( ! snippet_params )
snippet_params = unload_snippet_params( true, null ) ;
var vo_entry = $entry.data( "sortable2-data" ).vo_entry ;
var vo_image_id = $entry.data( "sortable2-data" ).vo_image_id ;
var capabilities = $entry.data( "sortable2-data" ).custom_capabilities ;
var data = $entry.data( "sortable2-data" ) ;
var vo_entry = data.vo_entry ;
var vo_image_id = data.vo_image_id ;
var capabilities = data.custom_capabilities ;
if ( capabilities )
capabilities = capabilities.slice() ;
else {
@ -210,6 +221,7 @@ function update_vo_sortable2_entry( $entry, snippet_params )
false,
vo_entry,
snippet_params[ "PLAYER_"+player_no ],
data.elite,
snippet_params.SCENARIO_THEATER, snippet_params.SCENARIO_YEAR, snippet_params.SCENARIO_MONTH,
false
) ;
@ -219,7 +231,10 @@ function update_vo_sortable2_entry( $entry, snippet_params )
var url = get_vo_image_url( vo_entry, vo_image_id, true ) ;
var $content = $entry.children( ".vo-entry" ) ;
$content.find( "img.vasl-image" ).attr( "src", url ) ;
$content.find( "div.vo-name" ).html( vo_entry.name ) ;
var name = vo_entry.name ;
if ( data.elite )
name += " \u24ba" ;
$content.find( "div.vo-name" ).html( name ) ;
for ( var i=0 ; i < capabilities.length ; ++i )
capabilities[i] = "<span class='vo-capability'>" + capabilities[i] + "</span>" ;
$content.find( "div.vo-capabilities" ).html( capabilities.join("") ) ;

@ -11,17 +11,50 @@ function _do_edit_ob_vo( $entry, player_no, vo_type )
false,
vo_entry,
params[ "PLAYER_"+player_no ],
false,
params.SCENARIO_THEATER, params.SCENARIO_YEAR, params.SCENARIO_MONTH,
show_warnings
) ;
}
function get_default_comments( vo_entry ) {
return vo_entry.comments ? vo_entry.comments : [] ;
}
function load_entries( $sortable, entries ) {
$sortable.sortable2( "delete-all" ) ;
for ( var i=0 ; i < entries.length ; ++i )
add_entry( $sortable, entries[i], false ) ;
}
function unload_entries( $sortable ) {
var entries = [] ;
$sortable.find( "input[type='text']" ).each( function() {
var val = $(this).val().trim() ;
if ( val )
entries.push( val ) ;
} ) ;
return entries ;
}
function make_vo_name( name, elite ) {
if ( elite )
name += " \u24ba" ;
else {
if ( name.substr( name.length-2 ) === " \u24ba" )
name = name.substr( 0, name.length-2 ) ;
}
return name ;
}
// get the vehicle/ordnance's capabilities
// get the vehicle/ordnance's capabilities/comments
var params = unload_snippet_params( true, null ) ;
var vo_entry = $entry.data( "sortable2-data" ).vo_entry ;
var capabilities = $entry.data( "sortable2-data" ).custom_capabilities ;
if ( ! capabilities )
capabilities = get_default_capabilities( vo_entry, params, true ).slice() ;
var elite = $entry.data( "sortable2-data" ).elite ;
var comments = $entry.data( "sortable2-data" ).custom_comments ;
if ( ! comments )
comments = get_default_comments( vo_entry ) ;
// load the dialog
var vo_image_id = $entry.data( "sortable2-data" ).vo_image_id ;
@ -29,7 +62,7 @@ function _do_edit_ob_vo( $entry, player_no, vo_type )
var buf = [ "<div class='header'>",
"<img src='" + url + "' class='vasl-image'>",
"<div class='content'>",
"<span class='vo-name'>" + vo_entry.name + "</span>",
"<span class='vo-name'>" + make_vo_name( vo_entry.name, elite ) + "</span>",
"</div>",
"</div" ] ;
$header = $( buf.join("") ) ;
@ -50,7 +83,9 @@ function _do_edit_ob_vo( $entry, player_no, vo_type )
// initialize
var $capabilities = $( "#vo_capabilities-sortable" ) ;
function add_capability( val ) {
var $elite = $( "#edit-vo .capabilities input.elite" ) ;
var $comments = $( "#vo_comments-sortable" ) ;
function add_entry( $sortable, val, visible ) {
var $elem = $( "<div>" +
"<img class='dragger' src='" + gImagesBaseUrl + "/dragger.png'>" +
"<input type='text'>" +
@ -59,42 +94,68 @@ function _do_edit_ob_vo( $entry, player_no, vo_type )
$elem.children( "input[type='text']" ).val( val ).keydown( function(evt) {
auto_dismiss_dialog( $dlg, evt, "OK" ) ;
} ) ;
return $capabilities.sortable2( "add", {
var $entry = $sortable.sortable2( "add", {
content: $elem,
data: { fixed_height: "1.4em" },
data: { fixed_height: "1.5em" },
} ) ;
if ( visible ) {
$entry.find( "input[type='text']" ).focus() ;
$entry[0].scrollIntoView() ;
}
}
// NOTE: on_reset_capabilities() gets bound when the sortable2 is *created*, so it needs some way
// to get the *current* vo_entry and params, otherwise it will use the values active when it was bound.
var $reset = $( "#vo_capabilities-reset" ) ;
$reset.data( { vo_entry: vo_entry, params: params } ) ;
// NOTE: on_reset_capabilities/comments() get bound when the sortable2 is *created*, so they need some way
// to get the *current* vo_entry and params, otherwise they will use the values active when they were bound.
var $reset_capabilities = $( "#vo_capabilities-reset" ) ;
$reset_capabilities.data( { vo_entry: vo_entry, params: params } ) ;
function on_reset_capabilities() {
$capabilities.sortable2( "delete-all" ) ;
var capabilities = get_default_capabilities( $reset.data("vo_entry"), $reset.data("params"), false ) ;
for ( var i=0 ; i < capabilities.length ; ++i )
add_capability( capabilities[i] ) ;
$dlg.find( ".header .vo-name" ).html( make_vo_name( vo_entry.name, elite ) ) ;
load_entries( $capabilities,
get_default_capabilities( $reset_capabilities.data("vo_entry"), $reset_capabilities.data("params"), false )
) ;
$elite.prop( "checked", false ) ;
}
var $reset_comments = $( "#vo_comments-reset" ) ;
$reset_comments.data( { vo_entry: vo_entry, params: params } ) ;
function on_reset_comments() {
load_entries( $comments,
get_default_comments( $reset_comments.data("vo_entry") )
) ;
}
function update_for_elite( delta ) {
// update the capabilities
var capabilities = unload_entries( $capabilities ) ;
adjust_capabilities_for_elite( capabilities, delta ) ;
load_entries( $capabilities, capabilities ) ;
// update the vehicle/ordnance name
var $name = $( "#edit-vo .header .vo-name" ) ;
$name.html( make_vo_name( $name.html(), delta > 0 ) ) ;
}
// show the dialog
var $dlg = $( "#edit-vo" ).dialog( {
dialogClass: "edit-vo",
title: "Edit "+vo_type,
minWidth: 350,
minHeight: 340,
minWidth: 550,
minHeight: 470,
modal: true,
create: function() {
// initialize the dialog
init_dialog( $(this), "OK", false ) ;
$capabilities.sortable2( "init", {
add: function() {
$elem = add_capability( "" ) ;
$elem.find( "input[type='text']" ).focus() ;
$elem[0].scrollIntoView() ;
},
add: function() { add_entry( $capabilities, "", true ) ; },
reset: on_reset_capabilities,
no_confirm_delete: true,
} ) ;
$comments.sortable2( "init", {
add: function() { add_entry( $comments, "", true ) ; },
reset: on_reset_comments,
no_confirm_delete: true,
} ) ;
$elite.click( function() {
update_for_elite( $(this).prop( "checked" ) ? +1 : -1 ) ;
} ) ;
},
open: function() {
// initialize
@ -107,9 +168,9 @@ function _do_edit_ob_vo( $entry, player_no, vo_type )
border: "1px solid "+colors[2],
} ) ;
// load the dialog
$capabilities.sortable2( "delete-all" ) ;
for ( var i=0 ; i < capabilities.length ; ++i )
add_capability( capabilities[i] ) ;
load_entries( $capabilities, capabilities ) ;
$elite.prop( "checked", elite ? true : false ) ;
load_entries( $comments, comments ) ;
},
buttons: {
OK: function() {
@ -119,18 +180,23 @@ function _do_edit_ob_vo( $entry, player_no, vo_type )
if ( vo_image_id )
$entry.data( "sortable2-data" ).vo_image_id = vo_image_id ;
// unload the capabilities
var capabilities = [] ;
$capabilities.find( "input[type='text']" ).each( function() {
var val = $(this).val().trim() ;
if ( val )
capabilities.push( val ) ;
} ) ;
var capabilities = unload_entries( $capabilities ) ;
if ( capabilities.join() !== get_default_capabilities( vo_entry, params, false ).join() )
$entry.data( "sortable2-data" ).custom_capabilities = capabilities ;
else {
// the capabilities are the same as the default - no need to retain these custom settings
delete $entry.data( "sortable2-data" ).custom_capabilities ;
}
$entry.data( "sortable2-data" ).elite = $elite.prop( "checked" ) ;
// unload the comments
var comments = unload_entries( $comments ) ;
if ( comments.join() !== get_default_comments( vo_entry ).join() ) {
$entry.data( "sortable2-data" ).custom_comments = comments ;
}
else {
// the comments are the same as the default - no need to retain these custom settings
delete $entry.data( "sortable2-data" ).custom_comments ;
}
// update the original V/O entry to reflect the changes
update_vo_sortable2_entry( $entry ) ;
$(this).dialog( "close" ) ;

@ -1,10 +1,13 @@
<div id="edit-vo" style="display:none;">
<div class="capabilities">
<div class="header"></div>
<div class="header"></div>
<div class="fieldset-legend">Capabilities:</div>
<div class="capabilities">
<div class="fieldset-legend">
Capabilities:
<div style="float:right;"> <input type="checkbox" class="elite">&nbsp;Elite </input> </div>
<br clear="all">
</div>
<div class="fieldset">
<ul id="vo_capabilities-sortable" class="sortable"></ul>
<div class="footer">
@ -14,7 +17,19 @@
<button id="vo_capabilities-reset" class="sortable-reset"></button>
</div>
</div>
</div>
<div class="comments">
<div class="fieldset-legend">Comments:</div>
<div class="fieldset">
<ul id="vo_comments-sortable" class="sortable"></ul>
<div class="footer">
<button id="vo_comments-add" class="sortable-add"></button>
<img id="vo_comments-trash" class="sortable-trash">
<span class="spacer"></span>
<button id="vo_comments-reset" class="sortable-reset"></button>
</div>
</div>
</div>
</div>

@ -7,3 +7,4 @@
<textarea id="_scenario-persistence_" style="display:none;"></textarea>
<textarea id="_vsav-persistence_" style="display:none;"></textarea>
<textarea id="_snippet-image-persistence_" style="display:none;"></textarea>
<button id="popmenu-hack" style="display:none;">

@ -4,6 +4,7 @@
<script>
var nat = "{{NATIONALITY}}" ;
var vo_type = "{{VO_TYPE}}" ;
var gTemplatePack = {} ;
var gVehicleOrdnanceNotes = {} ;
</script>
@ -30,15 +31,23 @@ td { padding: 0.2em 0.5em ; }
$(document).ready( function () {
// initialize
var vo_notes, vo_entries ;
var on_load_counter = 2 ;
var vo_entries ;
var on_load_counter = 3 ;
function on_data_loaded() {
if ( --on_load_counter == 0 ) {
// everything's loaded - generate the report
load_vo_notes( vo_notes, vo_entries ) ;
load_vo_notes( vo_entries ) ;
}
}
// get the template pack
$.getJSON( "{{url_for('get_template_pack')}}", function(data) {
gTemplatePack = data ;
on_data_loaded() ;
} ).fail( function( xhr, status, errorMsg ) {
alert( "Can't get the template pack:\n\n" + errorMsg ) ;
} ) ;
// get the vehicle/ordnance listings
var url ;
if ( vo_type === "vehicles" )
@ -58,16 +67,22 @@ $(document).ready( function () {
else
url = "{{url_for('get_ordnance_notes')}}" ;
$.getJSON( url, function( data ) {
gVehicleOrdnanceNotes[vo_type] = data ;
vo_notes = data[ nat ] ;
gVehicleOrdnanceNotes[ vo_type ] = data ;
on_data_loaded() ;
} ).fail( function( xhr, status, errorMsg ) {
alert( "Can't get the vehicle/ordnance notes:\n\n" + errorMsg ) ;
} ) ;
} ) ;
function load_vo_notes( vo_notes, vo_entries )
function load_vo_notes( vo_entries )
{
var $results = $("#results") ;
var vo_notes = gVehicleOrdnanceNotes[ vo_type ][ nat ] ;
if ( !vo_notes && !vo_entries ) {
$results.html( "No results." ).show() ;
return ;
}
// initialize
var vo_type2 = (vo_type === "vehicles" ? "vehicle" : vo_type ) ;
var header = nat[0].toUpperCase() + nat.substring(1) + " " + vo_type2[0].toUpperCase() + vo_type2.substring(1) + " Notes" ;
@ -94,6 +109,26 @@ function load_vo_notes( vo_notes, vo_entries )
return +1 ;
else if ( rhs === "multi-applicable" )
return -1 ;
// check if we have keys from an extension module (these always sort larger)
var lhsPos = lhs.indexOf( ":" ) ;
var rhsPos = rhs.indexOf( ":" ) ;
if ( lhsPos === -1 && rhsPos !== -1 )
return -1 ;
else if ( lhsPos !== -1 && rhsPos === -1 )
return +1 ;
else if ( lhsPos !== -1 && rhsPos !== -1 ) {
// both keys are from an extensions module, compare the extension ID's
var lhsExtnId = lhs.substring( 0, lhsPos ) ;
var rhsExtnId = rhs.substring( 0, rhsPos ) ;
if ( lhsExtnId < rhsExtnId )
return -1 ;
else if ( lhsExtnId > rhsExtnId )
return +1 ;
// both keys are from the same extension module, remove the extension ID and sort normally
lhs = lhs.substring( lhsPos+1 ) ;
rhs = rhs.substring( rhsPos+1 ) ;
}
// compare the two keys
var lhs = parse_key( lhs ) ;
var rhs = parse_key( rhs ) ;
if ( lhs[0] < rhs[0] )
@ -110,7 +145,10 @@ function load_vo_notes( vo_notes, vo_entries )
for ( var i=0 ; i < keys.length ; ++i ) {
if ( keys[i] === "multi-applicable" )
continue ;
buf.push( "<tr>", "<td class='key'>", keys[i]+":", "<td>", vo_notes[keys[i]] ) ;
buf.push( "<tr>",
"<td class='key'>", keys[i]+":",
"<td>", vo_notes[keys[i]]
) ;
}
buf.push( "</table>" ) ;
}
@ -156,22 +194,21 @@ function load_vo_notes( vo_notes, vo_entries )
for ( var j=0 ; j < result[4].length ; ++j )
unrecognized.push( result[4][j][1] ) ;
buf.push( "<td class='unrecognized'>", unrecognized ) ;
buf.push( "<td class='missing'>", find_missing_ma_notes(ma_notes,keys) ) ;
buf.push( "<td class='missing'>", find_missing_ma_notes(keys) ) ;
}
buf.push( "</table>" ) ;
var $results = $("#results") ;
$results.html( buf.join("") ).show() ;
}
function find_missing_ma_notes( ma_notes, keys )
function find_missing_ma_notes( keys )
{
// find Multi-Applicable Notes that are referenced but not defined
if ( ! keys )
return null ;
var missing_keys = [] ;
for ( var i=0 ; i < keys.length ; ++i ) {
if ( !ma_notes || !( keys[i] in ma_notes ) )
if ( ! get_ma_note( nat, vo_type, keys[i] ) )
missing_keys.push( keys[i] ) ;
}
return missing_keys ;

@ -60,20 +60,20 @@ function load_vo_listings( objs )
// load the vehicles/ordnance
var buf = [] ;
buf.push( "<table>" ) ;
buf.push( "<tr>", "<th>Name" ) ;
buf.push( "<th colspan='2'>Capabilities", "<th colspan='2'>Notes" ) ;
buf.push( "<tr>", "<th>Name", "<th colspan='2'>Capabilities", "<th colspan='2'>Notes", "<th>Comments" ) ;
for ( var i=0 ; i < objs[nat].length ; ++i ) {
var obj = objs[nat][i] ;
if ( vo_name && obj.name.toLowerCase() != vo_name )
continue ;
buf.push( "<tr>" ) ;
buf.push( "<td>", fmtval(obj.name) ) ;
var capabilities = make_capabilities( true, obj, nat, theater, year, month, true ) ;
var capabilities = make_capabilities( true, obj, nat, false, theater, year, month, true ) ;
buf.push( "<td>", listval(capabilities) ) ;
var capabilities = make_capabilities( false, obj, nat, theater, year, month, true ) ;
var capabilities = make_capabilities( false, obj, nat, false, theater, year, month, true ) ;
buf.push( "<td>", listval(capabilities) ) ;
buf.push( "<td>", "<span class='val'>" + fmtval(obj.note_number) + "</span>" ) ;
buf.push( "<td>", listval(obj.notes) ) ;
buf.push( "<td>", obj.comments ? listval(obj.comments) : "" ) ;
}
buf.push( "</table>" ) ;
$results.html( buf.join("") ).show() ;

@ -2,4 +2,5 @@
[*] {{ord.name}}: #={{ord.note_number}}{%if ord.notes%}
- notes:{%for n in ord.notes%} "{{n}}"{%endfor%}{%endif%}{%if ord.capabilities%}
- capabilities:{%for c in ord.capabilities%} "{{c}}"{%endfor%}{%endif%}{%if ord.raw_capabilities%}
- raw capabilities:{%for c in ord.capabilities%} "{{c}}"{%endfor%}{%endif%}{%endfor%}
- raw capabilities:{%for c in ord.capabilities%} "{{c}}"{%endfor%}{%endif%}{%if ord.comments%}
- comments:{%for c in ord.comments%} "{{c}}"{%endfor%}{%endif%}{%endfor%}

@ -2,4 +2,5 @@
[*] {{veh.name}}: #={{veh.note_number}}{%if veh.notes%}
- notes:{%for n in veh.notes%} "{{n}}"{%endfor%}{%endif%}{%if veh.capabilities%}
- capabilities:{%for c in veh.capabilities%} "{{c}}"{%endfor%}{%endif%}{%if veh.raw_capabilities%}
- raw capabilities:{%for c in veh.raw_capabilities%} "{{c}}"{%endfor%}{%endif%}{%endfor%}
- raw capabilities:{%for c in veh.raw_capabilities%} "{{c}}"{%endfor%}{%endif%}{%if veh.comments%}
- comments:{%for c in veh.comments%} "{{c}}"{%endfor%}{%endif%}{%endfor%}

@ -22,6 +22,10 @@
"notes": [ "A", "C" ],
"id": "ge/v:992"
},
{ "name": "a commented german vehicle",
"comments": [ "a comment", "another comment" ],
"id": "ge/v:993"
},
{ "name": "name only",
"id": "ge/v:999"
}

@ -1,7 +1,7 @@
=== landing craft ===
Name Capabilities (effective) # Notes
-------- -------------- ------------- --- ------------------------------------------------
Name Capabilities (effective) # Notes Comments
-------- -------------- ------------- --- ------------------------------------------------ ----------
LCP(L) DP 2 CS 4 DP 2 CS 4 1† A†<sup>1</sup> B†<sup>3</sup> C†<sup>2</sup> D
LCA DP 3 CS 6 DP 3 CS 6 2† n/a
LCVP DP 3 CS 5 DP 3 CS 5 3† B†<sup>2</sup> C†<sup>1</sup>

@ -1,18 +1,18 @@
=== ordnance/allied-minor-common/1940 ===
Name Capabilities (effective) # Notes
------------------------------- ----------------------------- ----------------------------- --- -----------------------
Brandt Medium Mortar NT QSU s8 NT QSU s8 23† A B Gr N P Y
37mm Bofors AT NT QSU NT QSU 24† A De P
3.7cm PaK 35/36 NT QSU NT QSU 25† Gr Ne Y
Bohler M35 47mm NT QSU NT QSU 26† A Gr Ne Y
65mm wz.06 NT QSU no Gunshield h-d NT QSU no Gunshield h-d 27† A Gr P Y
75mm wz.97 NT QSU s8 NT QSU s8 28† A Gr N P
Bofors M34 NT QSU NT QSU 29† A B Gr Ne N
75M 19S NT QSU h-d AP5 s6 NT QSU h-d AP5 s6 30† A Gr P Y
C105 L 13 S NT NT 31† B P Y
120mm wz. 09/31 NT h-d s6 NT h-d s6 32† N P
155mm 17 S NT s8 NT s8 33 B Gr P Y
Mitrailleuse de 13.2 CAJ mle 30 T 2 TK DR† Towing NA†[1] T 2 TK DR† Towing NA†[1] 34† T†<sup>1</sup> B Gr Y
20mm Oerlikon T LF [NT, 20†[1], 2 ROF, B11] T LF [NT, 20†[1], 2 ROF, B11] 35† C†<sup>1</sup> Gr Ne Y
40mm Bofors AA T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 36† C†<sup>1</sup> B N Ne P
Name Capabilities (effective) # Notes Comments
------------------------------- --------------------------- --------------------------- --- ----------------------- ----------------------
Brandt Medium Mortar QSU s8 QSU s8 23† A B Gr N P Y
37mm Bofors AT QSU QSU 24† A De P
3.7cm PaK 35/36 QSU QSU 25† Gr Ne Y
Bohler M35 47mm QSU QSU 26† A Gr Ne Y
65mm wz.06 QSU h-d QSU h-d 27† A Gr P Y No Gunshield.
75mm wz.97 QSU s8 QSU s8 28† A Gr N P
Bofors M34 QSU QSU 29† A B Gr Ne N
75M 19S QSU h-d AP5 s6 QSU h-d AP5 s6 30† A Gr P Y
C105 L 13 S 31† B P Y
120mm wz. 09/31 h-d s6 h-d s6 32† N P
155mm 17 S s8 s8 33 B Gr P Y
Mitrailleuse de 13.2 CAJ mle 30 2 TK DR† 2 TK DR† 34† T†<sup>1</sup> B Gr Y Towing NA†<sup>1</sup>
20mm Oerlikon LF [NT, 20†[1], 2 ROF, B11] LF [NT, 20†[1], 2 ROF, B11] 35† C†<sup>1</sup> Gr Ne Y
40mm Bofors AA LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 36† C†<sup>1</sup> B N Ne P

@ -1,18 +1,18 @@
=== ordnance/allied-minor-common/1941 ===
Name Capabilities (effective) # Notes
------------------------------- ----------------------------- ----------------------------- --- -----------------------
Brandt Medium Mortar NT QSU s8 NT QSU s8 23† A B Gr N P Y
37mm Bofors AT NT QSU NT QSU 24† A De P
3.7cm PaK 35/36 NT QSU NT QSU 25† Gr Ne Y
Bohler M35 47mm NT QSU NT QSU 26† A Gr Ne Y
65mm wz.06 NT QSU no Gunshield h-d NT QSU no Gunshield h-d 27† A Gr P Y
75mm wz.97 NT QSU s8 NT QSU s8 28† A Gr N P
Bofors M34 NT QSU NT QSU 29† A B Gr Ne N
75M 19S NT QSU h-d AP5 s6 NT QSU h-d AP5 s6 30† A Gr P Y
C105 L 13 S NT NT 31† B P Y
120mm wz. 09/31 NT h-d s6 NT h-d s6 32† N P
155mm 17 S NT s8 NT s8 33 B Gr P Y
Mitrailleuse de 13.2 CAJ mle 30 T 2 TK DR† Towing NA†[1] T 2 TK DR† Towing NA†[1] 34† T†<sup>1</sup> B Gr Y
20mm Oerlikon T LF [NT, 20†[1], 2 ROF, B11] T LF [NT, 20†[1], 2 ROF, B11] 35† C†<sup>1</sup> Gr Ne Y
40mm Bofors AA T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 36† C†<sup>1</sup> B N Ne P
Name Capabilities (effective) # Notes Comments
------------------------------- --------------------------- --------------------------- --- ----------------------- ----------------------
Brandt Medium Mortar QSU s8 QSU s8 23† A B Gr N P Y
37mm Bofors AT QSU QSU 24† A De P
3.7cm PaK 35/36 QSU QSU 25† Gr Ne Y
Bohler M35 47mm QSU QSU 26† A Gr Ne Y
65mm wz.06 QSU h-d QSU h-d 27† A Gr P Y No Gunshield.
75mm wz.97 QSU s8 QSU s8 28† A Gr N P
Bofors M34 QSU QSU 29† A B Gr Ne N
75M 19S QSU h-d AP5 s6 QSU h-d AP5 s6 30† A Gr P Y
C105 L 13 S 31† B P Y
120mm wz. 09/31 h-d s6 h-d s6 32† N P
155mm 17 S s8 s8 33 B Gr P Y
Mitrailleuse de 13.2 CAJ mle 30 2 TK DR† 2 TK DR† 34† T†<sup>1</sup> B Gr Y Towing NA†<sup>1</sup>
20mm Oerlikon LF [NT, 20†[1], 2 ROF, B11] LF [NT, 20†[1], 2 ROF, B11] 35† C†<sup>1</sup> Gr Ne Y
40mm Bofors AA LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 36† C†<sup>1</sup> B N Ne P

@ -1,18 +1,18 @@
=== ordnance/allied-minor-common/1942 ===
Name Capabilities (effective) # Notes
------------------------------- ----------------------------- ----------------------------- --- -----------------------
Brandt Medium Mortar NT QSU s8 NT QSU s8 23† A B Gr N P Y
37mm Bofors AT NT QSU NT QSU 24† A De P
3.7cm PaK 35/36 NT QSU NT QSU 25† Gr Ne Y
Bohler M35 47mm NT QSU NT QSU 26† A Gr Ne Y
65mm wz.06 NT QSU no Gunshield h-d NT QSU no Gunshield h-d 27† A Gr P Y
75mm wz.97 NT QSU s8 NT QSU s8 28† A Gr N P
Bofors M34 NT QSU NT QSU 29† A B Gr Ne N
75M 19S NT QSU h-d AP5 s6 NT QSU h-d AP5 s6 30† A Gr P Y
C105 L 13 S NT NT 31† B P Y
120mm wz. 09/31 NT h-d s6 NT h-d s6 32† N P
155mm 17 S NT s8 NT s8 33 B Gr P Y
Mitrailleuse de 13.2 CAJ mle 30 T 2 TK DR† Towing NA†[1] T 2 TK DR† Towing NA†[1] 34† T†<sup>1</sup> B Gr Y
20mm Oerlikon T LF [NT, 20†[1], 2 ROF, B11] T LF [NT, 20†[1], 2 ROF, B11] 35† C†<sup>1</sup> Gr Ne Y
40mm Bofors AA T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 36† C†<sup>1</sup> B N Ne P
Name Capabilities (effective) # Notes Comments
------------------------------- --------------------------- --------------------------- --- ----------------------- ----------------------
Brandt Medium Mortar QSU s8 QSU s8 23† A B Gr N P Y
37mm Bofors AT QSU QSU 24† A De P
3.7cm PaK 35/36 QSU QSU 25† Gr Ne Y
Bohler M35 47mm QSU QSU 26† A Gr Ne Y
65mm wz.06 QSU h-d QSU h-d 27† A Gr P Y No Gunshield.
75mm wz.97 QSU s8 QSU s8 28† A Gr N P
Bofors M34 QSU QSU 29† A B Gr Ne N
75M 19S QSU h-d AP5 s6 QSU h-d AP5 s6 30† A Gr P Y
C105 L 13 S 31† B P Y
120mm wz. 09/31 h-d s6 h-d s6 32† N P
155mm 17 S s8 s8 33 B Gr P Y
Mitrailleuse de 13.2 CAJ mle 30 2 TK DR† 2 TK DR† 34† T†<sup>1</sup> B Gr Y Towing NA†<sup>1</sup>
20mm Oerlikon LF [NT, 20†[1], 2 ROF, B11] LF [NT, 20†[1], 2 ROF, B11] 35† C†<sup>1</sup> Gr Ne Y
40mm Bofors AA LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 36† C†<sup>1</sup> B N Ne P

@ -1,18 +1,18 @@
=== ordnance/allied-minor-common/1943 ===
Name Capabilities (effective) # Notes
------------------------------- ----------------------------- ----------------------------- --- -----------------------
Brandt Medium Mortar NT QSU s8 NT QSU s8 23† A B Gr N P Y
37mm Bofors AT NT QSU NT QSU 24† A De P
3.7cm PaK 35/36 NT QSU NT QSU 25† Gr Ne Y
Bohler M35 47mm NT QSU NT QSU 26† A Gr Ne Y
65mm wz.06 NT QSU no Gunshield h-d NT QSU no Gunshield h-d 27† A Gr P Y
75mm wz.97 NT QSU s8 NT QSU s8 28† A Gr N P
Bofors M34 NT QSU NT QSU 29† A B Gr Ne N
75M 19S NT QSU h-d AP5 s6 NT QSU h-d AP5 s6 30† A Gr P Y
C105 L 13 S NT NT 31† B P Y
120mm wz. 09/31 NT h-d s6 NT h-d s6 32† N P
155mm 17 S NT s8 NT s8 33 B Gr P Y
Mitrailleuse de 13.2 CAJ mle 30 T 2 TK DR† Towing NA†[1] T 2 TK DR† Towing NA†[1] 34† T†<sup>1</sup> B Gr Y
20mm Oerlikon T LF [NT, 20†[1], 2 ROF, B11] T LF [NT, 20†[1], 2 ROF, B11] 35† C†<sup>1</sup> Gr Ne Y
40mm Bofors AA T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 36† C†<sup>1</sup> B N Ne P
Name Capabilities (effective) # Notes Comments
------------------------------- --------------------------- --------------------------- --- ----------------------- ----------------------
Brandt Medium Mortar QSU s8 QSU s8 23† A B Gr N P Y
37mm Bofors AT QSU QSU 24† A De P
3.7cm PaK 35/36 QSU QSU 25† Gr Ne Y
Bohler M35 47mm QSU QSU 26† A Gr Ne Y
65mm wz.06 QSU h-d QSU h-d 27† A Gr P Y No Gunshield.
75mm wz.97 QSU s8 QSU s8 28† A Gr N P
Bofors M34 QSU QSU 29† A B Gr Ne N
75M 19S QSU h-d AP5 s6 QSU h-d AP5 s6 30† A Gr P Y
C105 L 13 S 31† B P Y
120mm wz. 09/31 h-d s6 h-d s6 32† N P
155mm 17 S s8 s8 33 B Gr P Y
Mitrailleuse de 13.2 CAJ mle 30 2 TK DR† 2 TK DR† 34† T†<sup>1</sup> B Gr Y Towing NA†<sup>1</sup>
20mm Oerlikon LF [NT, 20†[1], 2 ROF, B11] LF [NT, 20†[1], 2 ROF, B11] 35† C†<sup>1</sup> Gr Ne Y
40mm Bofors AA LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 36† C†<sup>1</sup> B N Ne P

@ -1,18 +1,18 @@
=== ordnance/allied-minor-common/1944 ===
Name Capabilities (effective) # Notes
------------------------------- ----------------------------- ----------------------------- --- -----------------------
Brandt Medium Mortar NT QSU s8 NT QSU s8 23† A B Gr N P Y
37mm Bofors AT NT QSU NT QSU 24† A De P
3.7cm PaK 35/36 NT QSU NT QSU 25† Gr Ne Y
Bohler M35 47mm NT QSU NT QSU 26† A Gr Ne Y
65mm wz.06 NT QSU no Gunshield h-d NT QSU no Gunshield h-d 27† A Gr P Y
75mm wz.97 NT QSU s8 NT QSU s8 28† A Gr N P
Bofors M34 NT QSU NT QSU 29† A B Gr Ne N
75M 19S NT QSU h-d AP5 s6 NT QSU h-d AP5 s6 30† A Gr P Y
C105 L 13 S NT NT 31† B P Y
120mm wz. 09/31 NT h-d s6 NT h-d s6 32† N P
155mm 17 S NT s8 NT s8 33 B Gr P Y
Mitrailleuse de 13.2 CAJ mle 30 T 2 TK DR† Towing NA†[1] T 2 TK DR† Towing NA†[1] 34† T†<sup>1</sup> B Gr Y
20mm Oerlikon T LF [NT, 20†[1], 2 ROF, B11] T LF [NT, 20†[1], 2 ROF, B11] 35† C†<sup>1</sup> Gr Ne Y
40mm Bofors AA T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 36† C†<sup>1</sup> B N Ne P
Name Capabilities (effective) # Notes Comments
------------------------------- --------------------------- --------------------------- --- ----------------------- ----------------------
Brandt Medium Mortar QSU s8 QSU s8 23† A B Gr N P Y
37mm Bofors AT QSU QSU 24† A De P
3.7cm PaK 35/36 QSU QSU 25† Gr Ne Y
Bohler M35 47mm QSU QSU 26† A Gr Ne Y
65mm wz.06 QSU h-d QSU h-d 27† A Gr P Y No Gunshield.
75mm wz.97 QSU s8 QSU s8 28† A Gr N P
Bofors M34 QSU QSU 29† A B Gr Ne N
75M 19S QSU h-d AP5 s6 QSU h-d AP5 s6 30† A Gr P Y
C105 L 13 S 31† B P Y
120mm wz. 09/31 h-d s6 h-d s6 32† N P
155mm 17 S s8 s8 33 B Gr P Y
Mitrailleuse de 13.2 CAJ mle 30 2 TK DR† 2 TK DR† 34† T†<sup>1</sup> B Gr Y Towing NA†<sup>1</sup>
20mm Oerlikon LF [NT, 20†[1], 2 ROF, B11] LF [NT, 20†[1], 2 ROF, B11] 35† C†<sup>1</sup> Gr Ne Y
40mm Bofors AA LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 36† C†<sup>1</sup> B N Ne P

@ -1,18 +1,18 @@
=== ordnance/allied-minor-common/1945 ===
Name Capabilities (effective) # Notes
------------------------------- ----------------------------- ----------------------------- --- -----------------------
Brandt Medium Mortar NT QSU s8 NT QSU s8 23† A B Gr N P Y
37mm Bofors AT NT QSU NT QSU 24† A De P
3.7cm PaK 35/36 NT QSU NT QSU 25† Gr Ne Y
Bohler M35 47mm NT QSU NT QSU 26† A Gr Ne Y
65mm wz.06 NT QSU no Gunshield h-d NT QSU no Gunshield h-d 27† A Gr P Y
75mm wz.97 NT QSU s8 NT QSU s8 28† A Gr N P
Bofors M34 NT QSU NT QSU 29† A B Gr Ne N
75M 19S NT QSU h-d AP5 s6 NT QSU h-d AP5 s6 30† A Gr P Y
C105 L 13 S NT NT 31† B P Y
120mm wz. 09/31 NT h-d s6 NT h-d s6 32† N P
155mm 17 S NT s8 NT s8 33 B Gr P Y
Mitrailleuse de 13.2 CAJ mle 30 T 2 TK DR† Towing NA†[1] T 2 TK DR† Towing NA†[1] 34† T†<sup>1</sup> B Gr Y
20mm Oerlikon T LF [NT, 20†[1], 2 ROF, B11] T LF [NT, 20†[1], 2 ROF, B11] 35† C†<sup>1</sup> Gr Ne Y
40mm Bofors AA T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 36† C†<sup>1</sup> B N Ne P
Name Capabilities (effective) # Notes Comments
------------------------------- --------------------------- --------------------------- --- ----------------------- ----------------------
Brandt Medium Mortar QSU s8 QSU s8 23† A B Gr N P Y
37mm Bofors AT QSU QSU 24† A De P
3.7cm PaK 35/36 QSU QSU 25† Gr Ne Y
Bohler M35 47mm QSU QSU 26† A Gr Ne Y
65mm wz.06 QSU h-d QSU h-d 27† A Gr P Y No Gunshield.
75mm wz.97 QSU s8 QSU s8 28† A Gr N P
Bofors M34 QSU QSU 29† A B Gr Ne N
75M 19S QSU h-d AP5 s6 QSU h-d AP5 s6 30† A Gr P Y
C105 L 13 S 31† B P Y
120mm wz. 09/31 h-d s6 h-d s6 32† N P
155mm 17 S s8 s8 33 B Gr P Y
Mitrailleuse de 13.2 CAJ mle 30 2 TK DR† 2 TK DR† 34† T†<sup>1</sup> B Gr Y Towing NA†<sup>1</sup>
20mm Oerlikon LF [NT, 20†[1], 2 ROF, B11] LF [NT, 20†[1], 2 ROF, B11] 35† C†<sup>1</sup> Gr Ne Y
40mm Bofors AA LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 36† C†<sup>1</sup> B N Ne P

@ -1,31 +1,32 @@
=== ordnance/american/1940 ===
Name Capabilities (effective) # Notes
-------------------------------- ---------------------------------- ---------------------------------- ------ -------------------------------
M2 60mm Mortar IR WP7[5] 5PP OBA† IR 5PP OBA† 1† F N
M19 60mm Mortar IR WP6[5] 4PP IR 4PP 2 F
M1 81mm Mortar NT QSU WP8 NT QSU WP8 3 F N
M2 4.2-in. Mortar NT QSU WP10 NT QSU WP10 4† n/a
T25 155mm Mortar NT WP8 NT WP8 5† P
M3A1 37mm AT Gun NT QSU C7[A2+]†[1] NT QSU 6† C†<sup>1</sup> N
M1 57mm AT Gun NT QSU D4[J4+E]† HE7[J4E]7[5]† NT QSU 7† n/a
M5 3-in. AT Gun NT QSU A4[4]5[5]† s6[5] NT QSU 8† <s>P</s>
T32 37mm Manpack Gun 5PP (3PP dm)† C5†[1] crewed†[2] 5PP (3PP dm)† C5†[1] crewed†[2] 9† C†<sup>1</sup> D†<sup>2</sup> F
M18 57mm Recoilless Rifle 3PP crewed†[1] H7 WP6 3PP crewed†[1] H7 WP6 10 D†<sup>1</sup> E†
M20 75mm Recoilless Rifle 5PP crewed†[1] H7 WP7 5PP crewed†[1] H7 WP7 11 D†<sup>1</sup> E†
M1A1 75mm Pack Howitzer NT QSU C4[4+]†[1] H7 WP8 NT QSU H7 WP8 12† C†<sup>1</sup> F
M1897A2 75mm Gun NT QSU WP8 NT QSU WP8 13 P
M2A1 105mm Howitzer NT C7[4+P]†[1] H6 WP8 s7 NT H6 WP8 s7 14† C†<sup>1</sup> N
M3 105mm Howitzer NT C7[P]†[1] H7 WP8 s7 NT H7 WP8 s7 15† C†<sup>1</sup>
M1 4.5-in. Gun NT NT 16† <s>P</s>
M1918 155mm Howitzer NT WP8 s7[3+] NT WP8 17† N
M1 155mm Howitzer NT WP8 s7 NT WP8 s7 18† N
M1918M1 155mm Gun NT RFNM AP4†[1] no IF WP8 NT RFNM AP4†[1] no IF WP8 19† A†<sup>1</sup> N
M1A1 155mm Gun NT RFNM AP4†[1] no IF WP8 s7[5] NT RFNM AP4†[1] no IF WP8 20† A†<sup>1</sup>
M1 8-in. Howitzer NT RFNM no IF NT RFNM no IF 21† n/a
M51 Multiple .50-cal MG Carriage T LF [2 ROF, 20 IFE, B11] 4 TK DR† T LF [2 ROF, 20 IFE, B11] 4 TK DR† 22† n/a
M1A2 37mm AA Gun T T 23† N
M1 40mm AA Gun T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 24† B†<sup>1</sup>
M3 3-in. AA Gun T NM T NM 25 P
M1A1 90mm AA Gun T NM T NM 26† N
M2 90mm AA Gun T LF [90†, 1 ROF, B11] T LF [90†, 1 ROF, B11] 27†[1] B†
Name Capabilities (effective) # Notes Comments
-------------------------------- -------------------------------- -------------------------------- ------ ------------------------------- ----------------------------
M2 60mm Mortar IR WP7[5] 5PP OBA† IR 5PP OBA† 1† F N
M19 60mm Mortar IR WP6[5] 4PP IR 4PP 2 F
M1 81mm Mortar QSU WP8 QSU WP8 3 F N
M2 4.2-in. Mortar QSU WP10 QSU WP10 4† n/a
T25 155mm Mortar WP8 WP8 5† P
M3A1 37mm AT Gun QSU C7[A2+]†[1] QSU 6† C†<sup>1</sup> N
M1 57mm AT Gun QSU D4[J4+E]† HE7[J4E]7[5]† QSU 7† n/a
M5 3-in. AT Gun QSU A4[4]5[5]† s6[5] QSU 8† <s>P</s>
T32 37mm Manpack Gun 5PP (3PP dm)† C5†[1] crewed†[2] 5PP (3PP dm)† C5†[1] crewed†[2] 9† C†<sup>1</sup> D†<sup>2</sup> F
M18 57mm Recoilless Rifle 3PP crewed†[1] H7 WP6 3PP crewed†[1] H7 WP6 10 D†<sup>1</sup> E†
M20 75mm Recoilless Rifle 5PP crewed†[1] H7 WP7 5PP crewed†[1] H7 WP7 11 D†<sup>1</sup> E†
M1A1 75mm Pack Howitzer QSU C4[4+]†[1] H7 WP8 QSU H7 WP8 12† C†<sup>1</sup> F
M1897A2 75mm Gun QSU WP8 QSU WP8 13 P
M2A1 105mm Howitzer C7[4+P]†[1] H6 WP8 s7 H6 WP8 s7 14† C†<sup>1</sup> N
M3 105mm Howitzer C7[P]†[1] H7 WP8 s7 H7 WP8 s7 15† C†<sup>1</sup>
M1 4.5-in. Gun 16† <s>P</s>
M1918 155mm Howitzer WP8 s7[3+] WP8 17† N
M1 155mm Howitzer WP8 s7 WP8 s7 18† N
M1918M1 155mm Gun RFNM AP4†[1] WP8 RFNM AP4†[1] WP8 19† A†<sup>1</sup> N No IF.
M1A1 155mm Gun RFNM AP4†[1] WP8 s7[5] RFNM AP4†[1] WP8 20† A†<sup>1</sup> No IF.
M1 8-in. Howitzer RFNM RFNM 21† n/a No IF.
M51 Multiple .50-cal MG Carriage LF [2 ROF, 20 IFE, B11] 4 TK DR† LF [2 ROF, 20 IFE, B11] 4 TK DR† 22† n/a
M1A2 37mm AA Gun 23† N
M1 40mm AA Gun LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 24† B†<sup>1</sup>
M3 3-in. AA Gun NM NM 25 P
M1A1 90mm AA Gun NM NM 26† N
M2 90mm AA Gun LF [90†, 1 ROF, B11] LF [90†, 1 ROF, B11] 27†[1] B†
20mm Oerlikon Mk4 2 TK DR's† 2 TK DR's† 1† US P Multiple Hits (C3.8) are NA.

@ -1,31 +1,32 @@
=== ordnance/american/1941 ===
Name Capabilities (effective) # Notes
-------------------------------- ---------------------------------- ---------------------------------- ------ -------------------------------
M2 60mm Mortar IR WP7[5] 5PP OBA† IR 5PP OBA† 1† F N
M19 60mm Mortar IR WP6[5] 4PP IR 4PP 2 F
M1 81mm Mortar NT QSU WP8 NT QSU WP8 3 F N
M2 4.2-in. Mortar NT QSU WP10 NT QSU WP10 4† n/a
T25 155mm Mortar NT WP8 NT WP8 5† P
M3A1 37mm AT Gun NT QSU C7[A2+]†[1] NT QSU 6† C†<sup>1</sup> N
M1 57mm AT Gun NT QSU D4[J4+E]† HE7[J4E]7[5]† NT QSU 7† n/a
M5 3-in. AT Gun NT QSU A4[4]5[5]† s6[5] NT QSU 8† <s>P</s>
T32 37mm Manpack Gun 5PP (3PP dm)† C5†[1] crewed†[2] 5PP (3PP dm)† C5†[1] crewed†[2] 9† C†<sup>1</sup> D†<sup>2</sup> F
M18 57mm Recoilless Rifle 3PP crewed†[1] H7 WP6 3PP crewed†[1] H7 WP6 10 D†<sup>1</sup> E†
M20 75mm Recoilless Rifle 5PP crewed†[1] H7 WP7 5PP crewed†[1] H7 WP7 11 D†<sup>1</sup> E†
M1A1 75mm Pack Howitzer NT QSU C4[4+]†[1] H7 WP8 NT QSU H7 WP8 12† C†<sup>1</sup> F
M1897A2 75mm Gun NT QSU WP8 NT QSU WP8 13 P
M2A1 105mm Howitzer NT C7[4+P]†[1] H6 WP8 s7 NT H6 WP8 s7 14† C†<sup>1</sup> N
M3 105mm Howitzer NT C7[P]†[1] H7 WP8 s7 NT H7 WP8 s7 15† C†<sup>1</sup>
M1 4.5-in. Gun NT NT 16† <s>P</s>
M1918 155mm Howitzer NT WP8 s7[3+] NT WP8 17† N
M1 155mm Howitzer NT WP8 s7 NT WP8 s7 18† N
M1918M1 155mm Gun NT RFNM AP4†[1] no IF WP8 NT RFNM AP4†[1] no IF WP8 19† A†<sup>1</sup> N
M1A1 155mm Gun NT RFNM AP4†[1] no IF WP8 s7[5] NT RFNM AP4†[1] no IF WP8 20† A†<sup>1</sup>
M1 8-in. Howitzer NT RFNM no IF NT RFNM no IF 21† n/a
M51 Multiple .50-cal MG Carriage T LF [2 ROF, 20 IFE, B11] 4 TK DR† T LF [2 ROF, 20 IFE, B11] 4 TK DR† 22† n/a
M1A2 37mm AA Gun T T 23† N
M1 40mm AA Gun T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 24† B†<sup>1</sup>
M3 3-in. AA Gun T NM T NM 25 P
M1A1 90mm AA Gun T NM T NM 26† N
M2 90mm AA Gun T LF [90†, 1 ROF, B11] T LF [90†, 1 ROF, B11] 27†[1] B†
Name Capabilities (effective) # Notes Comments
-------------------------------- -------------------------------- -------------------------------- ------ ------------------------------- ----------------------------
M2 60mm Mortar IR WP7[5] 5PP OBA† IR 5PP OBA† 1† F N
M19 60mm Mortar IR WP6[5] 4PP IR 4PP 2 F
M1 81mm Mortar QSU WP8 QSU WP8 3 F N
M2 4.2-in. Mortar QSU WP10 QSU WP10 4† n/a
T25 155mm Mortar WP8 WP8 5† P
M3A1 37mm AT Gun QSU C7[A2+]†[1] QSU 6† C†<sup>1</sup> N
M1 57mm AT Gun QSU D4[J4+E]† HE7[J4E]7[5]† QSU 7† n/a
M5 3-in. AT Gun QSU A4[4]5[5]† s6[5] QSU 8† <s>P</s>
T32 37mm Manpack Gun 5PP (3PP dm)† C5†[1] crewed†[2] 5PP (3PP dm)† C5†[1] crewed†[2] 9† C†<sup>1</sup> D†<sup>2</sup> F
M18 57mm Recoilless Rifle 3PP crewed†[1] H7 WP6 3PP crewed†[1] H7 WP6 10 D†<sup>1</sup> E†
M20 75mm Recoilless Rifle 5PP crewed†[1] H7 WP7 5PP crewed†[1] H7 WP7 11 D†<sup>1</sup> E†
M1A1 75mm Pack Howitzer QSU C4[4+]†[1] H7 WP8 QSU H7 WP8 12† C†<sup>1</sup> F
M1897A2 75mm Gun QSU WP8 QSU WP8 13 P
M2A1 105mm Howitzer C7[4+P]†[1] H6 WP8 s7 H6 WP8 s7 14† C†<sup>1</sup> N
M3 105mm Howitzer C7[P]†[1] H7 WP8 s7 H7 WP8 s7 15† C†<sup>1</sup>
M1 4.5-in. Gun 16† <s>P</s>
M1918 155mm Howitzer WP8 s7[3+] WP8 17† N
M1 155mm Howitzer WP8 s7 WP8 s7 18† N
M1918M1 155mm Gun RFNM AP4†[1] WP8 RFNM AP4†[1] WP8 19† A†<sup>1</sup> N No IF.
M1A1 155mm Gun RFNM AP4†[1] WP8 s7[5] RFNM AP4†[1] WP8 20† A†<sup>1</sup> No IF.
M1 8-in. Howitzer RFNM RFNM 21† n/a No IF.
M51 Multiple .50-cal MG Carriage LF [2 ROF, 20 IFE, B11] 4 TK DR† LF [2 ROF, 20 IFE, B11] 4 TK DR† 22† n/a
M1A2 37mm AA Gun 23† N
M1 40mm AA Gun LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 24† B†<sup>1</sup>
M3 3-in. AA Gun NM NM 25 P
M1A1 90mm AA Gun NM NM 26† N
M2 90mm AA Gun LF [90†, 1 ROF, B11] LF [90†, 1 ROF, B11] 27†[1] B†
20mm Oerlikon Mk4 2 TK DR's† 2 TK DR's† 1† US P Multiple Hits (C3.8) are NA.

@ -1,31 +1,32 @@
=== ordnance/american/1942 ===
Name Capabilities (effective) # Notes
-------------------------------- ---------------------------------- ---------------------------------- ------ -------------------------------
M2 60mm Mortar IR WP7[5] 5PP OBA† IR 5PP OBA† 1† F N
M19 60mm Mortar IR WP6[5] 4PP IR 4PP 2 F
M1 81mm Mortar NT QSU WP8 NT QSU WP8 3 F N
M2 4.2-in. Mortar NT QSU WP10 NT QSU WP10 4† n/a
T25 155mm Mortar NT WP8 NT WP8 5† P
M3A1 37mm AT Gun NT QSU C7[A2+]†[1] NT QSU 6† C†<sup>1</sup> N
M1 57mm AT Gun NT QSU D4[J4+E]† HE7[J4E]7[5]† NT QSU 7† n/a
M5 3-in. AT Gun NT QSU A4[4]5[5]† s6[5] NT QSU 8† <s>P</s>
T32 37mm Manpack Gun 5PP (3PP dm)† C5†[1] crewed†[2] 5PP (3PP dm)† C5†[1] crewed†[2] 9† C†<sup>1</sup> D†<sup>2</sup> F
M18 57mm Recoilless Rifle 3PP crewed†[1] H7 WP6 3PP crewed†[1] H7 WP6 10 D†<sup>1</sup> E†
M20 75mm Recoilless Rifle 5PP crewed†[1] H7 WP7 5PP crewed†[1] H7 WP7 11 D†<sup>1</sup> E†
M1A1 75mm Pack Howitzer NT QSU C4[4+]†[1] H7 WP8 NT QSU H7 WP8 12† C†<sup>1</sup> F
M1897A2 75mm Gun NT QSU WP8 NT QSU WP8 13 P
M2A1 105mm Howitzer NT C7[4+P]†[1] H6 WP8 s7 NT H6 WP8 s7 14† C†<sup>1</sup> N
M3 105mm Howitzer NT C7[P]†[1] H7 WP8 s7 NT H7 WP8 s7 15† C†<sup>1</sup>
M1 4.5-in. Gun NT NT 16† <s>P</s>
M1918 155mm Howitzer NT WP8 s7[3+] NT WP8 17† N
M1 155mm Howitzer NT WP8 s7 NT WP8 s7 18† N
M1918M1 155mm Gun NT RFNM AP4†[1] no IF WP8 NT RFNM AP4†[1] no IF WP8 19† A†<sup>1</sup> N
M1A1 155mm Gun NT RFNM AP4†[1] no IF WP8 s7[5] NT RFNM AP4†[1] no IF WP8 20† A†<sup>1</sup>
M1 8-in. Howitzer NT RFNM no IF NT RFNM no IF 21† n/a
M51 Multiple .50-cal MG Carriage T LF [2 ROF, 20 IFE, B11] 4 TK DR† T LF [2 ROF, 20 IFE, B11] 4 TK DR† 22† n/a
M1A2 37mm AA Gun T T 23† N
M1 40mm AA Gun T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 24† B†<sup>1</sup>
M3 3-in. AA Gun T NM T NM 25 P
M1A1 90mm AA Gun T NM T NM 26† N
M2 90mm AA Gun T LF [90†, 1 ROF, B11] T LF [90†, 1 ROF, B11] 27†[1] B†
Name Capabilities (effective) # Notes Comments
-------------------------------- -------------------------------- -------------------------------- ------ ------------------------------- ----------------------------
M2 60mm Mortar IR WP7[5] 5PP OBA† IR 5PP OBA† 1† F N
M19 60mm Mortar IR WP6[5] 4PP IR 4PP 2 F
M1 81mm Mortar QSU WP8 QSU WP8 3 F N
M2 4.2-in. Mortar QSU WP10 QSU WP10 4† n/a
T25 155mm Mortar WP8 WP8 5† P
M3A1 37mm AT Gun QSU C7[A2+]†[1] QSU 6† C†<sup>1</sup> N
M1 57mm AT Gun QSU D4[J4+E]† HE7[J4E]7[5]† QSU 7† n/a
M5 3-in. AT Gun QSU A4[4]5[5]† s6[5] QSU 8† <s>P</s>
T32 37mm Manpack Gun 5PP (3PP dm)† C5†[1] crewed†[2] 5PP (3PP dm)† C5†[1] crewed†[2] 9† C†<sup>1</sup> D†<sup>2</sup> F
M18 57mm Recoilless Rifle 3PP crewed†[1] H7 WP6 3PP crewed†[1] H7 WP6 10 D†<sup>1</sup> E†
M20 75mm Recoilless Rifle 5PP crewed†[1] H7 WP7 5PP crewed†[1] H7 WP7 11 D†<sup>1</sup> E†
M1A1 75mm Pack Howitzer QSU C4[4+]†[1] H7 WP8 QSU H7 WP8 12† C†<sup>1</sup> F
M1897A2 75mm Gun QSU WP8 QSU WP8 13 P
M2A1 105mm Howitzer C7[4+P]†[1] H6 WP8 s7 H6 WP8 s7 14† C†<sup>1</sup> N
M3 105mm Howitzer C7[P]†[1] H7 WP8 s7 H7 WP8 s7 15† C†<sup>1</sup>
M1 4.5-in. Gun 16† <s>P</s>
M1918 155mm Howitzer WP8 s7[3+] WP8 17† N
M1 155mm Howitzer WP8 s7 WP8 s7 18† N
M1918M1 155mm Gun RFNM AP4†[1] WP8 RFNM AP4†[1] WP8 19† A†<sup>1</sup> N No IF.
M1A1 155mm Gun RFNM AP4†[1] WP8 s7[5] RFNM AP4†[1] WP8 20† A†<sup>1</sup> No IF.
M1 8-in. Howitzer RFNM RFNM 21† n/a No IF.
M51 Multiple .50-cal MG Carriage LF [2 ROF, 20 IFE, B11] 4 TK DR† LF [2 ROF, 20 IFE, B11] 4 TK DR† 22† n/a
M1A2 37mm AA Gun 23† N
M1 40mm AA Gun LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 24† B†<sup>1</sup>
M3 3-in. AA Gun NM NM 25 P
M1A1 90mm AA Gun NM NM 26† N
M2 90mm AA Gun LF [90†, 1 ROF, B11] LF [90†, 1 ROF, B11] 27†[1] B†
20mm Oerlikon Mk4 2 TK DR's† 2 TK DR's† 1† US P Multiple Hits (C3.8) are NA.

@ -1,31 +1,32 @@
=== ordnance/american/1943 ===
Name Capabilities (effective) # Notes
-------------------------------- ---------------------------------- ---------------------------------- ------ -------------------------------
M2 60mm Mortar IR WP7[5] 5PP OBA† IR 5PP OBA† 1† F N
M19 60mm Mortar IR WP6[5] 4PP IR 4PP 2 F
M1 81mm Mortar NT QSU WP8 NT QSU WP8 3 F N
M2 4.2-in. Mortar NT QSU WP10 NT QSU WP10 4† n/a
T25 155mm Mortar NT WP8 NT WP8 5† P
M3A1 37mm AT Gun NT QSU C7[A2+]†[1] NT QSU C7†[1] 6† C†<sup>1</sup> N
M1 57mm AT Gun NT QSU D4[J4+E]† HE7[J4E]7[5]† NT QSU 7† n/a
M5 3-in. AT Gun NT QSU A4[4]5[5]† s6[5] NT QSU 8† <s>P</s>
T32 37mm Manpack Gun 5PP (3PP dm)† C5†[1] crewed†[2] 5PP (3PP dm)† C5†[1] crewed†[2] 9† C†<sup>1</sup> D†<sup>2</sup> F
M18 57mm Recoilless Rifle 3PP crewed†[1] H7 WP6 3PP crewed†[1] H7 WP6 10 D†<sup>1</sup> E†
M20 75mm Recoilless Rifle 5PP crewed†[1] H7 WP7 5PP crewed†[1] H7 WP7 11 D†<sup>1</sup> E†
M1A1 75mm Pack Howitzer NT QSU C4[4+]†[1] H7 WP8 NT QSU H7 WP8 12† C†<sup>1</sup> F
M1897A2 75mm Gun NT QSU WP8 NT QSU WP8 13 P
M2A1 105mm Howitzer NT C7[4+P]†[1] H6 WP8 s7 NT H6 WP8 s7 14† C†<sup>1</sup> N
M3 105mm Howitzer NT C7[P]†[1] H7 WP8 s7 NT H7 WP8 s7 15† C†<sup>1</sup>
M1 4.5-in. Gun NT NT 16† <s>P</s>
M1918 155mm Howitzer NT WP8 s7[3+] NT WP8 s7 17† N
M1 155mm Howitzer NT WP8 s7 NT WP8 s7 18† N
M1918M1 155mm Gun NT RFNM AP4†[1] no IF WP8 NT RFNM AP4†[1] no IF WP8 19† A†<sup>1</sup> N
M1A1 155mm Gun NT RFNM AP4†[1] no IF WP8 s7[5] NT RFNM AP4†[1] no IF WP8 20† A†<sup>1</sup>
M1 8-in. Howitzer NT RFNM no IF NT RFNM no IF 21† n/a
M51 Multiple .50-cal MG Carriage T LF [2 ROF, 20 IFE, B11] 4 TK DR† T LF [2 ROF, 20 IFE, B11] 4 TK DR† 22† n/a
M1A2 37mm AA Gun T T 23† N
M1 40mm AA Gun T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 24† B†<sup>1</sup>
M3 3-in. AA Gun T NM T NM 25 P
M1A1 90mm AA Gun T NM T NM 26† N
M2 90mm AA Gun T LF [90†, 1 ROF, B11] T LF [90†, 1 ROF, B11] 27†[1] B†
Name Capabilities (effective) # Notes Comments
-------------------------------- -------------------------------- -------------------------------- ------ ------------------------------- ----------------------------
M2 60mm Mortar IR WP7[5] 5PP OBA† IR 5PP OBA† 1† F N
M19 60mm Mortar IR WP6[5] 4PP IR 4PP 2 F
M1 81mm Mortar QSU WP8 QSU WP8 3 F N
M2 4.2-in. Mortar QSU WP10 QSU WP10 4† n/a
T25 155mm Mortar WP8 WP8 5† P
M3A1 37mm AT Gun QSU C7[A2+]†[1] QSU C7†[1] 6† C†<sup>1</sup> N
M1 57mm AT Gun QSU D4[J4+E]† HE7[J4E]7[5]† QSU 7† n/a
M5 3-in. AT Gun QSU A4[4]5[5]† s6[5] QSU 8† <s>P</s>
T32 37mm Manpack Gun 5PP (3PP dm)† C5†[1] crewed†[2] 5PP (3PP dm)† C5†[1] crewed†[2] 9† C†<sup>1</sup> D†<sup>2</sup> F
M18 57mm Recoilless Rifle 3PP crewed†[1] H7 WP6 3PP crewed†[1] H7 WP6 10 D†<sup>1</sup> E†
M20 75mm Recoilless Rifle 5PP crewed†[1] H7 WP7 5PP crewed†[1] H7 WP7 11 D†<sup>1</sup> E†
M1A1 75mm Pack Howitzer QSU C4[4+]†[1] H7 WP8 QSU H7 WP8 12† C†<sup>1</sup> F
M1897A2 75mm Gun QSU WP8 QSU WP8 13 P
M2A1 105mm Howitzer C7[4+P]†[1] H6 WP8 s7 H6 WP8 s7 14† C†<sup>1</sup> N
M3 105mm Howitzer C7[P]†[1] H7 WP8 s7 H7 WP8 s7 15† C†<sup>1</sup>
M1 4.5-in. Gun 16† <s>P</s>
M1918 155mm Howitzer WP8 s7[3+] WP8 s7 17† N
M1 155mm Howitzer WP8 s7 WP8 s7 18† N
M1918M1 155mm Gun RFNM AP4†[1] WP8 RFNM AP4†[1] WP8 19† A†<sup>1</sup> N No IF.
M1A1 155mm Gun RFNM AP4†[1] WP8 s7[5] RFNM AP4†[1] WP8 20† A†<sup>1</sup> No IF.
M1 8-in. Howitzer RFNM RFNM 21† n/a No IF.
M51 Multiple .50-cal MG Carriage LF [2 ROF, 20 IFE, B11] 4 TK DR† LF [2 ROF, 20 IFE, B11] 4 TK DR† 22† n/a
M1A2 37mm AA Gun 23† N
M1 40mm AA Gun LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 24† B†<sup>1</sup>
M3 3-in. AA Gun NM NM 25 P
M1A1 90mm AA Gun NM NM 26† N
M2 90mm AA Gun LF [90†, 1 ROF, B11] LF [90†, 1 ROF, B11] 27†[1] B†
20mm Oerlikon Mk4 2 TK DR's† 2 TK DR's† 1† US P Multiple Hits (C3.8) are NA.

@ -1,31 +1,32 @@
=== ordnance/american/1944 ===
Name Capabilities (effective) # Notes
-------------------------------- ---------------------------------- ---------------------------------- ------ -------------------------------
M2 60mm Mortar IR WP7[5] 5PP OBA† IR 5PP OBA† 1† F N
M19 60mm Mortar IR WP6[5] 4PP IR 4PP 2 F
M1 81mm Mortar NT QSU WP8 NT QSU WP8 3 F N
M2 4.2-in. Mortar NT QSU WP10 NT QSU WP10 4† n/a
T25 155mm Mortar NT WP8 NT WP8 5† P
M3A1 37mm AT Gun NT QSU C7[A2+]†[1] NT QSU C7†[1] 6† C†<sup>1</sup> N
M1 57mm AT Gun NT QSU D4[J4+E]† HE7[J4E]7[5]† NT QSU 7† n/a
M5 3-in. AT Gun NT QSU A4[4]5[5]† s6[5] NT QSU A4† 8† <s>P</s>
T32 37mm Manpack Gun 5PP (3PP dm)† C5†[1] crewed†[2] 5PP (3PP dm)† C5†[1] crewed†[2] 9† C†<sup>1</sup> D†<sup>2</sup> F
M18 57mm Recoilless Rifle 3PP crewed†[1] H7 WP6 3PP crewed†[1] H7 WP6 10 D†<sup>1</sup> E†
M20 75mm Recoilless Rifle 5PP crewed†[1] H7 WP7 5PP crewed†[1] H7 WP7 11 D†<sup>1</sup> E†
M1A1 75mm Pack Howitzer NT QSU C4[4+]†[1] H7 WP8 NT QSU C4†[1] H7 WP8 12† C†<sup>1</sup> F
M1897A2 75mm Gun NT QSU WP8 NT QSU WP8 13 P
M2A1 105mm Howitzer NT C7[4+P]†[1] H6 WP8 s7 NT H6 WP8 s7 14† C†<sup>1</sup> N
M3 105mm Howitzer NT C7[P]†[1] H7 WP8 s7 NT H7 WP8 s7 15† C†<sup>1</sup>
M1 4.5-in. Gun NT NT 16† <s>P</s>
M1918 155mm Howitzer NT WP8 s7[3+] NT WP8 s7 17† N
M1 155mm Howitzer NT WP8 s7 NT WP8 s7 18† N
M1918M1 155mm Gun NT RFNM AP4†[1] no IF WP8 NT RFNM AP4†[1] no IF WP8 19† A†<sup>1</sup> N
M1A1 155mm Gun NT RFNM AP4†[1] no IF WP8 s7[5] NT RFNM AP4†[1] no IF WP8 20† A†<sup>1</sup>
M1 8-in. Howitzer NT RFNM no IF NT RFNM no IF 21† n/a
M51 Multiple .50-cal MG Carriage T LF [2 ROF, 20 IFE, B11] 4 TK DR† T LF [2 ROF, 20 IFE, B11] 4 TK DR† 22† n/a
M1A2 37mm AA Gun T T 23† N
M1 40mm AA Gun T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 24† B†<sup>1</sup>
M3 3-in. AA Gun T NM T NM 25 P
M1A1 90mm AA Gun T NM T NM 26† N
M2 90mm AA Gun T LF [90†, 1 ROF, B11] T LF [90†, 1 ROF, B11] 27†[1] B†
Name Capabilities (effective) # Notes Comments
-------------------------------- -------------------------------- -------------------------------- ------ ------------------------------- ----------------------------
M2 60mm Mortar IR WP7[5] 5PP OBA† IR 5PP OBA† 1† F N
M19 60mm Mortar IR WP6[5] 4PP IR 4PP 2 F
M1 81mm Mortar QSU WP8 QSU WP8 3 F N
M2 4.2-in. Mortar QSU WP10 QSU WP10 4† n/a
T25 155mm Mortar WP8 WP8 5† P
M3A1 37mm AT Gun QSU C7[A2+]†[1] QSU C7†[1] 6† C†<sup>1</sup> N
M1 57mm AT Gun QSU D4[J4+E]† HE7[J4E]7[5]† QSU 7† n/a
M5 3-in. AT Gun QSU A4[4]5[5]† s6[5] QSU A4† 8† <s>P</s>
T32 37mm Manpack Gun 5PP (3PP dm)† C5†[1] crewed†[2] 5PP (3PP dm)† C5†[1] crewed†[2] 9† C†<sup>1</sup> D†<sup>2</sup> F
M18 57mm Recoilless Rifle 3PP crewed†[1] H7 WP6 3PP crewed†[1] H7 WP6 10 D†<sup>1</sup> E†
M20 75mm Recoilless Rifle 5PP crewed†[1] H7 WP7 5PP crewed†[1] H7 WP7 11 D†<sup>1</sup> E†
M1A1 75mm Pack Howitzer QSU C4[4+]†[1] H7 WP8 QSU C4†[1] H7 WP8 12† C†<sup>1</sup> F
M1897A2 75mm Gun QSU WP8 QSU WP8 13 P
M2A1 105mm Howitzer C7[4+P]†[1] H6 WP8 s7 H6 WP8 s7 14† C†<sup>1</sup> N
M3 105mm Howitzer C7[P]†[1] H7 WP8 s7 H7 WP8 s7 15† C†<sup>1</sup>
M1 4.5-in. Gun 16† <s>P</s>
M1918 155mm Howitzer WP8 s7[3+] WP8 s7 17† N
M1 155mm Howitzer WP8 s7 WP8 s7 18† N
M1918M1 155mm Gun RFNM AP4†[1] WP8 RFNM AP4†[1] WP8 19† A†<sup>1</sup> N No IF.
M1A1 155mm Gun RFNM AP4†[1] WP8 s7[5] RFNM AP4†[1] WP8 20† A†<sup>1</sup> No IF.
M1 8-in. Howitzer RFNM RFNM 21† n/a No IF.
M51 Multiple .50-cal MG Carriage LF [2 ROF, 20 IFE, B11] 4 TK DR† LF [2 ROF, 20 IFE, B11] 4 TK DR† 22† n/a
M1A2 37mm AA Gun 23† N
M1 40mm AA Gun LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 24† B†<sup>1</sup>
M3 3-in. AA Gun NM NM 25 P
M1A1 90mm AA Gun NM NM 26† N
M2 90mm AA Gun LF [90†, 1 ROF, B11] LF [90†, 1 ROF, B11] 27†[1] B†
20mm Oerlikon Mk4 2 TK DR's† 2 TK DR's† 1† US P Multiple Hits (C3.8) are NA.

@ -1,31 +1,32 @@
=== ordnance/american/1945 ===
Name Capabilities (effective) # Notes
-------------------------------- ---------------------------------- ---------------------------------- ------ -------------------------------
M2 60mm Mortar IR WP7[5] 5PP OBA† IR WP7 5PP OBA† 1† F N
M19 60mm Mortar IR WP6[5] 4PP IR WP6 4PP 2 F
M1 81mm Mortar NT QSU WP8 NT QSU WP8 3 F N
M2 4.2-in. Mortar NT QSU WP10 NT QSU WP10 4† n/a
T25 155mm Mortar NT WP8 NT WP8 5† P
M3A1 37mm AT Gun NT QSU C7[A2+]†[1] NT QSU C7†[1] 6† C†<sup>1</sup> N
M1 57mm AT Gun NT QSU D4[J4+E]† HE7[J4E]7[5]† NT QSU D4† HE7† 7† n/a
M5 3-in. AT Gun NT QSU A4[4]5[5]† s6[5] NT QSU A5† s6 8† <s>P</s>
T32 37mm Manpack Gun 5PP (3PP dm)† C5†[1] crewed†[2] 5PP (3PP dm)† C5†[1] crewed†[2] 9† C†<sup>1</sup> D†<sup>2</sup> F
M18 57mm Recoilless Rifle 3PP crewed†[1] H7 WP6 3PP crewed†[1] H7 WP6 10 D†<sup>1</sup> E†
M20 75mm Recoilless Rifle 5PP crewed†[1] H7 WP7 5PP crewed†[1] H7 WP7 11 D†<sup>1</sup> E†
M1A1 75mm Pack Howitzer NT QSU C4[4+]†[1] H7 WP8 NT QSU C4†[1] H7 WP8 12† C†<sup>1</sup> F
M1897A2 75mm Gun NT QSU WP8 NT QSU WP8 13 P
M2A1 105mm Howitzer NT C7[4+P]†[1] H6 WP8 s7 NT H6 WP8 s7 14† C†<sup>1</sup> N
M3 105mm Howitzer NT C7[P]†[1] H7 WP8 s7 NT H7 WP8 s7 15† C†<sup>1</sup>
M1 4.5-in. Gun NT NT 16† <s>P</s>
M1918 155mm Howitzer NT WP8 s7[3+] NT WP8 s7 17† N
M1 155mm Howitzer NT WP8 s7 NT WP8 s7 18† N
M1918M1 155mm Gun NT RFNM AP4†[1] no IF WP8 NT RFNM AP4†[1] no IF WP8 19† A†<sup>1</sup> N
M1A1 155mm Gun NT RFNM AP4†[1] no IF WP8 s7[5] NT RFNM AP4†[1] no IF WP8 s7 20† A†<sup>1</sup>
M1 8-in. Howitzer NT RFNM no IF NT RFNM no IF 21† n/a
M51 Multiple .50-cal MG Carriage T LF [2 ROF, 20 IFE, B11] 4 TK DR† T LF [2 ROF, 20 IFE, B11] 4 TK DR† 22† n/a
M1A2 37mm AA Gun T T 23† N
M1 40mm AA Gun T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 24† B†<sup>1</sup>
M3 3-in. AA Gun T NM T NM 25 P
M1A1 90mm AA Gun T NM T NM 26† N
M2 90mm AA Gun T LF [90†, 1 ROF, B11] T LF [90†, 1 ROF, B11] 27†[1] B†
Name Capabilities (effective) # Notes Comments
-------------------------------- -------------------------------- -------------------------------- ------ ------------------------------- ----------------------------
M2 60mm Mortar IR WP7[5] 5PP OBA† IR WP7 5PP OBA† 1† F N
M19 60mm Mortar IR WP6[5] 4PP IR WP6 4PP 2 F
M1 81mm Mortar QSU WP8 QSU WP8 3 F N
M2 4.2-in. Mortar QSU WP10 QSU WP10 4† n/a
T25 155mm Mortar WP8 WP8 5† P
M3A1 37mm AT Gun QSU C7[A2+]†[1] QSU C7†[1] 6† C†<sup>1</sup> N
M1 57mm AT Gun QSU D4[J4+E]† HE7[J4E]7[5]† QSU D4† HE7† 7† n/a
M5 3-in. AT Gun QSU A4[4]5[5]† s6[5] QSU A5† s6 8† <s>P</s>
T32 37mm Manpack Gun 5PP (3PP dm)† C5†[1] crewed†[2] 5PP (3PP dm)† C5†[1] crewed†[2] 9† C†<sup>1</sup> D†<sup>2</sup> F
M18 57mm Recoilless Rifle 3PP crewed†[1] H7 WP6 3PP crewed†[1] H7 WP6 10 D†<sup>1</sup> E†
M20 75mm Recoilless Rifle 5PP crewed†[1] H7 WP7 5PP crewed†[1] H7 WP7 11 D†<sup>1</sup> E†
M1A1 75mm Pack Howitzer QSU C4[4+]†[1] H7 WP8 QSU C4†[1] H7 WP8 12† C†<sup>1</sup> F
M1897A2 75mm Gun QSU WP8 QSU WP8 13 P
M2A1 105mm Howitzer C7[4+P]†[1] H6 WP8 s7 H6 WP8 s7 14† C†<sup>1</sup> N
M3 105mm Howitzer C7[P]†[1] H7 WP8 s7 H7 WP8 s7 15† C†<sup>1</sup>
M1 4.5-in. Gun 16† <s>P</s>
M1918 155mm Howitzer WP8 s7[3+] WP8 s7 17† N
M1 155mm Howitzer WP8 s7 WP8 s7 18† N
M1918M1 155mm Gun RFNM AP4†[1] WP8 RFNM AP4†[1] WP8 19† A†<sup>1</sup> N No IF.
M1A1 155mm Gun RFNM AP4†[1] WP8 s7[5] RFNM AP4†[1] WP8 s7 20† A†<sup>1</sup> No IF.
M1 8-in. Howitzer RFNM RFNM 21† n/a No IF.
M51 Multiple .50-cal MG Carriage LF [2 ROF, 20 IFE, B11] 4 TK DR† LF [2 ROF, 20 IFE, B11] 4 TK DR† 22† n/a
M1A2 37mm AA Gun 23† N
M1 40mm AA Gun LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 24† B†<sup>1</sup>
M3 3-in. AA Gun NM NM 25 P
M1A1 90mm AA Gun NM NM 26† N
M2 90mm AA Gun LF [90†, 1 ROF, B11] LF [90†, 1 ROF, B11] 27†[1] B†
20mm Oerlikon Mk4 2 TK DR's† 2 TK DR's† 1† US P Multiple Hits (C3.8) are NA.

@ -1,37 +1,37 @@
=== ordnance/axis-minor-common/1940 ===
Name Capabilities (effective) # Notes
------------------------------- ----------------------------- ----------------------------- --- ----------------------
5cm leGrW 36 5PP 5PP 44 A H S C B
50mm RM obr. 40 4PP 4PP 45 A R H S C
8cm GrW 34 NT QSU IR s7 NT QSU IR s7 46† A C B
Brandt M27/31 NT QSU s7 NT QSU s7 47† A R H S
PM obr. 38 NT QSU h-d s8 NT QSU h-d s8 48† R H
Ur wz. 35 1PP 1PP 49 R H S C B
s18-1100 5PP 5PP 50 A R H
Kanon PUV vz. 37(t) NT QSU A4[1S] NT QSU 51† E H S B
Bohler M35 NT QSU no Gunshield NT QSU no Gunshield 52† A R H S
5cm PaK 38(g) NT QSU A4[3]3[4] NT QSU 53† E R H S B
7.5cm PaK 97/38(g) NT QSU H5[3+] s6 NT QSU s6 54† E R B
7.5cm PaK 40(g) NT QSU A4[3]3[4] NT QSU 55† E R H S B
Skoda M15 NT QSU NT QSU 56† A R H S C B
Canon de 75 mle 1897 NT QSU s7 NT QSU s7 57 R B
Skoda M29 NT AP6 NT AP6 58† A R S
Skoda M17 NT QSU NT QSU 59† A R S C
Skoda M28(80) T T 60† S C
Skoda M14/19 NT s8 NT s8 61† A† R H S C
leFH 18(g) NT H4[3+] s5 NT s5 62† E H S B
Skoda M35 NT AP7 C7[CS]† NT AP7 63† R S C
G obr. 10/30 NT h-d s7 NT h-d s7 64† R B
G obr. 38 NT s5[1-2R]† NT 65 R B
Skoda M14 NT NT 66† R H S
Skoda M15/16 NT no IF s6 NT no IF s6 67† S C
C mle 17 S NT s7 NT s7 68† R B
Mitrailleuse de 13.2 CAJ mle 30 T 2 TK DR† T 2 TK DR† 69† T†<sup>1</sup> R B
Oerlikon FF T LF [NT, 20†, 2 ROF, B11] T LF [NT, 20†, 2 ROF, B11] 70 G† R H S C B
2cm FlaK 30(g) T LF [NT, 20†[1], 2 ROF, B9] T LF [NT, 20†[1], 2 ROF, B9] 71† E G†<sup>1</sup> R B
2cm FlaK 38(g) T LF [NT, 20†[1], 2 ROF, B10] T LF [NT, 20†[1], 2 ROF, B10] 72† E G†<sup>1</sup> R B
3.7cm FlaK 36(g) T T 73† E R B
Bofors 40mm T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 74† G†<sup>1</sup> R H S C
Skoda M33 T T 75R S
8.8cm FlaK 18 o. 36(g) T LF [88†[1], 1 ROF, B11] T LF [88†[1], 1 ROF, B11] 76† E G†<sup>1</sup> R S B
Name Capabilities (effective) # Notes Comments
------------------------------- --------------------------- --------------------------- --- ---------------------- -------------
5cm leGrW 36 5PP 5PP 44 A H S C B
50mm RM obr. 40 4PP 4PP 45 A R H S C
8cm GrW 34 QSU IR s7 QSU IR s7 46† A C B
Brandt M27/31 QSU s7 QSU s7 47† A R H S
PM obr. 38 QSU h-d s8 QSU h-d s8 48† R H
Ur wz. 35 1PP 1PP 49 R H S C B
s18-1100 5PP 5PP 50 A R H
Kanon PUV vz. 37(t) QSU A4[1S] QSU 51† E H S B
Bohler M35 QSU QSU 52† A R H S No Gunshield.
5cm PaK 38(g) QSU A4[3]3[4] QSU 53† E R H S B
7.5cm PaK 97/38(g) QSU H5[3+] s6 QSU s6 54† E R B
7.5cm PaK 40(g) QSU A4[3]3[4] QSU 55† E R H S B
Skoda M15 QSU QSU 56† A R H S C B
Canon de 75 mle 1897 QSU s7 QSU s7 57 R B
Skoda M29 AP6 AP6 58† A R S
Skoda M17 QSU QSU 59† A R S C
Skoda M28(80) 60† S C
Skoda M14/19 s8 s8 61† A† R H S C
leFH 18(g) H4[3+] s5 s5 62† E H S B
Skoda M35 AP7 C7[CS]† AP7 63† R S C
G obr. 10/30 h-d s7 h-d s7 64† R B
G obr. 38 s5[1-2R]† 65 R B
Skoda M14 66† R H S
Skoda M15/16 s6 s6 67† S C No IF.
C mle 17 S s7 s7 68† R B
Mitrailleuse de 13.2 CAJ mle 30 2 TK DR† 2 TK DR† 69† T†<sup>1</sup> R B
Oerlikon FF LF [NT, 20†, 2 ROF, B11] LF [NT, 20†, 2 ROF, B11] 70 G† R H S C B
2cm FlaK 30(g) LF [NT, 20†[1], 2 ROF, B9] LF [NT, 20†[1], 2 ROF, B9] 71† E G†<sup>1</sup> R B
2cm FlaK 38(g) LF [NT, 20†[1], 2 ROF, B10] LF [NT, 20†[1], 2 ROF, B10] 72† E G†<sup>1</sup> R B
3.7cm FlaK 36(g) 73† E R B
Bofors 40mm LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 74† G†<sup>1</sup> R H S C
Skoda M33 75R S
8.8cm FlaK 18 o. 36(g) LF [88†[1], 1 ROF, B11] LF [88†[1], 1 ROF, B11] 76† E G†<sup>1</sup> R S B

@ -1,37 +1,37 @@
=== ordnance/axis-minor-common/1941 ===
Name Capabilities (effective) # Notes
------------------------------- ----------------------------- ----------------------------- --- ----------------------
5cm leGrW 36 5PP 5PP 44 A H S C B
50mm RM obr. 40 4PP 4PP 45 A R H S C
8cm GrW 34 NT QSU IR s7 NT QSU IR s7 46† A C B
Brandt M27/31 NT QSU s7 NT QSU s7 47† A R H S
PM obr. 38 NT QSU h-d s8 NT QSU h-d s8 48† R H
Ur wz. 35 1PP 1PP 49 R H S C B
s18-1100 5PP 5PP 50 A R H
Kanon PUV vz. 37(t) NT QSU A4[1S] NT QSU 51† E H S B
Bohler M35 NT QSU no Gunshield NT QSU no Gunshield 52† A R H S
5cm PaK 38(g) NT QSU A4[3]3[4] NT QSU 53† E R H S B
7.5cm PaK 97/38(g) NT QSU H5[3+] s6 NT QSU s6 54† E R B
7.5cm PaK 40(g) NT QSU A4[3]3[4] NT QSU 55† E R H S B
Skoda M15 NT QSU NT QSU 56† A R H S C B
Canon de 75 mle 1897 NT QSU s7 NT QSU s7 57 R B
Skoda M29 NT AP6 NT AP6 58† A R S
Skoda M17 NT QSU NT QSU 59† A R S C
Skoda M28(80) T T 60† S C
Skoda M14/19 NT s8 NT s8 61† A† R H S C
leFH 18(g) NT H4[3+] s5 NT s5 62† E H S B
Skoda M35 NT AP7 C7[CS]† NT AP7 63† R S C
G obr. 10/30 NT h-d s7 NT h-d s7 64† R B
G obr. 38 NT s5[1-2R]† NT 65 R B
Skoda M14 NT NT 66† R H S
Skoda M15/16 NT no IF s6 NT no IF s6 67† S C
C mle 17 S NT s7 NT s7 68† R B
Mitrailleuse de 13.2 CAJ mle 30 T 2 TK DR† T 2 TK DR† 69† T†<sup>1</sup> R B
Oerlikon FF T LF [NT, 20†, 2 ROF, B11] T LF [NT, 20†, 2 ROF, B11] 70 G† R H S C B
2cm FlaK 30(g) T LF [NT, 20†[1], 2 ROF, B9] T LF [NT, 20†[1], 2 ROF, B9] 71† E G†<sup>1</sup> R B
2cm FlaK 38(g) T LF [NT, 20†[1], 2 ROF, B10] T LF [NT, 20†[1], 2 ROF, B10] 72† E G†<sup>1</sup> R B
3.7cm FlaK 36(g) T T 73† E R B
Bofors 40mm T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 74† G†<sup>1</sup> R H S C
Skoda M33 T T 75R S
8.8cm FlaK 18 o. 36(g) T LF [88†[1], 1 ROF, B11] T LF [88†[1], 1 ROF, B11] 76† E G†<sup>1</sup> R S B
Name Capabilities (effective) # Notes Comments
------------------------------- --------------------------- --------------------------- --- ---------------------- -------------
5cm leGrW 36 5PP 5PP 44 A H S C B
50mm RM obr. 40 4PP 4PP 45 A R H S C
8cm GrW 34 QSU IR s7 QSU IR s7 46† A C B
Brandt M27/31 QSU s7 QSU s7 47† A R H S
PM obr. 38 QSU h-d s8 QSU h-d s8 48† R H
Ur wz. 35 1PP 1PP 49 R H S C B
s18-1100 5PP 5PP 50 A R H
Kanon PUV vz. 37(t) QSU A4[1S] QSU 51† E H S B
Bohler M35 QSU QSU 52† A R H S No Gunshield.
5cm PaK 38(g) QSU A4[3]3[4] QSU 53† E R H S B
7.5cm PaK 97/38(g) QSU H5[3+] s6 QSU s6 54† E R B
7.5cm PaK 40(g) QSU A4[3]3[4] QSU 55† E R H S B
Skoda M15 QSU QSU 56† A R H S C B
Canon de 75 mle 1897 QSU s7 QSU s7 57 R B
Skoda M29 AP6 AP6 58† A R S
Skoda M17 QSU QSU 59† A R S C
Skoda M28(80) 60† S C
Skoda M14/19 s8 s8 61† A† R H S C
leFH 18(g) H4[3+] s5 s5 62† E H S B
Skoda M35 AP7 C7[CS]† AP7 63† R S C
G obr. 10/30 h-d s7 h-d s7 64† R B
G obr. 38 s5[1-2R]† 65 R B
Skoda M14 66† R H S
Skoda M15/16 s6 s6 67† S C No IF.
C mle 17 S s7 s7 68† R B
Mitrailleuse de 13.2 CAJ mle 30 2 TK DR† 2 TK DR† 69† T†<sup>1</sup> R B
Oerlikon FF LF [NT, 20†, 2 ROF, B11] LF [NT, 20†, 2 ROF, B11] 70 G† R H S C B
2cm FlaK 30(g) LF [NT, 20†[1], 2 ROF, B9] LF [NT, 20†[1], 2 ROF, B9] 71† E G†<sup>1</sup> R B
2cm FlaK 38(g) LF [NT, 20†[1], 2 ROF, B10] LF [NT, 20†[1], 2 ROF, B10] 72† E G†<sup>1</sup> R B
3.7cm FlaK 36(g) 73† E R B
Bofors 40mm LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 74† G†<sup>1</sup> R H S C
Skoda M33 75R S
8.8cm FlaK 18 o. 36(g) LF [88†[1], 1 ROF, B11] LF [88†[1], 1 ROF, B11] 76† E G†<sup>1</sup> R S B

@ -1,37 +1,37 @@
=== ordnance/axis-minor-common/1942 ===
Name Capabilities (effective) # Notes
------------------------------- ----------------------------- ----------------------------- --- ----------------------
5cm leGrW 36 5PP 5PP 44 A H S C B
50mm RM obr. 40 4PP 4PP 45 A R H S C
8cm GrW 34 NT QSU IR s7 NT QSU IR s7 46† A C B
Brandt M27/31 NT QSU s7 NT QSU s7 47† A R H S
PM obr. 38 NT QSU h-d s8 NT QSU h-d s8 48† R H
Ur wz. 35 1PP 1PP 49 R H S C B
s18-1100 5PP 5PP 50 A R H
Kanon PUV vz. 37(t) NT QSU A4[1S] NT QSU 51† E H S B
Bohler M35 NT QSU no Gunshield NT QSU no Gunshield 52† A R H S
5cm PaK 38(g) NT QSU A4[3]3[4] NT QSU 53† E R H S B
7.5cm PaK 97/38(g) NT QSU H5[3+] s6 NT QSU s6 54† E R B
7.5cm PaK 40(g) NT QSU A4[3]3[4] NT QSU 55† E R H S B
Skoda M15 NT QSU NT QSU 56† A R H S C B
Canon de 75 mle 1897 NT QSU s7 NT QSU s7 57 R B
Skoda M29 NT AP6 NT AP6 58† A R S
Skoda M17 NT QSU NT QSU 59† A R S C
Skoda M28(80) T T 60† S C
Skoda M14/19 NT s8 NT s8 61† A† R H S C
leFH 18(g) NT H4[3+] s5 NT s5 62† E H S B
Skoda M35 NT AP7 C7[CS]† NT AP7 63† R S C
G obr. 10/30 NT h-d s7 NT h-d s7 64† R B
G obr. 38 NT s5[1-2R]† NT 65 R B
Skoda M14 NT NT 66† R H S
Skoda M15/16 NT no IF s6 NT no IF s6 67† S C
C mle 17 S NT s7 NT s7 68† R B
Mitrailleuse de 13.2 CAJ mle 30 T 2 TK DR† T 2 TK DR† 69† T†<sup>1</sup> R B
Oerlikon FF T LF [NT, 20†, 2 ROF, B11] T LF [NT, 20†, 2 ROF, B11] 70 G† R H S C B
2cm FlaK 30(g) T LF [NT, 20†[1], 2 ROF, B9] T LF [NT, 20†[1], 2 ROF, B9] 71† E G†<sup>1</sup> R B
2cm FlaK 38(g) T LF [NT, 20†[1], 2 ROF, B10] T LF [NT, 20†[1], 2 ROF, B10] 72† E G†<sup>1</sup> R B
3.7cm FlaK 36(g) T T 73† E R B
Bofors 40mm T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 74† G†<sup>1</sup> R H S C
Skoda M33 T T 75R S
8.8cm FlaK 18 o. 36(g) T LF [88†[1], 1 ROF, B11] T LF [88†[1], 1 ROF, B11] 76† E G†<sup>1</sup> R S B
Name Capabilities (effective) # Notes Comments
------------------------------- --------------------------- --------------------------- --- ---------------------- -------------
5cm leGrW 36 5PP 5PP 44 A H S C B
50mm RM obr. 40 4PP 4PP 45 A R H S C
8cm GrW 34 QSU IR s7 QSU IR s7 46† A C B
Brandt M27/31 QSU s7 QSU s7 47† A R H S
PM obr. 38 QSU h-d s8 QSU h-d s8 48† R H
Ur wz. 35 1PP 1PP 49 R H S C B
s18-1100 5PP 5PP 50 A R H
Kanon PUV vz. 37(t) QSU A4[1S] QSU 51† E H S B
Bohler M35 QSU QSU 52† A R H S No Gunshield.
5cm PaK 38(g) QSU A4[3]3[4] QSU 53† E R H S B
7.5cm PaK 97/38(g) QSU H5[3+] s6 QSU s6 54† E R B
7.5cm PaK 40(g) QSU A4[3]3[4] QSU 55† E R H S B
Skoda M15 QSU QSU 56† A R H S C B
Canon de 75 mle 1897 QSU s7 QSU s7 57 R B
Skoda M29 AP6 AP6 58† A R S
Skoda M17 QSU QSU 59† A R S C
Skoda M28(80) 60† S C
Skoda M14/19 s8 s8 61† A† R H S C
leFH 18(g) H4[3+] s5 s5 62† E H S B
Skoda M35 AP7 C7[CS]† AP7 63† R S C
G obr. 10/30 h-d s7 h-d s7 64† R B
G obr. 38 s5[1-2R]† 65 R B
Skoda M14 66† R H S
Skoda M15/16 s6 s6 67† S C No IF.
C mle 17 S s7 s7 68† R B
Mitrailleuse de 13.2 CAJ mle 30 2 TK DR† 2 TK DR† 69† T†<sup>1</sup> R B
Oerlikon FF LF [NT, 20†, 2 ROF, B11] LF [NT, 20†, 2 ROF, B11] 70 G† R H S C B
2cm FlaK 30(g) LF [NT, 20†[1], 2 ROF, B9] LF [NT, 20†[1], 2 ROF, B9] 71† E G†<sup>1</sup> R B
2cm FlaK 38(g) LF [NT, 20†[1], 2 ROF, B10] LF [NT, 20†[1], 2 ROF, B10] 72† E G†<sup>1</sup> R B
3.7cm FlaK 36(g) 73† E R B
Bofors 40mm LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 74† G†<sup>1</sup> R H S C
Skoda M33 75R S
8.8cm FlaK 18 o. 36(g) LF [88†[1], 1 ROF, B11] LF [88†[1], 1 ROF, B11] 76† E G†<sup>1</sup> R S B

@ -1,37 +1,37 @@
=== ordnance/axis-minor-common/1943 ===
Name Capabilities (effective) # Notes
------------------------------- ----------------------------- ----------------------------- --- ----------------------
5cm leGrW 36 5PP 5PP 44 A H S C B
50mm RM obr. 40 4PP 4PP 45 A R H S C
8cm GrW 34 NT QSU IR s7 NT QSU IR s7 46† A C B
Brandt M27/31 NT QSU s7 NT QSU s7 47† A R H S
PM obr. 38 NT QSU h-d s8 NT QSU h-d s8 48† R H
Ur wz. 35 1PP 1PP 49 R H S C B
s18-1100 5PP 5PP 50 A R H
Kanon PUV vz. 37(t) NT QSU A4[1S] NT QSU 51† E H S B
Bohler M35 NT QSU no Gunshield NT QSU no Gunshield 52† A R H S
5cm PaK 38(g) NT QSU A4[3]3[4] NT QSU A4 53† E R H S B
7.5cm PaK 97/38(g) NT QSU H5[3+] s6 NT QSU H5 s6 54† E R B
7.5cm PaK 40(g) NT QSU A4[3]3[4] NT QSU A4 55† E R H S B
Skoda M15 NT QSU NT QSU 56† A R H S C B
Canon de 75 mle 1897 NT QSU s7 NT QSU s7 57 R B
Skoda M29 NT AP6 NT AP6 58† A R S
Skoda M17 NT QSU NT QSU 59† A R S C
Skoda M28(80) T T 60† S C
Skoda M14/19 NT s8 NT s8 61† A† R H S C
leFH 18(g) NT H4[3+] s5 NT H4 s5 62† E H S B
Skoda M35 NT AP7 C7[CS]† NT AP7 63† R S C
G obr. 10/30 NT h-d s7 NT h-d s7 64† R B
G obr. 38 NT s5[1-2R]† NT 65 R B
Skoda M14 NT NT 66† R H S
Skoda M15/16 NT no IF s6 NT no IF s6 67† S C
C mle 17 S NT s7 NT s7 68† R B
Mitrailleuse de 13.2 CAJ mle 30 T 2 TK DR† T 2 TK DR† 69† T†<sup>1</sup> R B
Oerlikon FF T LF [NT, 20†, 2 ROF, B11] T LF [NT, 20†, 2 ROF, B11] 70 G† R H S C B
2cm FlaK 30(g) T LF [NT, 20†[1], 2 ROF, B9] T LF [NT, 20†[1], 2 ROF, B9] 71† E G†<sup>1</sup> R B
2cm FlaK 38(g) T LF [NT, 20†[1], 2 ROF, B10] T LF [NT, 20†[1], 2 ROF, B10] 72† E G†<sup>1</sup> R B
3.7cm FlaK 36(g) T T 73† E R B
Bofors 40mm T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 74† G†<sup>1</sup> R H S C
Skoda M33 T T 75R S
8.8cm FlaK 18 o. 36(g) T LF [88†[1], 1 ROF, B11] T LF [88†[1], 1 ROF, B11] 76† E G†<sup>1</sup> R S B
Name Capabilities (effective) # Notes Comments
------------------------------- --------------------------- --------------------------- --- ---------------------- -------------
5cm leGrW 36 5PP 5PP 44 A H S C B
50mm RM obr. 40 4PP 4PP 45 A R H S C
8cm GrW 34 QSU IR s7 QSU IR s7 46† A C B
Brandt M27/31 QSU s7 QSU s7 47† A R H S
PM obr. 38 QSU h-d s8 QSU h-d s8 48† R H
Ur wz. 35 1PP 1PP 49 R H S C B
s18-1100 5PP 5PP 50 A R H
Kanon PUV vz. 37(t) QSU A4[1S] QSU 51† E H S B
Bohler M35 QSU QSU 52† A R H S No Gunshield.
5cm PaK 38(g) QSU A4[3]3[4] QSU A4 53† E R H S B
7.5cm PaK 97/38(g) QSU H5[3+] s6 QSU H5 s6 54† E R B
7.5cm PaK 40(g) QSU A4[3]3[4] QSU A4 55† E R H S B
Skoda M15 QSU QSU 56† A R H S C B
Canon de 75 mle 1897 QSU s7 QSU s7 57 R B
Skoda M29 AP6 AP6 58† A R S
Skoda M17 QSU QSU 59† A R S C
Skoda M28(80) 60† S C
Skoda M14/19 s8 s8 61† A† R H S C
leFH 18(g) H4[3+] s5 H4 s5 62† E H S B
Skoda M35 AP7 C7[CS]† AP7 63† R S C
G obr. 10/30 h-d s7 h-d s7 64† R B
G obr. 38 s5[1-2R]† 65 R B
Skoda M14 66† R H S
Skoda M15/16 s6 s6 67† S C No IF.
C mle 17 S s7 s7 68† R B
Mitrailleuse de 13.2 CAJ mle 30 2 TK DR† 2 TK DR† 69† T†<sup>1</sup> R B
Oerlikon FF LF [NT, 20†, 2 ROF, B11] LF [NT, 20†, 2 ROF, B11] 70 G† R H S C B
2cm FlaK 30(g) LF [NT, 20†[1], 2 ROF, B9] LF [NT, 20†[1], 2 ROF, B9] 71† E G†<sup>1</sup> R B
2cm FlaK 38(g) LF [NT, 20†[1], 2 ROF, B10] LF [NT, 20†[1], 2 ROF, B10] 72† E G†<sup>1</sup> R B
3.7cm FlaK 36(g) 73† E R B
Bofors 40mm LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 74† G†<sup>1</sup> R H S C
Skoda M33 75R S
8.8cm FlaK 18 o. 36(g) LF [88†[1], 1 ROF, B11] LF [88†[1], 1 ROF, B11] 76† E G†<sup>1</sup> R S B

@ -1,37 +1,37 @@
=== ordnance/axis-minor-common/1944 ===
Name Capabilities (effective) # Notes
------------------------------- ----------------------------- ----------------------------- --- ----------------------
5cm leGrW 36 5PP 5PP 44 A H S C B
50mm RM obr. 40 4PP 4PP 45 A R H S C
8cm GrW 34 NT QSU IR s7 NT QSU IR s7 46† A C B
Brandt M27/31 NT QSU s7 NT QSU s7 47† A R H S
PM obr. 38 NT QSU h-d s8 NT QSU h-d s8 48† R H
Ur wz. 35 1PP 1PP 49 R H S C B
s18-1100 5PP 5PP 50 A R H
Kanon PUV vz. 37(t) NT QSU A4[1S] NT QSU 51† E H S B
Bohler M35 NT QSU no Gunshield NT QSU no Gunshield 52† A R H S
5cm PaK 38(g) NT QSU A4[3]3[4] NT QSU A3 53† E R H S B
7.5cm PaK 97/38(g) NT QSU H5[3+] s6 NT QSU H5 s6 54† E R B
7.5cm PaK 40(g) NT QSU A4[3]3[4] NT QSU A3 55† E R H S B
Skoda M15 NT QSU NT QSU 56† A R H S C B
Canon de 75 mle 1897 NT QSU s7 NT QSU s7 57 R B
Skoda M29 NT AP6 NT AP6 58† A R S
Skoda M17 NT QSU NT QSU 59† A R S C
Skoda M28(80) T T 60† S C
Skoda M14/19 NT s8 NT s8 61† A† R H S C
leFH 18(g) NT H4[3+] s5 NT H4 s5 62† E H S B
Skoda M35 NT AP7 C7[CS]† NT AP7 63† R S C
G obr. 10/30 NT h-d s7 NT h-d s7 64† R B
G obr. 38 NT s5[1-2R]† NT 65 R B
Skoda M14 NT NT 66† R H S
Skoda M15/16 NT no IF s6 NT no IF s6 67† S C
C mle 17 S NT s7 NT s7 68† R B
Mitrailleuse de 13.2 CAJ mle 30 T 2 TK DR† T 2 TK DR† 69† T†<sup>1</sup> R B
Oerlikon FF T LF [NT, 20†, 2 ROF, B11] T LF [NT, 20†, 2 ROF, B11] 70 G† R H S C B
2cm FlaK 30(g) T LF [NT, 20†[1], 2 ROF, B9] T LF [NT, 20†[1], 2 ROF, B9] 71† E G†<sup>1</sup> R B
2cm FlaK 38(g) T LF [NT, 20†[1], 2 ROF, B10] T LF [NT, 20†[1], 2 ROF, B10] 72† E G†<sup>1</sup> R B
3.7cm FlaK 36(g) T T 73† E R B
Bofors 40mm T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 74† G†<sup>1</sup> R H S C
Skoda M33 T T 75R S
8.8cm FlaK 18 o. 36(g) T LF [88†[1], 1 ROF, B11] T LF [88†[1], 1 ROF, B11] 76† E G†<sup>1</sup> R S B
Name Capabilities (effective) # Notes Comments
------------------------------- --------------------------- --------------------------- --- ---------------------- -------------
5cm leGrW 36 5PP 5PP 44 A H S C B
50mm RM obr. 40 4PP 4PP 45 A R H S C
8cm GrW 34 QSU IR s7 QSU IR s7 46† A C B
Brandt M27/31 QSU s7 QSU s7 47† A R H S
PM obr. 38 QSU h-d s8 QSU h-d s8 48† R H
Ur wz. 35 1PP 1PP 49 R H S C B
s18-1100 5PP 5PP 50 A R H
Kanon PUV vz. 37(t) QSU A4[1S] QSU 51† E H S B
Bohler M35 QSU QSU 52† A R H S No Gunshield.
5cm PaK 38(g) QSU A4[3]3[4] QSU A3 53† E R H S B
7.5cm PaK 97/38(g) QSU H5[3+] s6 QSU H5 s6 54† E R B
7.5cm PaK 40(g) QSU A4[3]3[4] QSU A3 55† E R H S B
Skoda M15 QSU QSU 56† A R H S C B
Canon de 75 mle 1897 QSU s7 QSU s7 57 R B
Skoda M29 AP6 AP6 58† A R S
Skoda M17 QSU QSU 59† A R S C
Skoda M28(80) 60† S C
Skoda M14/19 s8 s8 61† A† R H S C
leFH 18(g) H4[3+] s5 H4 s5 62† E H S B
Skoda M35 AP7 C7[CS]† AP7 63† R S C
G obr. 10/30 h-d s7 h-d s7 64† R B
G obr. 38 s5[1-2R]† 65 R B
Skoda M14 66† R H S
Skoda M15/16 s6 s6 67† S C No IF.
C mle 17 S s7 s7 68† R B
Mitrailleuse de 13.2 CAJ mle 30 2 TK DR† 2 TK DR† 69† T†<sup>1</sup> R B
Oerlikon FF LF [NT, 20†, 2 ROF, B11] LF [NT, 20†, 2 ROF, B11] 70 G† R H S C B
2cm FlaK 30(g) LF [NT, 20†[1], 2 ROF, B9] LF [NT, 20†[1], 2 ROF, B9] 71† E G†<sup>1</sup> R B
2cm FlaK 38(g) LF [NT, 20†[1], 2 ROF, B10] LF [NT, 20†[1], 2 ROF, B10] 72† E G†<sup>1</sup> R B
3.7cm FlaK 36(g) 73† E R B
Bofors 40mm LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 74† G†<sup>1</sup> R H S C
Skoda M33 75R S
8.8cm FlaK 18 o. 36(g) LF [88†[1], 1 ROF, B11] LF [88†[1], 1 ROF, B11] 76† E G†<sup>1</sup> R S B

@ -1,37 +1,37 @@
=== ordnance/axis-minor-common/1945 ===
Name Capabilities (effective) # Notes
------------------------------- ----------------------------- ----------------------------- --- ----------------------
5cm leGrW 36 5PP 5PP 44 A H S C B
50mm RM obr. 40 4PP 4PP 45 A R H S C
8cm GrW 34 NT QSU IR s7 NT QSU IR s7 46† A C B
Brandt M27/31 NT QSU s7 NT QSU s7 47† A R H S
PM obr. 38 NT QSU h-d s8 NT QSU h-d s8 48† R H
Ur wz. 35 1PP 1PP 49 R H S C B
s18-1100 5PP 5PP 50 A R H
Kanon PUV vz. 37(t) NT QSU A4[1S] NT QSU 51† E H S B
Bohler M35 NT QSU no Gunshield NT QSU no Gunshield 52† A R H S
5cm PaK 38(g) NT QSU A4[3]3[4] NT QSU A3 53† E R H S B
7.5cm PaK 97/38(g) NT QSU H5[3+] s6 NT QSU H5 s6 54† E R B
7.5cm PaK 40(g) NT QSU A4[3]3[4] NT QSU A3 55† E R H S B
Skoda M15 NT QSU NT QSU 56† A R H S C B
Canon de 75 mle 1897 NT QSU s7 NT QSU s7 57 R B
Skoda M29 NT AP6 NT AP6 58† A R S
Skoda M17 NT QSU NT QSU 59† A R S C
Skoda M28(80) T T 60† S C
Skoda M14/19 NT s8 NT s8 61† A† R H S C
leFH 18(g) NT H4[3+] s5 NT H4 s5 62† E H S B
Skoda M35 NT AP7 C7[CS]† NT AP7 63† R S C
G obr. 10/30 NT h-d s7 NT h-d s7 64† R B
G obr. 38 NT s5[1-2R]† NT 65 R B
Skoda M14 NT NT 66† R H S
Skoda M15/16 NT no IF s6 NT no IF s6 67† S C
C mle 17 S NT s7 NT s7 68† R B
Mitrailleuse de 13.2 CAJ mle 30 T 2 TK DR† T 2 TK DR† 69† T†<sup>1</sup> R B
Oerlikon FF T LF [NT, 20†, 2 ROF, B11] T LF [NT, 20†, 2 ROF, B11] 70 G† R H S C B
2cm FlaK 30(g) T LF [NT, 20†[1], 2 ROF, B9] T LF [NT, 20†[1], 2 ROF, B9] 71† E G†<sup>1</sup> R B
2cm FlaK 38(g) T LF [NT, 20†[1], 2 ROF, B10] T LF [NT, 20†[1], 2 ROF, B10] 72† E G†<sup>1</sup> R B
3.7cm FlaK 36(g) T T 73† E R B
Bofors 40mm T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 74† G†<sup>1</sup> R H S C
Skoda M33 T T 75R S
8.8cm FlaK 18 o. 36(g) T LF [88†[1], 1 ROF, B11] T LF [88†[1], 1 ROF, B11] 76† E G†<sup>1</sup> R S B
Name Capabilities (effective) # Notes Comments
------------------------------- --------------------------- --------------------------- --- ---------------------- -------------
5cm leGrW 36 5PP 5PP 44 A H S C B
50mm RM obr. 40 4PP 4PP 45 A R H S C
8cm GrW 34 QSU IR s7 QSU IR s7 46† A C B
Brandt M27/31 QSU s7 QSU s7 47† A R H S
PM obr. 38 QSU h-d s8 QSU h-d s8 48† R H
Ur wz. 35 1PP 1PP 49 R H S C B
s18-1100 5PP 5PP 50 A R H
Kanon PUV vz. 37(t) QSU A4[1S] QSU 51† E H S B
Bohler M35 QSU QSU 52† A R H S No Gunshield.
5cm PaK 38(g) QSU A4[3]3[4] QSU A3 53† E R H S B
7.5cm PaK 97/38(g) QSU H5[3+] s6 QSU H5 s6 54† E R B
7.5cm PaK 40(g) QSU A4[3]3[4] QSU A3 55† E R H S B
Skoda M15 QSU QSU 56† A R H S C B
Canon de 75 mle 1897 QSU s7 QSU s7 57 R B
Skoda M29 AP6 AP6 58† A R S
Skoda M17 QSU QSU 59† A R S C
Skoda M28(80) 60† S C
Skoda M14/19 s8 s8 61† A† R H S C
leFH 18(g) H4[3+] s5 H4 s5 62† E H S B
Skoda M35 AP7 C7[CS]† AP7 63† R S C
G obr. 10/30 h-d s7 h-d s7 64† R B
G obr. 38 s5[1-2R]† 65 R B
Skoda M14 66† R H S
Skoda M15/16 s6 s6 67† S C No IF.
C mle 17 S s7 s7 68† R B
Mitrailleuse de 13.2 CAJ mle 30 2 TK DR† 2 TK DR† 69† T†<sup>1</sup> R B
Oerlikon FF LF [NT, 20†, 2 ROF, B11] LF [NT, 20†, 2 ROF, B11] 70 G† R H S C B
2cm FlaK 30(g) LF [NT, 20†[1], 2 ROF, B9] LF [NT, 20†[1], 2 ROF, B9] 71† E G†<sup>1</sup> R B
2cm FlaK 38(g) LF [NT, 20†[1], 2 ROF, B10] LF [NT, 20†[1], 2 ROF, B10] 72† E G†<sup>1</sup> R B
3.7cm FlaK 36(g) 73† E R B
Bofors 40mm LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 74† G†<sup>1</sup> R H S C
Skoda M33 75R S
8.8cm FlaK 18 o. 36(g) LF [88†[1], 1 ROF, B11] LF [88†[1], 1 ROF, B11] 76† E G†<sup>1</sup> R S B

@ -1,14 +1,14 @@
=== ordnance/belgian/1940 ===
Name Capabilities (effective) # Notes
------------ ------------------- ------------------- --- -------
DBT 3PP 3PP 6† A B D
M76 A NT h-d LF† [INF] NT h-d LF† [INF] 7† A B D
M76 A NT h-d LF† [INF] NT h-d LF† [INF] 7† A B D
7.6cm FRC NT QSU † NT QSU † 8† A B
C47 FRC M 32 NT QSU NT QSU 9 B
C75 TR NT QSU h-d s5 NT QSU h-d s5 10 B
C75 GP NT LF [75*, B10] s5 NT LF [75*, B10] s5 11 B
Ob 105 GP NT LF [105*] s5 NT LF [105*] s5 12 B
C120 M31 NT LF [120*] NT LF [120*] 13 B
M27 FRC NM ST NM ST 14 B
Name Capabilities (effective) # Notes Comments
------------ ---------------- ---------------- --- ------- ----------
DBT 3PP 3PP 6† A B D
M76 A h-d LF† [INF] h-d LF† [INF] 7† A B D
M76 A h-d LF† [INF] h-d LF† [INF] 7† A B D
7.6cm FRC QSU QSU 8† A B †
C47 FRC M 32 QSU QSU 9 B
C75 TR QSU h-d s5 QSU h-d s5 10 B
C75 GP LF [75*, B10] s5 LF [75*, B10] s5 11 B
Ob 105 GP LF [105*] s5 LF [105*] s5 12 B
C120 M31 LF [120*] LF [120*] 13 B
M27 FRC NM NM 14 B

@ -1,14 +1,14 @@
=== ordnance/belgian/1941 ===
Name Capabilities (effective) # Notes
------------ ------------------- ------------------- --- -------
DBT 3PP 3PP 6† A B D
M76 A NT h-d LF† [INF] NT h-d LF† [INF] 7† A B D
M76 A NT h-d LF† [INF] NT h-d LF† [INF] 7† A B D
7.6cm FRC NT QSU † NT QSU † 8† A B
C47 FRC M 32 NT QSU NT QSU 9 B
C75 TR NT QSU h-d s5 NT QSU h-d s5 10 B
C75 GP NT LF [75*, B10] s5 NT LF [75*, B10] s5 11 B
Ob 105 GP NT LF [105*] s5 NT LF [105*] s5 12 B
C120 M31 NT LF [120*] NT LF [120*] 13 B
M27 FRC NM ST NM ST 14 B
Name Capabilities (effective) # Notes Comments
------------ ---------------- ---------------- --- ------- ----------
DBT 3PP 3PP 6† A B D
M76 A h-d LF† [INF] h-d LF† [INF] 7† A B D
M76 A h-d LF† [INF] h-d LF† [INF] 7† A B D
7.6cm FRC QSU QSU 8† A B †
C47 FRC M 32 QSU QSU 9 B
C75 TR QSU h-d s5 QSU h-d s5 10 B
C75 GP LF [75*, B10] s5 LF [75*, B10] s5 11 B
Ob 105 GP LF [105*] s5 LF [105*] s5 12 B
C120 M31 LF [120*] LF [120*] 13 B
M27 FRC NM NM 14 B

@ -1,14 +1,14 @@
=== ordnance/belgian/1942 ===
Name Capabilities (effective) # Notes
------------ ------------------- ------------------- --- -------
DBT 3PP 3PP 6† A B D
M76 A NT h-d LF† [INF] NT h-d LF† [INF] 7† A B D
M76 A NT h-d LF† [INF] NT h-d LF† [INF] 7† A B D
7.6cm FRC NT QSU † NT QSU † 8† A B
C47 FRC M 32 NT QSU NT QSU 9 B
C75 TR NT QSU h-d s5 NT QSU h-d s5 10 B
C75 GP NT LF [75*, B10] s5 NT LF [75*, B10] s5 11 B
Ob 105 GP NT LF [105*] s5 NT LF [105*] s5 12 B
C120 M31 NT LF [120*] NT LF [120*] 13 B
M27 FRC NM ST NM ST 14 B
Name Capabilities (effective) # Notes Comments
------------ ---------------- ---------------- --- ------- ----------
DBT 3PP 3PP 6† A B D
M76 A h-d LF† [INF] h-d LF† [INF] 7† A B D
M76 A h-d LF† [INF] h-d LF† [INF] 7† A B D
7.6cm FRC QSU QSU 8† A B †
C47 FRC M 32 QSU QSU 9 B
C75 TR QSU h-d s5 QSU h-d s5 10 B
C75 GP LF [75*, B10] s5 LF [75*, B10] s5 11 B
Ob 105 GP LF [105*] s5 LF [105*] s5 12 B
C120 M31 LF [120*] LF [120*] 13 B
M27 FRC NM NM 14 B

@ -1,14 +1,14 @@
=== ordnance/belgian/1943 ===
Name Capabilities (effective) # Notes
------------ ------------------- ------------------- --- -------
DBT 3PP 3PP 6† A B D
M76 A NT h-d LF† [INF] NT h-d LF† [INF] 7† A B D
M76 A NT h-d LF† [INF] NT h-d LF† [INF] 7† A B D
7.6cm FRC NT QSU † NT QSU † 8† A B
C47 FRC M 32 NT QSU NT QSU 9 B
C75 TR NT QSU h-d s5 NT QSU h-d s5 10 B
C75 GP NT LF [75*, B10] s5 NT LF [75*, B10] s5 11 B
Ob 105 GP NT LF [105*] s5 NT LF [105*] s5 12 B
C120 M31 NT LF [120*] NT LF [120*] 13 B
M27 FRC NM ST NM ST 14 B
Name Capabilities (effective) # Notes Comments
------------ ---------------- ---------------- --- ------- ----------
DBT 3PP 3PP 6† A B D
M76 A h-d LF† [INF] h-d LF† [INF] 7† A B D
M76 A h-d LF† [INF] h-d LF† [INF] 7† A B D
7.6cm FRC QSU QSU 8† A B †
C47 FRC M 32 QSU QSU 9 B
C75 TR QSU h-d s5 QSU h-d s5 10 B
C75 GP LF [75*, B10] s5 LF [75*, B10] s5 11 B
Ob 105 GP LF [105*] s5 LF [105*] s5 12 B
C120 M31 LF [120*] LF [120*] 13 B
M27 FRC NM NM 14 B

@ -1,14 +1,14 @@
=== ordnance/belgian/1944 ===
Name Capabilities (effective) # Notes
------------ ------------------- ------------------- --- -------
DBT 3PP 3PP 6† A B D
M76 A NT h-d LF† [INF] NT h-d LF† [INF] 7† A B D
M76 A NT h-d LF† [INF] NT h-d LF† [INF] 7† A B D
7.6cm FRC NT QSU † NT QSU † 8† A B
C47 FRC M 32 NT QSU NT QSU 9 B
C75 TR NT QSU h-d s5 NT QSU h-d s5 10 B
C75 GP NT LF [75*, B10] s5 NT LF [75*, B10] s5 11 B
Ob 105 GP NT LF [105*] s5 NT LF [105*] s5 12 B
C120 M31 NT LF [120*] NT LF [120*] 13 B
M27 FRC NM ST NM ST 14 B
Name Capabilities (effective) # Notes Comments
------------ ---------------- ---------------- --- ------- ----------
DBT 3PP 3PP 6† A B D
M76 A h-d LF† [INF] h-d LF† [INF] 7† A B D
M76 A h-d LF† [INF] h-d LF† [INF] 7† A B D
7.6cm FRC QSU QSU 8† A B †
C47 FRC M 32 QSU QSU 9 B
C75 TR QSU h-d s5 QSU h-d s5 10 B
C75 GP LF [75*, B10] s5 LF [75*, B10] s5 11 B
Ob 105 GP LF [105*] s5 LF [105*] s5 12 B
C120 M31 LF [120*] LF [120*] 13 B
M27 FRC NM NM 14 B

@ -1,14 +1,14 @@
=== ordnance/belgian/1945 ===
Name Capabilities (effective) # Notes
------------ ------------------- ------------------- --- -------
DBT 3PP 3PP 6† A B D
M76 A NT h-d LF† [INF] NT h-d LF† [INF] 7† A B D
M76 A NT h-d LF† [INF] NT h-d LF† [INF] 7† A B D
7.6cm FRC NT QSU † NT QSU † 8† A B
C47 FRC M 32 NT QSU NT QSU 9 B
C75 TR NT QSU h-d s5 NT QSU h-d s5 10 B
C75 GP NT LF [75*, B10] s5 NT LF [75*, B10] s5 11 B
Ob 105 GP NT LF [105*] s5 NT LF [105*] s5 12 B
C120 M31 NT LF [120*] NT LF [120*] 13 B
M27 FRC NM ST NM ST 14 B
Name Capabilities (effective) # Notes Comments
------------ ---------------- ---------------- --- ------- ----------
DBT 3PP 3PP 6† A B D
M76 A h-d LF† [INF] h-d LF† [INF] 7† A B D
M76 A h-d LF† [INF] h-d LF† [INF] 7† A B D
7.6cm FRC QSU QSU 8† A B †
C47 FRC M 32 QSU QSU 9 B
C75 TR QSU h-d s5 QSU h-d s5 10 B
C75 GP LF [75*, B10] s5 LF [75*, B10] s5 11 B
Ob 105 GP LF [105*] s5 LF [105*] s5 12 B
C120 M31 LF [120*] LF [120*] 13 B
M27 FRC NM NM 14 B

@ -1,29 +1,29 @@
=== ordnance/british/1940 ===
Name Capabilities (effective) # Notes
--------------------------- --------------------------------- ----------------------------- --- --------------------
OML 2-in. Mortar 4PP IR[2+]† s7 4PP s7 1 A† N P
OML 2-in. Airborne Mortar IR s7 3PP IR s7 3PP 1 n/a
OML 3-in. Mortar NT QSU IR[2+]†[1] WP7 s8[1+]† NT QSU WP7 2† A†<sup>1</sup> D N P
OSB 4.2-in. Mortar NT WP7 s8 Towed† NT WP7 s8 Towed† 3† N P
OQF 25mm Hotchkiss NT QSU NT QSU 4† B N
OQF 2-Pounder T LF [NT, 40†[1], 2 ROF, B11] T LF [NT, 40†[1], 2 ROF, B11] 5† B C†<sup>1</sup> N P
OQF 6-Pounder 7-cwt NT QSU D6[J4E]7[5]† HE7[F3]8[4+]† NT QSU 6† B N P
OQF 17/25-Pounder NT NT 7 N
OQF 17-Pounder NT D5[S4]6[5]† HE8[J4+]† NT 8† n/a
OQF M1A1 75mm Pack Howitzer NT QSU H6 WP7 NT QSU H6 WP7 9† D P
Canon de 75 mle 1897 NT QSU s8 NT QSU s8 10† B N
OQF 18-Pounder NT QSU WP7 s8 NT QSU WP7 s8 11† N P
OQF 25-Pounder Short NT QSU s8 NT QSU s8 12 D P
OQF 25-Pounder Gun-Howitzer LF [NT, 0 ROF] s8 ST LF [NT, 0 ROF] s8 ST 13† N P
OQF 3.7-in. Howitzer NT QSU H6[3+P]† WP7 s8 NT QSU WP7 s8 14† D N P
OQF 4.5-in. Howitzer NT WP7 s8 NT WP7 s8 15† N P
OBL 4.5-in. Gun NT NT 16† N
OBL 5.5-in. Gun-Howitzer NT NT 16† N P
OBL 6-in. Howitzer NT NT 17† N P
OBL 7.2-in. Howitzer Mk I NT no IF Acq. NA† NT no IF Acq. NA† 18† N P
OBL 7.2-in. Howitzer Mk VI NT RFNM no IF NT RFNM no IF 19† P
OQF 20mm AA T T 20 n/a
OQF 40mm AA T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 21† C†<sup>1</sup> N P
OQF 3-in. 20-cwt AA T T 22† E P
OQF 3.7-in. AA T T 23† E N P
Name Capabilities (effective) # Notes Comments
--------------------------- ------------------------------ --------------------------- --- -------------------- ---------------
OML 2-in. Mortar 4PP IR[2+]† s7 4PP s7 1 A† N P
OML 2-in. Airborne Mortar IR s7 3PP IR s7 3PP 1 n/a
OML 3-in. Mortar QSU IR[2+]†[1] WP7 s8[1+]† QSU WP7 2† A†<sup>1</sup> D N P
OSB 4.2-in. Mortar WP7 s8 WP7 s8 3† N P Towed†
OQF 25mm Hotchkiss QSU QSU 4† B N
OQF 2-Pounder LF [NT, 40†[1], 2 ROF, B11] LF [NT, 40†[1], 2 ROF, B11] 5† B C†<sup>1</sup> N P
OQF 6-Pounder 7-cwt QSU D6[J4E]7[5]† HE7[F3]8[4+]† QSU 6† B N P
OQF 17/25-Pounder 7 N
OQF 17-Pounder D5[S4]6[5]† HE8[J4+]† 8† n/a
OQF M1A1 75mm Pack Howitzer QSU H6 WP7 QSU H6 WP7 9† D P
Canon de 75 mle 1897 QSU s8 QSU s8 10† B N
OQF 18-Pounder QSU WP7 s8 QSU WP7 s8 11† N P
OQF 25-Pounder Short QSU s8 QSU s8 12 D P
OQF 25-Pounder Gun-Howitzer LF [NT, 0 ROF] s8 LF [NT, 0 ROF] s8 13† N P
OQF 3.7-in. Howitzer QSU H6[3+P]† WP7 s8 QSU WP7 s8 14† D N P
OQF 4.5-in. Howitzer WP7 s8 WP7 s8 15† N P
OBL 4.5-in. Gun 16† N
OBL 5.5-in. Gun-Howitzer 16† N P
OBL 6-in. Howitzer 17† N P
OBL 7.2-in. Howitzer Mk I 18† N P No IF. Acq. NA†
OBL 7.2-in. Howitzer Mk VI RFNM RFNM 19† P No IF.
OQF 20mm AA 20 n/a
OQF 40mm AA LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 21† C†<sup>1</sup> N P
OQF 3-in. 20-cwt AA 22† E P
OQF 3.7-in. AA 23† E N P

@ -1,29 +1,29 @@
=== ordnance/british/1941 ===
Name Capabilities (effective) # Notes
--------------------------- --------------------------------- ----------------------------- --- --------------------
OML 2-in. Mortar 4PP IR[2+]† s7 4PP s7 1 A† N P
OML 2-in. Airborne Mortar IR s7 3PP IR s7 3PP 1 n/a
OML 3-in. Mortar NT QSU IR[2+]†[1] WP7 s8[1+]† NT QSU WP7 s8† 2† A†<sup>1</sup> D N P
OSB 4.2-in. Mortar NT WP7 s8 Towed† NT WP7 s8 Towed† 3† N P
OQF 25mm Hotchkiss NT QSU NT QSU 4† B N
OQF 2-Pounder T LF [NT, 40†[1], 2 ROF, B11] T LF [NT, 40†[1], 2 ROF, B11] 5† B C†<sup>1</sup> N P
OQF 6-Pounder 7-cwt NT QSU D6[J4E]7[5]† HE7[F3]8[4+]† NT QSU 6† B N P
OQF 17/25-Pounder NT NT 7 N
OQF 17-Pounder NT D5[S4]6[5]† HE8[J4+]† NT 8† n/a
OQF M1A1 75mm Pack Howitzer NT QSU H6 WP7 NT QSU H6 WP7 9† D P
Canon de 75 mle 1897 NT QSU s8 NT QSU s8 10† B N
OQF 18-Pounder NT QSU WP7 s8 NT QSU WP7 s8 11† N P
OQF 25-Pounder Short NT QSU s8 NT QSU s8 12 D P
OQF 25-Pounder Gun-Howitzer LF [NT, 0 ROF] s8 ST LF [NT, 0 ROF] s8 ST 13† N P
OQF 3.7-in. Howitzer NT QSU H6[3+P]† WP7 s8 NT QSU WP7 s8 14† D N P
OQF 4.5-in. Howitzer NT WP7 s8 NT WP7 s8 15† N P
OBL 4.5-in. Gun NT NT 16† N
OBL 5.5-in. Gun-Howitzer NT NT 16† N P
OBL 6-in. Howitzer NT NT 17† N P
OBL 7.2-in. Howitzer Mk I NT no IF Acq. NA† NT no IF Acq. NA† 18† N P
OBL 7.2-in. Howitzer Mk VI NT RFNM no IF NT RFNM no IF 19† P
OQF 20mm AA T T 20 n/a
OQF 40mm AA T LF [40†[1], 2 ROF] T LF [40†[1], 2 ROF] 21† C†<sup>1</sup> N P
OQF 3-in. 20-cwt AA T T 22† E P
OQF 3.7-in. AA T T 23† E N P
Name Capabilities (effective) # Notes Comments
--------------------------- ------------------------------ --------------------------- --- -------------------- ---------------
OML 2-in. Mortar 4PP IR[2+]† s7 4PP s7 1 A† N P
OML 2-in. Airborne Mortar IR s7 3PP IR s7 3PP 1 n/a
OML 3-in. Mortar QSU IR[2+]†[1] WP7 s8[1+]† QSU WP7 s8† 2† A†<sup>1</sup> D N P
OSB 4.2-in. Mortar WP7 s8 WP7 s8 3† N P Towed†
OQF 25mm Hotchkiss QSU QSU 4† B N
OQF 2-Pounder LF [NT, 40†[1], 2 ROF, B11] LF [NT, 40†[1], 2 ROF, B11] 5† B C†<sup>1</sup> N P
OQF 6-Pounder 7-cwt QSU D6[J4E]7[5]† HE7[F3]8[4+]† QSU 6† B N P
OQF 17/25-Pounder 7 N
OQF 17-Pounder D5[S4]6[5]† HE8[J4+]† 8† n/a
OQF M1A1 75mm Pack Howitzer QSU H6 WP7 QSU H6 WP7 9† D P
Canon de 75 mle 1897 QSU s8 QSU s8 10† B N
OQF 18-Pounder QSU WP7 s8 QSU WP7 s8 11† N P
OQF 25-Pounder Short QSU s8 QSU s8 12 D P
OQF 25-Pounder Gun-Howitzer LF [NT, 0 ROF] s8 LF [NT, 0 ROF] s8 13† N P
OQF 3.7-in. Howitzer QSU H6[3+P]† WP7 s8 QSU WP7 s8 14† D N P
OQF 4.5-in. Howitzer WP7 s8 WP7 s8 15† N P
OBL 4.5-in. Gun 16† N
OBL 5.5-in. Gun-Howitzer 16† N P
OBL 6-in. Howitzer 17† N P
OBL 7.2-in. Howitzer Mk I 18† N P No IF. Acq. NA†
OBL 7.2-in. Howitzer Mk VI RFNM RFNM 19† P No IF.
OQF 20mm AA 20 n/a
OQF 40mm AA LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 21† C†<sup>1</sup> N P
OQF 3-in. 20-cwt AA 22† E P
OQF 3.7-in. AA 23† E N P

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save