Show VASL counter images in the UI.

master
Pacman Ghost 6 years ago
parent 12fb0b274f
commit 7780574717
  1. 3
      .pylintrc
  2. 6
      conftest.py
  3. 23
      vasl_templates/webapp/__init__.py
  4. 1
      vasl_templates/webapp/config/.gitignore
  5. 4
      vasl_templates/webapp/config/site.cfg.example
  6. 15
      vasl_templates/webapp/data/expected-multiple-images.json
  7. 30
      vasl_templates/webapp/data/ordnance/allied-minor/belgian.json
  8. 42
      vasl_templates/webapp/data/ordnance/allied-minor/common.json
  9. 3
      vasl_templates/webapp/data/ordnance/allied-minor/danish.json
  10. 3
      vasl_templates/webapp/data/ordnance/allied-minor/dutch.json
  11. 9
      vasl_templates/webapp/data/ordnance/allied-minor/greek.json
  12. 15
      vasl_templates/webapp/data/ordnance/allied-minor/polish.json
  13. 9
      vasl_templates/webapp/data/ordnance/allied-minor/yugoslavian.json
  14. 81
      vasl_templates/webapp/data/ordnance/american.json
  15. 24
      vasl_templates/webapp/data/ordnance/axis-minor/bulgarian.json
  16. 99
      vasl_templates/webapp/data/ordnance/axis-minor/common.json
  17. 6
      vasl_templates/webapp/data/ordnance/axis-minor/croatian.json
  18. 15
      vasl_templates/webapp/data/ordnance/axis-minor/hungarian.json
  19. 66
      vasl_templates/webapp/data/ordnance/axis-minor/romanian.json
  20. 21
      vasl_templates/webapp/data/ordnance/axis-minor/slovakian.json
  21. 75
      vasl_templates/webapp/data/ordnance/british.json
  22. 108
      vasl_templates/webapp/data/ordnance/chinese.json
  23. 117
      vasl_templates/webapp/data/ordnance/finnish.json
  24. 63
      vasl_templates/webapp/data/ordnance/french.json
  25. 90
      vasl_templates/webapp/data/ordnance/german.json
  26. 60
      vasl_templates/webapp/data/ordnance/italian.json
  27. 81
      vasl_templates/webapp/data/ordnance/japanese.json
  28. 87
      vasl_templates/webapp/data/ordnance/russian.json
  29. 104
      vasl_templates/webapp/data/vasl-overrides.json
  30. 15
      vasl_templates/webapp/data/vehicles/allied-minor/belgian.json
  31. 42
      vasl_templates/webapp/data/vehicles/allied-minor/common.json
  32. 3
      vasl_templates/webapp/data/vehicles/allied-minor/danish.json
  33. 21
      vasl_templates/webapp/data/vehicles/allied-minor/dutch.json
  34. 51
      vasl_templates/webapp/data/vehicles/allied-minor/polish.json
  35. 18
      vasl_templates/webapp/data/vehicles/allied-minor/yugoslavian.json
  36. 189
      vasl_templates/webapp/data/vehicles/american.json
  37. 3
      vasl_templates/webapp/data/vehicles/axis-minor/bulgarian.json
  38. 99
      vasl_templates/webapp/data/vehicles/axis-minor/common.json
  39. 18
      vasl_templates/webapp/data/vehicles/axis-minor/croatian.json
  40. 33
      vasl_templates/webapp/data/vehicles/axis-minor/hungarian.json
  41. 24
      vasl_templates/webapp/data/vehicles/axis-minor/romanian.json
  42. 21
      vasl_templates/webapp/data/vehicles/axis-minor/slovakian.json
  43. 381
      vasl_templates/webapp/data/vehicles/british.json
  44. 63
      vasl_templates/webapp/data/vehicles/chinese.json
  45. 96
      vasl_templates/webapp/data/vehicles/finnish.json
  46. 150
      vasl_templates/webapp/data/vehicles/french.json
  47. 360
      vasl_templates/webapp/data/vehicles/german.json
  48. 123
      vasl_templates/webapp/data/vehicles/italian.json
  49. 75
      vasl_templates/webapp/data/vehicles/japanese.json
  50. 27
      vasl_templates/webapp/data/vehicles/landing-craft.json
  51. 255
      vasl_templates/webapp/data/vehicles/russian.json
  52. 6
      vasl_templates/webapp/file_server/__init__.py
  53. 26
      vasl_templates/webapp/file_server/utils.py
  54. 200
      vasl_templates/webapp/file_server/vasl_mod.py
  55. 34
      vasl_templates/webapp/files.py
  56. 9
      vasl_templates/webapp/static/css/main.css
  57. 6
      vasl_templates/webapp/static/css/tabs-ob.css
  58. BIN
      vasl_templates/webapp/static/images/missing-image.png
  59. 1
      vasl_templates/webapp/static/select2/select2.min.css
  60. 1
      vasl_templates/webapp/static/select2/select2.min.js
  61. 2
      vasl_templates/webapp/static/utils.js
  62. 61
      vasl_templates/webapp/static/vo.js
  63. 5
      vasl_templates/webapp/templates/index.html
  64. 1207
      vasl_templates/webapp/tests/fixtures/vasl-pieces.txt
  65. 87
      vasl_templates/webapp/tests/test_counters.py
  66. 2
      vasl_templates/webapp/tests/test_dirty_scenario_checks.py
  67. 27
      vasl_templates/webapp/tests/test_vehicles_ordnance.py
  68. 2
      vasl_templates/webapp/tests/utils.py

@ -138,7 +138,8 @@ disable=print-statement,
bad-continuation,
invalid-name,
wrong-import-position,
global-statement
global-statement,
too-few-public-methods
# Enable the message, report, category or checker with the given id(s). You can
# either give multiple identifier separated by comma (,) or put this option

@ -43,6 +43,12 @@ def pytest_addoption( parser ):
"--short-tests", action="store_true", dest="short_tests", default=False,
help="Run a shorter version of the test suite."
)
# NOTE: Some tests require the VASL module file(s). We don't want to put these into source control,
# so we provide this option to allow the caller to specify where they live.
parser.addoption(
"--vasl-mods", action="store", dest="vasl_mods", default=None,
help="Directory containing the VASL .vmod file(s)."
)
# NOTE: It's not good to have the code run differently to how it will normally,
# but using the clipboard to retrieve snippets causes more trouble than it's worth :-/
# since any kind of clipboard activity while the tests are running could cause them to fail

@ -12,10 +12,18 @@ from vasl_templates.webapp.config.constants import APP_NAME, APP_VERSION, BASE_D
# ---------------------------------------------------------------------
def _load_config( fname, section ):
"""Load config settings from a file."""
if not os.path.isfile( fname ):
return
config_parser = configparser.ConfigParser()
config_parser.optionxform = str # preserve case for the keys :-/
config_parser.read( fname )
app.config.update( dict( config_parser.items( section) ) )
def load_debug_config( fname ):
"""Configure the application."""
config_parser.read( fname )
app.config.update( dict( config_parser.items( "Debug" ) ) )
_load_config( fname, "Debug" )
# ---------------------------------------------------------------------
@ -24,10 +32,12 @@ app = Flask( __name__ )
# load the application configuration
config_dir = os.path.join( BASE_DIR, "config" )
config_parser = configparser.ConfigParser()
config_parser.optionxform = str # preserve case for the keys :-/
config_parser.read( os.path.join( config_dir, "app.cfg" ) )
app.config.update( dict( config_parser.items( "System" ) ) )
_fname = os.path.join( config_dir, "app.cfg" )
_load_config( _fname, "System" )
# load any site configuration
_fname = os.path.join( config_dir, "site.cfg" )
_load_config( _fname, "Site Config" )
# load any debug configuration
_fname = os.path.join( config_dir, "debug.cfg" )
@ -47,6 +57,7 @@ else:
import vasl_templates.webapp.main #pylint: disable=cyclic-import
import vasl_templates.webapp.vo #pylint: disable=cyclic-import
import vasl_templates.webapp.snippets #pylint: disable=cyclic-import
import vasl_templates.webapp.files #pylint: disable=cyclic-import
# ---------------------------------------------------------------------

@ -1,2 +1,3 @@
site.cfg
debug.cfg
logging.yaml

@ -0,0 +1,4 @@
[Site Config]
; Enable VASL counter images in the UI by configuring a VASL .vmod file here.
VASL_MOD = ...

@ -0,0 +1,15 @@
{
"1555": {
"name": "2pdr Portee",
"front_images": [ "br/vehicles/portee", "br/vehicles/portee0" ],
"back_images": null
},
"2212": {
"name": "76* INF FRC",
"front_images": [ "al/gun/alINF76", "al/gun/alINF76u" ],
"back_images": "al/gun/alINF76b"
}
}

@ -3,60 +3,70 @@
{ "name": "DBT",
"capabilities_other": [ "3PP", "\u2020" ],
"note_number": "6\u2020",
"notes": [ "A", "B", "D" ]
"notes": [ "A", "B", "D" ],
"_gpid_": 2173
},
{ "name": "M76 A",
"capabilities": [ "NT", "h-d" ],
"capabilities2": { "LF": [ ["INF"], "\u2020" ] },
"note_number": "7\u2020",
"notes": [ "A", "B", "D" ]
"notes": [ "A", "B", "D" ],
"_gpid_": 2211
},
{ "name": "M76 A",
"capabilities": [ "NT", "h-d" ],
"capabilities2": { "LF": [ ["INF"], "\u2020" ] },
"note_number": "7\u2020",
"notes": [ "A", "B", "D" ]
"notes": [ "A", "B", "D" ],
"_gpid_": 2212
},
{ "name": "7.6cm FRC",
"capabilities": [ "NT", "QSU" ],
"capabilities_other": [ "\u2020" ],
"note_number": "8\u2020",
"notes": [ "A", "B" ]
"notes": [ "A", "B" ],
"_gpid_": 2212
},
{ "name": "C47 FRC M 32",
"capabilities": [ "NT", "QSU" ],
"note_number": "9",
"notes": [ "B" ]
"notes": [ "B" ],
"_gpid_": 2213
},
{ "name": "C75 TR",
"capabilities": [ "NT", "QSU", "h-d" ],
"capabilities2": { "s": 5 },
"note_number": "10",
"notes": [ "B" ]
"notes": [ "B" ],
"_gpid_": 2214
},
{ "name": "C75 GP",
"capabilities": [ "NT" ],
"capabilities2": { "LF": [ "75*", "B10" ], "s": 5 },
"note_number": "11",
"notes": [ "B" ]
"notes": [ "B" ],
"_gpid_": 2215
},
{ "name": "Ob 105 GP",
"capabilities": [ "NT" ],
"capabilities2": { "LF": [ "105*" ], "s": 5 },
"note_number": "12",
"notes": [ "B" ]
"notes": [ "B" ],
"_gpid_": 2216
},
{ "name": "C120 M31",
"capabilities": [ "NT" ],
"capabilities2": { "LF": [ "120*" ] },
"note_number": "13",
"notes": [ "B" ]
"notes": [ "B" ],
"_gpid_": 2217
},
{ "name": "M27 FRC",
"capabilities": [ "NM" ],
"capabilities_other": [ "ST" ],
"note_number": "14",
"notes": [ "B" ]
"notes": [ "B" ],
"_gpid_": 2218
}
]

@ -4,78 +4,92 @@
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "s": 8 },
"note_number": "23\u2020",
"notes": [ "A", "B", "Gr", "N", "P", "Y" ]
"notes": [ "A", "B", "Gr", "N", "P", "Y" ],
"_gpid_": 2193
},
{ "name": "37mm Bofors AT",
"capabilities": [ "NT", "QSU" ],
"note_number": "24\u2020",
"notes": [ "A", "De", "P" ]
"notes": [ "A", "De", "P" ],
"_gpid_": 2195
},
{ "name": "3.7cm PaK 35/36",
"capabilities": [ "NT", "QSU" ],
"note_number": "25\u2020",
"notes": [ "Gr", "Ne", "Y" ]
"notes": [ "Gr", "Ne", "Y" ],
"_gpid_": 2196
},
{ "name": "Bohler M35 47mm",
"capabilities": [ "NT", "QSU" ],
"note_number": "26\u2020",
"notes": [ "A", "Gr", "Ne", "Y" ]
"notes": [ "A", "Gr", "Ne", "Y" ],
"_gpid_": 2197
},
{ "name": "65mm wz.06",
"capabilities": [ "NT", "QSU", "no Gunshield", "h-d" ],
"note_number": "27\u2020",
"notes": [ "A", "Gr", "P", "Y" ]
"notes": [ "A", "Gr", "P", "Y" ],
"_gpid_": 2198
},
{ "name": "75mm wz.97",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "s": 8 },
"note_number": "28\u2020",
"notes": [ "A", "Gr", "N", "P" ]
"notes": [ "A", "Gr", "N", "P" ],
"_gpid_": 2199
},
{ "name": "Bofors M34",
"capabilities": [ "NT", "QSU" ],
"note_number": "29\u2020",
"notes": [ "A", "B", "Gr", "Ne", "N" ]
"notes": [ "A", "B", "Gr", "Ne", "N" ],
"_gpid_": 2200
},
{ "name": "75M 19S",
"capabilities": [ "NT", "QSU", "h-d" ],
"capabilities2": { "s": 6, "AP": 5 },
"note_number": "30\u2020",
"notes": [ "A", "Gr", "P", "Y" ]
"notes": [ "A", "Gr", "P", "Y" ],
"_gpid_": 2201
},
{ "name": "C105 L 13 S",
"capabilities": [ "NT" ],
"note_number": "31\u2020",
"notes": [ "B", "P", "Y" ]
"notes": [ "B", "P", "Y" ],
"_gpid_": 2202
},
{ "name": "120mm wz. 09/31",
"capabilities": [ "NT", "h-d" ],
"capabilities2": { "s": 6 },
"note_number": "32\u2020",
"notes": [ "N", "P" ]
"notes": [ "N", "P" ],
"_gpid_": 2203
},
{ "name": "155mm 17 S",
"capabilities": [ "NT" ],
"capabilities2": { "s": 8 },
"note_number": "33",
"notes": [ "B", "Gr", "P", "Y" ]
"notes": [ "B", "Gr", "P", "Y" ],
"_gpid_": 2204
},
{ "name": "Mitrailleuse de 13.2 CAJ mle 30",
"capabilities": [ "T", "2 TK DR\u2020", "Towing NA\u2020<sup>1</sup>" ],
"note_number": "34\u2020",
"notes": [ "T\u2020<sup>1</sup>", "B", "Gr", "Y" ]
"notes": [ "T\u2020<sup>1</sup>", "B", "Gr", "Y" ],
"_gpid_": 2205
},
{ "name": "20mm Oerlikon",
"capabilities": [ "T" ],
"capabilities2": { "LF": [ "NT", "20\u2020<sup>1</sup>", "2 ROF", "B11" ] },
"note_number": "35\u2020",
"notes": [ "C\u2020<sup>1</sup>", "Gr", "Ne", "Y" ]
"notes": [ "C\u2020<sup>1</sup>", "Gr", "Ne", "Y" ],
"_gpid_": 2206
},
{ "name": "40mm Bofors AA",
"capabilities": [ "T" ],
"capabilities2": { "LF": [ "40\u2020<sup>1</sup>", "2 ROF" ] },
"note_number": "36\u2020",
"notes": [ "C\u2020<sup>1</sup>", "B", "N", "Ne", "P" ]
"notes": [ "C\u2020<sup>1</sup>", "B", "N", "Ne", "P" ],
"_gpid_": 2207
}
]

@ -3,7 +3,8 @@
{ "name": "Machinecannon 20mm M-35",
"capabilities": [ "NT", "QSU\u2020<sup>1</sup>", "R2", "IFE=B10" ],
"note_number": "19\u2020",
"notes": [ "De", "T\u2020<sup>1</sup>" ]
"notes": [ "De", "T\u2020<sup>1</sup>" ],
"_gpid_": 2222
}
]

@ -3,7 +3,8 @@
{ "name": "Solothurn s/18-1100",
"capabilities_other": [ "5PP" ],
"note_number": "15",
"notes": [ "A", "Ne" ]
"notes": [ "A", "Ne" ],
"_gpid_": 2179
}
]

@ -4,17 +4,20 @@
"capabilities": [ "NT" ],
"capabilities2": { "s": 5 },
"note_number": "16",
"notes": [ "Gr" ]
"notes": [ "Gr" ],
"_gpid_": 2219
},
{ "name": "OR 105/19",
"capabilities": [ "NT", "h-d" ],
"note_number": "17",
"notes": [ "Gr" ]
"notes": [ "Gr" ],
"_gpid_": 2220
},
{ "name": "3.7cm Bofors AA",
"capabilities": [ "T" ],
"note_number": "18",
"notes": [ "Gr" ]
"notes": [ "Gr" ],
"_gpid_": 2221
}
]

@ -3,28 +3,33 @@
{ "name": "46mm granatnik wz. 36",
"capabilities_other": [ "4PP" ],
"note_number": "1",
"notes": [ "A", "P" ]
"notes": [ "A", "P" ],
"_gpid_": 2172
},
{ "name": "Ur. wz. 35",
"capabilities_other": [ "1PP" ],
"note_number": "2",
"notes": [ "P" ]
"notes": [ "P" ],
"_gpid_": 2176
},
{ "name": "75mm wz. 02/26",
"capabilities": [ "NT", "QSU", "h-d" ],
"capabilities2": { "s": 6 },
"note_number": "3",
"notes": [ "P" ]
"notes": [ "P" ],
"_gpid_": 2208
},
{ "name": "100mm wz. 14/19",
"capabilities": [ "NT" ],
"note_number": "4",
"notes": [ "A", "P" ]
"notes": [ "A", "P" ],
"_gpid_": 2209
},
{ "name": "75mm wz. 97/25",
"capabilities": [ "T", "NM" ],
"note_number": "5\u2020",
"notes": [ "P" ]
"notes": [ "P" ],
"_gpid_": 2210
}
]

@ -3,18 +3,21 @@
{ "name": "3.7cm Infantry Gun",
"capabilities": [ "NT", "QSU", "h-d" ],
"note_number": "20",
"notes": [ "Y" ]
"notes": [ "Y" ],
"_gpid_": 2223
},
{ "name": "80mm M28/M33",
"capabilities": [ "NT", "h-d" ],
"capabilities2": { "s": 5 },
"note_number": "21",
"notes": [ "Y" ]
"notes": [ "Y" ],
"_gpid_": 2224
},
{ "name": "100mm M14/19",
"capabilities": [ "NT" ],
"note_number": "22",
"notes": [ "Y" ]
"notes": [ "Y" ],
"_gpid_": 2225
}
]

@ -5,155 +5,182 @@
"capabilities2": { "WP": [ [7,5] ] },
"capabilities_other": [ "5PP", "OBA\u2020" ],
"note_number": "1\u2020",
"notes": [ "F", "N" ]
"notes": [ "F", "N" ],
"_gpid_": 849
},
{ "name": "M19 60mm Mortar",
"capabilities": [ "IR" ],
"capabilities2": { "WP": [ [6,5] ] },
"capabilities_other": [ "4PP" ],
"note_number": "2",
"notes": [ "F" ]
"notes": [ "F" ],
"_gpid_": 850
},
{ "name": "M1 81mm Mortar",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "WP": 8 },
"note_number": "3",
"notes": [ "F", "N" ]
"notes": [ "F", "N" ],
"_gpid_": 879
},
{ "name": "M2 4.2-in. Mortar",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "WP": 10 },
"note_number": "4\u2020"
"note_number": "4\u2020",
"_gpid_": 881
},
{ "name": "T25 155mm Mortar",
"capabilities": [ "NT" ],
"capabilities2": { "WP": 8 },
"note_number": "5\u2020",
"notes": [ "P" ]
"notes": [ "P" ],
"_gpid_": 882
},
{ "name": "M3A1 37mm AT Gun",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "C": [ [7,"A2+"], "\u2020<sup>1</sup>" ] },
"note_number": "6\u2020",
"notes": [ "C\u2020<sup>1</sup>", "N" ]
"notes": [ "C\u2020<sup>1</sup>", "N" ],
"_gpid_": 884
},
{ "name": "M1 57mm AT Gun",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "HE": [ [7,"J4E"], [7,5], "\u2020" ], "D": [ [4,"J4+E"], "\u2020" ] },
"note_number": "7\u2020"
"note_number": "7\u2020",
"_gpid_": 885
},
{ "name": "M5 3-in. AT Gun",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "A": [ [4,4], [5,5], "\u2020" ], "s": [ [6,5] ] },
"note_number": "8\u2020",
"notes": [ "<s>P</s>" ]
"notes": [ "<s>P</s>" ],
"_gpid_": 886
},
{ "name": "T32 37mm Manpack Gun",
"capabilities": [ "5PP (3PP dm)\u2020", "C5\u2020<sup>1</sup>", "crewed\u2020<sup>2</sup>" ],
"note_number": "9\u2020",
"notes": [ "C\u2020<sup>1</sup>", "D\u2020<sup>2</sup>", "F" ]
"notes": [ "C\u2020<sup>1</sup>", "D\u2020<sup>2</sup>", "F" ],
"_gpid_": null
},
{ "name": "M18 57mm Recoilless Rifle",
"capabilities": [ "3PP", "crewed\u2020<sup>1</sup>" ],
"capabilities2": { "H": 7, "WP": 6 },
"note_number": "10",
"notes": [ "D\u2020<sup>1</sup>", "E\u2020" ]
"notes": [ "D\u2020<sup>1</sup>", "E\u2020" ],
"_gpid_": null
},
{ "name": "M20 75mm Recoilless Rifle",
"capabilities": [ "5PP", "crewed\u2020<sup>1</sup>" ],
"capabilities2": { "H": 7, "WP": 7 },
"note_number": "11",
"notes": [ "D\u2020<sup>1</sup>", "E\u2020" ]
"notes": [ "D\u2020<sup>1</sup>", "E\u2020" ],
"_gpid_": null
},
{ "name": "M1A1 75mm Pack Howitzer",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "H": 7, "WP": 8, "C": [ [4,"4+"], "\u2020<sup>1</sup>" ] },
"note_number": "12\u2020",
"notes": [ "C\u2020<sup>1</sup>", "F" ]
"notes": [ "C\u2020<sup>1</sup>", "F" ],
"_gpid_": 888
},
{ "name": "M1897A2 75mm Gun",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "WP": 8 },
"note_number": "13",
"notes": [ "P" ]
"notes": [ "P" ],
"_gpid_": 890
},
{ "name": "M2A1 105mm Howitzer",
"capabilities": [ "NT" ],
"capabilities2": { "H": 6, "s": 7, "WP": 8, "C": [ [7,"4+P"], "\u2020<sup>1</sup>" ] },
"note_number": "14\u2020",
"notes": [ "C\u2020<sup>1</sup>", "N" ]
"notes": [ "C\u2020<sup>1</sup>", "N" ],
"_gpid_": 891
},
{ "name": "M3 105mm Howitzer",
"capabilities": [ "NT" ],
"capabilities2": { "H": 7, "s": 7, "WP": 8, "C": [ [7,"P"], "\u2020<sup>1</sup>" ] },
"note_number": "15\u2020",
"notes": [ "C\u2020<sup>1</sup>" ]
"notes": [ "C\u2020<sup>1</sup>" ],
"_gpid_": 892
},
{ "name": "M1 4.5-in. Gun",
"capabilities": [ "NT" ],
"note_number": "16\u2020",
"notes": [ "<s>P</s>" ]
"notes": [ "<s>P</s>" ],
"_gpid_": 893
},
{ "name": "M1918 155mm Howitzer",
"capabilities": [ "NT" ],
"capabilities2": { "s": [ [7,"3+"] ], "WP": 8 },
"note_number": "17\u2020",
"notes": [ "N" ]
"notes": [ "N" ],
"_gpid_": 894
},
{ "name": "M1 155mm Howitzer",
"capabilities": [ "NT" ],
"capabilities2": { "s": 7, "WP": 8 },
"note_number": "18\u2020",
"notes": [ "N" ]
"notes": [ "N" ],
"_gpid_": 895
},
{ "name": "M1918M1 155mm Gun",
"capabilities": [ "NT", "RFNM", "AP4\u2020<sup>1</sup>", "no IF" ],
"capabilities2": { "WP": 8 },
"note_number": "19\u2020",
"notes": [ "A\u2020<sup>1</sup>", "N" ]
"notes": [ "A\u2020<sup>1</sup>", "N" ],
"_gpid_": 896
},
{ "name": "M1A1 155mm Gun",
"capabilities": [ "NT", "RFNM", "AP4\u2020<sup>1</sup>", "no IF" ],
"capabilities2": { "s": [ [7,5] ], "WP": 8 },
"note_number": "20\u2020",
"notes": [ "A\u2020<sup>1</sup>" ]
"notes": [ "A\u2020<sup>1</sup>" ],
"_gpid_": 897
},
{ "name": "M1 8-in. Howitzer",
"capabilities": [ "NT", "RFNM", "no IF" ],
"note_number": "21\u2020"
"note_number": "21\u2020",
"_gpid_": 898
},
{ "name": "M51 Multiple .50-cal MG Carriage",
"capabilities": [ "T" ],
"capabilities2": { "LF": [ "2 ROF", "20 IFE", "B11" ] },
"capabilities_other": [ "4 TK DR\u2020" ],
"note_number": "22\u2020"
"note_number": "22\u2020",
"_gpid_": 900
},
{ "name": "M1A2 37mm AA Gun",
"capabilities": [ "T" ],
"note_number": "23\u2020",
"notes": [ "N" ]
"notes": [ "N" ],
"_gpid_": 901
},
{ "name": "M1 40mm AA Gun",
"capabilities": [ "T" ],
"capabilities2": { "LF": [ "40\u2020<sup>1</sup>", "2 ROF" ] },
"note_number": "24\u2020",
"notes": [ "B\u2020<sup>1</sup>" ]
"notes": [ "B\u2020<sup>1</sup>" ],
"_gpid_": 902
},
{ "name": "M3 3-in. AA Gun",
"capabilities": [ "T", "NM" ],
"note_number": "25",
"notes": [ "P" ]
"notes": [ "P" ],
"_gpid_": 903
},
{ "name": "M1A1 90mm AA Gun",
"capabilities": [ "T", "NM" ],
"note_number": "26\u2020",
"notes": [ "N" ]
"notes": [ "N" ],
"_gpid_": 904
},
{ "name": "M2 90mm AA Gun",
"capabilities": [ "T" ],
"capabilities2": { "LF": [ "90\u2020", "1 ROF", "B11" ] },
"note_number": "27\u2020<sup>1</sup>",
"notes": [ "B\u2020" ]
"notes": [ "B\u2020" ],
"_gpid_": 905
}
]

@ -3,41 +3,49 @@
{ "name": "LG de 50 mle 37",
"capabilities_other": [ "2PP" ],
"note_number": "37",
"notes": [ "A" ]
"notes": [ "A" ],
"_gpid_": 3679
},
{ "name": "Madsen M-35",
"capabilities": [ "NT", "QSU", "no Gunshield" ],
"capabilities_other": [ "R2", "IFE=B10\u2020" ],
"note_number": "38\u2020",
"notes": [ "T\u2020<sup>1</sup>" ]
"notes": [ "T\u2020<sup>1</sup>" ],
"_gpid_": 3775
},
{ "name": "Skoda Infantry Gun",
"capabilities": [ "NT", "QSU", "h-d" ],
"note_number": "39\u2020"
"note_number": "39\u2020",
"_gpid_": 3776
},
{ "name": "Skoda Infantry Gun",
"capabilities": [ "NT", "QSU", "h-d" ],
"note_number": "39\u2020"
"note_number": "39\u2020",
"_gpid_": 3777
},
{ "name": "Bofors 75mm M36",
"capabilities": [ "NT", "QSU", "h-d" ],
"note_number": "40\u2020",
"notes": [ "A" ]
"notes": [ "A" ],
"_gpid_": 3778
},
{ "name": "75mm K-S",
"capabilities": [ "NT", "QSU", "h-d" ],
"capabilities2": { "s": 5 },
"note_number": "41\u2020"
"note_number": "41\u2020",
"_gpid_": 3779
},
{ "name": "Ob 105mm GP",
"capabilities": [ "NT" ],
"capabilities2": { "s": 5, "LF": [ "105*\u2020<sup>1</sup>" ] },
"note_number": "42\u2020",
"notes": [ "G\u2020<sup>1</sup>" ]
"notes": [ "G\u2020<sup>1</sup>" ],
"_gpid_": 3780
},
{ "name": "D/30 Krupp",
"capabilities": [ "NT", "RFNM", "no IF" ],
"note_number": "43"
"note_number": "43",
"_gpid_": 3781
}
]

@ -3,189 +3,222 @@
{ "name": "5cm leGrW 36",
"capabilities_other": [ "5PP" ],
"note_number": "44",
"notes": [ "A", "H", "S", "C", "B" ]
"notes": [ "A", "H", "S", "C", "B" ],
"_gpid_": 3680
},
{ "name": "50mm RM obr. 40",
"capabilities_other": [ "4PP" ],
"note_number": "45",
"notes": [ "A", "R", "H", "S", "C" ]
"notes": [ "A", "R", "H", "S", "C" ],
"_gpid_": 3681
},
{ "name": "8cm GrW 34",
"capabilities": [ "NT", "QSU", "IR" ],
"capabilities2": { "s": 7 },
"note_number": "46\u2020",
"notes": [ "A", "C", "B" ]
"notes": [ "A", "C", "B" ],
"_gpid_": 3709
},
{ "name": "Brandt M27/31",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "s": 7 },
"note_number": "47\u2020",
"notes": [ "A", "R", "H", "S" ]
"notes": [ "A", "R", "H", "S" ],
"_gpid_": 3711
},
{ "name": "PM obr. 38",
"capabilities": [ "NT", "QSU", "h-d" ],
"capabilities2": { "s": 8 },
"note_number": "48\u2020",
"notes": [ "R", "H" ]
"notes": [ "R", "H" ],
"_gpid_": 3713
},
{ "name": "Ur wz. 35",
"capabilities_other": [ "1PP" ],
"note_number": "49",
"notes": [ "R", "H", "S", "C", "B" ]
"notes": [ "R", "H", "S", "C", "B" ],
"_gpid_": null
},
{ "name": "s18-1100",
"capabilities_other": [ "5PP" ],
"note_number": "50",
"notes": [ "A", "R", "H" ]
"notes": [ "A", "R", "H" ],
"_gpid_": null
},
{ "name": "Kanon PUV vz. 37(t)",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "A": [ [4,"1S"] ] },
"note_number": "51\u2020",
"notes": [ "E", "H", "S", "B" ]
"notes": [ "E", "H", "S", "B" ],
"_gpid_": 3714
},
{ "name": "Bohler M35",
"capabilities": [ "NT", "QSU", "no Gunshield" ],
"note_number": "52\u2020",
"notes": [ "A", "R", "H", "S" ]
"notes": [ "A", "R", "H", "S" ],
"_gpid_": 3715
},
{ "name": "5cm PaK 38(g)",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "A": [ [4,3], [3,4] ] },
"note_number": "53\u2020",
"notes": [ "E", "R", "H", "S", "B" ]
"notes": [ "E", "R", "H", "S", "B" ],
"_gpid_": 3716
},
{ "name": "7.5cm PaK 97/38(g)",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "H": [ [5,"3+"] ], "s": 6 },
"note_number": "54\u2020",
"notes": [ "E", "R", "B" ]
"notes": [ "E", "R", "B" ],
"_gpid_": 3717
},
{ "name": "7.5cm PaK 40(g)",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "A": [ [4,3], [3,4] ] },
"note_number": "55\u2020",
"notes": [ "E", "R", "H", "S", "B" ]
"notes": [ "E", "R", "H", "S", "B" ],
"_gpid_": 3718
},
{ "name": "Skoda M15",
"capabilities": [ "NT", "QSU" ],
"note_number": "56\u2020",
"notes": [ "A", "R", "H", "S", "C", "B" ]
"notes": [ "A", "R", "H", "S", "C", "B" ],
"_gpid_": 3719
},
{ "name": "Canon de 75 mle 1897",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "s": 7 },
"note_number": "57",
"notes": [ "R", "B" ]
"notes": [ "R", "B" ],
"_gpid_": 3720
},
{ "name": "Skoda M29",
"capabilities": [ "NT" ],
"capabilities2": { "AP": 6 },
"note_number": "58\u2020",
"notes": [ "A", "R", "S" ]
"notes": [ "A", "R", "S" ],
"_gpid_": 3721
},
{ "name": "Skoda M17",
"capabilities": [ "NT", "QSU" ],
"note_number": "59\u2020",
"notes": [ "A", "R", "S", "C" ]
"notes": [ "A", "R", "S", "C" ],
"_gpid_": 3722
},
{ "name": "Skoda M28(80)",
"capabilities": [ "T" ],
"note_number": "60\u2020",
"notes": [ "S", "C" ]
"notes": [ "S", "C" ],
"_gpid_": 3723
},
{ "name": "Skoda M14/19",
"capabilities": [ "NT" ],
"capabilities2": { "s": 8 },
"note_number": "61\u2020",
"notes": [ "A\u2020", "R", "H", "S", "C" ]
"notes": [ "A\u2020", "R", "H", "S", "C" ],
"_gpid_": 3724
},
{ "name": "leFH 18(g)",
"capabilities": [ "NT" ],
"capabilities2": { "H": [ [4,"3+"] ], "s": 5 },
"note_number": "62\u2020",
"notes": [ "E", "H", "S", "B" ]
"notes": [ "E", "H", "S", "B" ],
"_gpid_": 3725
},
{ "name": "Skoda M35",
"capabilities": [ "NT" ],
"capabilities2": { "AP": 7, "C": [ [7,"CS"], "\u2020" ] },
"note_number": "63\u2020",
"notes": [ "R", "S", "C" ]
"notes": [ "R", "S", "C" ],
"_gpid_": 3726
},
{ "name": "G obr. 10/30",
"capabilities": [ "NT", "h-d" ],
"capabilities2": { "s": 7 },
"note_number": "64\u2020",
"notes": [ "R", "B" ]
"notes": [ "R", "B" ],
"_gpid_": 3727
},
{ "name": "G obr. 38",
"capabilities": [ "NT" ],
"capabilities2": { "s": [ [5,"1-2R"], "\u2020" ] },
"note_number": "65",
"notes": [ "R", "B" ]
"notes": [ "R", "B" ],
"_gpid_": 3728
},
{ "name": "Skoda M14",
"capabilities": [ "NT" ],
"note_number": "66\u2020",
"notes": [ "R", "H", "S" ]
"notes": [ "R", "H", "S" ],
"_gpid_": 3729
},
{ "name": "Skoda M15/16",
"capabilities": [ "NT", "no IF" ],
"capabilities2": { "s": 6 },
"note_number": "67\u2020",
"notes": [ "S", "C" ]
"notes": [ "S", "C" ],
"_gpid_": 3730
},
{ "name": "C mle 17 S",
"capabilities": [ "NT" ],
"capabilities2": { "s": 7 },
"note_number": "68\u2020",
"notes": [ "R", "B" ]
"notes": [ "R", "B" ],
"_gpid_": 3731
},
{ "name": "Mitrailleuse de 13.2 CAJ mle 30",
"capabilities": [ "T" ],
"capabilities_other": [ "2 TK DR\u2020" ],
"note_number": "69\u2020",
"notes": [ "T\u2020<sup>1</sup>", "R", "B" ]
"notes": [ "T\u2020<sup>1</sup>", "R", "B" ],
"_gpid_": 3732
},
{ "name": "Oerlikon FF",
"capabilities": [ "T" ],
"capabilities2": { "LF": [ "NT", "20\u2020", "2 ROF", "B11" ] },
"note_number": "70",
"notes": [ "G\u2020", "R", "H", "S", "C", "B" ]
"notes": [ "G\u2020", "R", "H", "S", "C", "B" ],
"_gpid_": 3733
},
{ "name": "2cm FlaK 30(g)",
"capabilities": [ "T" ],
"capabilities2": { "LF": [ "NT", "20\u2020<sup>1</sup>", "2 ROF", "B9" ] },
"note_number": "71\u2020",
"notes": [ "E", "G\u2020<sup>1</sup>", "R", "B" ]
"notes": [ "E", "G\u2020<sup>1</sup>", "R", "B" ],
"_gpid_": 3734
},
{ "name": "2cm FlaK 38(g)",
"capabilities": [ "T" ],
"capabilities2": { "LF": [ "NT", "20\u2020<sup>1</sup>", "2 ROF", "B10" ] },
"note_number": "72\u2020",
"notes": [ "E", "G\u2020<sup>1</sup>", "R", "B" ]
"notes": [ "E", "G\u2020<sup>1</sup>", "R", "B" ],
"_gpid_": 3735
},
{ "name": "3.7cm FlaK 36(g)",
"capabilities": [ "T" ],
"note_number": "73\u2020",
"notes": [ "E", "R", "B" ]
"notes": [ "E", "R", "B" ],
"_gpid_": 3736
},
{ "name": "Bofors 40mm",
"capabilities": [ "T" ],
"capabilities2": { "LF": [ "40\u2020<sup>1</sup>", "2 ROF" ] },
"note_number": "74\u2020",
"notes": [ "G\u2020<sup>1</sup>", "R", "H", "S", "C" ]
"notes": [ "G\u2020<sup>1</sup>", "R", "H", "S", "C" ],
"_gpid_": 3737
},
{ "name": "Skoda M33",
"capabilities": [ "T" ],
"note_number": "75R",
"notes": [ "S" ]
"notes": [ "S" ],
"_gpid_": 3738
},
{ "name": "8.8cm FlaK 18 o. 36(g)",
"capabilities": [ "T" ],
"capabilities2": { "LF": [ "88\u2020<sup>1</sup>", "1 ROF", "B11" ] },
"note_number": "76\u2020",
"notes": [ "E", "G\u2020<sup>1</sup>", "R", "S", "B" ]
"notes": [ "E", "G\u2020<sup>1</sup>", "R", "S", "B" ],
"_gpid_": 3739
}
]

@ -3,12 +3,14 @@
{ "name": "Canonne da 65/17",
"capabilities": [ "NT", "no Gunshield" ],
"note_number": "35",
"notes": [ "A" ]
"notes": [ "A" ],
"_gpid_": 3772
},
{ "name": "Skoda M28(FE)",
"capabilities": [ "NT" ],
"note_number": "36",
"notes": [ "A" ]
"notes": [ "A" ],
"_gpid_": 3774
}
]

@ -3,27 +3,32 @@
{ "name": "5cm leGrW 39(h)",
"capabilities_other": [ "5PP" ],
"note_number": "23",
"notes": [ "A" ]
"notes": [ "A" ],
"_gpid_": 3679
},
{ "name": "40mm MAVAG 40 M",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "H": "7[9]\u2020" },
"note_number": "24\u2020"
"note_number": "24\u2020",
"_gpid_": 3993
},
{ "name": "Skoda M05/08",
"capabilities": [ "NT" ],
"note_number": "25",
"notes": [ "A" ]
"notes": [ "A" ],
"_gpid_": 3999
},
{ "name": "105mm MAVAG M40",
"capabilities": [ "NT", "h-d" ],
"note_number": "26"
"note_number": "26",
"_gpid_": 4001
},
{ "name": "Bofors 80mm M29/38",
"capabilities": [ "T" ],
"capabilities2": { "LF": [ "80\u2020<sup>1</sup>", "1 ROF", "B11" ] },
"note_number": "27\u2020",
"notes": [ "G\u2020<sup>1</sup>" ]
"notes": [ "G\u2020<sup>1</sup>" ],
"_gpid_": 4007
}
]

@ -4,111 +4,133 @@
"capabilities": [ "IR" ],
"capabilities_other": [ "5PP" ],
"note_number": "1",
"notes": [ "A" ]
"notes": [ "A" ],
"_gpid_": 3682
},
{ "name": "Bofors 37mm",
"capabilities": [ "NT", "QSU" ],
"note_number": "2\u2020",
"notes": [ "A" ]
"notes": [ "A" ],
"_gpid_": 3740
},
{ "name": "45mm PTP obr. 32",
"capabilities": [ "NT", "QSU" ],
"note_number": "3\u2020"
"note_number": "3\u2020",
"_gpid_": 3741
},
{ "name": "Resita M43",
"capabilities": [ "NT", "QSU" ],
"capabilities_other": [ "Blk TH", "AP TK#18\u2020" ],
"note_number": "4\u2020"
"note_number": "4\u2020",
"_gpid_": 3742
},
{ "name": "76.2mm PaK 36(r)",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "s": 7 },
"note_number": "5",
"notes": [ "K\u2020" ]
"notes": [ "K\u2020" ],
"_gpid_": 3743
},
{ "name": "Breda 47",
"capabilities": [ "NT", "QSU", "no Gunshield" ],
"note_number": "6\u2020",
"notes": [ "A" ]
"notes": [ "A" ],
"_gpid_": 3744
},
{ "name": "75mm PP obr. 27",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "H": 6, "s": 8 },
"note_number": "7",
"notes": [ "A" ]
"notes": [ "A" ],
"_gpid_": 3745
},
{ "name": "75 M mle 28",
"capabilities": [ "NT", "QSU", "h-d" ],
"capabilities2": { "AP": 5, "s": 5 },
"note_number": "8",
"notes": [ "A" ]
"notes": [ "A" ],
"_gpid_": 3746
},
{ "name": "Skoda M14/34",
"capabilities": [ "NT" ],
"capabilities2": { "AP": 6 },
"note_number": "9\u2020",
"notes": [ "A" ]
"notes": [ "A" ],
"_gpid_": 3747
},
{ "name": "76.2mm P obr. 00/02",
"capabilities": [ "NT", "QSU", "h-d" ],
"capabilities2": { "s": 7 },
"note_number": "10"
"note_number": "10",
"_gpid_": 3748
},
{ "name": "76.2mm P obr. 02/30",
"capabilities": [ "NT", "QSU", "h-d" ],
"capabilities2": { "s": 7 },
"note_number": "11"
"note_number": "11",
"_gpid_": 3749
},
{ "name": "76.2mm P obr. 39(r)",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "s": 5 },
"note_number": "12",
"notes": [ "K\u2020" ]
"notes": [ "K\u2020" ],
"_gpid_": 3750
},
{ "name": "s 10cm K 18(g)",
"capabilities": [ "NT", "NM" ],
"capabilities2": { "s": 5 },
"note_number": "13",
"notes": [ "E" ]
"notes": [ "E" ],
"_gpid_": 3751
},
{ "name": "Skoda M39(D9)",
"capabilities": [ "NT" ],
"note_number": "14"
"note_number": "14",
"_gpid_": 3752
},
{ "name": "Canon de 105L mle 36S",
"capabilities": [ "NT" ],
"note_number": "15"
"note_number": "15",
"_gpid_": 3753
},
{ "name": "Canon mle 10/12",
"capabilities": [ "NT", "h-d" ],
"capabilities2": { "s": 4 },
"note_number": "16"
"note_number": "16",
"_gpid_": 3754
},
{ "name": "OQF 4.5in",
"capabilities": [ "NT" ],
"capabilities2": { "s": 4 },
"note_number": "17"
"note_number": "17",
"_gpid_": 3755
},
{ "name": "Skoda M28 NOa",
"capabilities": [ "NM", "no IF" ],
"capabilities_other": [ "ST" ],
"note_number": "18"
"note_number": "18",
"_gpid_": 3756
},
{ "name": "Skoda M33 (K1)",
"capabilities": [ "NT" ],
"note_number": "19"
"note_number": "19",
"_gpid_": 3757
},
{ "name": "CA mle 38",
"capabilities": [ "T" ],
"note_number": "20"
"note_number": "20",
"_gpid_": 3758
},
{ "name": "Vickers/Resita M36/39",
"capabilities": [ "T" ],
"note_number": "21\u2020"
"note_number": "21\u2020",
"_gpid_": 3759
},
{ "name": "Kanon PL vz. 12/20",
"capabilities": [ "T", "NM" ],
"note_number": "22"
"note_number": "22",
"_gpid_": 3760
}
]

@ -3,39 +3,46 @@
{ "name": "Minomet vz. 36",
"capabilities": [ "NT", "QSU" ],
"note_number": "28",
"notes": [ "A" ]
"notes": [ "A" ],
"_gpid_": 3761
},
{ "name": "Kanon PUV vz. 36(t)",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "A": [ [5,1], [4,2] ] },
"note_number": "29",
"notes": [ "E" ]
"notes": [ "E" ],
"_gpid_": 3763
},
{ "name": "leIG 18(g)",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "H": [ ["7","3+"] ] },
"note_number": "30",
"notes": [ "A", "E" ]
"notes": [ "A", "E" ],
"_gpid_": 3764
},
{ "name": "Skoda M37(K4)",
"capabilities": [ "NT" ],
"capabilities2": { "s": 6 },
"note_number": "31"
"note_number": "31",
"_gpid_": 3765
},
{ "name": "Skoda 47L40(t)",
"capabilities": [ "T", "QSU" ],
"capabilities_other": [ "AA Fire ROF 2\u2020" ],
"note_number": "32\u2020",
"notes": [ "E" ]
"notes": [ "E" ],
"_gpid_": 3766
},
{ "name": "Skoda PL vz. 37(t)",
"capabilities": [ "T" ],
"note_number": "33",
"notes": [ "E" ]
"notes": [ "E" ],
"_gpid_": 3767
},
{ "name": "Kanon PL vz. 22/24",
"capabilities_other": [ "ST" ],
"note_number": "34\u2020"
"note_number": "34\u2020",
"_gpid_": 3768
}
]

@ -4,141 +4,166 @@
"capabilities": [ "4PP" ],
"capabilities2": { "s": 7, "IR": [ [null,"2+"], "\u2020" ] },
"note_number": "1",
"notes": [ "A\u2020", "N", "P" ]
"notes": [ "A\u2020", "N", "P" ],
"_gpid_": 1153
},
{ "name": "OML 2-in. Airborne Mortar",
"capabilities": [ "IR" ],
"capabilities2": { "s": 7 },
"capabilities_other": [ "3PP" ],
"note_number": "1"
"note_number": "1",
"_gpid_": 1149
},
{ "name": "OML 3-in. Mortar",
"capabilities": [ "NT", "QSU" ],
"capabilities2": { "WP": 7, "s": [ [8,"1+"], "\u2020" ], "IR": [ [null,"2+"], "\u2020<sup>1</sup>" ] },
"note_number": "2\u2020",
"notes": [ "A\u2020<sup>1</sup>", "D", "N", "P" ]
"notes": [ "A\u2020<sup>1</sup>", "D", "N", "P" ],
"_gpid_": [ 1177, 1179 ]