From 2536f220a290e730e45c4ab77c2ec9c2cc1abe63 Mon Sep 17 00:00:00 2001 From: Taka Date: Mon, 25 May 2020 03:04:20 +0000 Subject: [PATCH] Added support for K:FW. --- chapter-h/chapter-h-placeholders.zip | Bin 160606 -> 180522 bytes tools/build_file.py | 1 + vasl_templates/main_window.py | 2 +- .../tools/make_chapter_h_placeholders.py | 69 +- .../tests/fixtures/chapter-h-placeholders.txt | 165 ++ .../data/default-template-pack/baz-cpva16.j2 | 53 + .../data/default-template-pack/baz-cpva17.j2 | 55 + .../webapp/data/default-template-pack/baz.j2 | 9 +- .../data/default-template-pack/baz45.j2 | 58 + .../data/default-template-pack/baz50.j2 | 60 + .../data/default-template-pack/mol-p.j2 | 1 + .../webapp/data/default-template-pack/mol.j2 | 1 + .../default-template-pack/nationalities.json | 17 + .../webapp/data/default-template-pack/piat.j2 | 1 + .../webapp/data/default-template-pack/psk.j2 | 1 + .../webapp/data/expected-multiple-images.json | 6 + .../data/ordnance/axis-minor/common.json | 68 +- .../data/ordnance/axis-minor/croatian.json | 2 +- .../data/ordnance/axis-minor/romanian.json | 2 +- .../webapp/data/ordnance/kfw-cpva.json | 1 + .../webapp/data/ordnance/kfw-kpa.json | 1 + .../webapp/data/ordnance/kfw-ounc.json | 1 + .../webapp/data/ordnance/kfw-rok.json | 1 + .../bcfk.json} | 28 +- .../cvpa.json => kfw/cpva.json} | 74 +- .../{communist-forces => kfw}/kpa.json | 64 +- .../common.json => kfw/un-common.json} | 30 +- .../{un-forces => kfw}/us-rok-ounc.json | 52 +- .../webapp/data/vasl-overrides.json | 12 + .../webapp/data/vehicles/american.json | 12 +- .../data/vehicles/axis-minor/common.json | 58 +- .../data/vehicles/axis-minor/slovakian.json | 6 +- .../webapp/data/vehicles/british.json | 10 +- .../webapp/data/vehicles/chinese.json | 2 +- .../webapp/data/vehicles/kfw-kpa.json | 1 + .../webapp/data/vehicles/kfw-ounc.json | 1 + .../webapp/data/vehicles/kfw-rok.json | 1 + .../webapp/data/vehicles/kfw/bcfk.json | 219 ++ .../webapp/data/vehicles/kfw/kpa.json | 74 + .../webapp/data/vehicles/kfw/un-common.json | 54 + .../webapp/data/vehicles/kfw/us-rok-ounc.json | 332 +++ vasl_templates/webapp/static/css/tabs.css | 2 +- vasl_templates/webapp/static/extras.js | 2 +- .../webapp/static/images/flags/kfw-cpva.png | Bin 0 -> 13127 bytes .../webapp/static/images/flags/kfw-kpa.png | Bin 0 -> 13148 bytes .../webapp/static/images/flags/kfw-ounc.png | Bin 0 -> 10685 bytes .../webapp/static/images/flags/kfw-rok.png | Bin 0 -> 8056 bytes vasl_templates/webapp/static/main.js | 57 +- vasl_templates/webapp/static/snippets.js | 66 +- vasl_templates/webapp/static/user_settings.js | 1 + vasl_templates/webapp/static/vassal.js | 71 +- vasl_templates/webapp/static/vo.js | 9 +- vasl_templates/webapp/templates/tabs-ob1.html | 4 + .../webapp/templates/tabs-scenario.html | 3 +- .../vo-entry-selection-for-theater.vsav | Bin 0 -> 2702 bytes .../data/default-template-pack/baz-cpva16.j2 | 1 + .../data/default-template-pack/baz-cpva17.j2 | 1 + .../data/default-template-pack/baz.j2 | 2 +- .../data/default-template-pack/baz45.j2 | 1 + .../data/default-template-pack/baz50.j2 | 1 + .../default-template-pack/nationalities.json | 5 + .../template-packs/full/american/baz45.j2 | 1 + .../template-packs/full/american/baz50.j2 | 1 + .../template-packs/full/baz-cpva16.j2 | 1 + .../template-packs/full/baz-cpva17.j2 | 1 + .../new-default/american/baz45.j2 | 1 + .../new-default/american/baz50.j2 | 1 + .../new-default/kfw/baz-cpva16.j2 | 1 + .../new-default/kfw/baz-cpva17.j2 | 1 + .../tests/fixtures/vasl-pieces-6.5.0.txt | 2565 +++++++++-------- .../tests/fixtures/vasl-pieces-legacy.txt | 1 + .../vo-reports/ordnance/american/1940.txt | 16 + .../vo-reports/ordnance/american/1941.txt | 16 + .../vo-reports/ordnance/american/1942.txt | 16 + .../vo-reports/ordnance/american/1943.txt | 16 + .../vo-reports/ordnance/american/1944.txt | 16 + .../vo-reports/ordnance/american/1945.txt | 16 + .../ordnance/axis-minor-common/1940.txt | 64 +- .../ordnance/axis-minor-common/1941.txt | 64 +- .../ordnance/axis-minor-common/1942.txt | 64 +- .../ordnance/axis-minor-common/1943.txt | 64 +- .../ordnance/axis-minor-common/1944.txt | 64 +- .../ordnance/axis-minor-common/1945.txt | 64 +- .../vo-reports/ordnance/british/1940.txt | 64 +- .../vo-reports/ordnance/british/1941.txt | 64 +- .../vo-reports/ordnance/british/1942.txt | 64 +- .../vo-reports/ordnance/british/1943.txt | 64 +- .../vo-reports/ordnance/british/1944.txt | 64 +- .../vo-reports/ordnance/british/1945.txt | 64 +- .../vo-reports/ordnance/croatian/1940.txt | 2 +- .../vo-reports/ordnance/croatian/1941.txt | 2 +- .../vo-reports/ordnance/croatian/1942.txt | 2 +- .../vo-reports/ordnance/croatian/1943.txt | 2 +- .../vo-reports/ordnance/croatian/1944.txt | 2 +- .../vo-reports/ordnance/croatian/1945.txt | 2 +- .../vo-reports/ordnance/kfw-cpva/1950.txt | 19 + .../vo-reports/ordnance/kfw-cpva/1951.txt | 19 + .../vo-reports/ordnance/kfw-cpva/1952.txt | 19 + .../vo-reports/ordnance/kfw-cpva/1953.txt | 19 + .../vo-reports/ordnance/kfw-kpa/1950.txt | 20 + .../vo-reports/ordnance/kfw-kpa/1951.txt | 20 + .../vo-reports/ordnance/kfw-kpa/1952.txt | 20 + .../vo-reports/ordnance/kfw-kpa/1953.txt | 20 + .../vo-reports/ordnance/kfw-ounc/1950.txt | 20 + .../vo-reports/ordnance/kfw-ounc/1951.txt | 20 + .../vo-reports/ordnance/kfw-ounc/1952.txt | 20 + .../vo-reports/ordnance/kfw-ounc/1953.txt | 20 + .../vo-reports/ordnance/kfw-rok/1950.txt | 20 + .../vo-reports/ordnance/kfw-rok/1951.txt | 20 + .../vo-reports/ordnance/kfw-rok/1952.txt | 20 + .../vo-reports/ordnance/kfw-rok/1953.txt | 20 + .../vo-reports/ordnance/romanian/1940.txt | 2 +- .../vo-reports/ordnance/romanian/1941.txt | 2 +- .../vo-reports/ordnance/romanian/1942.txt | 2 +- .../vo-reports/ordnance/romanian/1943.txt | 2 +- .../vo-reports/ordnance/romanian/1944.txt | 2 +- .../vo-reports/ordnance/romanian/1945.txt | 2 +- .../vo-reports/vehicles/american/1940.txt | 45 + .../vo-reports/vehicles/american/1941.txt | 45 + .../vo-reports/vehicles/american/1942.txt | 45 + .../vo-reports/vehicles/american/1943.txt | 45 + .../vo-reports/vehicles/american/1944.txt | 45 + .../vo-reports/vehicles/american/1945.txt | 45 + .../vehicles/axis-minor-common/1940.txt | 58 +- .../vehicles/axis-minor-common/1941.txt | 58 +- .../vehicles/axis-minor-common/1942.txt | 58 +- .../vehicles/axis-minor-common/1943.txt | 58 +- .../vehicles/axis-minor-common/1944.txt | 58 +- .../vehicles/axis-minor-common/1945.txt | 58 +- .../vo-reports/vehicles/british/1940.txt | 289 +- .../vo-reports/vehicles/british/1941.txt | 289 +- .../vo-reports/vehicles/british/1942.txt | 289 +- .../vo-reports/vehicles/british/1943.txt | 289 +- .../vo-reports/vehicles/british/1944.txt | 35 +- .../vo-reports/vehicles/british/1945.txt | 35 +- .../vo-reports/vehicles/kfw-kpa/1950.txt | 13 + .../vo-reports/vehicles/kfw-kpa/1951.txt | 13 + .../vo-reports/vehicles/kfw-kpa/1952.txt | 13 + .../vo-reports/vehicles/kfw-kpa/1953.txt | 13 + .../vo-reports/vehicles/kfw-ounc/1950.txt | 49 + .../vo-reports/vehicles/kfw-ounc/1951.txt | 49 + .../vo-reports/vehicles/kfw-ounc/1952.txt | 49 + .../vo-reports/vehicles/kfw-ounc/1953.txt | 49 + .../vo-reports/vehicles/kfw-rok/1950.txt | 49 + .../vo-reports/vehicles/kfw-rok/1951.txt | 49 + .../vo-reports/vehicles/kfw-rok/1952.txt | 49 + .../vo-reports/vehicles/kfw-rok/1953.txt | 49 + .../vo-reports/vehicles/slovakian/1940.txt | 6 +- .../vo-reports/vehicles/slovakian/1941.txt | 6 +- .../vo-reports/vehicles/slovakian/1942.txt | 6 +- .../vo-reports/vehicles/slovakian/1943.txt | 6 +- .../vo-reports/vehicles/slovakian/1944.txt | 6 +- .../vo-reports/vehicles/slovakian/1945.txt | 6 +- .../webapp/tests/test_capabilities.py | 115 +- vasl_templates/webapp/tests/test_counters.py | 66 +- vasl_templates/webapp/tests/test_ob.py | 16 +- .../webapp/tests/test_vasl_extensions.py | 3 +- vasl_templates/webapp/tests/test_vassal.py | 50 +- .../webapp/tests/test_vehicles_ordnance.py | 3 + vasl_templates/webapp/tests/test_vo_notes.py | 15 +- .../webapp/tests/test_vo_reports.py | 24 +- vasl_templates/webapp/tests/utils.py | 11 + vasl_templates/webapp/vasl_mod.py | 116 +- vasl_templates/webapp/vassal.py | 2 +- vasl_templates/webapp/vo.py | 57 +- vasl_templates/webapp/vo_notes.py | 63 +- 166 files changed, 5753 insertions(+), 2721 deletions(-) create mode 100644 vasl_templates/webapp/data/default-template-pack/baz-cpva16.j2 create mode 100644 vasl_templates/webapp/data/default-template-pack/baz-cpva17.j2 create mode 100644 vasl_templates/webapp/data/default-template-pack/baz45.j2 create mode 100644 vasl_templates/webapp/data/default-template-pack/baz50.j2 create mode 100644 vasl_templates/webapp/data/ordnance/kfw-cpva.json create mode 100644 vasl_templates/webapp/data/ordnance/kfw-kpa.json create mode 100644 vasl_templates/webapp/data/ordnance/kfw-ounc.json create mode 100644 vasl_templates/webapp/data/ordnance/kfw-rok.json rename vasl_templates/webapp/data/ordnance/{un-forces/british-commonwealth-forces-korea.json => kfw/bcfk.json} (81%) rename vasl_templates/webapp/data/ordnance/{communist-forces/cvpa.json => kfw/cpva.json} (74%) rename vasl_templates/webapp/data/ordnance/{communist-forces => kfw}/kpa.json (78%) rename vasl_templates/webapp/data/ordnance/{un-forces/common.json => kfw/un-common.json} (54%) rename vasl_templates/webapp/data/ordnance/{un-forces => kfw}/us-rok-ounc.json (80%) create mode 100644 vasl_templates/webapp/data/vehicles/kfw-kpa.json create mode 100644 vasl_templates/webapp/data/vehicles/kfw-ounc.json create mode 100644 vasl_templates/webapp/data/vehicles/kfw-rok.json create mode 100644 vasl_templates/webapp/data/vehicles/kfw/bcfk.json create mode 100644 vasl_templates/webapp/data/vehicles/kfw/kpa.json create mode 100644 vasl_templates/webapp/data/vehicles/kfw/un-common.json create mode 100644 vasl_templates/webapp/data/vehicles/kfw/us-rok-ounc.json create mode 100644 vasl_templates/webapp/static/images/flags/kfw-cpva.png create mode 100644 vasl_templates/webapp/static/images/flags/kfw-kpa.png create mode 100644 vasl_templates/webapp/static/images/flags/kfw-ounc.png create mode 100644 vasl_templates/webapp/static/images/flags/kfw-rok.png create mode 100644 vasl_templates/webapp/tests/fixtures/analyze-vsav/vo-entry-selection-for-theater.vsav create mode 100644 vasl_templates/webapp/tests/fixtures/data/default-template-pack/baz-cpva16.j2 create mode 100644 vasl_templates/webapp/tests/fixtures/data/default-template-pack/baz-cpva17.j2 create mode 100644 vasl_templates/webapp/tests/fixtures/data/default-template-pack/baz45.j2 create mode 100644 vasl_templates/webapp/tests/fixtures/data/default-template-pack/baz50.j2 create mode 100644 vasl_templates/webapp/tests/fixtures/template-packs/full/american/baz45.j2 create mode 100644 vasl_templates/webapp/tests/fixtures/template-packs/full/american/baz50.j2 create mode 100644 vasl_templates/webapp/tests/fixtures/template-packs/full/baz-cpva16.j2 create mode 100644 vasl_templates/webapp/tests/fixtures/template-packs/full/baz-cpva17.j2 create mode 100644 vasl_templates/webapp/tests/fixtures/template-packs/new-default/american/baz45.j2 create mode 100644 vasl_templates/webapp/tests/fixtures/template-packs/new-default/american/baz50.j2 create mode 100644 vasl_templates/webapp/tests/fixtures/template-packs/new-default/kfw/baz-cpva16.j2 create mode 100644 vasl_templates/webapp/tests/fixtures/template-packs/new-default/kfw/baz-cpva17.j2 create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-cpva/1950.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-cpva/1951.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-cpva/1952.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-cpva/1953.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-kpa/1950.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-kpa/1951.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-kpa/1952.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-kpa/1953.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-ounc/1950.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-ounc/1951.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-ounc/1952.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-ounc/1953.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-rok/1950.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-rok/1951.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-rok/1952.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-rok/1953.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-kpa/1950.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-kpa/1951.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-kpa/1952.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-kpa/1953.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-ounc/1950.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-ounc/1951.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-ounc/1952.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-ounc/1953.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-rok/1950.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-rok/1951.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-rok/1952.txt create mode 100644 vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-rok/1953.txt diff --git a/chapter-h/chapter-h-placeholders.zip b/chapter-h/chapter-h-placeholders.zip index 10e359a1d7770a690bef4cfd25e2b520c0699a03..ad2f1328dcfb35cac1d3a88bc3cdffdfaa94fc9b 100644 GIT binary patch literal 180522 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 DTY+R( literal 160606 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 fRA13Vj8hg!&k diff --git a/tools/build_file.py b/tools/build_file.py index 3e49078..670081f 100755 --- a/tools/build_file.py +++ b/tools/build_file.py @@ -102,6 +102,7 @@ def _get_pieceslot_images( node, opts ): # identify fields that look like an image path valid_prefixes = ( "ru/", "ge/", "am/", "br/", "it/", "ja/", "ch/", "sh/", "fr/", "al/", "ax/", "hu/", "fi/", "po/", "ss/", # nb: for BFP + "nk/", # nb: for K:FW ) def is_image_path( val ): """Check if a value looks like an image path.""" diff --git a/vasl_templates/main_window.py b/vasl_templates/main_window.py index 03f8dde..2919aff 100644 --- a/vasl_templates/main_window.py +++ b/vasl_templates/main_window.py @@ -87,7 +87,7 @@ class MainWindow( QWidget ): self.restoreGeometry( val ) else : self.resize( 1000, 600 ) - self.setMinimumSize( 980, 520 ) + self.setMinimumSize( 1000, 520 ) # initialize the layout layout = QVBoxLayout( self ) diff --git a/vasl_templates/tools/make_chapter_h_placeholders.py b/vasl_templates/tools/make_chapter_h_placeholders.py index 429399f..c501a19 100755 --- a/vasl_templates/tools/make_chapter_h_placeholders.py +++ b/vasl_templates/tools/make_chapter_h_placeholders.py @@ -56,10 +56,12 @@ def make_chapter_h_placeholders( output_fname, log=None \ # (instead of being copied from an existing piece), but we can live with that... :-/ continue dname2, fname2 = os.path.split( fname ) + if os.path.split( dname2 )[1] == "kfw": + continue # nb: we do these files later nat = os.path.splitext( fname2 )[0] if nat == "common": nat = os.path.split( dname2 )[1] - if nat in ("free-french","british-commonwealth-forces-korea","cvpa","kpa","us-rok-ounc","un-forces"): + if nat == "free-french" or nat.startswith("kfw-"): continue notes, ma_notes = load_vo_data( fname, nat ) if nat not in results: @@ -69,6 +71,29 @@ def make_chapter_h_placeholders( output_fname, log=None \ else: results[ nat ][ vo_type ] = { "notes": notes, "ma_notes": ma_notes } + # insert the K:FW vehicles/ordnance + kfw_vo_data = load_kfw_vo_data() + results["kfw-un"] = { + "vehicles": { + "notes": kfw_vo_data["kfw-un"]["vehicles"][0], + "ma_notes": kfw_vo_data["kfw-un"]["vehicles"][1] + }, + "ordnance": { + "notes": kfw_vo_data["kfw-un"]["ordnance"][0], + "ma_notes": kfw_vo_data["kfw-un"]["ordnance"][1] + } + } + results["kfw-comm"] = { + "vehicles": { + "notes": kfw_vo_data["kfw-comm"]["vehicles"][0], + "ma_notes": kfw_vo_data["kfw-comm"]["vehicles"][1] + }, + "ordnance": { + "notes": kfw_vo_data["kfw-comm"]["ordnance"][0], + "ma_notes": kfw_vo_data["kfw-comm"]["ordnance"][1] + } + } + # 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" ) ): @@ -142,6 +167,48 @@ def load_vo_data( fname, nat ): # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +def load_kfw_vo_data(): + """Load the K:FW vehicle/ordnance data files.""" + + # load the K:FW vehicles + un_veh_notes, un_veh_ma_notes = set(), set() + dname = os.path.join( os.path.split(__file__)[0], "../webapp/data/vehicles/kfw" ) + for fname in ( "us-rok-ounc.json", "bcfk.json", "un-common.json" ): + notes, ma_notes = load_vo_data( os.path.join(dname,fname), None ) + un_veh_notes.update( notes ) + un_veh_ma_notes.update( ma_notes ) + comm_veh_notes, comm_veh_ma_notes = set(), set() + for fname in ( "kpa.json", ): + notes, ma_notes = load_vo_data( os.path.join(dname,"kpa.json"), None ) + comm_veh_notes.update( notes ) + comm_veh_ma_notes.update( ma_notes ) + + # load the K:FW ordnance + un_ord_notes, un_ord_ma_notes = set(), set() + dname = os.path.join( os.path.split(__file__)[0], "../webapp/data/ordnance/kfw" ) + for fname in ( "us-rok-ounc.json", "bcfk.json", "un-common.json" ): + notes, ma_notes = load_vo_data( os.path.join(dname,fname), None ) + un_ord_notes.update( notes ) + un_ord_ma_notes.update( ma_notes ) + comm_ord_notes, comm_ord_ma_notes = set(), set() + for fname in ( "kpa.json", "cpva.json" ): + notes, ma_notes = load_vo_data( os.path.join(dname,fname), None ) + comm_ord_notes.update( notes ) + comm_ord_ma_notes.update( ma_notes ) + + return { + "kfw-un": { + "vehicles": ( un_veh_notes, un_veh_ma_notes ), + "ordnance": ( un_ord_notes, un_ord_ma_notes ) + }, + "kfw-comm": { + "vehicles": ( comm_veh_notes, comm_veh_ma_notes ), + "ordnance": ( comm_ord_notes, comm_ord_ma_notes ) + } + } + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + def load_vo_data_from_extension( fname ): """Load a vehicle/ordnance extension data file.""" diff --git a/vasl_templates/tools/tests/fixtures/chapter-h-placeholders.txt b/vasl_templates/tools/tests/fixtures/chapter-h-placeholders.txt index 60e7488..d1c4e2f 100644 --- a/vasl_templates/tools/tests/fixtures/chapter-h-placeholders.txt +++ b/vasl_templates/tools/tests/fixtures/chapter-h-placeholders.txt @@ -1049,6 +1049,171 @@ japanese/vehicles/adf-bj/b.html japanese/vehicles/adf-bj/c.html japanese/vehicles/b.html japanese/vehicles/c.html +kfw-comm/ordnance/1.png +kfw-comm/ordnance/10.png +kfw-comm/ordnance/11.png +kfw-comm/ordnance/12.png +kfw-comm/ordnance/13.png +kfw-comm/ordnance/14.png +kfw-comm/ordnance/15.png +kfw-comm/ordnance/18.png +kfw-comm/ordnance/19.png +kfw-comm/ordnance/2.png +kfw-comm/ordnance/20.png +kfw-comm/ordnance/21.png +kfw-comm/ordnance/22.png +kfw-comm/ordnance/23.png +kfw-comm/ordnance/24.png +kfw-comm/ordnance/25.png +kfw-comm/ordnance/26.png +kfw-comm/ordnance/27.png +kfw-comm/ordnance/28.png +kfw-comm/ordnance/29.png +kfw-comm/ordnance/3.png +kfw-comm/ordnance/30.png +kfw-comm/ordnance/31.png +kfw-comm/ordnance/32.png +kfw-comm/ordnance/4.png +kfw-comm/ordnance/5.png +kfw-comm/ordnance/6.png +kfw-comm/ordnance/7.png +kfw-comm/ordnance/8.png +kfw-comm/ordnance/9.png +kfw-comm/ordnance/a.html +kfw-comm/ordnance/b.html +kfw-comm/ordnance/r.html +kfw-comm/vehicles/1.png +kfw-comm/vehicles/2.png +kfw-comm/vehicles/3.png +kfw-comm/vehicles/4.png +kfw-comm/vehicles/5.png +kfw-comm/vehicles/6.png +kfw-comm/vehicles/b.html +kfw-un/ordnance/1.png +kfw-un/ordnance/10.png +kfw-un/ordnance/11.png +kfw-un/ordnance/12.png +kfw-un/ordnance/13.png +kfw-un/ordnance/14.png +kfw-un/ordnance/15.png +kfw-un/ordnance/16.png +kfw-un/ordnance/17.png +kfw-un/ordnance/18.png +kfw-un/ordnance/19.png +kfw-un/ordnance/2.png +kfw-un/ordnance/20.png +kfw-un/ordnance/23.png +kfw-un/ordnance/24.png +kfw-un/ordnance/25.png +kfw-un/ordnance/3.png +kfw-un/ordnance/4.png +kfw-un/ordnance/5.png +kfw-un/ordnance/6.png +kfw-un/ordnance/7.png +kfw-un/ordnance/8.png +kfw-un/ordnance/9.png +kfw-un/ordnance/a.html +kfw-un/ordnance/b.html +kfw-un/ordnance/c.html +kfw-un/ordnance/k.html +kfw-un/ordnance/m.html +kfw-un/ordnance/n.html +kfw-un/ordnance/o.html +kfw-un/ordnance/p.html +kfw-un/ordnance/r.html +kfw-un/ordnance/y.html +kfw-un/vehicles/1.png +kfw-un/vehicles/10.png +kfw-un/vehicles/11.png +kfw-un/vehicles/12.png +kfw-un/vehicles/13.png +kfw-un/vehicles/14.png +kfw-un/vehicles/15.png +kfw-un/vehicles/16.png +kfw-un/vehicles/17.png +kfw-un/vehicles/18.png +kfw-un/vehicles/19.png +kfw-un/vehicles/2.png +kfw-un/vehicles/20.png +kfw-un/vehicles/21.png +kfw-un/vehicles/22.png +kfw-un/vehicles/23.png +kfw-un/vehicles/24.png +kfw-un/vehicles/25.png +kfw-un/vehicles/26.png +kfw-un/vehicles/27.png +kfw-un/vehicles/28.png +kfw-un/vehicles/29.png +kfw-un/vehicles/3.png +kfw-un/vehicles/30.png +kfw-un/vehicles/31.png +kfw-un/vehicles/32.png +kfw-un/vehicles/33.png +kfw-un/vehicles/34.png +kfw-un/vehicles/35.png +kfw-un/vehicles/36.png +kfw-un/vehicles/37.png +kfw-un/vehicles/38.png +kfw-un/vehicles/39.png +kfw-un/vehicles/4.png +kfw-un/vehicles/40.png +kfw-un/vehicles/41.png +kfw-un/vehicles/42.png +kfw-un/vehicles/43.png +kfw-un/vehicles/44.png +kfw-un/vehicles/45.png +kfw-un/vehicles/46.png +kfw-un/vehicles/47.png +kfw-un/vehicles/48.png +kfw-un/vehicles/49.png +kfw-un/vehicles/5.png +kfw-un/vehicles/50.png +kfw-un/vehicles/51.png +kfw-un/vehicles/52.png +kfw-un/vehicles/53.png +kfw-un/vehicles/54.png +kfw-un/vehicles/55.png +kfw-un/vehicles/56.png +kfw-un/vehicles/57.png +kfw-un/vehicles/6.png +kfw-un/vehicles/7.png +kfw-un/vehicles/8.png +kfw-un/vehicles/9.png +kfw-un/vehicles/a.html +kfw-un/vehicles/aa.html +kfw-un/vehicles/b.html +kfw-un/vehicles/bb.html +kfw-un/vehicles/c.html +kfw-un/vehicles/cc.html +kfw-un/vehicles/d.html +kfw-un/vehicles/dd.html +kfw-un/vehicles/e.html +kfw-un/vehicles/ee.html +kfw-un/vehicles/f.html +kfw-un/vehicles/ff.html +kfw-un/vehicles/g.html +kfw-un/vehicles/h.html +kfw-un/vehicles/j.html +kfw-un/vehicles/k.html +kfw-un/vehicles/l.html +kfw-un/vehicles/m.html +kfw-un/vehicles/mm.html +kfw-un/vehicles/n.html +kfw-un/vehicles/nn.html +kfw-un/vehicles/o.html +kfw-un/vehicles/p.html +kfw-un/vehicles/q.html +kfw-un/vehicles/s.html +kfw-un/vehicles/t.html +kfw-un/vehicles/tt.html +kfw-un/vehicles/u.html +kfw-un/vehicles/uu.html +kfw-un/vehicles/v.html +kfw-un/vehicles/w.html +kfw-un/vehicles/x.html +kfw-un/vehicles/y.html +kfw-un/vehicles/z.html +kfw-un/vehicles/zz.html landing-craft/1.png landing-craft/2.png landing-craft/3.png diff --git a/vasl_templates/webapp/data/default-template-pack/baz-cpva16.j2 b/vasl_templates/webapp/data/default-template-pack/baz-cpva16.j2 new file mode 100644 index 0000000..bd408e4 --- /dev/null +++ b/vasl_templates/webapp/data/default-template-pack/baz-cpva16.j2 @@ -0,0 +1,53 @@ + + + + + + + + + + + + +
+ {{INCLUDE:player_flag}}Bazooka '44 + +
+ + + + + + + +
Range TH# +
0 10 +
1 8 +
2 7 +
3 6 +
4 3 +
+ +
+ + + + +
X#: + 11 +
TK#: + 16 +
8-4 +
+ +
+ + diff --git a/vasl_templates/webapp/data/default-template-pack/baz-cpva17.j2 b/vasl_templates/webapp/data/default-template-pack/baz-cpva17.j2 new file mode 100644 index 0000000..6b9c807 --- /dev/null +++ b/vasl_templates/webapp/data/default-template-pack/baz-cpva17.j2 @@ -0,0 +1,55 @@ + + + + + + + + + + + + +
+ {{INCLUDE:player_flag}}Bazooka Type 51 + +
+ + + + + + + + +
Range TH# +
0 10 +
1 9 +
2 8 +
3 7 +
4 5 +
5 3 +
+ +
+ + + + +
X#: + 10 +
TK#: + 22 +
12-5 +
+ +
+ + diff --git a/vasl_templates/webapp/data/default-template-pack/baz.j2 b/vasl_templates/webapp/data/default-template-pack/baz.j2 index 78342b1..f907dc5 100644 --- a/vasl_templates/webapp/data/default-template-pack/baz.j2 +++ b/vasl_templates/webapp/data/default-template-pack/baz.j2 @@ -53,26 +53,21 @@ -{%if BAZ_BREAKDOWN%}
X#: {{BAZ_BREAKDOWN}} -{%endif%} {%if BAZ_WP%}
WP#: {{BAZ_WP}} {%endif%} -{%if BAZ_TOKILL%}
TK#: - {{BAZ_TOKILL}} -{%endif%} -{%if BAZ_RANGE%} + {{BAZ_TK}}
8-{{BAZ_RANGE}} -{%endif%}
+ diff --git a/vasl_templates/webapp/data/default-template-pack/baz45.j2 b/vasl_templates/webapp/data/default-template-pack/baz45.j2 new file mode 100644 index 0000000..5ce3f2b --- /dev/null +++ b/vasl_templates/webapp/data/default-template-pack/baz45.j2 @@ -0,0 +1,58 @@ + + + + + + + + + + + + +
+ {{INCLUDE:player_flag}}Bazooka '45 + +
+ + + + + + + + +
Range TH# +
0 11 +
1 10 +
2 9 +
3 8 +
4 6 +
5 4 +
+ +
+ + + + + +
X#: + 11 +
WP#: + 6 +
TK#: + 16 +
8-5 +
+ +
+ + diff --git a/vasl_templates/webapp/data/default-template-pack/baz50.j2 b/vasl_templates/webapp/data/default-template-pack/baz50.j2 new file mode 100644 index 0000000..3ed3469 --- /dev/null +++ b/vasl_templates/webapp/data/default-template-pack/baz50.j2 @@ -0,0 +1,60 @@ + + + + + + + + + + + + +
+ {{INCLUDE:player_flag}}Bazooka '50 + +
+ + + + + + + + +
Range TH# +
0 11 +
1 10 +
2 9 +
3 8 +
4 6 +
5 4 +
+ +
+ + + + + +
X#: + 11 +{%if SCENARIO_YEAR >= 1952%} +
WP#: + 6 +{%endif%} +
TK#: + 32 +
12-5 +
+ +
+ + diff --git a/vasl_templates/webapp/data/default-template-pack/mol-p.j2 b/vasl_templates/webapp/data/default-template-pack/mol-p.j2 index f4128cb..c0b7358 100644 --- a/vasl_templates/webapp/data/default-template-pack/mol-p.j2 +++ b/vasl_templates/webapp/data/default-template-pack/mol-p.j2 @@ -57,4 +57,5 @@ + diff --git a/vasl_templates/webapp/data/default-template-pack/mol.j2 b/vasl_templates/webapp/data/default-template-pack/mol.j2 index 1195ebb..cd16b85 100644 --- a/vasl_templates/webapp/data/default-template-pack/mol.j2 +++ b/vasl_templates/webapp/data/default-template-pack/mol.j2 @@ -39,4 +39,5 @@ Kindling Attempt: +2 DRM + diff --git a/vasl_templates/webapp/data/default-template-pack/nationalities.json b/vasl_templates/webapp/data/default-template-pack/nationalities.json index 5465915..5681ae7 100644 --- a/vasl_templates/webapp/data/default-template-pack/nationalities.json +++ b/vasl_templates/webapp/data/default-template-pack/nationalities.json @@ -137,6 +137,23 @@ "filipino": { "display_name": "Filipino", "ob_colors": [ "#3ceb7c","#1de256", "#0ed93c" ] +}, + +"kfw-rok": { + "display_name": "South Korean", + "ob_colors": [ "#e5cea0","#d2ac5b", "#cdf000" ] +}, +"kfw-ounc": { + "display_name": "OUNC", + "ob_colors": [ "#55aeff","#118eff", "#b8e527" ] +}, +"kfw-kpa": { + "display_name": "North Korean", + "ob_colors": [ "#eabe51","#d68d1a", "#d68d1a" ] +}, +"kfw-cpva": { + "display_name": "Communist Chinese", + "ob_colors": [ "#e5cea0","#d2ac5b", "#d3870e" ] } } diff --git a/vasl_templates/webapp/data/default-template-pack/piat.j2 b/vasl_templates/webapp/data/default-template-pack/piat.j2 index 145e974..619bd33 100644 --- a/vasl_templates/webapp/data/default-template-pack/piat.j2 +++ b/vasl_templates/webapp/data/default-template-pack/piat.j2 @@ -45,4 +45,5 @@ + diff --git a/vasl_templates/webapp/data/default-template-pack/psk.j2 b/vasl_templates/webapp/data/default-template-pack/psk.j2 index 48b9d96..f1652c4 100644 --- a/vasl_templates/webapp/data/default-template-pack/psk.j2 +++ b/vasl_templates/webapp/data/default-template-pack/psk.j2 @@ -47,4 +47,5 @@ + diff --git a/vasl_templates/webapp/data/expected-multiple-images.json b/vasl_templates/webapp/data/expected-multiple-images.json index 63294c8..6ab97c4 100644 --- a/vasl_templates/webapp/data/expected-multiple-images.json +++ b/vasl_templates/webapp/data/expected-multiple-images.json @@ -26,6 +26,12 @@ "name": "155 ART wz.17", "front_images": "po/gun/poARTwz17-BFP.png", "back_images": [ "po/gun/poARTwz17-BFP.png", "po/gun/poARTwz17-BFPb.png" ] +}, + +"3b5:3676": { + "name": "M19A1 MGMC", + "front_images": [ "us/veh/usM19A1MGMC(trailer)KFW.png", "us/veh/usM19A1MGMC(KFW).png" ], + "back_images": null } } diff --git a/vasl_templates/webapp/data/ordnance/axis-minor/common.json b/vasl_templates/webapp/data/ordnance/axis-minor/common.json index 4ae99ca..19b36d4 100644 --- a/vasl_templates/webapp/data/ordnance/axis-minor/common.json +++ b/vasl_templates/webapp/data/ordnance/axis-minor/common.json @@ -4,7 +4,7 @@ "type": "MTR", "capabilities_other": [ "5PP" ], "note_number": "44", - "notes": [ "A", "H", "S", "C", "B" ], + "notes": [ "A", "B", "C", "H", "S" ], "id": "axc/o:000", "gpid": 3680 }, @@ -12,7 +12,7 @@ "type": "MTR", "capabilities_other": [ "4PP" ], "note_number": "45", - "notes": [ "A", "R", "H", "S", "C" ], + "notes": [ "A", "C", "H", "R", "S" ], "id": "axc/o:001", "gpid": 3681 }, @@ -21,7 +21,7 @@ "capabilities": [ "NT", "QSU", "IR" ], "capabilities2": { "s": 7 }, "note_number": "46\u2020", - "notes": [ "A", "C", "B" ], + "notes": [ "A", "B", "C" ], "id": "axc/o:002", "gpid": 3709 }, @@ -30,7 +30,7 @@ "capabilities": [ "NT", "QSU" ], "capabilities2": { "s": 7 }, "note_number": "47\u2020", - "notes": [ "A", "R", "H", "S" ], + "notes": [ "A", "H", "R", "S" ], "id": "axc/o:003", "gpid": 3711 }, @@ -39,7 +39,7 @@ "capabilities": [ "NT", "QSU", "h-d" ], "capabilities2": { "s": 8 }, "note_number": "48\u2020", - "notes": [ "R", "H" ], + "notes": [ "H", "R" ], "id": "axc/o:004", "gpid": 3713 }, @@ -47,7 +47,7 @@ "type": "ATR", "capabilities_other": [ "1PP" ], "note_number": "49", - "notes": [ "R", "H", "S", "C", "B" ], + "notes": [ "B", "C", "H", "R", "S" ], "id": "axc/o:005", "gpid": null }, @@ -55,16 +55,16 @@ "type": "ATR", "capabilities_other": [ "5PP" ], "note_number": "50", - "notes": [ "A", "R", "H" ], + "notes": [ "A", "H", "R" ], "id": "axc/o:006", "gpid": null }, { "name": "Kanon PUV vz. 37(t)", "type": "AT", "capabilities": [ "NT", "QSU" ], - "capabilities2": { "A": [ [4,"1S"] ] }, + "capabilities2": { "A": [ [4,"1S"], "\u2020" ] }, "note_number": "51\u2020", - "notes": [ "E", "H", "S", "B" ], + "notes": [ "B", "E", "H", "S" ], "id": "axc/o:007", "gpid": 3714 }, @@ -73,7 +73,7 @@ "capabilities": [ "NT", "QSU" ], "comments": [ "No Gunshield." ], "note_number": "52\u2020", - "notes": [ "A", "R", "H", "S" ], + "notes": [ "A", "H", "R", "S" ], "id": "axc/o:008", "gpid": 3715 }, @@ -82,7 +82,7 @@ "capabilities": [ "NT", "QSU" ], "capabilities2": { "A": [ [4,3], [3,4] ] }, "note_number": "53\u2020", - "notes": [ "E", "R", "H", "S", "B" ], + "notes": [ "B", "E", "H", "R", "S" ], "id": "axc/o:009", "gpid": 3716 }, @@ -91,7 +91,7 @@ "capabilities": [ "NT", "QSU" ], "capabilities2": { "H": [ [5,"3+"] ], "s": 6 }, "note_number": "54\u2020", - "notes": [ "E", "R", "B" ], + "notes": [ "B", "E", "R" ], "id": "axc/o:010", "gpid": 3717 }, @@ -100,7 +100,7 @@ "capabilities": [ "NT", "QSU" ], "capabilities2": { "A": [ [4,3], [3,4] ] }, "note_number": "55\u2020", - "notes": [ "E", "R", "H", "S", "B" ], + "notes": [ "B", "E", "H", "R", "S" ], "id": "axc/o:011", "gpid": 3718 }, @@ -108,7 +108,7 @@ "type": "ART", "capabilities": [ "NT", "QSU" ], "note_number": "56\u2020", - "notes": [ "A", "R", "H", "S", "C", "B" ], + "notes": [ "A", "B", "C", "H", "R", "S" ], "id": "axc/o:012", "gpid": 3719 }, @@ -117,7 +117,7 @@ "capabilities": [ "NT", "QSU" ], "capabilities2": { "s": 7 }, "note_number": "57", - "notes": [ "R", "B" ], + "notes": [ "B", "R" ], "id": "axc/o:013", "gpid": 3720 }, @@ -134,7 +134,7 @@ "type": "ART", "capabilities": [ "NT", "QSU" ], "note_number": "59\u2020", - "notes": [ "A", "R", "S", "C" ], + "notes": [ "A", "C", "R", "S" ], "id": "axc/o:015", "gpid": 3722 }, @@ -142,7 +142,7 @@ "type": "ART", "capabilities": [ "T" ], "note_number": "60\u2020", - "notes": [ "S", "C" ], + "notes": [ "C", "S" ], "id": "axc/o:016", "gpid": 3723 }, @@ -151,7 +151,7 @@ "capabilities": [ "NT" ], "capabilities2": { "s": 8 }, "note_number": "61\u2020", - "notes": [ "A\u2020", "R", "H", "S", "C" ], + "notes": [ "A\u2020", "C", "H", "R", "S" ], "id": "axc/o:017", "gpid": 3724 }, @@ -160,7 +160,7 @@ "capabilities": [ "NT" ], "capabilities2": { "H": [ [4,"3+"] ], "s": 5 }, "note_number": "62\u2020", - "notes": [ "E", "H", "S", "B" ], + "notes": [ "B", "E", "H", "S" ], "id": "axc/o:018", "gpid": 3725 }, @@ -169,7 +169,7 @@ "capabilities": [ "NT" ], "capabilities2": { "AP": 7, "C": [ [7,"CS"], "\u2020" ] }, "note_number": "63\u2020", - "notes": [ "R", "S", "C" ], + "notes": [ "C", "R", "S" ], "id": "axc/o:019", "gpid": 3726 }, @@ -178,7 +178,7 @@ "capabilities": [ "NT", "h-d" ], "capabilities2": { "s": 7 }, "note_number": "64\u2020", - "notes": [ "R", "B" ], + "notes": [ "B", "R" ], "id": "axc/o:020", "gpid": 3727 }, @@ -187,7 +187,7 @@ "capabilities": [ "NT" ], "capabilities2": { "s": [ [5,"1-2R"], "\u2020" ] }, "note_number": "65", - "notes": [ "R", "B" ], + "notes": [ "B", "R" ], "id": "axc/o:021", "gpid": 3728 }, @@ -195,7 +195,7 @@ "type": "ART", "capabilities": [ "NT" ], "note_number": "66\u2020", - "notes": [ "R", "H", "S" ], + "notes": [ "H", "R", "S" ], "id": "axc/o:022", "gpid": 3729 }, @@ -205,7 +205,7 @@ "capabilities2": { "s": 6 }, "comments": [ "No IF." ], "note_number": "67\u2020", - "notes": [ "S", "C" ], + "notes": [ "C", "S" ], "id": "axc/o:023", "gpid": 3730 }, @@ -214,7 +214,7 @@ "capabilities": [ "NT" ], "capabilities2": { "s": 7 }, "note_number": "68\u2020", - "notes": [ "R", "B" ], + "notes": [ "B", "R" ], "id": "axc/o:024", "gpid": 3731 }, @@ -223,7 +223,7 @@ "capabilities": [ "T" ], "capabilities_other": [ "2 TK DR\u2020" ], "note_number": "69\u2020", - "notes": [ "T\u20201", "R", "B" ], + "notes": [ "B", "R", "T\u20201" ], "id": "axc/o:025", "gpid": 3732 }, @@ -232,7 +232,7 @@ "capabilities": [ "T" ], "capabilities2": { "LF": [ "NT", "20\u2020", "2 ROF", "B11" ] }, "note_number": "70", - "notes": [ "G\u2020", "R", "H", "S", "C", "B" ], + "notes": [ "B", "C", "G\u2020", "H", "R", "S" ], "id": "axc/o:026", "gpid": 3733 }, @@ -241,7 +241,7 @@ "capabilities": [ "T" ], "capabilities2": { "LF": [ "NT", "20\u20201", "2 ROF", "B9" ] }, "note_number": "71\u2020", - "notes": [ "E", "G\u20201", "R", "B" ], + "notes": [ "B", "E", "G\u20201", "R" ], "id": "axc/o:027", "gpid": 3734 }, @@ -250,7 +250,7 @@ "capabilities": [ "T" ], "capabilities2": { "LF": [ "NT", "20\u20201", "2 ROF", "B10" ] }, "note_number": "72\u2020", - "notes": [ "E", "G\u20201", "R", "B" ], + "notes": [ "B", "E", "G\u20201", "R" ], "id": "axc/o:028", "gpid": 3735 }, @@ -258,7 +258,7 @@ "type": "AA", "capabilities": [ "T" ], "note_number": "73\u2020", - "notes": [ "E", "R", "B" ], + "notes": [ "B", "E", "R" ], "id": "axc/o:029", "gpid": 3736 }, @@ -267,15 +267,15 @@ "capabilities": [ "T" ], "capabilities2": { "LF": [ "40\u20201", "2 ROF" ] }, "note_number": "74\u2020", - "notes": [ "G\u20201", "R", "H", "S", "C" ], + "notes": [ "C", "G\u20201", "H", "R", "S" ], "id": "axc/o:030", "gpid": 3737 }, { "name": "Skoda M33", "type": "AA", "capabilities": [ "T" ], - "note_number": "75R", - "notes": [ "S" ], + "note_number": "75", + "notes": [ "R", "S" ], "id": "axc/o:031", "gpid": 3738 }, @@ -284,7 +284,7 @@ "capabilities": [ "T" ], "capabilities2": { "LF": [ "88\u20201", "1 ROF", "B11" ] }, "note_number": "76\u2020", - "notes": [ "E", "G\u20201", "R", "S", "B" ], + "notes": [ "B", "E", "G\u20201", "R", "S" ], "id": "axc/o:032", "gpid": 3739 } diff --git a/vasl_templates/webapp/data/ordnance/axis-minor/croatian.json b/vasl_templates/webapp/data/ordnance/axis-minor/croatian.json index 5219b73..ec1978a 100644 --- a/vasl_templates/webapp/data/ordnance/axis-minor/croatian.json +++ b/vasl_templates/webapp/data/ordnance/axis-minor/croatian.json @@ -1,6 +1,6 @@ [ -{ "name": "Canonne da 65/17", +{ "name": "Cannone da 65/17", "type": "INF", "capabilities": [ "NT" ], "comments": [ "No Gunshield." ], diff --git a/vasl_templates/webapp/data/ordnance/axis-minor/romanian.json b/vasl_templates/webapp/data/ordnance/axis-minor/romanian.json index 5681662..9e7e54b 100644 --- a/vasl_templates/webapp/data/ordnance/axis-minor/romanian.json +++ b/vasl_templates/webapp/data/ordnance/axis-minor/romanian.json @@ -74,7 +74,7 @@ "capabilities": [ "NT" ], "capabilities2": { "AP": 6 }, "note_number": "9\u2020", - "notes": [ "A" ], + "notes": [ "A\u2020" ], "id": "ro/o:008", "gpid": 3747 }, diff --git a/vasl_templates/webapp/data/ordnance/kfw-cpva.json b/vasl_templates/webapp/data/ordnance/kfw-cpva.json new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/vasl_templates/webapp/data/ordnance/kfw-cpva.json @@ -0,0 +1 @@ +[] diff --git a/vasl_templates/webapp/data/ordnance/kfw-kpa.json b/vasl_templates/webapp/data/ordnance/kfw-kpa.json new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/vasl_templates/webapp/data/ordnance/kfw-kpa.json @@ -0,0 +1 @@ +[] diff --git a/vasl_templates/webapp/data/ordnance/kfw-ounc.json b/vasl_templates/webapp/data/ordnance/kfw-ounc.json new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/vasl_templates/webapp/data/ordnance/kfw-ounc.json @@ -0,0 +1 @@ +[] diff --git a/vasl_templates/webapp/data/ordnance/kfw-rok.json b/vasl_templates/webapp/data/ordnance/kfw-rok.json new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/vasl_templates/webapp/data/ordnance/kfw-rok.json @@ -0,0 +1 @@ +[] diff --git a/vasl_templates/webapp/data/ordnance/un-forces/british-commonwealth-forces-korea.json b/vasl_templates/webapp/data/ordnance/kfw/bcfk.json similarity index 81% rename from vasl_templates/webapp/data/ordnance/un-forces/british-commonwealth-forces-korea.json rename to vasl_templates/webapp/data/ordnance/kfw/bcfk.json index 1725bc4..9a8af9b 100644 --- a/vasl_templates/webapp/data/ordnance/un-forces/british-commonwealth-forces-korea.json +++ b/vasl_templates/webapp/data/ordnance/kfw/bcfk.json @@ -7,8 +7,8 @@ "capabilities_other": [ "4PP" ], "note_number": "14", "notes": [ "A", "N" ], - "id": "bcfk/o:000", - "gpid": null + "id": "kfw-bcfk/o:000", + "gpid": 12687 }, { "name": "M19 60mm Mortar", "type": "MTR", @@ -17,8 +17,8 @@ "capabilities_other": [ "4PP" ], "note_number": "15", "notes": [ "A", "R" ], - "id": "bcfk/o:001", - "gpid": null + "id": "kfw-bcfk/o:001", + "gpid": "3b5:7613" }, { "name": "OML 3-in. Mortar", "type": "MTR", @@ -26,8 +26,8 @@ "capabilities2": { "s": 8, "WP": 7 }, "note_number": "16", "notes": [ "A" ], - "id": "bcfk/o:002", - "gpid": null + "id": "kfw-bcfk/o:002", + "gpid": 5944 }, { "name": "OSB 4.2-in. Mortar", "type": "MTR", @@ -36,8 +36,8 @@ "comments": [ "Towed\u2020" ], "note_number": "17\u2020", "notes": [ "N" ], - "id": "bcfk/o:003", - "gpid": null + "id": "kfw-bcfk/o:003", + "gpid": 1181 }, { "name": "OQF 17-Pounder", "type": "AT", @@ -45,8 +45,8 @@ "capabilities2": { "HE": 8, "D": 6 }, "note_number": "18", "notes": [ "N" ], - "id": "bcfk/o:004", - "gpid": null + "id": "kfw-bcfk/o:004", + "gpid": 12439 }, { "name": "OQF 25-Pounder", "type": "ART", @@ -54,8 +54,8 @@ "capabilities_other": [ "ST" ], "note_number": "19\u2020", "notes": [ "N" ], - "id": "bcfk/o:005", - "gpid": null + "id": "kfw-bcfk/o:005", + "gpid": 1194 }, { "name": "OQF 40mm AA", "type": "AA", @@ -63,8 +63,8 @@ "capabilities2": { "LF": [ "40\u2020", "2 ROF" ] }, "note_number": "20", "notes": [ "B\u2020", "N" ], - "id": "bcfk/o:006", - "gpid": null + "id": "kfw-bcfk/o:006", + "gpid": 1204 } ] diff --git a/vasl_templates/webapp/data/ordnance/communist-forces/cvpa.json b/vasl_templates/webapp/data/ordnance/kfw/cpva.json similarity index 74% rename from vasl_templates/webapp/data/ordnance/communist-forces/cvpa.json rename to vasl_templates/webapp/data/ordnance/kfw/cpva.json index 27d40ad..9677fee 100644 --- a/vasl_templates/webapp/data/ordnance/communist-forces/cvpa.json +++ b/vasl_templates/webapp/data/ordnance/kfw/cpva.json @@ -1,42 +1,28 @@ [ -{ "name": "M1A1 Rocket Launcher", - "type": null, - "capabilities_other": [ "1PP" ], - "note_number": "16", - "id": "cvpa/o:000", - "gpid": null -}, -{ "name": "Type 51 Rocket Launcher", - "type": null, - "capabilities_other": [ "1PP" ], - "note_number": "17", - "id": "cvpa/o:001", - "gpid": null -}, { "name": "50mm Type 89 Heavy Grenade Launcher", "type": "MTR", "capabilities_other": [ "4PP" ], "note_number": "18\u2020", "notes": [ "A" ], - "id": "cvpa/o:002", - "gpid": null + "id": "kfw-cpva/o:002", + "gpid": 11558 }, { "name": "60mm Type 31 Mortar", "type": "MTR", "capabilities_other": [ "5PP" ], "note_number": "19", "notes": [ "A" ], - "id": "cvpa/o:003", - "gpid": null + "id": "kfw-cpva/o:003", + "gpid": 11559 }, { "name": "82mm Type 20 Mortar", "type": "MTR", "capabilities": [ "NT", "QSU" ], "note_number": "20\u2020", "notes": [ "A" ], - "id": "cvpa/o:004", - "gpid": null + "id": "kfw-cpva/o:004", + "gpid": 11579 }, { "name": "82mm Type 53 Mortar", "type": "MTR", @@ -44,39 +30,39 @@ "capabilities2": { "s": 6 }, "note_number": "21\u2020", "notes": [ "A" ], - "id": "cvpa/o:005", - "gpid": null + "id": "kfw-cpva/o:005", + "gpid": 11581 }, { "name": "120mm PM obr. 38", "type": "MTR", "capabilities": [ "NT", "QSU" ], "capabilities2": { "s": 6 }, "note_number": "22\u2020", - "id": "cvpa/o:006", - "gpid": null + "id": "kfw-cpva/o:006", + "gpid": 11583 }, { "name": "45mm PTP obr. 42", "type": "AT", "capabilities": [ "NT", "QSU" ], "capabilities2": { "A": 7 }, "note_number": "23\u2020", - "id": "cvpa/o:007", - "gpid": null + "id": "kfw-cpva/o:007", + "gpid": 11584 }, { "name": "47mm Type 1 Machine-Moved Gun", "type": "AT", "capabilities": [ "NT", "QSU" ], "note_number": "24\u2020", - "id": "cvpa/o:008", - "gpid": null + "id": "kfw-cpva/o:008", + "gpid": 11585 }, { "name": "57mm PTP obr. 43", "type": "AT", "capabilities": [ "NT", "QSU" ], "capabilities2": { "A": 6 }, "note_number": "25\u2020", - "id": "cvpa/o:009", - "gpid": null + "id": "kfw-cpva/o:009", + "gpid": "3b5:10114" }, { "name": "57mm Type 36 Recoilless Rifle", "type": "RCL", @@ -85,8 +71,8 @@ "comments": [ "crewed\u2020" ], "note_number": "26\u20201", "notes": [ "R\u2020" ], - "id": "cvpa/o:010", - "gpid": null + "id": "kfw-cpva/o:010", + "gpid": "3b5:10150" }, { "name": "75mm Type 52 Recoilless Rifle", "type": "RCL", @@ -95,8 +81,8 @@ "comments": [ "crewed\u2020" ], "note_number": "27", "notes": [ "R\u2020" ], - "id": "cvpa/o:011", - "gpid": null + "id": "kfw-cpva/o:011", + "gpid": "3b5:10151" }, { "name": "70mm Type 92 Infantry Gun", "type": "INF", @@ -104,8 +90,8 @@ "capabilities2": { "AP": 3, "H": 3 }, "note_number": "28\u2020", "notes": [ "A" ], - "id": "cvpa/o:012", - "gpid": null + "id": "kfw-cpva/o:012", + "gpid": "3b5:10115" }, { "name": "76.2mm PP obr. 27", "type": "INF", @@ -113,24 +99,24 @@ "capabilities2": { "H": 6, "s": 6 }, "note_number": "29\u2020", "notes": [ "A" ], - "id": "cvpa/o:013", - "gpid": null + "id": "kfw-cpva/o:013", + "gpid": "3b5:10118" }, { "name": "Year-38 Type Field Gun (Improved)", "type": "ART", "capabilities": [ "NT", "QSU", "h-d" ], "capabilities_other": [ "\"12\" AP TK#\u2020" ], "note_number": "30\u2020", - "id": "cvpa/o:014", - "gpid": null + "id": "kfw-cpva/o:014", + "gpid": 11586 }, { "name": "76.2mm obr. 42", "type": "ART", "capabilities": [ "NT", "QSU" ], "capabilities2": { "A": 7, "s": 6 }, "note_number": "31\u2020", - "id": "cvpa/o:015", - "gpid": null + "id": "kfw-cpva/o:015", + "gpid": "3b5:10119" }, { "name": "Type 93 Twin-Mount High-Angle Machine Gun", "type": "AA", @@ -139,8 +125,8 @@ "comments": [ "Towing NA\u2020" ], "note_number": "32\u2020", "notes": [ "A" ], - "id": "cvpa/o:016", - "gpid": null + "id": "kfw-cpva/o:016", + "gpid": 11587 } ] diff --git a/vasl_templates/webapp/data/ordnance/communist-forces/kpa.json b/vasl_templates/webapp/data/ordnance/kfw/kpa.json similarity index 78% rename from vasl_templates/webapp/data/ordnance/communist-forces/kpa.json rename to vasl_templates/webapp/data/ordnance/kfw/kpa.json index b77af28..21b8229 100644 --- a/vasl_templates/webapp/data/ordnance/communist-forces/kpa.json +++ b/vasl_templates/webapp/data/ordnance/kfw/kpa.json @@ -5,8 +5,8 @@ "capabilities_other": [ "4PP" ], "note_number": "1", "notes": [ "A", "B" ], - "id": "kpa/o:000", - "gpid": null + "id": "kfw-kpa/o:000", + "gpid": 11600 }, { "name": "82mm BM obr. 37", "type": "MTR", @@ -14,8 +14,8 @@ "capabilities2": { "s": 8 }, "note_number": "2\u2020", "notes": [ "A", "B" ], - "id": "kpa/o:001", - "gpid": null + "id": "kfw-kpa/o:001", + "gpid": 11621 }, { "name": "120mm PM obr. 38", "type": "MTR", @@ -23,23 +23,23 @@ "capabilities2": { "s": 8 }, "note_number": "3\u2020", "notes": [ "B" ], - "id": "kpa/o:002", - "gpid": null + "id": "kfw-kpa/o:002", + "gpid": 11623 }, { "name": "14.5mm PTRD-41", "type": "ATR", "capabilities_other": [ "1PP" ], "note_number": "4", "notes": [ "B" ], - "id": "kpa/o:003", - "gpid": null + "id": "kfw-kpa/o:003", + "gpid": 11604 }, { "name": "14.5mm PTRS-41", "type": "ATR", "capabilities_other": [ "2PP", "TK#: 6\u2020" ], "note_number": "5\u2020", - "id": "kpa/o:004", - "gpid": null + "id": "kfw-kpa/o:004", + "gpid": "3b5:7871" }, { "name": "45mm PTP obr. 37", "type": "AT", @@ -47,8 +47,8 @@ "capabilities2": { "A": 7 }, "note_number": "6\u2020", "notes": [ "B" ], - "id": "kpa/o:005", - "gpid": null + "id": "kfw-kpa/o:005", + "gpid": 11624 }, { "name": "45mm PTP obr. 42", "type": "AT", @@ -56,8 +56,8 @@ "capabilities2": { "A": 7 }, "note_number": "6\u2020", "notes": [ "B" ], - "id": "kpa/o:006", - "gpid": null + "id": "kfw-kpa/o:006", + "gpid": 11625 }, { "name": "76.2mm PP obr. 27", "type": "INF", @@ -65,8 +65,8 @@ "capabilities2": { "H": 6, "s": 8 }, "note_number": "7\u2020", "notes": [ "A", "B" ], - "id": "kpa/o:007", - "gpid": null + "id": "kfw-kpa/o:007", + "gpid": 11626 }, { "name": "76.2mm obr. 02/30", "type": "ART", @@ -74,8 +74,8 @@ "capabilities2": { "s": 8 }, "note_number": "8\u2020", "notes": [ "B" ], - "id": "kpa/o:008", - "gpid": null + "id": "kfw-kpa/o:008", + "gpid": 11627 }, { "name": "76.2mm obr. 42", "type": "ART", @@ -83,8 +83,8 @@ "capabilities2": { "A": 7, "s": 8 }, "note_number": "9\u2020", "notes": [ "B" ], - "id": "kpa/o:009", - "gpid": null + "id": "kfw-kpa/o:009", + "gpid": 11628 }, { "name": "107mm P obr. 10/30", "type": "ART", @@ -92,8 +92,8 @@ "capabilities2": { "s": 8 }, "note_number": "10", "notes": [ "B" ], - "id": "kpa/o:010", - "gpid": null + "id": "kfw-kpa/o:010", + "gpid": 11629 }, { "name": "122mm G obr. 38", "type": "ART", @@ -101,8 +101,8 @@ "capabilities2": { "H": 6, "s": 8 }, "note_number": "11\u2020", "notes": [ "B" ], - "id": "kpa/o:011", - "gpid": null + "id": "kfw-kpa/o:011", + "gpid": "3b5:2047" }, { "name": "122mm obr. 31", "type": "ART", @@ -110,32 +110,32 @@ "capabilities2": { "s": 8 }, "note_number": "12", "notes": [ "B" ], - "id": "kpa/o:012", - "gpid": null + "id": "kfw-kpa/o:012", + "gpid": 11630 }, { "name": "152mm GP obr. 37", "type": "ART", "capabilities": [ "NT" ], "note_number": "13", "notes": [ "B" ], - "id": "kpa/o:013", - "gpid": null + "id": "kfw-kpa/o:013", + "gpid": 11631 }, { "name": "37mm ZP obr. 39", "type": "AA", "capabilities": [ "T" ], "note_number": "14\u2020", "notes": [ "B" ], - "id": "kpa/o:014", - "gpid": null + "id": "kfw-kpa/o:014", + "gpid": 11632 }, { "name": "85mm ZP obr. 39", "type": "AA", "capabilities": [ "T" ], "note_number": "15", "notes": [ "B" ], - "id": "kpa/o:015", - "gpid": null + "id": "kfw-kpa/o:015", + "gpid": 11633 } ] diff --git a/vasl_templates/webapp/data/ordnance/un-forces/common.json b/vasl_templates/webapp/data/ordnance/kfw/un-common.json similarity index 54% rename from vasl_templates/webapp/data/ordnance/un-forces/common.json rename to vasl_templates/webapp/data/ordnance/kfw/un-common.json index afbce56..e5d65f9 100644 --- a/vasl_templates/webapp/data/ordnance/un-forces/common.json +++ b/vasl_templates/webapp/data/ordnance/kfw/un-common.json @@ -1,23 +1,5 @@ [ -{ "name": "M9A1 Rocket Launcher", - "type": null, - "capabilities2": { "WP": 6 }, - "capabilities_other": [ "1PP" ], - "note_number": "21", - "notes": [ "K", "R", "Y" ], - "id": "unc/o:000", - "gpid": null -}, -{ "name": "M20 Rocket Launcher", - "type": null, - "capabilities2": { "WP": [ [6,"2+"], "\u2020" ] }, - "capabilities_other": [ "1PP" ], - "note_number": "22\u2020", - "notes": [ "K", "M", "O", "P", "R" ], - "id": "unc/o:001", - "gpid": null -}, { "name": "M2 60mm Mortar", "type": "MTR", "capabilities": [ "IR" ], @@ -25,8 +7,8 @@ "capabilities_other": [ "5PP", "OBA\u2020" ], "note_number": "23\u2020", "notes": [ "A", "K", "M", "O", "P", "Y" ], - "id": "unc/o:002", - "gpid": null + "id": "kfw-un-common/o:002", + "gpid": [ 12689, 11391, 11359, 11440, 849 ] }, { "name": "M1(L) 81mm Mortar", "type": "MTR", @@ -34,8 +16,8 @@ "capabilities2": { "WP": 8 }, "note_number": "24\u2020", "notes": [ "A", "K", "M", "O", "P", "R" ], - "id": "unc/o:003", - "gpid": null + "id": "kfw-un-common/o:003", + "gpid": [ 11416, "3b5:2460", 11363, "3b5:8410" ] }, { "name": "M20(L) 75mm Recoilless Rifle", "type": "RCL", @@ -44,8 +26,8 @@ "comments": [ "crewed\u2020" ], "note_number": "25\u2020", "notes": [ "K", "M", "O", "P", "R" ], - "id": "unc/o:004", - "gpid": null + "id": "kfw-un-common/o:004", + "gpid": [ 11396, 11337, "3b5:11259", "3b5:8402" ] } ] diff --git a/vasl_templates/webapp/data/ordnance/un-forces/us-rok-ounc.json b/vasl_templates/webapp/data/ordnance/kfw/us-rok-ounc.json similarity index 80% rename from vasl_templates/webapp/data/ordnance/un-forces/us-rok-ounc.json rename to vasl_templates/webapp/data/ordnance/kfw/us-rok-ounc.json index 69e33a1..ec81a9b 100644 --- a/vasl_templates/webapp/data/ordnance/un-forces/us-rok-ounc.json +++ b/vasl_templates/webapp/data/ordnance/kfw/us-rok-ounc.json @@ -5,8 +5,8 @@ "capabilities_other": [ "4PP" ], "note_number": "1\u2020", "notes": [ "A", "P" ], - "id": "uro/o:000", - "gpid": null + "id": "kfw-uro/o:000", + "gpid": 11392 }, { "name": "M2 4.2-in. Mortar", "type": "MTR", @@ -14,8 +14,8 @@ "capabilities2": { "WP": 10 }, "note_number": "2\u2020", "notes": [ "K", "M", "O", "P", "Y" ], - "id": "uro/o:001", - "gpid": null + "id": "kfw-uro/o:001", + "gpid": [ 11418, 881, "3b5:8412" ] }, { "name": "M3A1 37mm AT Gun", "type": "AT", @@ -23,8 +23,8 @@ "capabilities2": { "C": 7 }, "note_number": "3\u2020", "notes": [ "C", "K", "P" ], - "id": "uro/o:002", - "gpid": null + "id": "kfw-uro/o:002", + "gpid": 11419 }, { "name": "M1 57mm AT Gun", "type": "AT", @@ -32,8 +32,8 @@ "capabilities2": { "HE": 7, "D": 4 }, "note_number": "4\u2020", "notes": [ "K" ], - "id": "uro/o:003", - "gpid": null + "id": "kfw-uro/o:003", + "gpid": 11420 }, { "name": "M18(L) 57mm Recoilless Rifle", "type": "RCL", @@ -42,8 +42,8 @@ "comments": [ "non-crewed\u2020" ], "note_number": "5\u2020", "notes": [ "C", "K", "O" ], - "id": "uro/o:004", - "gpid": null + "id": "kfw-uro/o:004", + "gpid": [ 11395, 11336, "3b5:8401" ] }, { "name": "M2A1 105mm Howitzer", "type": "ART", @@ -51,8 +51,8 @@ "capabilities2": { "H": 6, "s": 7, "WP": 8, "C": 7 }, "note_number": "6\u2020", "notes": [ "C", "K", "M", "O", "P", "Y" ], - "id": "uro/o:005", - "gpid": null + "id": "kfw-uro/o:005", + "gpid": [ 11421, 891, "3b5:8417" ] }, { "name": "M3 105mm Howitzer", "type": "ART", @@ -60,8 +60,8 @@ "capabilities2": { "H": 7, "s": 7, "WP": 8, "C": 7 }, "note_number": "7\u2020", "notes": [ "C", "K" ], - "id": "uro/o:006", - "gpid": null + "id": "kfw-uro/o:006", + "gpid": 11422 }, { "name": "M1 155mm Howitzer", "type": "ART", @@ -69,8 +69,8 @@ "capabilities2": { "s": 7, "WP": 8 }, "note_number": "8\u2020", "notes": [ "K", "M", "P", "Y" ], - "id": "uro/o:007", - "gpid": null + "id": "kfw-uro/o:007", + "gpid": [ 11423, 895 ] }, { "name": "M1A1 155mm Gun", "type": "ART", @@ -79,8 +79,8 @@ "comments": [ "No IF." ], "note_number": "9", "notes": [ "Y" ], - "id": "uro/o:008", - "gpid": null + "id": "kfw-uro/o:008", + "gpid": 897 }, { "name": "M1 8-in. Howitzer", "type": "ART", @@ -88,8 +88,8 @@ "comments": [ "No IF." ], "note_number": "10\u2020", "notes": [ "Y" ], - "id": "uro/o:009", - "gpid": null + "id": "kfw-uro/o:009", + "gpid": 898 }, { "name": "M51 Multiple .50-cal MG Carriage", "type": "AA", @@ -98,8 +98,8 @@ "capabilities_other": [ "4 TK DR\u2020" ], "note_number": "11\u2020", "notes": [ "M", "Y" ], - "id": "uro/o:010", - "gpid": null + "id": "kfw-uro/o:010", + "gpid": "3b5:3741" }, { "name": "M1 40mm AA Gun", "type": "AA", @@ -107,8 +107,8 @@ "capabilities2": { "LF": [ "40\u2020", "2 ROF" ] }, "note_number": "12", "notes": [ "B\u2020", "Y" ], - "id": "uro/o:011", - "gpid": null + "id": "kfw-uro/o:011", + "gpid": 902 }, { "name": "M2 90mm AA Gun", "type": "AA", @@ -116,8 +116,8 @@ "capabilities2": { "LF": [ "90\u20201", "1 ROF", "B11" ] }, "note_number": "13\u2020", "notes": [ "B\u20201", "M", "Y" ], - "id": "uro/o:012", - "gpid": null + "id": "kfw-uro/o:012", + "gpid": 905 } ] diff --git a/vasl_templates/webapp/data/vasl-overrides.json b/vasl_templates/webapp/data/vasl-overrides.json index bb073ef..9a51f1b 100644 --- a/vasl_templates/webapp/data/vasl-overrides.json +++ b/vasl_templates/webapp/data/vasl-overrides.json @@ -130,6 +130,18 @@ "updated": { "front_images": "ru/gun/ru76PPobr27.png" } +}, + +"3b5:10093": { + "expected": { + "name": "SL truck", + "front_images": [ "sh/SL3b(KFW).png", "sh/SL4b(KFW).png", "sh/SL5b(KFW).png", "sh/SL6b(KFW).png", "sh/SL1b(KFW).png", "sh/SL2b(KFW).png" ], + "back_images": [ "sh/SL3(KFW).png", "sh/SL4(KFW).png", "sh/SL5(KFW).png", "sh/SL6(KFW).png", "sh/SL1(KFW).png", "sh/SL2(KFW).png" ] + }, + "updated": { + "front_images": "us/veh/usSearchlight(KFW).png", + "back_images": null + } } } diff --git a/vasl_templates/webapp/data/vehicles/american.json b/vasl_templates/webapp/data/vehicles/american.json index d90ef3c..aacf8de 100644 --- a/vasl_templates/webapp/data/vehicles/american.json +++ b/vasl_templates/webapp/data/vehicles/american.json @@ -497,7 +497,7 @@ "id": "am/v:056", "gpid": 1032 }, -{ "name": "\u00bc-Ton Jeep GPA", +{ "name": "¼-Ton Jeep GPA", "type": "atr", "cs#": 2, "note_number": "53\u2020", @@ -505,7 +505,7 @@ "id": "am/v:057", "gpid": 1036 }, -{ "name": "\u00bc-Ton Jeep", +{ "name": "¼-Ton Jeep", "type": "tr", "cs#": "2\u20201", "note_number": "54\u2020", @@ -513,7 +513,7 @@ "id": "am/v:058", "gpid": [ 1039, 1040, 1041 ] }, -{ "name": "\u00be-Ton", +{ "name": "¾-Ton", "type": "tr", "cs#": 4, "note_number": "55\u2020", @@ -521,7 +521,7 @@ "id": "am/v:059", "gpid": 1042 }, -{ "name": "1\u00bd-Ton", +{ "name": "1½-Ton", "type": "tr", "cs#": 6, "note_number": "56\u2020", @@ -529,7 +529,7 @@ "id": "am/v:060", "gpid": 1044 }, -{ "name": "2\u00bd-Ton", +{ "name": "2½-Ton", "type": "tr", "cs#": 7, "note_number": "57\u2020", @@ -537,7 +537,7 @@ "id": "am/v:061", "gpid": 1046 }, -{ "name": "7\u00bd-Ton", +{ "name": "7½-Ton", "type": "tr", "cs#": 7, "note_number": "58\u2020", diff --git a/vasl_templates/webapp/data/vehicles/axis-minor/common.json b/vasl_templates/webapp/data/vehicles/axis-minor/common.json index 8f0921c..70dadd4 100644 --- a/vasl_templates/webapp/data/vehicles/axis-minor/common.json +++ b/vasl_templates/webapp/data/vehicles/axis-minor/common.json @@ -5,7 +5,7 @@ "no_radio": "\u00ae", "CS#": 2, "note_number": "29\u2020", - "notes": [ "K\u20201", "E", "F", "G\u20202", "H", "C", "B" ], + "notes": [ "B", "C", "E", "F", "G\u20202", "H", "K\u20201" ], "id": "axc/v:000", "gpid": 3787 }, @@ -15,7 +15,7 @@ "CS#": 2, "no_if": true, "note_number": "30\u2020", - "notes": [ "D", "R", "C" ], + "notes": [ "C", "D", "R" ], "id": "axc/v:001", "gpid": 3789 }, @@ -25,7 +25,7 @@ "CS#": 2, "capabilities2": { "AP": 9 }, "note_number": "30\u2020", - "notes": [ "D", "R", "C" ], + "notes": [ "C", "D", "R" ], "id": "axc/v:002", "gpid": 3791 }, @@ -34,7 +34,7 @@ "CS#": 2, "capabilities2": { "sD": 6 }, "note_number": "31\u2020", - "notes": [ "K\u20201", "E", "H", "C" ], + "notes": [ "C", "E", "H", "K\u20201" ], "id": "axc/v:003", "gpid": 3827 }, @@ -44,7 +44,7 @@ "CS#": 2, "capabilities2": { "AP": 10 }, "note_number": "32\u2020", - "notes": [ "A\u20201", "D", "E", "R", "H", "B" ], + "notes": [ "A\u20201", "B", "D", "E", "H", "R" ], "id": "axc/v:004", "gpid": [ 3795, 3906 ] }, @@ -54,7 +54,7 @@ "CS#": 2, "capabilities2": { "AP": 10 }, "note_number": "33\u2020", - "notes": [ "A\u20201", "D", "E", "H", "C", "B" ], + "notes": [ "A\u20201", "B", "C", "D", "E", "H" ], "id": "axc/v:005", "gpid": 3793 }, @@ -63,7 +63,7 @@ "CS#": 4, "capabilities2": { "sD": 5 }, "note_number": "34\u2020", - "notes": [ "E", "R", "S", "B" ], + "notes": [ "B", "E", "R", "S" ], "id": "axc/v:006", "gpid": 3825 }, @@ -72,7 +72,7 @@ "CS#": 4, "capabilities2": { "A": [ [3,1], [4,2], [3,3] ], "sD": 6 }, "note_number": "35\u2020", - "notes": [ "E", "R", "H", "S" ], + "notes": [ "E", "H", "R", "S" ], "id": "axc/v:007", "gpid": 3799 }, @@ -81,11 +81,11 @@ "CS#": 4, "capabilities2": { "A": [ [4,2], [3,3] ], "sD": 7 }, "note_number": "35\u2020", - "notes": [ "E", "H", "S", "B" ], + "notes": [ "B", "E", "H", "S" ], "id": "axc/v:008", "gpid": 3801 }, -{ "name": "S-35(f)", +{ "name": "S35(f)", "type": "MT", "CS#": 4, "note_number": "36\u2020", @@ -98,7 +98,7 @@ "CS#": 5, "capabilities2": { "A": [ [5,2], [4,3], [3,4] ], "sD": 5 }, "note_number": "37\u2020", - "notes": [ "E", "O\u20201", "Q", "R", "H", "C" ], + "notes": [ "C", "E", "H", "O\u20201", "Q", "R" ], "id": "axc/v:010", "gpid": [ 3829, 3831 ] }, @@ -125,7 +125,7 @@ "CS#": 6, "capabilities2": { "AP": 7, "H": [ [5,"3+"] ], "s": 8, "sD": 7 }, "note_number": "39\u2020", - "notes": [ "E", "Q", "R", "H", "B" ], + "notes": [ "B", "E", "H", "Q", "R" ], "id": "axc/v:013", "gpid": 3839 }, @@ -134,7 +134,7 @@ "CS#": 6, "capabilities2": { "A": [ [4,2], [3,3] ], "s": 7, "sD": 5 }, "note_number": "39\u2020", - "notes": [ "E", "O\u20201", "Q", "R", "H", "B" ], + "notes": [ "B", "E", "H", "O\u20201", "Q", "R" ], "id": "axc/v:014", "gpid": [ 3841, 3843 ] }, @@ -143,7 +143,7 @@ "CS#": 4, "capabilities2": { "A": [ [3,4] ], "s": 8, "sD": 7 }, "note_number": "40\u2020", - "notes": [ "E", "Q", "R", "H", "B" ], + "notes": [ "B", "E", "H", "Q", "R" ], "id": "axc/v:015", "gpid": 3845 }, @@ -152,14 +152,14 @@ "CS#": 4, "capabilities2": { "A": [ [3,4] ], "HE": 7 }, "note_number": "41\u2020", - "notes": [ "E", "H", "B" ], + "notes": [ "B", "E", "H" ], "id": "axc/v:016", "gpid": 3803 }, { "name": "SPW 250/1(g)", "type": "ht", "CS#": 4, - "note_number": "42\u2020", + "note_number": "42", "notes": [ "E", "R" ], "id": "axc/v:017", "gpid": 3847 @@ -168,7 +168,7 @@ "type": "ht", "CS#": 5, "note_number": "42\u2020", - "notes": [ "E", "R", "C" ], + "notes": [ "C", "E", "R" ], "id": "axc/v:018", "gpid": 3849 }, @@ -194,7 +194,7 @@ "type": "AC", "CS#": 4, "note_number": "44\u2020", - "notes": [ "E", "R", "C" ], + "notes": [ "C", "E", "R" ], "id": "axc/v:021", "gpid": 3807 }, @@ -203,7 +203,7 @@ "CS#": 3, "capabilities2": { "sD": 6 }, "note_number": "45\u2020", - "notes": [ "P\u20201", "E", "M\u20202", "R", "B" ], + "notes": [ "B", "E", "M\u20202", "P\u20201", "R" ], "id": "axc/v:022", "gpid": 3853 }, @@ -212,7 +212,7 @@ "CS#": 3, "capabilities2": { "sD": 6 }, "note_number": "45\u2020", - "notes": [ "P\u20201", "E", "M\u20202", "R", "B" ], + "notes": [ "B", "E", "M\u20202", "P\u20201", "R" ], "id": "axc/v:023", "gpid": 3855 }, @@ -221,7 +221,7 @@ "CS#": 3, "capabilities2": { "sD": 6 }, "note_number": "46\u2020", - "notes": [ "E", "M\u20201", "P\u20202", "R", "B" ], + "notes": [ "B", "E", "M\u20201", "P\u20202", "R" ], "id": "axc/v:024", "gpid": 3857 }, @@ -229,7 +229,7 @@ "type": "APC", "cs#": "2\u20201", "note_number": "47\u2020", - "notes": [ "E", "F", "I\u20201", "J", "R", "H", "S", "C", "B" ], + "notes": [ "B", "C", "E", "F", "H", "I\u20201", "J", "R", "S" ], "id": "axc/v:025", "gpid": [ 3809, 3811 ] }, @@ -237,7 +237,7 @@ "type": "PC", "cs#": 5, "note_number": "48", - "notes": [ "S", "B" ], + "notes": [ "B", "S" ], "id": "axc/v:026", "gpid": 3859 }, @@ -245,7 +245,7 @@ "type": "PC", "cs#": 4, "note_number": "49", - "notes": [ "R", "H", "S", "C", "B" ], + "notes": [ "B", "C", "H", "R", "S" ], "id": "axc/v:027", "gpid": 3813 }, @@ -253,7 +253,7 @@ "type": "PC", "cs#": 5, "note_number": "49", - "notes": [ "R", "H", "S", "C", "B" ], + "notes": [ "B", "C", "H", "R", "S" ], "id": "axc/v:028", "gpid": 3815 }, @@ -261,7 +261,7 @@ "type": "PC", "cs#": 6, "note_number": "49", - "notes": [ "R", "H", "S", "C", "B" ], + "notes": [ "B", "C", "H", "R", "S" ], "id": "axc/v:029", "gpid": 3817 }, @@ -269,7 +269,7 @@ "type": "tr", "cs#": 4, "note_number": "50", - "notes": [ "R", "H", "S", "C", "B" ], + "notes": [ "B", "C", "H", "R", "S" ], "id": "axc/v:030", "gpid": 3819 }, @@ -277,7 +277,7 @@ "type": "tr", "cs#": 5, "note_number": "50", - "notes": [ "R", "H", "S", "C", "B" ], + "notes": [ "B", "C", "H", "R", "S" ], "id": "axc/v:031", "gpid": 3821 }, @@ -285,7 +285,7 @@ "type": "tr", "cs#": 7, "note_number": "50", - "notes": [ "R", "H", "S", "C", "B" ], + "notes": [ "B", "C", "H", "R", "S" ], "id": "axc/v:032", "gpid": 3823 } diff --git a/vasl_templates/webapp/data/vehicles/axis-minor/slovakian.json b/vasl_templates/webapp/data/vehicles/axis-minor/slovakian.json index d034454..888846c 100644 --- a/vasl_templates/webapp/data/vehicles/axis-minor/slovakian.json +++ b/vasl_templates/webapp/data/vehicles/axis-minor/slovakian.json @@ -5,7 +5,7 @@ "no_radio": "\u00ae", "CS#": 2, "note_number": "17\u2020", - "notes": [ "K\u20201", "E", "F", "G\u20202" ], + "notes": [ "E", "F", "G\u20202", "K\u20201" ], "id": "sl/v:000", "gpid": 3879 }, @@ -31,7 +31,7 @@ "CS#": 4, "capabilities2": { "sD": 6 }, "note_number": "20\u2020", - "notes": [ "K\u20201", "E" ], + "notes": [ "E", "K\u20201" ], "id": "sl/v:003", "gpid": 3885 }, @@ -48,7 +48,7 @@ "type": "tr", "cs#": "2\u20201", "note_number": "22\u2020", - "notes": [ "E", "L\u20202", "I\u20201" ], + "notes": [ "E", "I\u20201", "L\u20202" ], "id": "sl/v:005", "gpid": 3889 }, diff --git a/vasl_templates/webapp/data/vehicles/british.json b/vasl_templates/webapp/data/vehicles/british.json index f60b3b3..3eb206d 100644 --- a/vasl_templates/webapp/data/vehicles/british.json +++ b/vasl_templates/webapp/data/vehicles/british.json @@ -1068,7 +1068,7 @@ "id": "br/v:121", "gpid": 1567 }, -{ "name": "\u00bc-Ton Jeep(a)", +{ "name": "¼-Ton Jeep(a)", "type": "tr", "cs#": "2\u20201", "note_number": "84\u2020", @@ -1076,7 +1076,7 @@ "id": "br/v:122", "gpid": [ 1569, 1570 ] }, -{ "name": "\u00be-Ton Truck(a)", +{ "name": "¾-Ton Truck(a)", "type": "tr", "cs#": 4, "note_number": "85", @@ -1084,7 +1084,7 @@ "id": "br/v:123", "gpid": 1571 }, -{ "name": "1\u00bd-Ton Truck(a)", +{ "name": "1½-Ton Truck(a)", "type": "tr", "cs#": 6, "note_number": "85", @@ -1092,7 +1092,7 @@ "id": "br/v:124", "gpid": 1573 }, -{ "name": "2\u00bd-Ton Truck(a)", +{ "name": "2½-Ton Truck(a)", "type": "tr", "cs#": 7, "note_number": "85", @@ -1100,7 +1100,7 @@ "id": "br/v:125", "gpid": 1575 }, -{ "name": "7\u00bd-Ton Truck(a)", +{ "name": "7½-Ton Truck(a)", "type": "tr", "cs#": 7, "note_number": "85\u2020", diff --git a/vasl_templates/webapp/data/vehicles/chinese.json b/vasl_templates/webapp/data/vehicles/chinese.json index 6745dff..ce94ba3 100644 --- a/vasl_templates/webapp/data/vehicles/chinese.json +++ b/vasl_templates/webapp/data/vehicles/chinese.json @@ -170,7 +170,7 @@ "id": "ch/v:019", "gpid": 2113 }, -{ "name": "2\u00bd-Ton(a)", +{ "name": "2½-Ton(a)", "type": "tr", "cs#": 7, "note_number": "16\u2020", diff --git a/vasl_templates/webapp/data/vehicles/kfw-kpa.json b/vasl_templates/webapp/data/vehicles/kfw-kpa.json new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/vasl_templates/webapp/data/vehicles/kfw-kpa.json @@ -0,0 +1 @@ +[] diff --git a/vasl_templates/webapp/data/vehicles/kfw-ounc.json b/vasl_templates/webapp/data/vehicles/kfw-ounc.json new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/vasl_templates/webapp/data/vehicles/kfw-ounc.json @@ -0,0 +1 @@ +[] diff --git a/vasl_templates/webapp/data/vehicles/kfw-rok.json b/vasl_templates/webapp/data/vehicles/kfw-rok.json new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/vasl_templates/webapp/data/vehicles/kfw-rok.json @@ -0,0 +1 @@ +[] diff --git a/vasl_templates/webapp/data/vehicles/kfw/bcfk.json b/vasl_templates/webapp/data/vehicles/kfw/bcfk.json new file mode 100644 index 0000000..0699a65 --- /dev/null +++ b/vasl_templates/webapp/data/vehicles/kfw/bcfk.json @@ -0,0 +1,219 @@ +[ + +{ "name": "M4A3E8(a)", + "type": "MT", + "CS#": 6, + "capabilities2": { "A": [ "\u20201" ], "s": 5, "sM": 8 }, + "note_number": "34", + "notes": [ "A\u20201", "FF\u2020", "UU" ], + "id": "kfw-bcfk/v:000", + "gpid": "3b5:7685" +}, +{ "name": "M4A3E8 Dozer(a)", + "type": "MTv", + "CS#": 6, + "capabilities2": { "A": [ "\u20201" ], "s": 5, "sM": 8 }, + "note_number": "34", + "notes": [ "A\u20201", "TT\u2020", "UU" ], + "id": "kfw-bcfk/v:001", + "gpid": "3b5:7687" +}, +{ "name": "Cromwell VII", + "type": "MT", + "CS#": 6, + "capabilities2": { "s": "8\u2020", "sD": 7, "sM": "8\u20201" }, + "note_number": "35\u2020", + "notes": [ "N", "ZZ\u20201" ], + "id": "kfw-bcfk/v:002", + "gpid": 1320 +}, +{ "name": "Centaur Dozer", + "type": "MTv", + "CS#": "2\u20201", + "capabilities2": { "sD": 7 }, + "note_number": "36\u20201", + "notes": [ "TT\u2020" ], + "id": "kfw-bcfk/v:003", + "gpid": "3b5:7658" +}, +{ "name": "Churchill VII", + "type": "HT", + "CS#": 7, + "capabilities2": { "s": 8, "WP": 6, "sD": 7, "sM": "8\u20201" }, + "note_number": "37\u2020", + "notes": [ "N", "CC", "ZZ\u20201" ], + "id": "kfw-bcfk/v:004", + "gpid": 1372 +}, +{ "name": "Centurion III", + "type": "HT", + "CS#": 7, + "capabilities2": { "HE": 8, "D": [ "\u2020" ], "s": 8, "WP": 6, "sD": 7, "sM": "8\u20201" }, + "note_number": "38\u2020", + "notes": [ "CC", "ZZ\u20201" ], + "id": "kfw-bcfk/v:005", + "gpid": 11365 +}, +{ "name": "Centurion III(L)", + "type": "HT", + "CS#": 7, + "capabilities2": { "D": 8, "s": 8, "WP": 6, "sD": 7, "sM": "8\u20202" }, + "note_number": "38\u2020", + "notes": [ "CC", "FF\u20201", "ZZ\u20202" ], + "id": "kfw-bcfk/v:006", + "gpid": "3b5:7669" +}, +{ "name": "Churchill Bridgelayer", + "type": "HTv", + "CS#": 2, + "capabilities2": { "sD": 7 }, + "note_number": "39\u2020", + "notes": [ "N", "CC" ], + "id": "kfw-bcfk/v:007", + "gpid": "3b5:7681" +}, +{ "name": "M4A1 MC(a)", + "type": "ht", + "CS#": "4:brewup", + "capabilities": [ "IR" ], + "capabilities2": { "WP": 8 }, + "note_number": "40\u2020", + "notes": [ "Q\u20201", "NN", "UU" ], + "id": "kfw-bcfk/v:008", + "gpid": "3b5:7705" +}, +{ "name": "M9(a)", + "type": "ht", + "cs#": 4, + "note_number": "41", + "notes": [ "N", "UU" ], + "id": "kfw-bcfk/v:009", + "gpid": 1489 +}, +{ "name": "Daimler", + "type": "SC", + "CS#": 2, + "capabilities2": { "sD": 4 }, + "note_number": "42\u2020", + "notes": [ "N" ], + "id": "kfw-bcfk/v:010", + "gpid": 1401 +}, +{ "name": "Carrier A", + "type": "APC", + "CS#": 3, + "capabilities2": { "sD": 5 }, + "note_number": "43\u2020", + "notes": [ "N", "U\u20201" ], + "id": "kfw-bcfk/v:011", + "gpid": 1497 +}, +{ "name": "Carrier C", + "type": "APC", + "CS#": 3, + "capabilities2": { "sD": 5 }, + "note_number": "43\u2020", + "notes": [ "N", "U\u20202", "Z\u20201" ], + "id": "kfw-bcfk/v:012", + "gpid": 1501 +}, +{ "name": "Carrier, MMG A", + "type": "APC", + "CS#": 3, + "capabilities2": { "sD": 5 }, + "note_number": "44\u2020", + "notes": [ "N", "U\u20201" ], + "id": "kfw-bcfk/v:013", + "gpid": 1503 +}, +{ "name": "Carrier, 3-in. Mtr", + "type": "APC", + "CS#": "4:brewup", + "note_number": "45\u2020", + "notes": [ "U", "MM\u20201", "NN" ], + "id": "kfw-bcfk/v:014", + "gpid": 1511 +}, +{ "name": "Oxford Carrier", + "type": "APC", + "CS#": "5\u2020", + "note_number": "46\u2020", + "notes": [ "EE\u20201" ], + "id": "kfw-bcfk/v:015", + "gpid": "3b5:7735" +}, +{ "name": "Oxford Carrier, MMG", + "type": "APC", + "CS#": 5, + "note_number": "47\u2020", + "notes": [ "EE\u20201" ], + "id": "kfw-bcfk/v:016", + "gpid": "3b5:7731" +}, +{ "name": "Oxford Carrier, HMG", + "type": "APC", + "CS#": 5, + "note_number": "47\u2020", + "notes": [ "G\u20201", "EE\u20202" ], + "id": "kfw-bcfk/v:017", + "gpid": "3b5:7733" +}, +{ "name": "Oxford Carrier, 3-in Mtr", + "type": "APC", + "CS#": 5, + "note_number": "48\u2020", + "notes": [ "EE\u20202", "MM\u20201", "NN" ], + "id": "kfw-bcfk/v:018", + "gpid": "3b5:7719" +}, +{ "name": "IP Carrier AOV", + "type": "APC", + "CS#": 4, + "note_number": "49\u2020", + "notes": [ "N", "W\u20201" ], + "id": "kfw-bcfk/v:019", + "gpid": 1527 +}, +{ "name": "Wasp", + "type": "APCv", + "CS#": "3:brewup", + "capabilities2": { "sD": "5\u2020" }, + "note_number": "50\u2020", + "notes": [ "N", "U" ], + "id": "kfw-bcfk/v:020", + "gpid": 1533 +}, +{ "name": "Morris C9/B", + "type": "AAtr", + "CS#": 4, + "note_number": "51\u2020", + "notes": [ "N", "AA\u20201" ], + "id": "kfw-bcfk/v:021", + "gpid": 1557 +}, +{ "name": "Quad FAT", + "type": "tr", + "cs#": "5:brewup\u2020", + "note_number": "52\u2020", + "notes": [ "N" ], + "id": "kfw-bcfk/v:022", + "gpid": 1561 +}, +{ "name": "15-cwt", + "type": "tr", + "cs#": 5, + "note_number": "53\u2020", + "notes": [ "N" ], + "id": "kfw-bcfk/v:023", + "gpid": 1563 +}, +{ "name": "3-Ton Lorry", + "type": "tr", + "cs#": 7, + "note_number": "53\u2020", + "notes": [ "N" ], + "id": "kfw-bcfk/v:024", + "gpid": 1567 +} + +] diff --git a/vasl_templates/webapp/data/vehicles/kfw/kpa.json b/vasl_templates/webapp/data/vehicles/kfw/kpa.json new file mode 100644 index 0000000..2d1309b --- /dev/null +++ b/vasl_templates/webapp/data/vehicles/kfw/kpa.json @@ -0,0 +1,74 @@ +[ + +{ "name": "T-34/85", + "type": "MT", + "CS#": 6, + "capabilities2": { "A": 6, "sD": "6\u2020" }, + "note_number": "1\u2020", + "id": "kfw-kpa/v:000", + "gpid": "3b5:8212" +}, +{ "name": "SU-76M", + "type": "AG", + "CS#": "4:brewup", + "capabilities2": { "A": 7 }, + "note_number": "2\u2020", + "id": "kfw-kpa/v:001", + "gpid": "3b5:8214" +}, +{ "name": "BA-64B", + "type": "AC", + "CS#": 2, + "note_number": "3\u2020", + "notes": [ "B" ], + "id": "kfw-kpa/v:002", + "gpid": "3b5:8216" +}, +{ "name": "GAZ-67B", + "type": "tr", + "cs#": 2, + "note_number": "4\u2020", + "notes": [ "B" ], + "id": "kfw-kpa/v:003", + "gpid": "3b5:11102" +}, +{ "name": "GAZ-MM", + "type": "tr", + "cs#": 6, + "note_number": "4\u2020", + "notes": [ "B" ], + "id": "kfw-kpa/v:004", + "gpid": "3b5:11098" +}, +{ "name": "ZIS-5", + "type": "tr", + "cs#": 7, + "note_number": "4\u2020", + "notes": [ "B" ], + "id": "kfw-kpa/v:005", + "gpid": "3b5:11103" +}, +{ "name": "IAG-6", + "type": "tr", + "cs#": 7, + "note_number": "4\u2020", + "notes": [ "B" ], + "id": "kfw-kpa/v:006", + "gpid": "3b5:11107" +}, +{ "name": "GAZ-51", + "type": "tr", + "cs#": 6, + "note_number": "5\u2020", + "id": "kfw-kpa/v:007", + "gpid": "3b5:11100" +}, +{ "name": "ZIS-151", + "type": "tr", + "cs#": 7, + "note_number": "6\u2020", + "id": "kfw-kpa/v:008", + "gpid": "3b5:11105" +} + +] diff --git a/vasl_templates/webapp/data/vehicles/kfw/un-common.json b/vasl_templates/webapp/data/vehicles/kfw/un-common.json new file mode 100644 index 0000000..4eca4ed --- /dev/null +++ b/vasl_templates/webapp/data/vehicles/kfw/un-common.json @@ -0,0 +1,54 @@ +[ + +{ "name": "M3A1", + "type": "ht", + "CS#": 5, + "note_number": "54\u2020", + "notes": [ "E\u2020", "H", "K", "Y", "Z\u20201", "UU" ], + "id": "kfw-un-common/v:000", + "gpid": [ 969, "3b5:7703", "3b5:4019" ] +}, +{ "name": "M20", + "type": "SC", + "CS#": 4, + "capabilities2": { "sP": 5 }, + "note_number": "55\u2020", + "notes": [ "D\u20204", "K", "Q\u20202", "W\u20201", "Y", "Z\u20203", "UU" ], + "id": "kfw-un-common/v:001", + "gpid": [ 998, "3b5:7697", "3b5:4036" ] +}, +{ "name": "M8", + "type": "AC", + "CS#": 4, + "capabilities2": { "C": 7, "sP": 5 }, + "note_number": "56\u2020", + "notes": [ "C", "K", "W\u20201", "Y", "UU" ], + "id": "kfw-un-common/v:002", + "gpid": [ 1002, "3b5:7699", "3b5:4038" ] +}, +{ "name": "¼-Ton Jeep", + "type": "tr", + "cs#": "2\u20201", + "note_number": "57\u2020", + "notes": [ "K", "L\u20202", "M", "N", "O", "P", "Q\u20201", "Y", "UU" ], + "id": "kfw-un-common/v:003", + "gpid": [ 1039, 1569, "3b5:10746", "3b5:8423" ] +}, +{ "name": "¾-Ton", + "type": "tr", + "cs#": 4, + "note_number": "57\u2020", + "notes": [ "K", "N", "O", "Y", "UU" ], + "id": "kfw-un-common/v:004", + "gpid": [ 1042, 1571, "3b5:4050", "3b5:8425" ] +}, +{ "name": "2½-Ton", + "type": "tr", + "cs#": 7, + "note_number": "57\u2020", + "notes": [ "K", "M", "N", "O", "P", "Y", "UU" ], + "id": "kfw-un-common/v:005", + "gpid": [ 1046, 1575, "3b5:4052", "3b5:8427" ] +} + +] diff --git a/vasl_templates/webapp/data/vehicles/kfw/us-rok-ounc.json b/vasl_templates/webapp/data/vehicles/kfw/us-rok-ounc.json new file mode 100644 index 0000000..d6bc922 --- /dev/null +++ b/vasl_templates/webapp/data/vehicles/kfw/us-rok-ounc.json @@ -0,0 +1,332 @@ +[ + +{ "name": "M24", + "type": "LT", + "CS#": 5, + "capabilities2": { "s": 5, "WP": 7, "sM": 8 }, + "note_number": "1\u2020", + "notes": [ "O", "Y" ], + "id": "kfw-uro/v:000", + "gpid": [ 12652, "3b5:8419" ] +}, +{ "name": "M4A3E8", + "type": "MT", + "CS#": 6, + "capabilities2": { "A": [ "\u20201" ], "s": 5, "sM": 8 }, + "note_number": "2\u2020", + "notes": [ "A\u20201", "P" ], + "id": "kfw-uro/v:001", + "gpid": [ 11338, "3b5:3983" ] +}, +{ "name": "M4A3E8(105)", + "type": "MT", + "CS#": 6, + "capabilities2": { "H": 9, "C": 7, "s": 7, "WP": 9, "sM": 8 }, + "note_number": "3\u2020", + "notes": [ "C", "M" ], + "id": "kfw-uro/v:002", + "gpid": "3b5:3626" +}, +{ "name": "M4A3E8 Dozer", + "type": "MTv", + "CS#": 6, + "capabilities2": { "A": [ "\u20201" ], "s": 5, "sM": 8 }, + "note_number": "4", + "notes": [ "A\u20201", "TT\u2020" ], + "id": "kfw-uro/v:003", + "gpid": "3b5:3628" +}, +{ "name": "M4A3E8(105) Dozer", + "type": "MTv", + "CS#": 6, + "capabilities2": { "H": 9, "C": 7, "s": 7, "WP": 9, "sM": 8 }, + "note_number": "4\u2020", + "notes": [ "C", "M", "TT\u20201" ], + "id": "kfw-uro/v:004", + "gpid": "3b5:3630" +}, +{ "name": "POA-CWS-H5", + "type": "MTv", + "CS#": 6, + "capabilities2": { "C": 5, "sM": 8 }, + "note_number": "5\u2020", + "notes": [ "C", "M" ], + "id": "kfw-uro/v:005", + "gpid": "3b5:3632" +}, +{ "name": "M32A1B3 TRV", + "type": "MTv", + "CS#": 6, + "note_number": "6\u2020", + "notes": [ "K", "M", "P" ], + "id": "kfw-uro/v:006", + "gpid": "3b5:3634" +}, +{ "name": "M26A1", + "type": "MT", + "CS#": 6, + "capabilities2": { "A": [ "\u20201" ], "WP": [ [6,"M51+"], "\u20202" ] }, + "note_number": "7\u2020", + "notes": [ "A\u20201", "J\u20202", "M" ], + "id": "kfw-uro/v:007", + "gpid": "3b5:3636" +}, +{ "name": "M45", + "type": "MT", + "CS#": 6, + "capabilities2": { "H": 7, "s": 7, "WP": 9 }, + "note_number": "8", + "id": "kfw-uro/v:008", + "gpid": "3b5:3638" +}, +{ "name": "M46", + "type": "MT", + "CS#": 6, + "capabilities2": { "A": [ "\u20202" ], "WP": [ [6,"M51+"], "\u20203" ] }, + "note_number": "9\u2020", + "notes": [ "A\u20202", "J\u20203", "M", "FF\u20201" ], + "id": "kfw-uro/v:009", + "gpid": "3b5:3640" +}, +{ "name": "M36B2 GMC(a)", + "type": "TD", + "CS#": 7, + "capabilities2": { "A": [ "\u2020" ], "sP": 5 }, + "note_number": "10", + "notes": [ "A\u2020", "K", "UU" ], + "id": "kfw-uro/v:010", + "gpid": 11424 +}, +{ "name": "M38A1C Jeep", + "type": "TDtr", + "CS#": 2, + "capabilities2": { "H": [ "\u2020" ] }, + "note_number": "11\u2020", + "id": "kfw-uro/v:011", + "gpid": "3b5:3642" +}, +{ "name": "M3", + "type": "ht", + "CS#": 5, + "note_number": "12\u2020", + "notes": [ "K", "Y" ], + "id": "kfw-uro/v:012", + "gpid": [ 967, "3b5:4017" ] +}, +{ "name": "M3(MMG)", + "type": "ht", + "CS#": 5, + "note_number": "13\u2020", + "notes": [ "E\u2020", "H", "K", "Y" ], + "id": "kfw-uro/v:013", + "gpid": [ 971, "3b5:4021" ] +}, +{ "name": "M3(HMG)", + "type": "ht", + "CS#": 5, + "note_number": "13\u2020", + "notes": [ "E\u2020", "H", "K", "Y" ], + "id": "kfw-uro/v:014", + "gpid": [ 973, "3b5:4023" ] +}, +{ "name": "M19A1 MGMC", + "type": "SPAA", + "CS#": 4, + "note_number": "14\u2020", + "notes": [ "AA\u20201" ], + "id": "kfw-uro/v:015", + "gpid": "3b5:3676" +}, +{ "name": "M15A1 MGMC", + "type": "AAht", + "CS#": 4, + "note_number": "15\u2020", + "notes": [ "O", "V\u20201", "Y", "AA\u20202", "DD\u20201" ], + "id": "kfw-uro/v:016", + "gpid": [ 990, "3b5:8421" ] +}, +{ "name": "M15 Special", + "type": "AAht", + "CS#": 4, + "note_number": "16\u2020", + "notes": [ "AA\u20202", "DD\u20201" ], + "id": "kfw-uro/v:017", + "gpid": "3b5:3686" +}, +{ "name": "M16 MGMC", + "type": "AAht", + "CS#": 4, + "note_number": "17\u2020", + "notes": [ "F\u20201", "V\u20201", "Y", "AA\u20202", "DD\u20201" ], + "id": "kfw-uro/v:018", + "gpid": 992 +}, +{ "name": "M16A1 MGMC", + "type": "AAht", + "CS#": 5, + "note_number": "18\u2020", + "notes": [ "F\u20201", "V\u20201", "AA\u20202", "DD\u20201" ], + "id": "kfw-uro/v:019", + "gpid": "3b5:3688" +}, +{ "name": "M39 AUV", + "type": "APC", + "CS#": 6, + "note_number": "19\u2020", + "notes": [ "G\u20201", "M" ], + "id": "kfw-uro/v:020", + "gpid": 12277 +}, +{ "name": "M39 MC", + "type": "SPA", + "CS#": "5:brewup", + "capabilities2": { "WP": 8 }, + "note_number": "19\u2020", + "id": "kfw-uro/v:021", + "gpid": 12279 +}, +{ "name": "M7 HMC", + "type": "SPA", + "CS#": 7, + "capabilities2": { "H": 7, "C": 7, "s": 7, "WP": 8 }, + "note_number": "20\u2020", + "notes": [ "C", "Y" ], + "id": "kfw-uro/v:022", + "gpid": 1006 +}, +{ "name": "M37 HMC", + "type": "SPA", + "CS#": 7, + "capabilities2": { "H": 9, "s": 7, "WP": 9 }, + "note_number": "21", + "id": "kfw-uro/v:023", + "gpid": "3b5:3690" +}, +{ "name": "M41 HMC", + "type": "SPA", + "CS#": 9, + "no_if": true, + "capabilities2": { "s": 7, "WP": 8 }, + "note_number": "22\u2020", + "notes": [ "S\u20201" ], + "id": "kfw-uro/v:024", + "gpid": "3b5:10290" +}, +{ "name": "M40 GMC", + "type": "SPA", + "CS#": 9, + "no_if": true, + "capabilities2": { "AP": 4, "s": 7, "WP": 8 }, + "note_number": "23", + "notes": [ "S\u2020" ], + "id": "kfw-uro/v:025", + "gpid": "3b5:4148" +}, +{ "name": "M43 HMC", + "type": "SPA", + "CS#": 9, + "no_if": true, + "note_number": "23", + "notes": [ "S\u2020" ], + "id": "kfw-uro/v:026", + "gpid": "3b5:4154" +}, +{ "name": "LVT(A)5", + "type": "aLT", + "CS#": 6, + "capabilities2": { "H": 8, "C": 7, "WP": 8 }, + "note_number": "24\u2020", + "notes": [ "H", "T\u20201", "X\u20202" ], + "id": "kfw-uro/v:027", + "gpid": 11344 +}, +{ "name": "LVT(A)5m", + "type": "aLT", + "CS#": 6, + "capabilities2": { "H": 8, "C": 7, "WP": 8 }, + "note_number": "24", + "notes": [ "M", "T\u2020" ], + "id": "kfw-uro/v:028", + "gpid": 11346 +}, +{ "name": "LVT3", + "type": "aAPC", + "CS#": 7, + "note_number": "25\u2020", + "notes": [ "D\u2020", "H", "M", "T\u20201", "X\u20202" ], + "id": "kfw-uro/v:029", + "gpid": [ "3b5:3704", "3b5:3706" ] +}, +{ "name": "LVT3C", + "type": "aAPC", + "CS#": 7, + "note_number": "25\u2020", + "notes": [ "D\u2020", "M", "T\u20201", "X\u20202", "BB\u2020" ], + "id": "kfw-uro/v:030", + "gpid": 11348 +}, +{ "name": "M75", + "type": "APC", + "CS#": 6, + "note_number": "26", + "notes": [ "G\u2020", "BB\u20201" ], + "id": "kfw-uro/v:031", + "gpid": 11342 +}, +{ "name": "M29 Weasel", + "type": "PC", + "CS#": 3, + "note_number": "27\u2020", + "notes": [ "B\u20201", "M", "T\u20201" ], + "id": "kfw-uro/v:032", + "gpid": "3b5:3898" +}, +{ "name": "M29C Weasel", + "type": "aPC", + "CS#": 3, + "note_number": "28\u2020", + "notes": [ "B\u20201", "M", "T\u20201" ], + "id": "kfw-uro/v:033", + "gpid": "3b5:3896" +}, +{ "name": "M4 hst", + "type": "PC", + "CS#": 6, + "note_number": "29", + "notes": [ "G\u2020", "Y" ], + "id": "kfw-uro/v:034", + "gpid": 1050 +}, +{ "name": "DUKW", + "type": "atr", + "CS#": "7\u20201", + "note_number": "30\u2020", + "notes": [ "D\u20202", "M", "Q\u20201", "Y" ], + "id": "kfw-uro/v:035", + "gpid": 1032 +}, +{ "name": "TACP Jeep", + "type": "trv", + "CS#": "2\u2020", + "note_number": "31\u2020", + "notes": [ "L\u20201", "M" ], + "id": "kfw-uro/v:036", + "gpid": "3b5:3643" +}, +{ "name": "7½-Ton", + "type": "tr", + "CS#": 7, + "note_number": "32", + "notes": [ "Y" ], + "id": "kfw-uro/v:037", + "gpid": 1048 +}, +{ "name": "Searchlight Truck", + "type": "trv", + "CS#": "7\u2020", + "note_number": "33\u2020", + "id": "kfw-uro/v:038", + "gpid": "3b5:10093" +} + +] diff --git a/vasl_templates/webapp/static/css/tabs.css b/vasl_templates/webapp/static/css/tabs.css index 4317ba0..19c3454 100644 --- a/vasl_templates/webapp/static/css/tabs.css +++ b/vasl_templates/webapp/static/css/tabs.css @@ -19,7 +19,7 @@ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #tabs-scenario { display: flex ; } -#tabs-scenario .left { width: 32em ; min-width: 32em ; } +#tabs-scenario .left { width: 33.5em ; min-width: 33.5em ; } #tabs-scenario .right { flex-grow: 1 ; min-width: 25em ; } #tabs-scenario .left { display: flex ; flex-direction: column ; } diff --git a/vasl_templates/webapp/static/extras.js b/vasl_templates/webapp/static/extras.js index e4dc942..8497848 100644 --- a/vasl_templates/webapp/static/extras.js +++ b/vasl_templates/webapp/static/extras.js @@ -93,7 +93,7 @@ function _show_extra_template( template_id ) buf.push( "" ) ; buf.push( "" ) ; } else if ( template_info.params[i].type.substr(0,22) === "player-color2-droplist" ) { - buf.push( "" ) ; if ( template_info.params[i].type === "player-color2-droplist-ex" ) buf.push( "", "" ) ; var nats = get_sorted_nats() ; diff --git a/vasl_templates/webapp/static/images/flags/kfw-cpva.png b/vasl_templates/webapp/static/images/flags/kfw-cpva.png new file mode 100644 index 0000000000000000000000000000000000000000..f812a1e8179f0c06d4dde0e7a72017be1fa46a0f GIT binary patch literal 13127 zcmYkDWmJ^k7w<(nhDL^x80j2x=nhE%35N!0>25(l!~sMJ!2v;98OotSqy}(s=s{}e z5|Hk?{Qh^{weE{^&RUy-z}uRI?n>`-J|UJZ{TGLQnK7Z;=soSn#3!F6aYTyXC$8R{~=AwK-Hi?Hy{6d z6;*>ecZeeJ4rw?CIQhH#2DhJ9E zUnobQyO;AlsZ%P_yB*U1c1(R-0z(}9o$uNB-u@R({=b*I2ROZOxC`~a*Z32ec85v+ z!xj$y-tOM6_kOahy}o0_|M&SIe<$aA$G5Mx{$H57kC&ITci_E~!K{uuM)Y6UQ}@6Z z&iBgyjq={R$8qnmhU(K$_;%Y=s<2gX{%OjTR*#2xfJ_-8|9N_)BMm(V>6cZa`+QBW zD9$n|&QL}RGBwpg_|gt6S^974G{37<=v3&WYvz5GD>F1Lo09)jZ>}*Ie8y$cw$E83 zqw@1*=e+|ix*Vn)kjo$#rTil%`Rl>tq}`nJO~(!X&28{?kjiaxbqD2!-Tv_;-nHP5 z+3cu&yIYIfdJ*Morq^Xg8-hYqOk44OjDBg2|p9k_?R zuPgHAsrVPQJ(}Oi4>T(^VFd^}^?PN1I0n!2rGz1V8uE@Qyk#0&Zy=T}55gOOJYPlh z<+XQpALl`tQPAMm>Gih#UaBv8TFNT*Vq5IpV5S;wBzexV4)D&8D*V*f4?z#Wg7x{N z%&M%ya>$?+laKSEsE*V58<_)LJjK~)%;IX_*?}xunj!j?`+0Z7!6rBT12(KC!C}yYx_wYm-qrX)Tdpzh0UE7?|Haw+*Ehlx`Kiw~> z9ZRHo17#UWbK8wy*qpX6qZk>pDs8xbztuR0(gHbcIZC?Ab(YHTN+xvyzy5(?8F?q; z(gbD4R`L0uB*`?3d4@Sl*yElWP&j%5JbD59n*a&R((9V)f@taY1ATJV>Ef2%c&n

X%WRr&qd>8~=i;*``LyR@L%h=xJRkgHkC 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 literal 0 HcmV?d00001 diff --git a/vasl_templates/webapp/static/images/flags/kfw-ounc.png b/vasl_templates/webapp/static/images/flags/kfw-ounc.png new file mode 100644 index 0000000000000000000000000000000000000000..70cf79ebf5aa7438bd97d802f259389d63b5b40d GIT binary patch literal 10685 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 literal 0 HcmV?d00001 diff --git a/vasl_templates/webapp/static/images/flags/kfw-rok.png b/vasl_templates/webapp/static/images/flags/kfw-rok.png new file mode 100644 index 0000000000000000000000000000000000000000..700109723ecab7b6deead66623dd53440116aae5 GIT binary patch literal 8056 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 AB>(^b literal 0 HcmV?d00001 diff --git a/vasl_templates/webapp/static/main.js b/vasl_templates/webapp/static/main.js index 64cb4c7..9fa37f6 100644 --- a/vasl_templates/webapp/static/main.js +++ b/vasl_templates/webapp/static/main.js @@ -12,11 +12,18 @@ gWebChannelHandler = null ; gEmSize = null ; var NATIONALITY_SPECIFIC_BUTTONS = { - "russian": [ "mol", "mol-p" ], - "german": [ "pf", "psk", "atmm" ], - "american": [ "baz" ], - "british": [ "piat" ], - "japanese": [ "thh" ], + "pf": [ "german" ], + "atmm": [ "german" ], + "psk": [ "german" ], + "mol": [ "russian" ], + "mol-p": [ "russian" ], + "baz": [ "american!korea" ], + "baz45": [ "american@korea", "kfw-rok", "kfw-ounc" ], + "baz50": [ "american@korea", "kfw-rok", "kfw-ounc" ], + "baz-cpva16": [ "kfw-cpva" ], + "baz-cpva17": [ "kfw-cpva" ], + "piat": [ "british" ], + "thh": [ "japanese" ], } ; GENERATE_SNIPPET_HINT = "Generate an HTML snippet (shift-click to get an image)." ; @@ -202,14 +209,14 @@ $(document).ready( function () { "" ) ; } init_select2( $( "select[name='PLAYER_1']" ), - "10em", false, format_player_droplist_item + "12.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']" ), - "10em", false, format_player_droplist_item + "12.5em", false, format_player_droplist_item ).on( "select2:open", function() { on_player_droplist_open( $(this) ) ; } ).on( "change", function() { @@ -670,13 +677,7 @@ function on_player_change( player_no ) var player_nat = update_ob_tab_header( player_no ) ; // show/hide the nationality-specific buttons - for ( var nat in NATIONALITY_SPECIFIC_BUTTONS ) { - for ( var i=0 ; i < NATIONALITY_SPECIFIC_BUTTONS[nat].length ; ++i ) { - var button_id = NATIONALITY_SPECIFIC_BUTTONS[nat][i] ; - var $elem = $( "#panel-ob_notes_" + player_no + " div.snippet-control[data-id='" + button_id + "']" ) ; - $elem.css( "display", nat == player_nat ? "inline-block" : "none" ) ; - } - } + update_nationality_specific_buttons( player_no ) ; // show/hide the vehicle/ordnance multi-applicable notes controls function update_ma_notes_controls( vo_type ) { @@ -721,6 +722,34 @@ function update_ob_tab_header( player_no ) return player_nat ; } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function update_nationality_specific_buttons( player_no ) +{ + // initialize + var player_nat = $( "select[name='PLAYER_" + player_no + "']" ).val() ; + var theater = $( "select.param[name='SCENARIO_THEATER']" ).val().toLowerCase() ; + + // hide/show each nationality-specific button + for ( var button_id in NATIONALITY_SPECIFIC_BUTTONS ) { + var show = false ; + for ( var i=0 ; i < NATIONALITY_SPECIFIC_BUTTONS[button_id].length ; ++i ) { + var nat = NATIONALITY_SPECIFIC_BUTTONS[button_id][i] ; + if ( nat == player_nat ) + show = true ; + else if ( nat == player_nat+"@"+theater ) + show = true ; + else { + var pos = nat.indexOf( "!" ) ; + if ( pos !== -1 ) + show = nat.substr(0,pos) == player_nat && nat.substr(pos+1) !== theater ; + } + } + var $elem = $( "#panel-ob_notes_" + player_no + " div.snippet-control[data-id='" + button_id + "']" ) ; + $elem.css( "display", show ? "inline-block" : "none" ) ; + } +} + // -------------------------------------------------------------------- function on_tab_activate( evt, ui ) diff --git a/vasl_templates/webapp/static/snippets.js b/vasl_templates/webapp/static/snippets.js index b45e66b..77f1177 100644 --- a/vasl_templates/webapp/static/snippets.js +++ b/vasl_templates/webapp/static/snippets.js @@ -346,18 +346,18 @@ function make_snippet( $btn, params, extra_params, show_date_warnings ) if ( params.SCENARIO_YEAR >= 1945 ) { params.BAZ_TYPE = 45 ; params.BAZ_BREAKDOWN = 11 ; - params.BAZ_TOKILL = 16 ; + params.BAZ_TK = 16 ; params.BAZ_WP = 6 ; params.BAZ_RANGE = 5 ; } else if ( params.SCENARIO_YEAR >= 1944 ) { params.BAZ_TYPE = 44 ; params.BAZ_BREAKDOWN = 11 ; - params.BAZ_TOKILL = 16 ; + params.BAZ_TK = 16 ; params.BAZ_RANGE = 4 ; } else if ( params.SCENARIO_YEAR === 1943 || (params.SCENARIO_YEAR === 1942 && params.SCENARIO_MONTH >= 11) ) { params.BAZ_TYPE = 43 ; params.BAZ_BREAKDOWN = 10 ; - params.BAZ_TOKILL = 13 ; + params.BAZ_TK = 13 ; params.BAZ_RANGE = 4 ; } @@ -465,8 +465,13 @@ function get_vo_note_key( vo_entry ) if ( ! match ) return null ; var key = match[0] ; + // NOTE: The K:FW counters appear in the main VASL module, but we handle them as if they were an extension. if ( vo_entry.extn_id ) key = vo_entry.extn_id + ":" + key ; + else if ( vo_entry.id.match( /^kfw-(uro|bcfk|rok|ounc|un-common)\// ) ) + key = "kfw-un:" + key ; + else if ( vo_entry.id.match( /^kfw-(kpa|cpva)\// ) ) + key = "kfw-comm:" + key ; return key ; } @@ -501,6 +506,16 @@ function get_vo_note( vo_type, nat, key ) function get_ma_notes_keys( nat, vo_entries, vo_type ) { + function translate_kfw_key( vo_entry, notes_index, regex, extn_id ) { + if ( ! vo_entry.id.match( regex ) ) + return null ; + var key = extn_id + ":" + vo_entry.notes[notes_index] ; + var pos = key.indexOf( "\u2020" ) ; + if ( pos >= 0 ) + key = key.substr( 0, pos ) ; + return key ; + } + // figure out which multi-applicable notes are being referenced if ( ! vo_entries ) return null ; @@ -528,17 +543,33 @@ 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 P" ) { // nb: can't do this with a regex + + // NOTE: The K:FW counters appear in the main VASL module, but we handle them as if they were an extension. + var key = translate_kfw_key( vo_entry, j, /^kfw-(uro|bcfk|rok|ounc|un-common)\//, "kfw-un" ) ; + if ( key ) { + keys[0][ key ] = true ; + continue ; + } + key = translate_kfw_key( vo_entry, j, /^kfw-(kpa|cpva)\//, "kfw-comm" ) ; + if ( key ) { + keys[0][ key ] = true ; + continue ; + } + + // handle a special case we can't do with a regex + if ( vo_entry.notes[j] === "US P" ) { keys[0][ vo_entry.extn_id + ":US P" ] = true ; continue ; } + + // check all the regex's 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 = ( nat !== "landing-craft" && vo_id === "sh/v" ) ; - var key = match[1] ; + 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, @@ -683,11 +714,12 @@ function get_ma_note( nat, vo_type, key ) function get_ma_notes_for_nat( nat, vo_type ) { // get the multi-applicable vehicle/ordnance notes for the specified nationality + var ma_notes ; if ( nat === "landing-craft" && nat in gVehicleOrdnanceNotes.vehicles ) - return gVehicleOrdnanceNotes.vehicles[ "landing-craft" ][ "multi-applicable" ] ; + ma_notes = gVehicleOrdnanceNotes.vehicles[ "landing-craft" ][ "multi-applicable" ] ; if ( vo_type in gVehicleOrdnanceNotes && nat in gVehicleOrdnanceNotes[vo_type] ) - return gVehicleOrdnanceNotes[ vo_type ][ nat ][ "multi-applicable" ] ; - return {} ; + ma_notes = gVehicleOrdnanceNotes[ vo_type ][ nat ][ "multi-applicable" ] ; + return ma_notes || {} ; } function _make_snippet_image_filename( snippet ) @@ -951,8 +983,12 @@ function make_capabilities( raw, vo_entry, vo_type, nat, elite, scenario_theater capabilities.push( crew_survival ) ; // do any special adjustments - if ( nat === "american" && vo_type === "ordnance" && scenario_theater === "PTO" ) + if ( vo_entry.id.substr(0,3) === "am/" && vo_type === "ordnance" && scenario_theater === "PTO" ) { + // NOTE: We used to do this if nat == "american" here, but the addition of K:FW broke that, + // since it contains counters (e.g. M3A1 37mm AT Gun) that has a Note C which is similar + // to the standard Note C, but doesn't have this special case. adjust_capabilities_for_us_ordnance_note_c( capabilities, vo_entry ) ; + } if ( elite ) adjust_capabilities_for_elite( capabilities, +1 ) ; @@ -1009,6 +1045,8 @@ function _select_capability_by_date( capabilities, nat, scenario_theater, scenar // initialize capabilities = capabilities.slice() ; var ref = has_ref( capabilities ) ; + if ( ref && capabilities.length === 0 ) + return ref ; // check all the capability timestamps var retval = "???" ; @@ -1030,7 +1068,7 @@ function _select_capability_by_date( capabilities, nat, scenario_theater, scenar function _check_capability_timestamp( capabilities, timestamp, nat, scenario_theater, scenario_year, scenario_month ) { - var MONTH_NAMES = { F:2, J:6, A:8, S:9, N:11 } ; + var MONTH_NAMES = { F:2, M:3, J:6, A:8, S:9, N:11 } ; // check for a theater flag THEATER_FLAGS = { E: "ETO", P: "PTO", B: "BURMA" } ; @@ -1074,10 +1112,12 @@ function _check_capability_timestamp( capabilities, timestamp, nat, scenario_the var month = MONTH_NAMES[ timestamp.substring(0,1) ] ; if ( month ) timestamp = timestamp.substring( 1 ) ; - if ( /^\d$/.test( timestamp ) ) { + if ( /^\d+$/.test( timestamp ) ) { // this is a single year timestamp = parseInt( timestamp ) ; // check if the capabilitity is available + if ( timestamp >= 50 ) + timestamp -= 40 ; if ( scenario_year > 1940 + timestamp ) return capabilities[0] ; else if ( scenario_year === 1940 + timestamp ) { @@ -2011,4 +2051,8 @@ function on_scenario_theater_change() { // update the vehicle/ordnance entries _update_vo_sortable2_entries() ; + + // show/hide the nationality-specific buttons + update_nationality_specific_buttons( 1 ) ; + update_nationality_specific_buttons( 2 ) ; } diff --git a/vasl_templates/webapp/static/user_settings.js b/vasl_templates/webapp/static/user_settings.js index 1be4484..4a72225 100644 --- a/vasl_templates/webapp/static/user_settings.js +++ b/vasl_templates/webapp/static/user_settings.js @@ -138,6 +138,7 @@ function apply_user_settings() $scenario_date.datepicker( "option", "defaultDate", $.datepicker.formatDate( date_format, new Date(1940,0,1) ) ) ; + $scenario_date.datepicker( "option", "yearRange", "c-10:c+15" ) ; if ( curr_date ) { $scenario_date.val( $.datepicker.formatDate( date_format, curr_date ) diff --git a/vasl_templates/webapp/static/vassal.js b/vasl_templates/webapp/static/vassal.js index 4d1b5ed..680d086 100644 --- a/vasl_templates/webapp/static/vassal.js +++ b/vasl_templates/webapp/static/vassal.js @@ -84,17 +84,14 @@ function _generate_snippets() // figure out which templates we don't want to auto-create labels for var no_autocreate = {} ; - for ( var nat in NATIONALITY_SPECIFIC_BUTTONS ) { - for ( var i=0 ; i < NATIONALITY_SPECIFIC_BUTTONS[nat].length ; ++i ) { - var template_id = NATIONALITY_SPECIFIC_BUTTONS[nat][i] ; - if ( ["pf","atmm","thh"].indexOf( template_id ) !== -1 ) { - // NOTE: PF, ATMM, THH are always available as an inherent part of a squad's capabilities - // (subject to date restrictions), so we always auto-create these labels, unlike, say MOL or BAZ, - // which are only present by SSR or OB counter). - continue ; - } - no_autocreate[template_id] = true ; + for ( var template_id in NATIONALITY_SPECIFIC_BUTTONS ) { + if ( ["pf","atmm","thh"].indexOf( template_id ) !== -1 ) { + // NOTE: PF, ATMM, THH are always available as an inherent part of a squad's capabilities + // (subject to date restrictions), so we always auto-create these labels, unlike, say MOL or BAZ, + // which are only present by SSR or OB counter). + continue ; } + no_autocreate[template_id] = true ; } function on_snippet_button( $btn, inactive ) { @@ -201,6 +198,8 @@ function _get_raw_content( snippet_id, $btn, params ) } // handle simple cases + // NOTE: These checks also have the side-effect of not deleting these labels if they are already in + // a scenario that is being updated. if ( snippet_id === "mol" ) return [ "Molotov Cocktail", "MOL check:", "IFT DR original colored dr:" ] ; if ( snippet_id === "mol-p" ) @@ -213,7 +212,7 @@ function _get_raw_content( snippet_id, $btn, params ) return [ "Anti-Tank Magnetic Mines", "ATMM check:", "vs. non-armored vehicle" ] ; if ( snippet_id === "piat" ) return [ "PIAT", "Range", "TH#", "B#", "TK#" ] ; - if ( snippet_id === "baz" ) + if ( snippet_id === "baz" || snippet_id === "baz45" || snippet_id === "baz50" || snippet_id.substr(0,8) === "baz-cpva" ) return [ "Bazooka", "Range", "TH#" ] ; if ( snippet_id === "thh" ) return [ "Tank-Hunter Heroes", "Banzai Charge" ] ; @@ -318,24 +317,62 @@ function _do_analyze_vsav( vsav_data, fname ) function _create_vo_entries_from_analysis( report ) { + // initialize + var theater = $( "select.param[name='SCENARIO_THEATER']" ).val() ; + function create_vo_entries( player_no, vo_type ) { + + var gpids, i ; + // clear the existing vehicles/ordnance $( "#ob_" + vo_type + "-sortable_" + player_no ).sortable2( "delete-all" ) ; // build an index of GPID's that belong to the specified player and V/O type var entries_index = {} ; var entries = gVehicleOrdnanceListings[ vo_type ][ get_player_nat(player_no) ] ; - var gpids, i ; - for ( i=0 ; i < entries.length ; ++i ) { - gpids = $.isArray( entries[i].gpid ) ? entries[i].gpid : [entries[i].gpid] ; - for ( var j=0 ; j < gpids.length ; ++j ) - entries_index[ gpids[j] ] = entries[i] ; + if ( entries ) { + for ( i=0 ; i < entries.length ; ++i ) { + gpids = $.isArray( entries[i].gpid ) ? entries[i].gpid : [entries[i].gpid] ; + for ( var j=0 ; j < gpids.length ; ++j ) { + if ( entries_index[ gpids[j] ] === undefined ) + entries_index[ gpids[j] ] = [ entries[i] ] ; + else + entries_index[ gpids[j] ].push( entries[i] ) ; + } + } + } + + // IMPORTANT: Adding support for the new K:FW counters in VASL 6.5.0 caused problems for + // the "analyze scenario" feature, since quite a few of the new counters use images + // from the old counter set e.g. the American "M2 60mm Mortar" has a K:FW variant (kfw-un-common/o:002) + // that has GPID 849 (as well as 11391, 11359, 11440 for the ROK, BCFK, OUNC variants), + // but GPID 849 is also used by the old American "M2 60mm Mortar" counter (am/o:000). + // So, if we find GPID 849 in a .vsav file, we don't know if we should create the K:FW entry + // or the normal American entry. To work around this, we added a new scenario theater for Korea, + // and use that to decide. + function chooseEntry( gpid ) { + var entries = entries_index[ gpid ] ; + if ( !entries || entries.length === 0 ) + return null ; + if ( entries.length === 1 ) + return entries[0] ; + var entries2 = [] ; + for ( var i=0 ; i < entries.length ; ++i ) { + var isKFW = entries[i].id.substr( 0, 4 ) === "kfw-" ; + if ( (theater == "Korea" && isKFW) || (theater != "Korea" && !isKFW) ) + entries2.push( entries[i] ) ; + } + if ( entries2.length === 1 ) + return entries2[0] ; + console.log( "WARNING: Found multiple entries for GPID " + gpid + " during analysis:", entries ) ; + return entries[0] ; } + // add a vehicle/ordnance for each relevant GPID var nCreated = 0 ; gpids = Object.keys( report ) ; for ( i=0 ; i < gpids.length ; ++i ) { var gpid = gpids[ i ] ; - var entry = entries_index[ gpid ] ; + var entry = chooseEntry( gpid ) ; if ( ! entry ) continue ; var image_id = $.isArray( entry.gpid ) ? [gpid,0] : null ; diff --git a/vasl_templates/webapp/static/vo.js b/vasl_templates/webapp/static/vo.js index 72e7d96..0c882cd 100644 --- a/vasl_templates/webapp/static/vo.js +++ b/vasl_templates/webapp/static/vo.js @@ -21,7 +21,9 @@ function add_vo( vo_type, player_no ) if ( is_small_vasl_piece( vo_entry ) ) div_class += " small-piece" ; var extn_name ; - if ( vo_entry.extn_id ) { + if ( vo_entry.id.substr(0,4) === "kfw-" ) + extn_name = "KFW" ; + else if ( vo_entry.extn_id ) { extn_name = gAppConfig.VASL_EXTENSIONS[ vo_entry.extn_id ].displayNameAbbrev ; if ( ! extn_name ) extn_name = gAppConfig.VASL_EXTENSIONS[ vo_entry.extn_id ].displayName ; @@ -447,7 +449,10 @@ function make_online_counter_image_url( gpid, index ) // check if we have a piece from the core VASL module or an extension var url, extn_id ; var pos = gpid.toString().indexOf( ":" ) ; - if ( pos === -1 ) + // FUDGE! K:FW was originally done as an extension, then moved into the main VASL module. + // One of the consequences of this is that a lot of the new counters have a GPID that + // looks like they come from an extension (3b5), but are actually in the main module. + if ( pos === -1 || gpid.substr(0,pos) === "3b5" ) url = gAppConfig.ONLINE_COUNTER_IMAGES_URL_TEMPLATE ; else { url = gAppConfig.ONLINE_EXTN_COUNTER_IMAGES_URL_TEMPLATE ; diff --git a/vasl_templates/webapp/templates/tabs-ob1.html b/vasl_templates/webapp/templates/tabs-ob1.html index ba9f0f8..0887900 100644 --- a/vasl_templates/webapp/templates/tabs-ob1.html +++ b/vasl_templates/webapp/templates/tabs-ob1.html @@ -34,6 +34,10 @@ + + + + diff --git a/vasl_templates/webapp/templates/tabs-scenario.html b/vasl_templates/webapp/templates/tabs-scenario.html index 7744ec7..a294121 100644 --- a/vasl_templates/webapp/templates/tabs-scenario.html +++ b/vasl_templates/webapp/templates/tabs-scenario.html @@ -16,6 +16,7 @@ @@ -31,7 +32,7 @@

- +
diff --git a/vasl_templates/webapp/tests/fixtures/analyze-vsav/vo-entry-selection-for-theater.vsav b/vasl_templates/webapp/tests/fixtures/analyze-vsav/vo-entry-selection-for-theater.vsav new file mode 100644 index 0000000000000000000000000000000000000000..0e1b9be93c190214a1b6357a1f31f9d978a0c5d6 GIT binary patch literal 2702 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 Ud0|jiwximy!1 M Y +M2 60mm Mortar IR WP7 5PP OBA† IR WP7 5PP OBA† 23† A K M O P Y +M1(L) 81mm Mortar QSU IR WP8 QSU IR WP8 24† A K M O P R +M20(L) 75mm Recoilless Rifle WP7 5PP H† WP7 5PP H† 25† K M O P R crewed† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1941.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1941.txt index b03eb9a..4efba43 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1941.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1941.txt @@ -30,3 +30,19 @@ M3 3-in. AA Gun NM NM 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. +Type 89 Heavy Grenade Launcher 4PP 4PP 1† A P +M2 4.2-in. Mortar QSU WP10 QSU WP10 2† K M O P Y +M3A1 37mm AT Gun QSU C7 QSU C7 3† C K P +M1 57mm AT Gun QSU D4 HE7 QSU D4 HE7 4† K +M18(L) 57mm Recoilless Rifle C7 H7 WP6 3PP C7 H7 WP6 3PP 5† C K O non-crewed† +M2A1 105mm Howitzer C7 H6 WP8 s7 C7 H6 WP8 s7 6† C K M O P Y +M3 105mm Howitzer C7 H7 WP8 s7 C7 H7 WP8 s7 7† C K +M1 155mm Howitzer WP8 s7 WP8 s7 8† K M P Y +M1A1 155mm Gun RFNM AP4 WP8 s7 RFNM AP4 WP8 s7 9 Y No IF. +M1 8-in. Howitzer RFNM RFNM 10† Y 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† 11† M Y +M1 40mm AA Gun LF [40†, 2 ROF] LF [40†, 2 ROF] 12 B† Y +M2 90mm AA Gun LF [90†[1], 1 ROF, B11] LF [90†[1], 1 ROF, B11] 13† B†1 M Y +M2 60mm Mortar IR WP7 5PP OBA† IR WP7 5PP OBA† 23† A K M O P Y +M1(L) 81mm Mortar QSU IR WP8 QSU IR WP8 24† A K M O P R +M20(L) 75mm Recoilless Rifle WP7 5PP H† WP7 5PP H† 25† K M O P R crewed† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1942.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1942.txt index d3f0903..c183811 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1942.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1942.txt @@ -30,3 +30,19 @@ M3 3-in. AA Gun NM NM 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. +Type 89 Heavy Grenade Launcher 4PP 4PP 1† A P +M2 4.2-in. Mortar QSU WP10 QSU WP10 2† K M O P Y +M3A1 37mm AT Gun QSU C7 QSU C7 3† C K P +M1 57mm AT Gun QSU D4 HE7 QSU D4 HE7 4† K +M18(L) 57mm Recoilless Rifle C7 H7 WP6 3PP C7 H7 WP6 3PP 5† C K O non-crewed† +M2A1 105mm Howitzer C7 H6 WP8 s7 C7 H6 WP8 s7 6† C K M O P Y +M3 105mm Howitzer C7 H7 WP8 s7 C7 H7 WP8 s7 7† C K +M1 155mm Howitzer WP8 s7 WP8 s7 8† K M P Y +M1A1 155mm Gun RFNM AP4 WP8 s7 RFNM AP4 WP8 s7 9 Y No IF. +M1 8-in. Howitzer RFNM RFNM 10† Y 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† 11† M Y +M1 40mm AA Gun LF [40†, 2 ROF] LF [40†, 2 ROF] 12 B† Y +M2 90mm AA Gun LF [90†[1], 1 ROF, B11] LF [90†[1], 1 ROF, B11] 13† B†1 M Y +M2 60mm Mortar IR WP7 5PP OBA† IR WP7 5PP OBA† 23† A K M O P Y +M1(L) 81mm Mortar QSU IR WP8 QSU IR WP8 24† A K M O P R +M20(L) 75mm Recoilless Rifle WP7 5PP H† WP7 5PP H† 25† K M O P R crewed† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1943.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1943.txt index 1da4f50..3f75faa 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1943.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1943.txt @@ -30,3 +30,19 @@ M3 3-in. AA Gun NM NM 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. +Type 89 Heavy Grenade Launcher 4PP 4PP 1† A P +M2 4.2-in. Mortar QSU WP10 QSU WP10 2† K M O P Y +M3A1 37mm AT Gun QSU C7 QSU C7 3† C K P +M1 57mm AT Gun QSU D4 HE7 QSU D4 HE7 4† K +M18(L) 57mm Recoilless Rifle C7 H7 WP6 3PP C7 H7 WP6 3PP 5† C K O non-crewed† +M2A1 105mm Howitzer C7 H6 WP8 s7 C7 H6 WP8 s7 6† C K M O P Y +M3 105mm Howitzer C7 H7 WP8 s7 C7 H7 WP8 s7 7† C K +M1 155mm Howitzer WP8 s7 WP8 s7 8† K M P Y +M1A1 155mm Gun RFNM AP4 WP8 s7 RFNM AP4 WP8 s7 9 Y No IF. +M1 8-in. Howitzer RFNM RFNM 10† Y 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† 11† M Y +M1 40mm AA Gun LF [40†, 2 ROF] LF [40†, 2 ROF] 12 B† Y +M2 90mm AA Gun LF [90†[1], 1 ROF, B11] LF [90†[1], 1 ROF, B11] 13† B†1 M Y +M2 60mm Mortar IR WP7 5PP OBA† IR WP7 5PP OBA† 23† A K M O P Y +M1(L) 81mm Mortar QSU IR WP8 QSU IR WP8 24† A K M O P R +M20(L) 75mm Recoilless Rifle WP7 5PP H† WP7 5PP H† 25† K M O P R crewed† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1944.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1944.txt index a830d10..c32758a 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1944.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1944.txt @@ -30,3 +30,19 @@ M3 3-in. AA Gun NM NM 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. +Type 89 Heavy Grenade Launcher 4PP 4PP 1† A P +M2 4.2-in. Mortar QSU WP10 QSU WP10 2† K M O P Y +M3A1 37mm AT Gun QSU C7 QSU C7 3† C K P +M1 57mm AT Gun QSU D4 HE7 QSU D4 HE7 4† K +M18(L) 57mm Recoilless Rifle C7 H7 WP6 3PP C7 H7 WP6 3PP 5† C K O non-crewed† +M2A1 105mm Howitzer C7 H6 WP8 s7 C7 H6 WP8 s7 6† C K M O P Y +M3 105mm Howitzer C7 H7 WP8 s7 C7 H7 WP8 s7 7† C K +M1 155mm Howitzer WP8 s7 WP8 s7 8† K M P Y +M1A1 155mm Gun RFNM AP4 WP8 s7 RFNM AP4 WP8 s7 9 Y No IF. +M1 8-in. Howitzer RFNM RFNM 10† Y 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† 11† M Y +M1 40mm AA Gun LF [40†, 2 ROF] LF [40†, 2 ROF] 12 B† Y +M2 90mm AA Gun LF [90†[1], 1 ROF, B11] LF [90†[1], 1 ROF, B11] 13† B†1 M Y +M2 60mm Mortar IR WP7 5PP OBA† IR WP7 5PP OBA† 23† A K M O P Y +M1(L) 81mm Mortar QSU IR WP8 QSU IR WP8 24† A K M O P R +M20(L) 75mm Recoilless Rifle WP7 5PP H† WP7 5PP H† 25† K M O P R crewed† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1945.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1945.txt index 617a12e..6502ca4 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1945.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/american/1945.txt @@ -30,3 +30,19 @@ M3 3-in. AA Gun NM NM 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. +Type 89 Heavy Grenade Launcher 4PP 4PP 1† A P +M2 4.2-in. Mortar QSU WP10 QSU WP10 2† K M O P Y +M3A1 37mm AT Gun QSU C7 QSU C7 3† C K P +M1 57mm AT Gun QSU D4 HE7 QSU D4 HE7 4† K +M18(L) 57mm Recoilless Rifle C7 H7 WP6 3PP C7 H7 WP6 3PP 5† C K O non-crewed† +M2A1 105mm Howitzer C7 H6 WP8 s7 C7 H6 WP8 s7 6† C K M O P Y +M3 105mm Howitzer C7 H7 WP8 s7 C7 H7 WP8 s7 7† C K +M1 155mm Howitzer WP8 s7 WP8 s7 8† K M P Y +M1A1 155mm Gun RFNM AP4 WP8 s7 RFNM AP4 WP8 s7 9 Y No IF. +M1 8-in. Howitzer RFNM RFNM 10† Y 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† 11† M Y +M1 40mm AA Gun LF [40†, 2 ROF] LF [40†, 2 ROF] 12 B† Y +M2 90mm AA Gun LF [90†[1], 1 ROF, B11] LF [90†[1], 1 ROF, B11] 13† B†1 M Y +M2 60mm Mortar IR WP7 5PP OBA† IR WP7 5PP OBA† 23† A K M O P Y +M1(L) 81mm Mortar QSU IR WP8 QSU IR WP8 24† A K M O P R +M20(L) 75mm Recoilless Rifle WP7 5PP H† WP7 5PP H† 25† K M O P R crewed† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1940.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1940.txt index 5ccd09a..4785ea4 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1940.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1940.txt @@ -2,36 +2,36 @@ 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 +5cm leGrW 36 5PP 5PP 44 A B C H S +50mm RM obr. 40 4PP 4PP 45 A C H R S +8cm GrW 34 QSU IR s7 QSU IR s7 46† A B C +Brandt M27/31 QSU s7 QSU s7 47† A H R S +PM obr. 38 QSU h-d s8 QSU h-d s8 48† H R +Ur wz. 35 1PP 1PP 49 B C H R S +s18-1100 5PP 5PP 50 A H R +Kanon PUV vz. 37(t) QSU A4[1S]† QSU 51† B E H S +Bohler M35 QSU QSU 52† A H R S No Gunshield. +5cm PaK 38(g) QSU A4[3]3[4] QSU 53† B E H R S +7.5cm PaK 97/38(g) QSU H5[3+] s6 QSU s6 54† B E R +7.5cm PaK 40(g) QSU A4[3]3[4] QSU 55† B E H R S +Skoda M15 QSU QSU 56† A B C H R S +Canon de 75 mle 1897 QSU s7 QSU s7 57 B R 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†1 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†1 R B -2cm FlaK 38(g) LF [NT, 20†[1], 2 ROF, B10] LF [NT, 20†[1], 2 ROF, B10] 72† E G†1 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†1 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†1 R S B +Skoda M17 QSU QSU 59† A C R S +Skoda M28(80) 60† C S +Skoda M14/19 s8 s8 61† A† C H R S +leFH 18(g) H4[3+] s5 s5 62† B E H S +Skoda M35 AP7 C7[CS]† AP7 63† C R S +G obr. 10/30 h-d s7 h-d s7 64† B R +G obr. 38 s5[1-2R]† 65 B R +Skoda M14 66† H R S +Skoda M15/16 s6 s6 67† C S No IF. +C mle 17 S s7 s7 68† B R +Mitrailleuse de 13.2 CAJ mle 30 2 TK DR† 2 TK DR† 69† B R T†1 +Oerlikon FF LF [NT, 20†, 2 ROF, B11] LF [NT, 20†, 2 ROF, B11] 70 B C G† H R S +2cm FlaK 30(g) LF [NT, 20†[1], 2 ROF, B9] LF [NT, 20†[1], 2 ROF, B9] 71† B E G†1 R +2cm FlaK 38(g) LF [NT, 20†[1], 2 ROF, B10] LF [NT, 20†[1], 2 ROF, B10] 72† B E G†1 R +3.7cm FlaK 36(g) 73† B E R +Bofors 40mm LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 74† C G†1 H R S +Skoda M33 75 R S +8.8cm FlaK 18 o. 36(g) LF [88†[1], 1 ROF, B11] LF [88†[1], 1 ROF, B11] 76† B E G†1 R S diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1941.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1941.txt index aecd97f..c716360 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1941.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1941.txt @@ -2,36 +2,36 @@ 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 +5cm leGrW 36 5PP 5PP 44 A B C H S +50mm RM obr. 40 4PP 4PP 45 A C H R S +8cm GrW 34 QSU IR s7 QSU IR s7 46† A B C +Brandt M27/31 QSU s7 QSU s7 47† A H R S +PM obr. 38 QSU h-d s8 QSU h-d s8 48† H R +Ur wz. 35 1PP 1PP 49 B C H R S +s18-1100 5PP 5PP 50 A H R +Kanon PUV vz. 37(t) QSU A4[1S]† QSU 51† B E H S +Bohler M35 QSU QSU 52† A H R S No Gunshield. +5cm PaK 38(g) QSU A4[3]3[4] QSU 53† B E H R S +7.5cm PaK 97/38(g) QSU H5[3+] s6 QSU s6 54† B E R +7.5cm PaK 40(g) QSU A4[3]3[4] QSU 55† B E H R S +Skoda M15 QSU QSU 56† A B C H R S +Canon de 75 mle 1897 QSU s7 QSU s7 57 B R 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†1 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†1 R B -2cm FlaK 38(g) LF [NT, 20†[1], 2 ROF, B10] LF [NT, 20†[1], 2 ROF, B10] 72† E G†1 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†1 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†1 R S B +Skoda M17 QSU QSU 59† A C R S +Skoda M28(80) 60† C S +Skoda M14/19 s8 s8 61† A† C H R S +leFH 18(g) H4[3+] s5 s5 62† B E H S +Skoda M35 AP7 C7[CS]† AP7 63† C R S +G obr. 10/30 h-d s7 h-d s7 64† B R +G obr. 38 s5[1-2R]† 65 B R +Skoda M14 66† H R S +Skoda M15/16 s6 s6 67† C S No IF. +C mle 17 S s7 s7 68† B R +Mitrailleuse de 13.2 CAJ mle 30 2 TK DR† 2 TK DR† 69† B R T†1 +Oerlikon FF LF [NT, 20†, 2 ROF, B11] LF [NT, 20†, 2 ROF, B11] 70 B C G† H R S +2cm FlaK 30(g) LF [NT, 20†[1], 2 ROF, B9] LF [NT, 20†[1], 2 ROF, B9] 71† B E G†1 R +2cm FlaK 38(g) LF [NT, 20†[1], 2 ROF, B10] LF [NT, 20†[1], 2 ROF, B10] 72† B E G†1 R +3.7cm FlaK 36(g) 73† B E R +Bofors 40mm LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 74† C G†1 H R S +Skoda M33 75 R S +8.8cm FlaK 18 o. 36(g) LF [88†[1], 1 ROF, B11] LF [88†[1], 1 ROF, B11] 76† B E G†1 R S diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1942.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1942.txt index 367b6be..a69dc6b 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1942.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1942.txt @@ -2,36 +2,36 @@ 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 +5cm leGrW 36 5PP 5PP 44 A B C H S +50mm RM obr. 40 4PP 4PP 45 A C H R S +8cm GrW 34 QSU IR s7 QSU IR s7 46† A B C +Brandt M27/31 QSU s7 QSU s7 47† A H R S +PM obr. 38 QSU h-d s8 QSU h-d s8 48† H R +Ur wz. 35 1PP 1PP 49 B C H R S +s18-1100 5PP 5PP 50 A H R +Kanon PUV vz. 37(t) QSU A4[1S]† QSU 51† B E H S +Bohler M35 QSU QSU 52† A H R S No Gunshield. +5cm PaK 38(g) QSU A4[3]3[4] QSU 53† B E H R S +7.5cm PaK 97/38(g) QSU H5[3+] s6 QSU s6 54† B E R +7.5cm PaK 40(g) QSU A4[3]3[4] QSU 55† B E H R S +Skoda M15 QSU QSU 56† A B C H R S +Canon de 75 mle 1897 QSU s7 QSU s7 57 B R 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†1 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†1 R B -2cm FlaK 38(g) LF [NT, 20†[1], 2 ROF, B10] LF [NT, 20†[1], 2 ROF, B10] 72† E G†1 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†1 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†1 R S B +Skoda M17 QSU QSU 59† A C R S +Skoda M28(80) 60† C S +Skoda M14/19 s8 s8 61† A† C H R S +leFH 18(g) H4[3+] s5 s5 62† B E H S +Skoda M35 AP7 C7[CS]† AP7 63† C R S +G obr. 10/30 h-d s7 h-d s7 64† B R +G obr. 38 s5[1-2R]† 65 B R +Skoda M14 66† H R S +Skoda M15/16 s6 s6 67† C S No IF. +C mle 17 S s7 s7 68† B R +Mitrailleuse de 13.2 CAJ mle 30 2 TK DR† 2 TK DR† 69† B R T†1 +Oerlikon FF LF [NT, 20†, 2 ROF, B11] LF [NT, 20†, 2 ROF, B11] 70 B C G† H R S +2cm FlaK 30(g) LF [NT, 20†[1], 2 ROF, B9] LF [NT, 20†[1], 2 ROF, B9] 71† B E G†1 R +2cm FlaK 38(g) LF [NT, 20†[1], 2 ROF, B10] LF [NT, 20†[1], 2 ROF, B10] 72† B E G†1 R +3.7cm FlaK 36(g) 73† B E R +Bofors 40mm LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 74† C G†1 H R S +Skoda M33 75 R S +8.8cm FlaK 18 o. 36(g) LF [88†[1], 1 ROF, B11] LF [88†[1], 1 ROF, B11] 76† B E G†1 R S diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1943.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1943.txt index 77d1fc6..3eec83d 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1943.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1943.txt @@ -2,36 +2,36 @@ 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 +5cm leGrW 36 5PP 5PP 44 A B C H S +50mm RM obr. 40 4PP 4PP 45 A C H R S +8cm GrW 34 QSU IR s7 QSU IR s7 46† A B C +Brandt M27/31 QSU s7 QSU s7 47† A H R S +PM obr. 38 QSU h-d s8 QSU h-d s8 48† H R +Ur wz. 35 1PP 1PP 49 B C H R S +s18-1100 5PP 5PP 50 A H R +Kanon PUV vz. 37(t) QSU A4[1S]† QSU 51† B E H S +Bohler M35 QSU QSU 52† A H R S No Gunshield. +5cm PaK 38(g) QSU A4[3]3[4] QSU A4 53† B E H R S +7.5cm PaK 97/38(g) QSU H5[3+] s6 QSU H5 s6 54† B E R +7.5cm PaK 40(g) QSU A4[3]3[4] QSU A4 55† B E H R S +Skoda M15 QSU QSU 56† A B C H R S +Canon de 75 mle 1897 QSU s7 QSU s7 57 B R 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†1 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†1 R B -2cm FlaK 38(g) LF [NT, 20†[1], 2 ROF, B10] LF [NT, 20†[1], 2 ROF, B10] 72† E G†1 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†1 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†1 R S B +Skoda M17 QSU QSU 59† A C R S +Skoda M28(80) 60† C S +Skoda M14/19 s8 s8 61† A† C H R S +leFH 18(g) H4[3+] s5 H4 s5 62† B E H S +Skoda M35 AP7 C7[CS]† AP7 63† C R S +G obr. 10/30 h-d s7 h-d s7 64† B R +G obr. 38 s5[1-2R]† 65 B R +Skoda M14 66† H R S +Skoda M15/16 s6 s6 67† C S No IF. +C mle 17 S s7 s7 68† B R +Mitrailleuse de 13.2 CAJ mle 30 2 TK DR† 2 TK DR† 69† B R T†1 +Oerlikon FF LF [NT, 20†, 2 ROF, B11] LF [NT, 20†, 2 ROF, B11] 70 B C G† H R S +2cm FlaK 30(g) LF [NT, 20†[1], 2 ROF, B9] LF [NT, 20†[1], 2 ROF, B9] 71† B E G†1 R +2cm FlaK 38(g) LF [NT, 20†[1], 2 ROF, B10] LF [NT, 20†[1], 2 ROF, B10] 72† B E G†1 R +3.7cm FlaK 36(g) 73† B E R +Bofors 40mm LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 74† C G†1 H R S +Skoda M33 75 R S +8.8cm FlaK 18 o. 36(g) LF [88†[1], 1 ROF, B11] LF [88†[1], 1 ROF, B11] 76† B E G†1 R S diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1944.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1944.txt index cc6e569..dcaebd0 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1944.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1944.txt @@ -2,36 +2,36 @@ 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 +5cm leGrW 36 5PP 5PP 44 A B C H S +50mm RM obr. 40 4PP 4PP 45 A C H R S +8cm GrW 34 QSU IR s7 QSU IR s7 46† A B C +Brandt M27/31 QSU s7 QSU s7 47† A H R S +PM obr. 38 QSU h-d s8 QSU h-d s8 48† H R +Ur wz. 35 1PP 1PP 49 B C H R S +s18-1100 5PP 5PP 50 A H R +Kanon PUV vz. 37(t) QSU A4[1S]† QSU 51† B E H S +Bohler M35 QSU QSU 52† A H R S No Gunshield. +5cm PaK 38(g) QSU A4[3]3[4] QSU A3 53† B E H R S +7.5cm PaK 97/38(g) QSU H5[3+] s6 QSU H5 s6 54† B E R +7.5cm PaK 40(g) QSU A4[3]3[4] QSU A3 55† B E H R S +Skoda M15 QSU QSU 56† A B C H R S +Canon de 75 mle 1897 QSU s7 QSU s7 57 B R 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†1 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†1 R B -2cm FlaK 38(g) LF [NT, 20†[1], 2 ROF, B10] LF [NT, 20†[1], 2 ROF, B10] 72† E G†1 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†1 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†1 R S B +Skoda M17 QSU QSU 59† A C R S +Skoda M28(80) 60† C S +Skoda M14/19 s8 s8 61† A† C H R S +leFH 18(g) H4[3+] s5 H4 s5 62† B E H S +Skoda M35 AP7 C7[CS]† AP7 63† C R S +G obr. 10/30 h-d s7 h-d s7 64† B R +G obr. 38 s5[1-2R]† 65 B R +Skoda M14 66† H R S +Skoda M15/16 s6 s6 67† C S No IF. +C mle 17 S s7 s7 68† B R +Mitrailleuse de 13.2 CAJ mle 30 2 TK DR† 2 TK DR† 69† B R T†1 +Oerlikon FF LF [NT, 20†, 2 ROF, B11] LF [NT, 20†, 2 ROF, B11] 70 B C G† H R S +2cm FlaK 30(g) LF [NT, 20†[1], 2 ROF, B9] LF [NT, 20†[1], 2 ROF, B9] 71† B E G†1 R +2cm FlaK 38(g) LF [NT, 20†[1], 2 ROF, B10] LF [NT, 20†[1], 2 ROF, B10] 72† B E G†1 R +3.7cm FlaK 36(g) 73† B E R +Bofors 40mm LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 74† C G†1 H R S +Skoda M33 75 R S +8.8cm FlaK 18 o. 36(g) LF [88†[1], 1 ROF, B11] LF [88†[1], 1 ROF, B11] 76† B E G†1 R S diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1945.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1945.txt index 2148820..57a7b75 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1945.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/axis-minor-common/1945.txt @@ -2,36 +2,36 @@ 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 +5cm leGrW 36 5PP 5PP 44 A B C H S +50mm RM obr. 40 4PP 4PP 45 A C H R S +8cm GrW 34 QSU IR s7 QSU IR s7 46† A B C +Brandt M27/31 QSU s7 QSU s7 47† A H R S +PM obr. 38 QSU h-d s8 QSU h-d s8 48† H R +Ur wz. 35 1PP 1PP 49 B C H R S +s18-1100 5PP 5PP 50 A H R +Kanon PUV vz. 37(t) QSU A4[1S]† QSU 51† B E H S +Bohler M35 QSU QSU 52† A H R S No Gunshield. +5cm PaK 38(g) QSU A4[3]3[4] QSU A3 53† B E H R S +7.5cm PaK 97/38(g) QSU H5[3+] s6 QSU H5 s6 54† B E R +7.5cm PaK 40(g) QSU A4[3]3[4] QSU A3 55† B E H R S +Skoda M15 QSU QSU 56† A B C H R S +Canon de 75 mle 1897 QSU s7 QSU s7 57 B R 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†1 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†1 R B -2cm FlaK 38(g) LF [NT, 20†[1], 2 ROF, B10] LF [NT, 20†[1], 2 ROF, B10] 72† E G†1 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†1 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†1 R S B +Skoda M17 QSU QSU 59† A C R S +Skoda M28(80) 60† C S +Skoda M14/19 s8 s8 61† A† C H R S +leFH 18(g) H4[3+] s5 H4 s5 62† B E H S +Skoda M35 AP7 C7[CS]† AP7 63† C R S +G obr. 10/30 h-d s7 h-d s7 64† B R +G obr. 38 s5[1-2R]† 65 B R +Skoda M14 66† H R S +Skoda M15/16 s6 s6 67† C S No IF. +C mle 17 S s7 s7 68† B R +Mitrailleuse de 13.2 CAJ mle 30 2 TK DR† 2 TK DR† 69† B R T†1 +Oerlikon FF LF [NT, 20†, 2 ROF, B11] LF [NT, 20†, 2 ROF, B11] 70 B C G† H R S +2cm FlaK 30(g) LF [NT, 20†[1], 2 ROF, B9] LF [NT, 20†[1], 2 ROF, B9] 71† B E G†1 R +2cm FlaK 38(g) LF [NT, 20†[1], 2 ROF, B10] LF [NT, 20†[1], 2 ROF, B10] 72† B E G†1 R +3.7cm FlaK 36(g) 73† B E R +Bofors 40mm LF [40†[1], 2 ROF] LF [40†[1], 2 ROF] 74† C G†1 H R S +Skoda M33 75 R S +8.8cm FlaK 18 o. 36(g) LF [88†[1], 1 ROF, B11] LF [88†[1], 1 ROF, B11] 76† B E G†1 R S diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1940.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1940.txt index def3715..3a7f69e 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1940.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1940.txt @@ -1,29 +1,39 @@ === ordnance/british/1940 === -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†1 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†1 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†1 N P -OQF 3-in. 20-cwt AA 22† E P -OQF 3.7-in. AA 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†1 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†1 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†1 N P +OQF 3-in. 20-cwt AA 22† E P +OQF 3.7-in. AA 23† E N P +OML 2-in. Mortar IR s7 4PP IR s7 4PP 14 A N +M19 60mm Mortar IR WP6 4PP IR WP6 4PP 15 A R +OML 3-in. Mortar QSU IR WP7 s8 QSU IR WP7 s8 16 A +OSB 4.2-in. Mortar WP7 s8 WP7 s8 17† N Towed† +OQF 17-Pounder D6 HE8 D6 HE8 18 N +OQF 25-Pounder LF [NT, 0 ROF] s8 LF [NT, 0 ROF] s8 19† N +OQF 40mm AA LF [40†, 2 ROF] LF [40†, 2 ROF] 20 B† N +M2 60mm Mortar IR WP7 5PP OBA† IR WP7 5PP OBA† 23† A K M O P Y +M1(L) 81mm Mortar QSU IR WP8 QSU IR WP8 24† A K M O P R +M20(L) 75mm Recoilless Rifle WP7 5PP H† WP7 5PP H† 25† K M O P R crewed† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1941.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1941.txt index acdf6df..70f1bf3 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1941.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1941.txt @@ -1,29 +1,39 @@ === ordnance/british/1941 === -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†1 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†1 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†1 N P -OQF 3-in. 20-cwt AA 22† E P -OQF 3.7-in. AA 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†1 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†1 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†1 N P +OQF 3-in. 20-cwt AA 22† E P +OQF 3.7-in. AA 23† E N P +OML 2-in. Mortar IR s7 4PP IR s7 4PP 14 A N +M19 60mm Mortar IR WP6 4PP IR WP6 4PP 15 A R +OML 3-in. Mortar QSU IR WP7 s8 QSU IR WP7 s8 16 A +OSB 4.2-in. Mortar WP7 s8 WP7 s8 17† N Towed† +OQF 17-Pounder D6 HE8 D6 HE8 18 N +OQF 25-Pounder LF [NT, 0 ROF] s8 LF [NT, 0 ROF] s8 19† N +OQF 40mm AA LF [40†, 2 ROF] LF [40†, 2 ROF] 20 B† N +M2 60mm Mortar IR WP7 5PP OBA† IR WP7 5PP OBA† 23† A K M O P Y +M1(L) 81mm Mortar QSU IR WP8 QSU IR WP8 24† A K M O P R +M20(L) 75mm Recoilless Rifle WP7 5PP H† WP7 5PP H† 25† K M O P R crewed† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1942.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1942.txt index e01eb2a..3392ffb 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1942.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1942.txt @@ -1,29 +1,39 @@ === ordnance/british/1942 === -Name Capabilities (effective) # Notes Comments ---------------------------- ------------------------------ --------------------------- --- -------------------- --------------- -OML 2-in. Mortar 4PP IR[2+]† s7 4PP IR† 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 IR†[1] WP7 s8† 2† A†1 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†1 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†1 N P -OQF 3-in. 20-cwt AA 22† E P -OQF 3.7-in. AA 23† E N P +Name Capabilities (effective) # Notes Comments +---------------------------- ------------------------------ --------------------------- --- -------------------- --------------- +OML 2-in. Mortar 4PP IR[2+]† s7 4PP IR† 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 IR†[1] WP7 s8† 2† A†1 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†1 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†1 N P +OQF 3-in. 20-cwt AA 22† E P +OQF 3.7-in. AA 23† E N P +OML 2-in. Mortar IR s7 4PP IR s7 4PP 14 A N +M19 60mm Mortar IR WP6 4PP IR WP6 4PP 15 A R +OML 3-in. Mortar QSU IR WP7 s8 QSU IR WP7 s8 16 A +OSB 4.2-in. Mortar WP7 s8 WP7 s8 17† N Towed† +OQF 17-Pounder D6 HE8 D6 HE8 18 N +OQF 25-Pounder LF [NT, 0 ROF] s8 LF [NT, 0 ROF] s8 19† N +OQF 40mm AA LF [40†, 2 ROF] LF [40†, 2 ROF] 20 B† N +M2 60mm Mortar IR WP7 5PP OBA† IR WP7 5PP OBA† 23† A K M O P Y +M1(L) 81mm Mortar QSU IR WP8 QSU IR WP8 24† A K M O P R +M20(L) 75mm Recoilless Rifle WP7 5PP H† WP7 5PP H† 25† K M O P R crewed† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1943.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1943.txt index 309f2fe..4f136e1 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1943.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1943.txt @@ -1,29 +1,39 @@ === ordnance/british/1943 === -Name Capabilities (effective) # Notes Comments ---------------------------- ------------------------------ --------------------------- --- -------------------- --------------- -OML 2-in. Mortar 4PP IR[2+]† s7 4PP IR† 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 IR†[1] WP7 s8† 2† A†1 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†1 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†1 N P -OQF 3-in. 20-cwt AA 22† E P -OQF 3.7-in. AA 23† E N P +Name Capabilities (effective) # Notes Comments +---------------------------- ------------------------------ --------------------------- --- -------------------- --------------- +OML 2-in. Mortar 4PP IR[2+]† s7 4PP IR† 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 IR†[1] WP7 s8† 2† A†1 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†1 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†1 N P +OQF 3-in. 20-cwt AA 22† E P +OQF 3.7-in. AA 23† E N P +OML 2-in. Mortar IR s7 4PP IR s7 4PP 14 A N +M19 60mm Mortar IR WP6 4PP IR WP6 4PP 15 A R +OML 3-in. Mortar QSU IR WP7 s8 QSU IR WP7 s8 16 A +OSB 4.2-in. Mortar WP7 s8 WP7 s8 17† N Towed† +OQF 17-Pounder D6 HE8 D6 HE8 18 N +OQF 25-Pounder LF [NT, 0 ROF] s8 LF [NT, 0 ROF] s8 19† N +OQF 40mm AA LF [40†, 2 ROF] LF [40†, 2 ROF] 20 B† N +M2 60mm Mortar IR WP7 5PP OBA† IR WP7 5PP OBA† 23† A K M O P Y +M1(L) 81mm Mortar QSU IR WP8 QSU IR WP8 24† A K M O P R +M20(L) 75mm Recoilless Rifle WP7 5PP H† WP7 5PP H† 25† K M O P R crewed† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1944.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1944.txt index 8ffab08..7a4f371 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1944.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1944.txt @@ -1,29 +1,39 @@ === ordnance/british/1944 === -Name Capabilities (effective) # Notes Comments ---------------------------- ------------------------------ --------------------------- --- -------------------- --------------- -OML 2-in. Mortar 4PP IR[2+]† s7 4PP IR† 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 IR†[1] WP7 s8† 2† A†1 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†1 N P -OQF 6-Pounder 7-cwt QSU D6[J4E]7[5]† HE7[F3]8[4+]† QSU HE8† 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†1 N P -OQF 3-in. 20-cwt AA 22† E P -OQF 3.7-in. AA 23† E N P +Name Capabilities (effective) # Notes Comments +---------------------------- ------------------------------ --------------------------- --- -------------------- --------------- +OML 2-in. Mortar 4PP IR[2+]† s7 4PP IR† 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 IR†[1] WP7 s8† 2† A†1 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†1 N P +OQF 6-Pounder 7-cwt QSU D6[J4E]7[5]† HE7[F3]8[4+]† QSU HE8† 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†1 N P +OQF 3-in. 20-cwt AA 22† E P +OQF 3.7-in. AA 23† E N P +OML 2-in. Mortar IR s7 4PP IR s7 4PP 14 A N +M19 60mm Mortar IR WP6 4PP IR WP6 4PP 15 A R +OML 3-in. Mortar QSU IR WP7 s8 QSU IR WP7 s8 16 A +OSB 4.2-in. Mortar WP7 s8 WP7 s8 17† N Towed† +OQF 17-Pounder D6 HE8 D6 HE8 18 N +OQF 25-Pounder LF [NT, 0 ROF] s8 LF [NT, 0 ROF] s8 19† N +OQF 40mm AA LF [40†, 2 ROF] LF [40†, 2 ROF] 20 B† N +M2 60mm Mortar IR WP7 5PP OBA† IR WP7 5PP OBA† 23† A K M O P Y +M1(L) 81mm Mortar QSU IR WP8 QSU IR WP8 24† A K M O P R +M20(L) 75mm Recoilless Rifle WP7 5PP H† WP7 5PP H† 25† K M O P R crewed† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1945.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1945.txt index ea86e4f..adcf665 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1945.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/british/1945.txt @@ -1,29 +1,39 @@ === ordnance/british/1945 === -Name Capabilities (effective) # Notes Comments ---------------------------- ------------------------------ --------------------------- --- -------------------- --------------- -OML 2-in. Mortar 4PP IR[2+]† s7 4PP IR† 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 IR†[1] WP7 s8† 2† A†1 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†1 N P -OQF 6-Pounder 7-cwt QSU D6[J4E]7[5]† HE7[F3]8[4+]† QSU D7† HE8† 6† B N P -OQF 17/25-Pounder 7 N -OQF 17-Pounder D5[S4]6[5]† HE8[J4+]† D6† HE8† 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†1 N P -OQF 3-in. 20-cwt AA 22† E P -OQF 3.7-in. AA 23† E N P +Name Capabilities (effective) # Notes Comments +---------------------------- ------------------------------ --------------------------- --- -------------------- --------------- +OML 2-in. Mortar 4PP IR[2+]† s7 4PP IR† 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 IR†[1] WP7 s8† 2† A†1 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†1 N P +OQF 6-Pounder 7-cwt QSU D6[J4E]7[5]† HE7[F3]8[4+]† QSU D7† HE8† 6† B N P +OQF 17/25-Pounder 7 N +OQF 17-Pounder D5[S4]6[5]† HE8[J4+]† D6† HE8† 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†1 N P +OQF 3-in. 20-cwt AA 22† E P +OQF 3.7-in. AA 23† E N P +OML 2-in. Mortar IR s7 4PP IR s7 4PP 14 A N +M19 60mm Mortar IR WP6 4PP IR WP6 4PP 15 A R +OML 3-in. Mortar QSU IR WP7 s8 QSU IR WP7 s8 16 A +OSB 4.2-in. Mortar WP7 s8 WP7 s8 17† N Towed† +OQF 17-Pounder D6 HE8 D6 HE8 18 N +OQF 25-Pounder LF [NT, 0 ROF] s8 LF [NT, 0 ROF] s8 19† N +OQF 40mm AA LF [40†, 2 ROF] LF [40†, 2 ROF] 20 B† N +M2 60mm Mortar IR WP7 5PP OBA† IR WP7 5PP OBA† 23† A K M O P Y +M1(L) 81mm Mortar QSU IR WP8 QSU IR WP8 24† A K M O P R +M20(L) 75mm Recoilless Rifle WP7 5PP H† WP7 5PP H† 25† K M O P R crewed† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/croatian/1940.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/croatian/1940.txt index 4b3cfff..e88105c 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/croatian/1940.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/croatian/1940.txt @@ -2,5 +2,5 @@ Name Capabilities (effective) # Notes Comments ---------------- -------------- ------------- --- ------- ------------- -Canonne da 65/17 35 A No Gunshield. +Cannone da 65/17 35 A No Gunshield. Skoda M28(FE) 36 A diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/croatian/1941.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/croatian/1941.txt index 6caae2e..9f9ed2a 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/croatian/1941.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/croatian/1941.txt @@ -2,5 +2,5 @@ Name Capabilities (effective) # Notes Comments ---------------- -------------- ------------- --- ------- ------------- -Canonne da 65/17 35 A No Gunshield. +Cannone da 65/17 35 A No Gunshield. Skoda M28(FE) 36 A diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/croatian/1942.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/croatian/1942.txt index fcea43a..5d392f3 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/croatian/1942.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/croatian/1942.txt @@ -2,5 +2,5 @@ Name Capabilities (effective) # Notes Comments ---------------- -------------- ------------- --- ------- ------------- -Canonne da 65/17 35 A No Gunshield. +Cannone da 65/17 35 A No Gunshield. Skoda M28(FE) 36 A diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/croatian/1943.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/croatian/1943.txt index 82fb80e..5206b6b 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/croatian/1943.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/croatian/1943.txt @@ -2,5 +2,5 @@ Name Capabilities (effective) # Notes Comments ---------------- -------------- ------------- --- ------- ------------- -Canonne da 65/17 35 A No Gunshield. +Cannone da 65/17 35 A No Gunshield. Skoda M28(FE) 36 A diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/croatian/1944.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/croatian/1944.txt index 90b1897..84f52ab 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/croatian/1944.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/croatian/1944.txt @@ -2,5 +2,5 @@ Name Capabilities (effective) # Notes Comments ---------------- -------------- ------------- --- ------- ------------- -Canonne da 65/17 35 A No Gunshield. +Cannone da 65/17 35 A No Gunshield. Skoda M28(FE) 36 A diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/croatian/1945.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/croatian/1945.txt index c799a33..9deaadb 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/croatian/1945.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/croatian/1945.txt @@ -2,5 +2,5 @@ Name Capabilities (effective) # Notes Comments ---------------- -------------- ------------- --- ------- ------------- -Canonne da 65/17 35 A No Gunshield. +Cannone da 65/17 35 A No Gunshield. Skoda M28(FE) 36 A diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-cpva/1950.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-cpva/1950.txt new file mode 100644 index 0000000..bdebace --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-cpva/1950.txt @@ -0,0 +1,19 @@ +=== ordnance/kfw-cpva/1950 === + +Name Capabilities (effective) # Notes Comments +----------------------------------------- -------------------- -------------------- ------ ------- ---------- +50mm Type 89 Heavy Grenade Launcher 4PP 4PP 18† A +60mm Type 31 Mortar 5PP 5PP 19 A +82mm Type 20 Mortar QSU QSU 20† A +82mm Type 53 Mortar QSU s6 QSU s6 21† A +120mm PM obr. 38 QSU s6 QSU s6 22† n/a +45mm PTP obr. 42 QSU A7 QSU A7 23† n/a +47mm Type 1 Machine-Moved Gun QSU QSU 24† n/a +57mm PTP obr. 43 QSU A6 QSU A6 25† n/a +57mm Type 36 Recoilless Rifle H6 WP5 3PP H6 WP5 3PP 26†[1] R† crewed† +75mm Type 52 Recoilless Rifle H6 WP5 5PP H6 WP5 5PP 27 R† crewed† +70mm Type 92 Infantry Gun QSU h-d AP3 H3 QSU h-d AP3 H3 28† A +76.2mm PP obr. 27 QSU H6 s6 QSU H6 s6 29† A +Year-38 Type Field Gun (Improved) QSU h-d "12" AP TK#† QSU h-d "12" AP TK#† 30† n/a +76.2mm obr. 42 QSU A7 s6 QSU A7 s6 31† n/a +Type 93 Twin-Mount High-Angle Machine Gun 2 TK DR† 2 TK DR† 32† A Towing NA† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-cpva/1951.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-cpva/1951.txt new file mode 100644 index 0000000..9004f1c --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-cpva/1951.txt @@ -0,0 +1,19 @@ +=== ordnance/kfw-cpva/1951 === + +Name Capabilities (effective) # Notes Comments +----------------------------------------- -------------------- -------------------- ------ ------- ---------- +50mm Type 89 Heavy Grenade Launcher 4PP 4PP 18† A +60mm Type 31 Mortar 5PP 5PP 19 A +82mm Type 20 Mortar QSU QSU 20† A +82mm Type 53 Mortar QSU s6 QSU s6 21† A +120mm PM obr. 38 QSU s6 QSU s6 22† n/a +45mm PTP obr. 42 QSU A7 QSU A7 23† n/a +47mm Type 1 Machine-Moved Gun QSU QSU 24† n/a +57mm PTP obr. 43 QSU A6 QSU A6 25† n/a +57mm Type 36 Recoilless Rifle H6 WP5 3PP H6 WP5 3PP 26†[1] R† crewed† +75mm Type 52 Recoilless Rifle H6 WP5 5PP H6 WP5 5PP 27 R† crewed† +70mm Type 92 Infantry Gun QSU h-d AP3 H3 QSU h-d AP3 H3 28† A +76.2mm PP obr. 27 QSU H6 s6 QSU H6 s6 29† A +Year-38 Type Field Gun (Improved) QSU h-d "12" AP TK#† QSU h-d "12" AP TK#† 30† n/a +76.2mm obr. 42 QSU A7 s6 QSU A7 s6 31† n/a +Type 93 Twin-Mount High-Angle Machine Gun 2 TK DR† 2 TK DR† 32† A Towing NA† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-cpva/1952.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-cpva/1952.txt new file mode 100644 index 0000000..7d7736d --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-cpva/1952.txt @@ -0,0 +1,19 @@ +=== ordnance/kfw-cpva/1952 === + +Name Capabilities (effective) # Notes Comments +----------------------------------------- -------------------- -------------------- ------ ------- ---------- +50mm Type 89 Heavy Grenade Launcher 4PP 4PP 18† A +60mm Type 31 Mortar 5PP 5PP 19 A +82mm Type 20 Mortar QSU QSU 20† A +82mm Type 53 Mortar QSU s6 QSU s6 21† A +120mm PM obr. 38 QSU s6 QSU s6 22† n/a +45mm PTP obr. 42 QSU A7 QSU A7 23† n/a +47mm Type 1 Machine-Moved Gun QSU QSU 24† n/a +57mm PTP obr. 43 QSU A6 QSU A6 25† n/a +57mm Type 36 Recoilless Rifle H6 WP5 3PP H6 WP5 3PP 26†[1] R† crewed† +75mm Type 52 Recoilless Rifle H6 WP5 5PP H6 WP5 5PP 27 R† crewed† +70mm Type 92 Infantry Gun QSU h-d AP3 H3 QSU h-d AP3 H3 28† A +76.2mm PP obr. 27 QSU H6 s6 QSU H6 s6 29† A +Year-38 Type Field Gun (Improved) QSU h-d "12" AP TK#† QSU h-d "12" AP TK#† 30† n/a +76.2mm obr. 42 QSU A7 s6 QSU A7 s6 31† n/a +Type 93 Twin-Mount High-Angle Machine Gun 2 TK DR† 2 TK DR† 32† A Towing NA† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-cpva/1953.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-cpva/1953.txt new file mode 100644 index 0000000..3b78b63 --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-cpva/1953.txt @@ -0,0 +1,19 @@ +=== ordnance/kfw-cpva/1953 === + +Name Capabilities (effective) # Notes Comments +----------------------------------------- -------------------- -------------------- ------ ------- ---------- +50mm Type 89 Heavy Grenade Launcher 4PP 4PP 18† A +60mm Type 31 Mortar 5PP 5PP 19 A +82mm Type 20 Mortar QSU QSU 20† A +82mm Type 53 Mortar QSU s6 QSU s6 21† A +120mm PM obr. 38 QSU s6 QSU s6 22† n/a +45mm PTP obr. 42 QSU A7 QSU A7 23† n/a +47mm Type 1 Machine-Moved Gun QSU QSU 24† n/a +57mm PTP obr. 43 QSU A6 QSU A6 25† n/a +57mm Type 36 Recoilless Rifle H6 WP5 3PP H6 WP5 3PP 26†[1] R† crewed† +75mm Type 52 Recoilless Rifle H6 WP5 5PP H6 WP5 5PP 27 R† crewed† +70mm Type 92 Infantry Gun QSU h-d AP3 H3 QSU h-d AP3 H3 28† A +76.2mm PP obr. 27 QSU H6 s6 QSU H6 s6 29† A +Year-38 Type Field Gun (Improved) QSU h-d "12" AP TK#† QSU h-d "12" AP TK#† 30† n/a +76.2mm obr. 42 QSU A7 s6 QSU A7 s6 31† n/a +Type 93 Twin-Mount High-Angle Machine Gun 2 TK DR† 2 TK DR† 32† A Towing NA† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-kpa/1950.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-kpa/1950.txt new file mode 100644 index 0000000..a20922c --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-kpa/1950.txt @@ -0,0 +1,20 @@ +=== ordnance/kfw-kpa/1950 === + +Name Capabilities (effective) # Notes Comments +------------------ -------------- ------------- --- ------- ---------- +50mm RM obr. 40 4PP 4PP 1 A B +82mm BM obr. 37 QSU IR s8 QSU IR s8 2† A B +120mm PM obr. 38 QSU s8 QSU s8 3† B +14.5mm PTRD-41 1PP 1PP 4 B +14.5mm PTRS-41 2PP TK#: 6† 2PP TK#: 6† 5† n/a +45mm PTP obr. 37 QSU A7 QSU A7 6† B +45mm PTP obr. 42 QSU A7 QSU A7 6† B +76.2mm PP obr. 27 QSU H6 s8 QSU H6 s8 7† A B +76.2mm obr. 02/30 QSU h-d s8 QSU h-d s8 8† B +76.2mm obr. 42 QSU A7 s8 QSU A7 s8 9† B +107mm P obr. 10/30 h-d s8 h-d s8 10 B +122mm G obr. 38 H6 s8 H6 s8 11† B +122mm obr. 31 s8 s8 12 B +152mm GP obr. 37 13 B +37mm ZP obr. 39 14† B +85mm ZP obr. 39 15 B diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-kpa/1951.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-kpa/1951.txt new file mode 100644 index 0000000..013c9c6 --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-kpa/1951.txt @@ -0,0 +1,20 @@ +=== ordnance/kfw-kpa/1951 === + +Name Capabilities (effective) # Notes Comments +------------------ -------------- ------------- --- ------- ---------- +50mm RM obr. 40 4PP 4PP 1 A B +82mm BM obr. 37 QSU IR s8 QSU IR s8 2† A B +120mm PM obr. 38 QSU s8 QSU s8 3† B +14.5mm PTRD-41 1PP 1PP 4 B +14.5mm PTRS-41 2PP TK#: 6† 2PP TK#: 6† 5† n/a +45mm PTP obr. 37 QSU A7 QSU A7 6† B +45mm PTP obr. 42 QSU A7 QSU A7 6† B +76.2mm PP obr. 27 QSU H6 s8 QSU H6 s8 7† A B +76.2mm obr. 02/30 QSU h-d s8 QSU h-d s8 8† B +76.2mm obr. 42 QSU A7 s8 QSU A7 s8 9† B +107mm P obr. 10/30 h-d s8 h-d s8 10 B +122mm G obr. 38 H6 s8 H6 s8 11† B +122mm obr. 31 s8 s8 12 B +152mm GP obr. 37 13 B +37mm ZP obr. 39 14† B +85mm ZP obr. 39 15 B diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-kpa/1952.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-kpa/1952.txt new file mode 100644 index 0000000..ddb0de3 --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-kpa/1952.txt @@ -0,0 +1,20 @@ +=== ordnance/kfw-kpa/1952 === + +Name Capabilities (effective) # Notes Comments +------------------ -------------- ------------- --- ------- ---------- +50mm RM obr. 40 4PP 4PP 1 A B +82mm BM obr. 37 QSU IR s8 QSU IR s8 2† A B +120mm PM obr. 38 QSU s8 QSU s8 3† B +14.5mm PTRD-41 1PP 1PP 4 B +14.5mm PTRS-41 2PP TK#: 6† 2PP TK#: 6† 5† n/a +45mm PTP obr. 37 QSU A7 QSU A7 6† B +45mm PTP obr. 42 QSU A7 QSU A7 6† B +76.2mm PP obr. 27 QSU H6 s8 QSU H6 s8 7† A B +76.2mm obr. 02/30 QSU h-d s8 QSU h-d s8 8† B +76.2mm obr. 42 QSU A7 s8 QSU A7 s8 9† B +107mm P obr. 10/30 h-d s8 h-d s8 10 B +122mm G obr. 38 H6 s8 H6 s8 11† B +122mm obr. 31 s8 s8 12 B +152mm GP obr. 37 13 B +37mm ZP obr. 39 14† B +85mm ZP obr. 39 15 B diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-kpa/1953.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-kpa/1953.txt new file mode 100644 index 0000000..d4b8824 --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-kpa/1953.txt @@ -0,0 +1,20 @@ +=== ordnance/kfw-kpa/1953 === + +Name Capabilities (effective) # Notes Comments +------------------ -------------- ------------- --- ------- ---------- +50mm RM obr. 40 4PP 4PP 1 A B +82mm BM obr. 37 QSU IR s8 QSU IR s8 2† A B +120mm PM obr. 38 QSU s8 QSU s8 3† B +14.5mm PTRD-41 1PP 1PP 4 B +14.5mm PTRS-41 2PP TK#: 6† 2PP TK#: 6† 5† n/a +45mm PTP obr. 37 QSU A7 QSU A7 6† B +45mm PTP obr. 42 QSU A7 QSU A7 6† B +76.2mm PP obr. 27 QSU H6 s8 QSU H6 s8 7† A B +76.2mm obr. 02/30 QSU h-d s8 QSU h-d s8 8† B +76.2mm obr. 42 QSU A7 s8 QSU A7 s8 9† B +107mm P obr. 10/30 h-d s8 h-d s8 10 B +122mm G obr. 38 H6 s8 H6 s8 11† B +122mm obr. 31 s8 s8 12 B +152mm GP obr. 37 13 B +37mm ZP obr. 39 14† B +85mm ZP obr. 39 15 B diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-ounc/1950.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-ounc/1950.txt new file mode 100644 index 0000000..fcb2c60 --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-ounc/1950.txt @@ -0,0 +1,20 @@ +=== ordnance/kfw-ounc/1950 === + +Name Capabilities (effective) # Notes Comments +-------------------------------- -------------------------------- -------------------------------- --- ------------------ ----------- +Type 89 Heavy Grenade Launcher 4PP 4PP 1† A P +M2 4.2-in. Mortar QSU WP10 QSU WP10 2† K M O P Y +M3A1 37mm AT Gun QSU C7 QSU C7 3† C K P +M1 57mm AT Gun QSU D4 HE7 QSU D4 HE7 4† K +M18(L) 57mm Recoilless Rifle C7 H7 WP6 3PP C7 H7 WP6 3PP 5† C K O non-crewed† +M2A1 105mm Howitzer C7 H6 WP8 s7 C7 H6 WP8 s7 6† C K M O P Y +M3 105mm Howitzer C7 H7 WP8 s7 C7 H7 WP8 s7 7† C K +M1 155mm Howitzer WP8 s7 WP8 s7 8† K M P Y +M1A1 155mm Gun RFNM AP4 WP8 s7 RFNM AP4 WP8 s7 9 Y No IF. +M1 8-in. Howitzer RFNM RFNM 10† Y 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† 11† M Y +M1 40mm AA Gun LF [40†, 2 ROF] LF [40†, 2 ROF] 12 B† Y +M2 90mm AA Gun LF [90†[1], 1 ROF, B11] LF [90†[1], 1 ROF, B11] 13† B†1 M Y +M2 60mm Mortar IR WP7 5PP OBA† IR WP7 5PP OBA† 23† A K M O P Y +M1(L) 81mm Mortar QSU IR WP8 QSU IR WP8 24† A K M O P R +M20(L) 75mm Recoilless Rifle WP7 5PP H† WP7 5PP H† 25† K M O P R crewed† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-ounc/1951.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-ounc/1951.txt new file mode 100644 index 0000000..ca48896 --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-ounc/1951.txt @@ -0,0 +1,20 @@ +=== ordnance/kfw-ounc/1951 === + +Name Capabilities (effective) # Notes Comments +-------------------------------- -------------------------------- -------------------------------- --- ------------------ ----------- +Type 89 Heavy Grenade Launcher 4PP 4PP 1† A P +M2 4.2-in. Mortar QSU WP10 QSU WP10 2† K M O P Y +M3A1 37mm AT Gun QSU C7 QSU C7 3† C K P +M1 57mm AT Gun QSU D4 HE7 QSU D4 HE7 4† K +M18(L) 57mm Recoilless Rifle C7 H7 WP6 3PP C7 H7 WP6 3PP 5† C K O non-crewed† +M2A1 105mm Howitzer C7 H6 WP8 s7 C7 H6 WP8 s7 6† C K M O P Y +M3 105mm Howitzer C7 H7 WP8 s7 C7 H7 WP8 s7 7† C K +M1 155mm Howitzer WP8 s7 WP8 s7 8† K M P Y +M1A1 155mm Gun RFNM AP4 WP8 s7 RFNM AP4 WP8 s7 9 Y No IF. +M1 8-in. Howitzer RFNM RFNM 10† Y 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† 11† M Y +M1 40mm AA Gun LF [40†, 2 ROF] LF [40†, 2 ROF] 12 B† Y +M2 90mm AA Gun LF [90†[1], 1 ROF, B11] LF [90†[1], 1 ROF, B11] 13† B†1 M Y +M2 60mm Mortar IR WP7 5PP OBA† IR WP7 5PP OBA† 23† A K M O P Y +M1(L) 81mm Mortar QSU IR WP8 QSU IR WP8 24† A K M O P R +M20(L) 75mm Recoilless Rifle WP7 5PP H† WP7 5PP H† 25† K M O P R crewed† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-ounc/1952.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-ounc/1952.txt new file mode 100644 index 0000000..1647239 --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-ounc/1952.txt @@ -0,0 +1,20 @@ +=== ordnance/kfw-ounc/1952 === + +Name Capabilities (effective) # Notes Comments +-------------------------------- -------------------------------- -------------------------------- --- ------------------ ----------- +Type 89 Heavy Grenade Launcher 4PP 4PP 1† A P +M2 4.2-in. Mortar QSU WP10 QSU WP10 2† K M O P Y +M3A1 37mm AT Gun QSU C7 QSU C7 3† C K P +M1 57mm AT Gun QSU D4 HE7 QSU D4 HE7 4† K +M18(L) 57mm Recoilless Rifle C7 H7 WP6 3PP C7 H7 WP6 3PP 5† C K O non-crewed† +M2A1 105mm Howitzer C7 H6 WP8 s7 C7 H6 WP8 s7 6† C K M O P Y +M3 105mm Howitzer C7 H7 WP8 s7 C7 H7 WP8 s7 7† C K +M1 155mm Howitzer WP8 s7 WP8 s7 8† K M P Y +M1A1 155mm Gun RFNM AP4 WP8 s7 RFNM AP4 WP8 s7 9 Y No IF. +M1 8-in. Howitzer RFNM RFNM 10† Y 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† 11† M Y +M1 40mm AA Gun LF [40†, 2 ROF] LF [40†, 2 ROF] 12 B† Y +M2 90mm AA Gun LF [90†[1], 1 ROF, B11] LF [90†[1], 1 ROF, B11] 13† B†1 M Y +M2 60mm Mortar IR WP7 5PP OBA† IR WP7 5PP OBA† 23† A K M O P Y +M1(L) 81mm Mortar QSU IR WP8 QSU IR WP8 24† A K M O P R +M20(L) 75mm Recoilless Rifle WP7 5PP H† WP7 5PP H† 25† K M O P R crewed† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-ounc/1953.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-ounc/1953.txt new file mode 100644 index 0000000..5672016 --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-ounc/1953.txt @@ -0,0 +1,20 @@ +=== ordnance/kfw-ounc/1953 === + +Name Capabilities (effective) # Notes Comments +-------------------------------- -------------------------------- -------------------------------- --- ------------------ ----------- +Type 89 Heavy Grenade Launcher 4PP 4PP 1† A P +M2 4.2-in. Mortar QSU WP10 QSU WP10 2† K M O P Y +M3A1 37mm AT Gun QSU C7 QSU C7 3† C K P +M1 57mm AT Gun QSU D4 HE7 QSU D4 HE7 4† K +M18(L) 57mm Recoilless Rifle C7 H7 WP6 3PP C7 H7 WP6 3PP 5† C K O non-crewed† +M2A1 105mm Howitzer C7 H6 WP8 s7 C7 H6 WP8 s7 6† C K M O P Y +M3 105mm Howitzer C7 H7 WP8 s7 C7 H7 WP8 s7 7† C K +M1 155mm Howitzer WP8 s7 WP8 s7 8† K M P Y +M1A1 155mm Gun RFNM AP4 WP8 s7 RFNM AP4 WP8 s7 9 Y No IF. +M1 8-in. Howitzer RFNM RFNM 10† Y 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† 11† M Y +M1 40mm AA Gun LF [40†, 2 ROF] LF [40†, 2 ROF] 12 B† Y +M2 90mm AA Gun LF [90†[1], 1 ROF, B11] LF [90†[1], 1 ROF, B11] 13† B†1 M Y +M2 60mm Mortar IR WP7 5PP OBA† IR WP7 5PP OBA† 23† A K M O P Y +M1(L) 81mm Mortar QSU IR WP8 QSU IR WP8 24† A K M O P R +M20(L) 75mm Recoilless Rifle WP7 5PP H† WP7 5PP H† 25† K M O P R crewed† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-rok/1950.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-rok/1950.txt new file mode 100644 index 0000000..c83f326 --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-rok/1950.txt @@ -0,0 +1,20 @@ +=== ordnance/kfw-rok/1950 === + +Name Capabilities (effective) # Notes Comments +-------------------------------- -------------------------------- -------------------------------- --- ------------------ ----------- +Type 89 Heavy Grenade Launcher 4PP 4PP 1† A P +M2 4.2-in. Mortar QSU WP10 QSU WP10 2† K M O P Y +M3A1 37mm AT Gun QSU C7 QSU C7 3† C K P +M1 57mm AT Gun QSU D4 HE7 QSU D4 HE7 4† K +M18(L) 57mm Recoilless Rifle C7 H7 WP6 3PP C7 H7 WP6 3PP 5† C K O non-crewed† +M2A1 105mm Howitzer C7 H6 WP8 s7 C7 H6 WP8 s7 6† C K M O P Y +M3 105mm Howitzer C7 H7 WP8 s7 C7 H7 WP8 s7 7† C K +M1 155mm Howitzer WP8 s7 WP8 s7 8† K M P Y +M1A1 155mm Gun RFNM AP4 WP8 s7 RFNM AP4 WP8 s7 9 Y No IF. +M1 8-in. Howitzer RFNM RFNM 10† Y 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† 11† M Y +M1 40mm AA Gun LF [40†, 2 ROF] LF [40†, 2 ROF] 12 B† Y +M2 90mm AA Gun LF [90†[1], 1 ROF, B11] LF [90†[1], 1 ROF, B11] 13† B†1 M Y +M2 60mm Mortar IR WP7 5PP OBA† IR WP7 5PP OBA† 23† A K M O P Y +M1(L) 81mm Mortar QSU IR WP8 QSU IR WP8 24† A K M O P R +M20(L) 75mm Recoilless Rifle WP7 5PP H† WP7 5PP H† 25† K M O P R crewed† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-rok/1951.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-rok/1951.txt new file mode 100644 index 0000000..4681039 --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-rok/1951.txt @@ -0,0 +1,20 @@ +=== ordnance/kfw-rok/1951 === + +Name Capabilities (effective) # Notes Comments +-------------------------------- -------------------------------- -------------------------------- --- ------------------ ----------- +Type 89 Heavy Grenade Launcher 4PP 4PP 1† A P +M2 4.2-in. Mortar QSU WP10 QSU WP10 2† K M O P Y +M3A1 37mm AT Gun QSU C7 QSU C7 3† C K P +M1 57mm AT Gun QSU D4 HE7 QSU D4 HE7 4† K +M18(L) 57mm Recoilless Rifle C7 H7 WP6 3PP C7 H7 WP6 3PP 5† C K O non-crewed† +M2A1 105mm Howitzer C7 H6 WP8 s7 C7 H6 WP8 s7 6† C K M O P Y +M3 105mm Howitzer C7 H7 WP8 s7 C7 H7 WP8 s7 7† C K +M1 155mm Howitzer WP8 s7 WP8 s7 8† K M P Y +M1A1 155mm Gun RFNM AP4 WP8 s7 RFNM AP4 WP8 s7 9 Y No IF. +M1 8-in. Howitzer RFNM RFNM 10† Y 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† 11† M Y +M1 40mm AA Gun LF [40†, 2 ROF] LF [40†, 2 ROF] 12 B† Y +M2 90mm AA Gun LF [90†[1], 1 ROF, B11] LF [90†[1], 1 ROF, B11] 13† B†1 M Y +M2 60mm Mortar IR WP7 5PP OBA† IR WP7 5PP OBA† 23† A K M O P Y +M1(L) 81mm Mortar QSU IR WP8 QSU IR WP8 24† A K M O P R +M20(L) 75mm Recoilless Rifle WP7 5PP H† WP7 5PP H† 25† K M O P R crewed† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-rok/1952.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-rok/1952.txt new file mode 100644 index 0000000..a7d4e96 --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-rok/1952.txt @@ -0,0 +1,20 @@ +=== ordnance/kfw-rok/1952 === + +Name Capabilities (effective) # Notes Comments +-------------------------------- -------------------------------- -------------------------------- --- ------------------ ----------- +Type 89 Heavy Grenade Launcher 4PP 4PP 1† A P +M2 4.2-in. Mortar QSU WP10 QSU WP10 2† K M O P Y +M3A1 37mm AT Gun QSU C7 QSU C7 3† C K P +M1 57mm AT Gun QSU D4 HE7 QSU D4 HE7 4† K +M18(L) 57mm Recoilless Rifle C7 H7 WP6 3PP C7 H7 WP6 3PP 5† C K O non-crewed† +M2A1 105mm Howitzer C7 H6 WP8 s7 C7 H6 WP8 s7 6† C K M O P Y +M3 105mm Howitzer C7 H7 WP8 s7 C7 H7 WP8 s7 7† C K +M1 155mm Howitzer WP8 s7 WP8 s7 8† K M P Y +M1A1 155mm Gun RFNM AP4 WP8 s7 RFNM AP4 WP8 s7 9 Y No IF. +M1 8-in. Howitzer RFNM RFNM 10† Y 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† 11† M Y +M1 40mm AA Gun LF [40†, 2 ROF] LF [40†, 2 ROF] 12 B† Y +M2 90mm AA Gun LF [90†[1], 1 ROF, B11] LF [90†[1], 1 ROF, B11] 13† B†1 M Y +M2 60mm Mortar IR WP7 5PP OBA† IR WP7 5PP OBA† 23† A K M O P Y +M1(L) 81mm Mortar QSU IR WP8 QSU IR WP8 24† A K M O P R +M20(L) 75mm Recoilless Rifle WP7 5PP H† WP7 5PP H† 25† K M O P R crewed† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-rok/1953.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-rok/1953.txt new file mode 100644 index 0000000..57a8a8c --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/kfw-rok/1953.txt @@ -0,0 +1,20 @@ +=== ordnance/kfw-rok/1953 === + +Name Capabilities (effective) # Notes Comments +-------------------------------- -------------------------------- -------------------------------- --- ------------------ ----------- +Type 89 Heavy Grenade Launcher 4PP 4PP 1† A P +M2 4.2-in. Mortar QSU WP10 QSU WP10 2† K M O P Y +M3A1 37mm AT Gun QSU C7 QSU C7 3† C K P +M1 57mm AT Gun QSU D4 HE7 QSU D4 HE7 4† K +M18(L) 57mm Recoilless Rifle C7 H7 WP6 3PP C7 H7 WP6 3PP 5† C K O non-crewed† +M2A1 105mm Howitzer C7 H6 WP8 s7 C7 H6 WP8 s7 6† C K M O P Y +M3 105mm Howitzer C7 H7 WP8 s7 C7 H7 WP8 s7 7† C K +M1 155mm Howitzer WP8 s7 WP8 s7 8† K M P Y +M1A1 155mm Gun RFNM AP4 WP8 s7 RFNM AP4 WP8 s7 9 Y No IF. +M1 8-in. Howitzer RFNM RFNM 10† Y 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† 11† M Y +M1 40mm AA Gun LF [40†, 2 ROF] LF [40†, 2 ROF] 12 B† Y +M2 90mm AA Gun LF [90†[1], 1 ROF, B11] LF [90†[1], 1 ROF, B11] 13† B†1 M Y +M2 60mm Mortar IR WP7 5PP OBA† IR WP7 5PP OBA† 23† A K M O P Y +M1(L) 81mm Mortar QSU IR WP8 QSU IR WP8 24† A K M O P R +M20(L) 75mm Recoilless Rifle WP7 5PP H† WP7 5PP H† 25† K M O P R crewed† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/romanian/1940.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/romanian/1940.txt index aa73a2d..eb8866d 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/romanian/1940.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/romanian/1940.txt @@ -10,7 +10,7 @@ Resita M43 QSU AP TK#18† QSU AP TK#18† 4† n/a Blk T Breda 47 QSU QSU 6† A No Gunshield. 75mm PP obr. 27 QSU H6 s8 QSU H6 s8 7 A 75 M mle 28 QSU h-d AP5 s5 QSU h-d AP5 s5 8 A -Skoda M14/34 AP6 AP6 9† A +Skoda M14/34 AP6 AP6 9† A† 76.2mm P obr. 00/02 QSU h-d s7 QSU h-d s7 10 n/a 76.2mm P obr. 02/30 QSU h-d s7 QSU h-d s7 11 n/a 76.2mm P obr. 39(r) QSU s5 QSU s5 12 K† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/romanian/1941.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/romanian/1941.txt index 2dc2132..d48eb8a 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/romanian/1941.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/romanian/1941.txt @@ -10,7 +10,7 @@ Resita M43 QSU AP TK#18† QSU AP TK#18† 4† n/a Blk T Breda 47 QSU QSU 6† A No Gunshield. 75mm PP obr. 27 QSU H6 s8 QSU H6 s8 7 A 75 M mle 28 QSU h-d AP5 s5 QSU h-d AP5 s5 8 A -Skoda M14/34 AP6 AP6 9† A +Skoda M14/34 AP6 AP6 9† A† 76.2mm P obr. 00/02 QSU h-d s7 QSU h-d s7 10 n/a 76.2mm P obr. 02/30 QSU h-d s7 QSU h-d s7 11 n/a 76.2mm P obr. 39(r) QSU s5 QSU s5 12 K† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/romanian/1942.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/romanian/1942.txt index e226cf4..adddd6b 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/romanian/1942.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/romanian/1942.txt @@ -10,7 +10,7 @@ Resita M43 QSU AP TK#18† QSU AP TK#18† 4† n/a Blk T Breda 47 QSU QSU 6† A No Gunshield. 75mm PP obr. 27 QSU H6 s8 QSU H6 s8 7 A 75 M mle 28 QSU h-d AP5 s5 QSU h-d AP5 s5 8 A -Skoda M14/34 AP6 AP6 9† A +Skoda M14/34 AP6 AP6 9† A† 76.2mm P obr. 00/02 QSU h-d s7 QSU h-d s7 10 n/a 76.2mm P obr. 02/30 QSU h-d s7 QSU h-d s7 11 n/a 76.2mm P obr. 39(r) QSU s5 QSU s5 12 K† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/romanian/1943.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/romanian/1943.txt index 10ac59f..59cfc0a 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/romanian/1943.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/romanian/1943.txt @@ -10,7 +10,7 @@ Resita M43 QSU AP TK#18† QSU AP TK#18† 4† n/a Blk T Breda 47 QSU QSU 6† A No Gunshield. 75mm PP obr. 27 QSU H6 s8 QSU H6 s8 7 A 75 M mle 28 QSU h-d AP5 s5 QSU h-d AP5 s5 8 A -Skoda M14/34 AP6 AP6 9† A +Skoda M14/34 AP6 AP6 9† A† 76.2mm P obr. 00/02 QSU h-d s7 QSU h-d s7 10 n/a 76.2mm P obr. 02/30 QSU h-d s7 QSU h-d s7 11 n/a 76.2mm P obr. 39(r) QSU s5 QSU s5 12 K† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/romanian/1944.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/romanian/1944.txt index c6cfb53..f9b25ac 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/romanian/1944.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/romanian/1944.txt @@ -10,7 +10,7 @@ Resita M43 QSU AP TK#18† QSU AP TK#18† 4† n/a Blk T Breda 47 QSU QSU 6† A No Gunshield. 75mm PP obr. 27 QSU H6 s8 QSU H6 s8 7 A 75 M mle 28 QSU h-d AP5 s5 QSU h-d AP5 s5 8 A -Skoda M14/34 AP6 AP6 9† A +Skoda M14/34 AP6 AP6 9† A† 76.2mm P obr. 00/02 QSU h-d s7 QSU h-d s7 10 n/a 76.2mm P obr. 02/30 QSU h-d s7 QSU h-d s7 11 n/a 76.2mm P obr. 39(r) QSU s5 QSU s5 12 K† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/romanian/1945.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/romanian/1945.txt index cffe695..4085cfd 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/romanian/1945.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/romanian/1945.txt @@ -10,7 +10,7 @@ Resita M43 QSU AP TK#18† QSU AP TK#18† 4† n/a Blk T Breda 47 QSU QSU 6† A No Gunshield. 75mm PP obr. 27 QSU H6 s8 QSU H6 s8 7 A 75 M mle 28 QSU h-d AP5 s5 QSU h-d AP5 s5 8 A -Skoda M14/34 AP6 AP6 9† A +Skoda M14/34 AP6 AP6 9† A† 76.2mm P obr. 00/02 QSU h-d s7 QSU h-d s7 10 n/a 76.2mm P obr. 02/30 QSU h-d s7 QSU h-d s7 11 n/a 76.2mm P obr. 39(r) QSU s5 QSU s5 12 K† diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1940.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1940.txt index 67ac09d..0bbe3f3 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1940.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1940.txt @@ -94,3 +94,48 @@ M4A3F WP7[J4+]†[3] s5[J4+] sM4[4+] CS 5[brewup] CS 5[brewup] M4A3F(75)W WP7 s5 sM8 CS 6 WP7 s5 sM8 CS 6 13† US F†2 US G US R†1 US Y C M4A1F(76)W A4[A4]5[5]†[2] s5[5] sM8 CS 6 sM8 CS 6 15† US A†2 US F†1 US G US P US Y C M4A3F(76)W A4[A4]5[5]†[2] s5[5] sM8 CS 6 sM8 CS 6 16† US A†2 US F†1 US G US P US Y C +M24 WP7 s5 sM8 CS 5 WP7 s5 sM8 CS 5 1† O Y +M4A3E8 A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 2† A†1 P +M4A3E8(105) C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 3† C M +M4A3E8 Dozer A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 4 A†1 TT† +M4A3E8(105) Dozer C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 4† C M TT†1 +POA-CWS-H5 C5 sM8 CS 6 C5 sM8 CS 6 5† C M +M32A1B3 TRV CS 6 CS 6 6† K M P +M26A1 A†[1] WP6[M51+]†[2] CS 6 A†[1] CS 6 7† A†1 J†2 M +M45 H7 WP9 s7 CS 6 H7 WP9 s7 CS 6 8 n/a +M46 A†[2] WP6[M51+]†[3] CS 6 A†[2] CS 6 9† A†2 J†3 M FF†1 +M36B2 GMC(a) A† sP5 CS 7 A† sP5 CS 7 10 A† K UU +M38A1C Jeep H† CS 2 H† CS 2 11† n/a +M3 CS 5 CS 5 12† K Y +M3(MMG) CS 5 CS 5 13† E† H K Y +M3(HMG) CS 5 CS 5 13† E† H K Y +M19A1 MGMC CS 4 CS 4 14† AA†1 +M15A1 MGMC CS 4 CS 4 15† O V†1 Y AA†2 DD†1 +M15 Special CS 4 CS 4 16† AA†2 DD†1 +M16 MGMC CS 4 CS 4 17† F†1 V†1 Y AA†2 DD†1 +M16A1 MGMC CS 5 CS 5 18† F†1 V†1 AA†2 DD†1 +M39 AUV CS 6 CS 6 19† G†1 M +M39 MC WP8 CS 5[brewup] WP8 CS 5[brewup] 19† n/a +M7 HMC C7 H7 WP8 s7 CS 7 C7 H7 WP8 s7 CS 7 20† C Y +M37 HMC H9 WP9 s7 CS 7 H9 WP9 s7 CS 7 21 n/a +M41 HMC no IF WP8 s7 CS 9 no IF WP8 s7 CS 9 22† S†1 +M40 GMC no IF AP4 WP8 s7 CS 9 no IF AP4 WP8 s7 CS 9 23 S† +M43 HMC no IF CS 9 no IF CS 9 23 S† +LVT(A)5 C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24† H T†1 X†2 +LVT(A)5m C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24 M T† +LVT3 CS 7 CS 7 25† D† H M T†1 X†2 +LVT3C CS 7 CS 7 25† D† M T†1 X†2 BB† +M75 CS 6 CS 6 26 G† BB†1 +M29 Weasel CS 3 CS 3 27† B†1 M T†1 +M29C Weasel CS 3 CS 3 28† B†1 M T†1 +M4 hst CS 6 CS 6 29 G† Y +DUKW CS 7†[1] CS 7†[1] 30† D†2 M Q†1 Y +TACP Jeep CS 2† CS 2† 31† L†1 M +7½-Ton CS 7 CS 7 32 Y +Searchlight Truck CS 7† CS 7† 33† n/a +M3A1 CS 5 CS 5 54† E† H K Y Z†1 UU +M20 sP5 CS 4 sP5 CS 4 55† D†4 K Q†2 W†1 Y Z†3 UU +M8 C7 sP5 CS 4 C7 sP5 CS 4 56† C K W†1 Y UU +¼-Ton Jeep cs 2†[1] cs 2†[1] 57† K L†2 M N O P Q†1 Y UU +¾-Ton cs 4 cs 4 57† K N O Y UU +2½-Ton cs 7 cs 7 57† K M N O P Y UU diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1941.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1941.txt index e624be3..199230a 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1941.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1941.txt @@ -94,3 +94,48 @@ M4A3F WP7[J4+]†[3] s5[J4+] sM4[4+] CS 5[brewup] CS 5[brewup] M4A3F(75)W WP7 s5 sM8 CS 6 WP7 s5 sM8 CS 6 13† US F†2 US G US R†1 US Y C M4A1F(76)W A4[A4]5[5]†[2] s5[5] sM8 CS 6 sM8 CS 6 15† US A†2 US F†1 US G US P US Y C M4A3F(76)W A4[A4]5[5]†[2] s5[5] sM8 CS 6 sM8 CS 6 16† US A†2 US F†1 US G US P US Y C +M24 WP7 s5 sM8 CS 5 WP7 s5 sM8 CS 5 1† O Y +M4A3E8 A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 2† A†1 P +M4A3E8(105) C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 3† C M +M4A3E8 Dozer A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 4 A†1 TT† +M4A3E8(105) Dozer C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 4† C M TT†1 +POA-CWS-H5 C5 sM8 CS 6 C5 sM8 CS 6 5† C M +M32A1B3 TRV CS 6 CS 6 6† K M P +M26A1 A†[1] WP6[M51+]†[2] CS 6 A†[1] CS 6 7† A†1 J†2 M +M45 H7 WP9 s7 CS 6 H7 WP9 s7 CS 6 8 n/a +M46 A†[2] WP6[M51+]†[3] CS 6 A†[2] CS 6 9† A†2 J†3 M FF†1 +M36B2 GMC(a) A† sP5 CS 7 A† sP5 CS 7 10 A† K UU +M38A1C Jeep H† CS 2 H† CS 2 11† n/a +M3 CS 5 CS 5 12† K Y +M3(MMG) CS 5 CS 5 13† E† H K Y +M3(HMG) CS 5 CS 5 13† E† H K Y +M19A1 MGMC CS 4 CS 4 14† AA†1 +M15A1 MGMC CS 4 CS 4 15† O V†1 Y AA†2 DD†1 +M15 Special CS 4 CS 4 16† AA†2 DD†1 +M16 MGMC CS 4 CS 4 17† F†1 V†1 Y AA†2 DD†1 +M16A1 MGMC CS 5 CS 5 18† F†1 V†1 AA†2 DD†1 +M39 AUV CS 6 CS 6 19† G†1 M +M39 MC WP8 CS 5[brewup] WP8 CS 5[brewup] 19† n/a +M7 HMC C7 H7 WP8 s7 CS 7 C7 H7 WP8 s7 CS 7 20† C Y +M37 HMC H9 WP9 s7 CS 7 H9 WP9 s7 CS 7 21 n/a +M41 HMC no IF WP8 s7 CS 9 no IF WP8 s7 CS 9 22† S†1 +M40 GMC no IF AP4 WP8 s7 CS 9 no IF AP4 WP8 s7 CS 9 23 S† +M43 HMC no IF CS 9 no IF CS 9 23 S† +LVT(A)5 C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24† H T†1 X†2 +LVT(A)5m C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24 M T† +LVT3 CS 7 CS 7 25† D† H M T†1 X†2 +LVT3C CS 7 CS 7 25† D† M T†1 X†2 BB† +M75 CS 6 CS 6 26 G† BB†1 +M29 Weasel CS 3 CS 3 27† B†1 M T†1 +M29C Weasel CS 3 CS 3 28† B†1 M T†1 +M4 hst CS 6 CS 6 29 G† Y +DUKW CS 7†[1] CS 7†[1] 30† D†2 M Q†1 Y +TACP Jeep CS 2† CS 2† 31† L†1 M +7½-Ton CS 7 CS 7 32 Y +Searchlight Truck CS 7† CS 7† 33† n/a +M3A1 CS 5 CS 5 54† E† H K Y Z†1 UU +M20 sP5 CS 4 sP5 CS 4 55† D†4 K Q†2 W†1 Y Z†3 UU +M8 C7 sP5 CS 4 C7 sP5 CS 4 56† C K W†1 Y UU +¼-Ton Jeep cs 2†[1] cs 2†[1] 57† K L†2 M N O P Q†1 Y UU +¾-Ton cs 4 cs 4 57† K N O Y UU +2½-Ton cs 7 cs 7 57† K M N O P Y UU diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1942.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1942.txt index 9e8fbb1..9d90c80 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1942.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1942.txt @@ -94,3 +94,48 @@ M4A3F WP7[J4+]†[3] s5[J4+] sM4[4+] CS 5[brewup] CS 5[brewup] M4A3F(75)W WP7 s5 sM8 CS 6 WP7 s5 sM8 CS 6 13† US F†2 US G US R†1 US Y C M4A1F(76)W A4[A4]5[5]†[2] s5[5] sM8 CS 6 sM8 CS 6 15† US A†2 US F†1 US G US P US Y C M4A3F(76)W A4[A4]5[5]†[2] s5[5] sM8 CS 6 sM8 CS 6 16† US A†2 US F†1 US G US P US Y C +M24 WP7 s5 sM8 CS 5 WP7 s5 sM8 CS 5 1† O Y +M4A3E8 A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 2† A†1 P +M4A3E8(105) C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 3† C M +M4A3E8 Dozer A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 4 A†1 TT† +M4A3E8(105) Dozer C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 4† C M TT†1 +POA-CWS-H5 C5 sM8 CS 6 C5 sM8 CS 6 5† C M +M32A1B3 TRV CS 6 CS 6 6† K M P +M26A1 A†[1] WP6[M51+]†[2] CS 6 A†[1] CS 6 7† A†1 J†2 M +M45 H7 WP9 s7 CS 6 H7 WP9 s7 CS 6 8 n/a +M46 A†[2] WP6[M51+]†[3] CS 6 A†[2] CS 6 9† A†2 J†3 M FF†1 +M36B2 GMC(a) A† sP5 CS 7 A† sP5 CS 7 10 A† K UU +M38A1C Jeep H† CS 2 H† CS 2 11† n/a +M3 CS 5 CS 5 12† K Y +M3(MMG) CS 5 CS 5 13† E† H K Y +M3(HMG) CS 5 CS 5 13† E† H K Y +M19A1 MGMC CS 4 CS 4 14† AA†1 +M15A1 MGMC CS 4 CS 4 15† O V†1 Y AA†2 DD†1 +M15 Special CS 4 CS 4 16† AA†2 DD†1 +M16 MGMC CS 4 CS 4 17† F†1 V†1 Y AA†2 DD†1 +M16A1 MGMC CS 5 CS 5 18† F†1 V†1 AA†2 DD†1 +M39 AUV CS 6 CS 6 19† G†1 M +M39 MC WP8 CS 5[brewup] WP8 CS 5[brewup] 19† n/a +M7 HMC C7 H7 WP8 s7 CS 7 C7 H7 WP8 s7 CS 7 20† C Y +M37 HMC H9 WP9 s7 CS 7 H9 WP9 s7 CS 7 21 n/a +M41 HMC no IF WP8 s7 CS 9 no IF WP8 s7 CS 9 22† S†1 +M40 GMC no IF AP4 WP8 s7 CS 9 no IF AP4 WP8 s7 CS 9 23 S† +M43 HMC no IF CS 9 no IF CS 9 23 S† +LVT(A)5 C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24† H T†1 X†2 +LVT(A)5m C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24 M T† +LVT3 CS 7 CS 7 25† D† H M T†1 X†2 +LVT3C CS 7 CS 7 25† D† M T†1 X†2 BB† +M75 CS 6 CS 6 26 G† BB†1 +M29 Weasel CS 3 CS 3 27† B†1 M T†1 +M29C Weasel CS 3 CS 3 28† B†1 M T†1 +M4 hst CS 6 CS 6 29 G† Y +DUKW CS 7†[1] CS 7†[1] 30† D†2 M Q†1 Y +TACP Jeep CS 2† CS 2† 31† L†1 M +7½-Ton CS 7 CS 7 32 Y +Searchlight Truck CS 7† CS 7† 33† n/a +M3A1 CS 5 CS 5 54† E† H K Y Z†1 UU +M20 sP5 CS 4 sP5 CS 4 55† D†4 K Q†2 W†1 Y Z†3 UU +M8 C7 sP5 CS 4 C7 sP5 CS 4 56† C K W†1 Y UU +¼-Ton Jeep cs 2†[1] cs 2†[1] 57† K L†2 M N O P Q†1 Y UU +¾-Ton cs 4 cs 4 57† K N O Y UU +2½-Ton cs 7 cs 7 57† K M N O P Y UU diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1943.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1943.txt index 256815a..8e768d6 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1943.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1943.txt @@ -94,3 +94,48 @@ M4A3F WP7[J4+]†[3] s5[J4+] sM4[4+] CS 5[brewup] CS 5[brewup] M4A3F(75)W WP7 s5 sM8 CS 6 WP7 s5 sM8 CS 6 13† US F†2 US G US R†1 US Y C M4A1F(76)W A4[A4]5[5]†[2] s5[5] sM8 CS 6 sM8 CS 6 15† US A†2 US F†1 US G US P US Y C M4A3F(76)W A4[A4]5[5]†[2] s5[5] sM8 CS 6 sM8 CS 6 16† US A†2 US F†1 US G US P US Y C +M24 WP7 s5 sM8 CS 5 WP7 s5 sM8 CS 5 1† O Y +M4A3E8 A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 2† A†1 P +M4A3E8(105) C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 3† C M +M4A3E8 Dozer A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 4 A†1 TT† +M4A3E8(105) Dozer C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 4† C M TT†1 +POA-CWS-H5 C5 sM8 CS 6 C5 sM8 CS 6 5† C M +M32A1B3 TRV CS 6 CS 6 6† K M P +M26A1 A†[1] WP6[M51+]†[2] CS 6 A†[1] CS 6 7† A†1 J†2 M +M45 H7 WP9 s7 CS 6 H7 WP9 s7 CS 6 8 n/a +M46 A†[2] WP6[M51+]†[3] CS 6 A†[2] CS 6 9† A†2 J†3 M FF†1 +M36B2 GMC(a) A† sP5 CS 7 A† sP5 CS 7 10 A† K UU +M38A1C Jeep H† CS 2 H† CS 2 11† n/a +M3 CS 5 CS 5 12† K Y +M3(MMG) CS 5 CS 5 13† E† H K Y +M3(HMG) CS 5 CS 5 13† E† H K Y +M19A1 MGMC CS 4 CS 4 14† AA†1 +M15A1 MGMC CS 4 CS 4 15† O V†1 Y AA†2 DD†1 +M15 Special CS 4 CS 4 16† AA†2 DD†1 +M16 MGMC CS 4 CS 4 17† F†1 V†1 Y AA†2 DD†1 +M16A1 MGMC CS 5 CS 5 18† F†1 V†1 AA†2 DD†1 +M39 AUV CS 6 CS 6 19† G†1 M +M39 MC WP8 CS 5[brewup] WP8 CS 5[brewup] 19† n/a +M7 HMC C7 H7 WP8 s7 CS 7 C7 H7 WP8 s7 CS 7 20† C Y +M37 HMC H9 WP9 s7 CS 7 H9 WP9 s7 CS 7 21 n/a +M41 HMC no IF WP8 s7 CS 9 no IF WP8 s7 CS 9 22† S†1 +M40 GMC no IF AP4 WP8 s7 CS 9 no IF AP4 WP8 s7 CS 9 23 S† +M43 HMC no IF CS 9 no IF CS 9 23 S† +LVT(A)5 C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24† H T†1 X†2 +LVT(A)5m C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24 M T† +LVT3 CS 7 CS 7 25† D† H M T†1 X†2 +LVT3C CS 7 CS 7 25† D† M T†1 X†2 BB† +M75 CS 6 CS 6 26 G† BB†1 +M29 Weasel CS 3 CS 3 27† B†1 M T†1 +M29C Weasel CS 3 CS 3 28† B†1 M T†1 +M4 hst CS 6 CS 6 29 G† Y +DUKW CS 7†[1] CS 7†[1] 30† D†2 M Q†1 Y +TACP Jeep CS 2† CS 2† 31† L†1 M +7½-Ton CS 7 CS 7 32 Y +Searchlight Truck CS 7† CS 7† 33† n/a +M3A1 CS 5 CS 5 54† E† H K Y Z†1 UU +M20 sP5 CS 4 sP5 CS 4 55† D†4 K Q†2 W†1 Y Z†3 UU +M8 C7 sP5 CS 4 C7 sP5 CS 4 56† C K W†1 Y UU +¼-Ton Jeep cs 2†[1] cs 2†[1] 57† K L†2 M N O P Q†1 Y UU +¾-Ton cs 4 cs 4 57† K N O Y UU +2½-Ton cs 7 cs 7 57† K M N O P Y UU diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1944.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1944.txt index 1592e1d..870b8a1 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1944.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1944.txt @@ -94,3 +94,48 @@ M4A3F WP7[J4+]†[3] s5[J4+] sM4[4+] CS 5[brewup] sM4 CS 5[brewu M4A3F(75)W WP7 s5 sM8 CS 6 WP7 s5 sM8 CS 6 13† US F†2 US G US R†1 US Y C M4A1F(76)W A4[A4]5[5]†[2] s5[5] sM8 CS 6 sM8 CS 6 15† US A†2 US F†1 US G US P US Y C M4A3F(76)W A4[A4]5[5]†[2] s5[5] sM8 CS 6 sM8 CS 6 16† US A†2 US F†1 US G US P US Y C +M24 WP7 s5 sM8 CS 5 WP7 s5 sM8 CS 5 1† O Y +M4A3E8 A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 2† A†1 P +M4A3E8(105) C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 3† C M +M4A3E8 Dozer A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 4 A†1 TT† +M4A3E8(105) Dozer C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 4† C M TT†1 +POA-CWS-H5 C5 sM8 CS 6 C5 sM8 CS 6 5† C M +M32A1B3 TRV CS 6 CS 6 6† K M P +M26A1 A†[1] WP6[M51+]†[2] CS 6 A†[1] CS 6 7† A†1 J†2 M +M45 H7 WP9 s7 CS 6 H7 WP9 s7 CS 6 8 n/a +M46 A†[2] WP6[M51+]†[3] CS 6 A†[2] CS 6 9† A†2 J†3 M FF†1 +M36B2 GMC(a) A† sP5 CS 7 A† sP5 CS 7 10 A† K UU +M38A1C Jeep H† CS 2 H† CS 2 11† n/a +M3 CS 5 CS 5 12† K Y +M3(MMG) CS 5 CS 5 13† E† H K Y +M3(HMG) CS 5 CS 5 13† E† H K Y +M19A1 MGMC CS 4 CS 4 14† AA†1 +M15A1 MGMC CS 4 CS 4 15† O V†1 Y AA†2 DD†1 +M15 Special CS 4 CS 4 16† AA†2 DD†1 +M16 MGMC CS 4 CS 4 17† F†1 V†1 Y AA†2 DD†1 +M16A1 MGMC CS 5 CS 5 18† F†1 V†1 AA†2 DD†1 +M39 AUV CS 6 CS 6 19† G†1 M +M39 MC WP8 CS 5[brewup] WP8 CS 5[brewup] 19† n/a +M7 HMC C7 H7 WP8 s7 CS 7 C7 H7 WP8 s7 CS 7 20† C Y +M37 HMC H9 WP9 s7 CS 7 H9 WP9 s7 CS 7 21 n/a +M41 HMC no IF WP8 s7 CS 9 no IF WP8 s7 CS 9 22† S†1 +M40 GMC no IF AP4 WP8 s7 CS 9 no IF AP4 WP8 s7 CS 9 23 S† +M43 HMC no IF CS 9 no IF CS 9 23 S† +LVT(A)5 C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24† H T†1 X†2 +LVT(A)5m C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24 M T† +LVT3 CS 7 CS 7 25† D† H M T†1 X†2 +LVT3C CS 7 CS 7 25† D† M T†1 X†2 BB† +M75 CS 6 CS 6 26 G† BB†1 +M29 Weasel CS 3 CS 3 27† B†1 M T†1 +M29C Weasel CS 3 CS 3 28† B†1 M T†1 +M4 hst CS 6 CS 6 29 G† Y +DUKW CS 7†[1] CS 7†[1] 30† D†2 M Q†1 Y +TACP Jeep CS 2† CS 2† 31† L†1 M +7½-Ton CS 7 CS 7 32 Y +Searchlight Truck CS 7† CS 7† 33† n/a +M3A1 CS 5 CS 5 54† E† H K Y Z†1 UU +M20 sP5 CS 4 sP5 CS 4 55† D†4 K Q†2 W†1 Y Z†3 UU +M8 C7 sP5 CS 4 C7 sP5 CS 4 56† C K W†1 Y UU +¼-Ton Jeep cs 2†[1] cs 2†[1] 57† K L†2 M N O P Q†1 Y UU +¾-Ton cs 4 cs 4 57† K N O Y UU +2½-Ton cs 7 cs 7 57† K M N O P Y UU diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1945.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1945.txt index 971c74c..93cf00e 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1945.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/american/1945.txt @@ -94,3 +94,48 @@ M4A3F WP7[J4+]†[3] s5[J4+] sM4[4+] CS 5[brewup] WP7†[3] s5 s M4A3F(75)W WP7 s5 sM8 CS 6 WP7 s5 sM8 CS 6 13† US F†2 US G US R†1 US Y C M4A1F(76)W A4[A4]5[5]†[2] s5[5] sM8 CS 6 A5†[2] s5 sM8 CS 6 15† US A†2 US F†1 US G US P US Y C M4A3F(76)W A4[A4]5[5]†[2] s5[5] sM8 CS 6 A5†[2] s5 sM8 CS 6 16† US A†2 US F†1 US G US P US Y C +M24 WP7 s5 sM8 CS 5 WP7 s5 sM8 CS 5 1† O Y +M4A3E8 A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 2† A†1 P +M4A3E8(105) C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 3† C M +M4A3E8 Dozer A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 4 A†1 TT† +M4A3E8(105) Dozer C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 4† C M TT†1 +POA-CWS-H5 C5 sM8 CS 6 C5 sM8 CS 6 5† C M +M32A1B3 TRV CS 6 CS 6 6† K M P +M26A1 A†[1] WP6[M51+]†[2] CS 6 A†[1] CS 6 7† A†1 J†2 M +M45 H7 WP9 s7 CS 6 H7 WP9 s7 CS 6 8 n/a +M46 A†[2] WP6[M51+]†[3] CS 6 A†[2] CS 6 9† A†2 J†3 M FF†1 +M36B2 GMC(a) A† sP5 CS 7 A† sP5 CS 7 10 A† K UU +M38A1C Jeep H† CS 2 H† CS 2 11† n/a +M3 CS 5 CS 5 12† K Y +M3(MMG) CS 5 CS 5 13† E† H K Y +M3(HMG) CS 5 CS 5 13† E† H K Y +M19A1 MGMC CS 4 CS 4 14† AA†1 +M15A1 MGMC CS 4 CS 4 15† O V†1 Y AA†2 DD†1 +M15 Special CS 4 CS 4 16† AA†2 DD†1 +M16 MGMC CS 4 CS 4 17† F†1 V†1 Y AA†2 DD†1 +M16A1 MGMC CS 5 CS 5 18† F†1 V†1 AA†2 DD†1 +M39 AUV CS 6 CS 6 19† G†1 M +M39 MC WP8 CS 5[brewup] WP8 CS 5[brewup] 19† n/a +M7 HMC C7 H7 WP8 s7 CS 7 C7 H7 WP8 s7 CS 7 20† C Y +M37 HMC H9 WP9 s7 CS 7 H9 WP9 s7 CS 7 21 n/a +M41 HMC no IF WP8 s7 CS 9 no IF WP8 s7 CS 9 22† S†1 +M40 GMC no IF AP4 WP8 s7 CS 9 no IF AP4 WP8 s7 CS 9 23 S† +M43 HMC no IF CS 9 no IF CS 9 23 S† +LVT(A)5 C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24† H T†1 X†2 +LVT(A)5m C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24 M T† +LVT3 CS 7 CS 7 25† D† H M T†1 X†2 +LVT3C CS 7 CS 7 25† D† M T†1 X†2 BB† +M75 CS 6 CS 6 26 G† BB†1 +M29 Weasel CS 3 CS 3 27† B†1 M T†1 +M29C Weasel CS 3 CS 3 28† B†1 M T†1 +M4 hst CS 6 CS 6 29 G† Y +DUKW CS 7†[1] CS 7†[1] 30† D†2 M Q†1 Y +TACP Jeep CS 2† CS 2† 31† L†1 M +7½-Ton CS 7 CS 7 32 Y +Searchlight Truck CS 7† CS 7† 33† n/a +M3A1 CS 5 CS 5 54† E† H K Y Z†1 UU +M20 sP5 CS 4 sP5 CS 4 55† D†4 K Q†2 W†1 Y Z†3 UU +M8 C7 sP5 CS 4 C7 sP5 CS 4 56† C K W†1 Y UU +¼-Ton Jeep cs 2†[1] cs 2†[1] 57† K L†2 M N O P Q†1 Y UU +¾-Ton cs 4 cs 4 57† K N O Y UU +2½-Ton cs 7 cs 7 57† K M N O P Y UU diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/axis-minor-common/1940.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/axis-minor-common/1940.txt index 0b42873..d83c4f3 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/axis-minor-common/1940.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/axis-minor-common/1940.txt @@ -2,36 +2,36 @@ Name Capabilities (effective) # Notes Comments -------------- ---------------------- ------------------ --- --------------------------------------- ---------- -L3/35(i) ® CS 2 ® CS 2 29† K†1 E F G†2 H C B -FT-17M(f) ® no IF CS 2 ® no IF CS 2 30† D R C -FT-17C(f) ® AP9 CS 2 ® AP9 CS 2 30† D R C -PzKpfw IB(g) sD6 CS 2 sD6 CS 2 31† K†1 E H C -R-35(f) ® AP10 CS 2 ® AP10 CS 2 32† A†1 D E R H B -H39(f) ® AP10 CS 2 ® AP10 CS 2 33† A†1 D E H C B -LT vz 35(g) sD5 CS 4 sD5 CS 4 34† E R S B -LT vz 38(t)A A3[1]4[2]3[3] sD6 CS 4 sD6 CS 4 35† E R H S -LT vz 38(t)E A4[2]3[3] sD7 CS 4 sD7 CS 4 35† E H S B -S-35(f) CS 4 CS 4 36† A†1 D E H S -PzKpfw IIIL(g) A5[2]4[3]3[4] sD5 CS 5 sD5 CS 5 37† E O†1 Q R H C +L3/35(i) ® CS 2 ® CS 2 29† B C E F G†2 H K†1 +FT-17M(f) ® no IF CS 2 ® no IF CS 2 30† C D R +FT-17C(f) ® AP9 CS 2 ® AP9 CS 2 30† C D R +PzKpfw IB(g) sD6 CS 2 sD6 CS 2 31† C E H K†1 +R-35(f) ® AP10 CS 2 ® AP10 CS 2 32† A†1 B D E H R +H39(f) ® AP10 CS 2 ® AP10 CS 2 33† A†1 B C D E H +LT vz 35(g) sD5 CS 4 sD5 CS 4 34† B E R S +LT vz 38(t)A A3[1]4[2]3[3] sD6 CS 4 sD6 CS 4 35† E H R S +LT vz 38(t)E A4[2]3[3] sD7 CS 4 sD7 CS 4 35† B E H S +S35(f) CS 4 CS 4 36† A†1 D E H S +PzKpfw IIIL(g) A5[2]4[3]3[4] sD5 CS 5 sD5 CS 5 37† C E H O†1 Q R PzKpfw IIIN(g) H8[3+] s8 sD7 CS 5 s8 sD7 CS 5 38† E O†1 Q R S PzKpfw IVD(g) AP7 H5[3+] s8 sD7 CS 5 AP7 s8 sD7 CS 5 39† E Q R -PzKpfw IVF1(g) AP7 H5[3+] s8 sD7 CS 6 AP7 s8 sD7 CS 6 39† E Q R H B -PzKpfw IVH(g) A4[2]3[3] s7 sD5 CS 6 s7 sD5 CS 6 39† E O†1 Q R H B -StuG IIIG(g) A3[4] s8 sD7 CS 4 s8 sD7 CS 4 40† E Q R H B -JgdPz 38(t) A3[4] HE7 CS 4 HE7 CS 4 41† E H B -SPW 250/1(g) CS 4 CS 4 42† E R -SPW 251/1(g) CS 5 CS 5 42† E R C +PzKpfw IVF1(g) AP7 H5[3+] s8 sD7 CS 6 AP7 s8 sD7 CS 6 39† B E H Q R +PzKpfw IVH(g) A4[2]3[3] s7 sD5 CS 6 s7 sD5 CS 6 39† B E H O†1 Q R +StuG IIIG(g) A3[4] s8 sD7 CS 4 s8 sD7 CS 4 40† B E H Q R +JgdPz 38(t) A3[4] HE7 CS 4 HE7 CS 4 41† B E H +SPW 250/1(g) CS 4 CS 4 42 E R +SPW 251/1(g) CS 5 CS 5 42† C E R SPW 251/9(g) H5 s8 CS 4[brewup] H5 s8 CS 4[brewup] 42† E R OA vz 30(t) ® CS 2 ® CS 2 43† E R S -AB 41(i) CS 4 CS 4 44† E R C -PSW 222(g) sD6 CS 3 sD6 CS 3 45† P†1 E M†2 R B -PSW 222(L)(g) sD6 CS 3 sD6 CS 3 45† P†1 E M†2 R B -PSW 223(g) sD6 CS 3 sD6 CS 3 46† E M†1 P†2 R B -Komsomolet(r) cs 2†[1] cs 2†[1] 47† E F I†1 J R H S C B -RSO(g) cs 5 cs 5 48 S B -Light Tractor cs 4 cs 4 49 R H S C B -Medium Tractor cs 5 cs 5 49 R H S C B -Heavy Tractor cs 6 cs 6 49 R H S C B -Light Truck cs 4 cs 4 50 R H S C B -Medium Truck cs 5 cs 5 50 R H S C B -Heavy Truck cs 7 cs 7 50 R H S C B +AB 41(i) CS 4 CS 4 44† C E R +PSW 222(g) sD6 CS 3 sD6 CS 3 45† B E M†2 P†1 R +PSW 222(L)(g) sD6 CS 3 sD6 CS 3 45† B E M†2 P†1 R +PSW 223(g) sD6 CS 3 sD6 CS 3 46† B E M†1 P†2 R +Komsomolet(r) cs 2†[1] cs 2†[1] 47† B C E F H I†1 J R S +RSO(g) cs 5 cs 5 48 B S +Light Tractor cs 4 cs 4 49 B C H R S +Medium Tractor cs 5 cs 5 49 B C H R S +Heavy Tractor cs 6 cs 6 49 B C H R S +Light Truck cs 4 cs 4 50 B C H R S +Medium Truck cs 5 cs 5 50 B C H R S +Heavy Truck cs 7 cs 7 50 B C H R S diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/axis-minor-common/1941.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/axis-minor-common/1941.txt index adf7ad8..fe4d1c0 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/axis-minor-common/1941.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/axis-minor-common/1941.txt @@ -2,36 +2,36 @@ Name Capabilities (effective) # Notes Comments -------------- ---------------------- ------------------ --- --------------------------------------- ---------- -L3/35(i) ® CS 2 ® CS 2 29† K†1 E F G†2 H C B -FT-17M(f) ® no IF CS 2 ® no IF CS 2 30† D R C -FT-17C(f) ® AP9 CS 2 ® AP9 CS 2 30† D R C -PzKpfw IB(g) sD6 CS 2 sD6 CS 2 31† K†1 E H C -R-35(f) ® AP10 CS 2 ® AP10 CS 2 32† A†1 D E R H B -H39(f) ® AP10 CS 2 ® AP10 CS 2 33† A†1 D E H C B -LT vz 35(g) sD5 CS 4 sD5 CS 4 34† E R S B -LT vz 38(t)A A3[1]4[2]3[3] sD6 CS 4 A3 sD6 CS 4 35† E R H S -LT vz 38(t)E A4[2]3[3] sD7 CS 4 sD7 CS 4 35† E H S B -S-35(f) CS 4 CS 4 36† A†1 D E H S -PzKpfw IIIL(g) A5[2]4[3]3[4] sD5 CS 5 sD5 CS 5 37† E O†1 Q R H C +L3/35(i) ® CS 2 ® CS 2 29† B C E F G†2 H K†1 +FT-17M(f) ® no IF CS 2 ® no IF CS 2 30† C D R +FT-17C(f) ® AP9 CS 2 ® AP9 CS 2 30† C D R +PzKpfw IB(g) sD6 CS 2 sD6 CS 2 31† C E H K†1 +R-35(f) ® AP10 CS 2 ® AP10 CS 2 32† A†1 B D E H R +H39(f) ® AP10 CS 2 ® AP10 CS 2 33† A†1 B C D E H +LT vz 35(g) sD5 CS 4 sD5 CS 4 34† B E R S +LT vz 38(t)A A3[1]4[2]3[3] sD6 CS 4 A3 sD6 CS 4 35† E H R S +LT vz 38(t)E A4[2]3[3] sD7 CS 4 sD7 CS 4 35† B E H S +S35(f) CS 4 CS 4 36† A†1 D E H S +PzKpfw IIIL(g) A5[2]4[3]3[4] sD5 CS 5 sD5 CS 5 37† C E H O†1 Q R PzKpfw IIIN(g) H8[3+] s8 sD7 CS 5 s8 sD7 CS 5 38† E O†1 Q R S PzKpfw IVD(g) AP7 H5[3+] s8 sD7 CS 5 AP7 s8 sD7 CS 5 39† E Q R -PzKpfw IVF1(g) AP7 H5[3+] s8 sD7 CS 6 AP7 s8 sD7 CS 6 39† E Q R H B -PzKpfw IVH(g) A4[2]3[3] s7 sD5 CS 6 s7 sD5 CS 6 39† E O†1 Q R H B -StuG IIIG(g) A3[4] s8 sD7 CS 4 s8 sD7 CS 4 40† E Q R H B -JgdPz 38(t) A3[4] HE7 CS 4 HE7 CS 4 41† E H B -SPW 250/1(g) CS 4 CS 4 42† E R -SPW 251/1(g) CS 5 CS 5 42† E R C +PzKpfw IVF1(g) AP7 H5[3+] s8 sD7 CS 6 AP7 s8 sD7 CS 6 39† B E H Q R +PzKpfw IVH(g) A4[2]3[3] s7 sD5 CS 6 s7 sD5 CS 6 39† B E H O†1 Q R +StuG IIIG(g) A3[4] s8 sD7 CS 4 s8 sD7 CS 4 40† B E H Q R +JgdPz 38(t) A3[4] HE7 CS 4 HE7 CS 4 41† B E H +SPW 250/1(g) CS 4 CS 4 42 E R +SPW 251/1(g) CS 5 CS 5 42† C E R SPW 251/9(g) H5 s8 CS 4[brewup] H5 s8 CS 4[brewup] 42† E R OA vz 30(t) ® CS 2 ® CS 2 43† E R S -AB 41(i) CS 4 CS 4 44† E R C -PSW 222(g) sD6 CS 3 sD6 CS 3 45† P†1 E M†2 R B -PSW 222(L)(g) sD6 CS 3 sD6 CS 3 45† P†1 E M†2 R B -PSW 223(g) sD6 CS 3 sD6 CS 3 46† E M†1 P†2 R B -Komsomolet(r) cs 2†[1] cs 2†[1] 47† E F I†1 J R H S C B -RSO(g) cs 5 cs 5 48 S B -Light Tractor cs 4 cs 4 49 R H S C B -Medium Tractor cs 5 cs 5 49 R H S C B -Heavy Tractor cs 6 cs 6 49 R H S C B -Light Truck cs 4 cs 4 50 R H S C B -Medium Truck cs 5 cs 5 50 R H S C B -Heavy Truck cs 7 cs 7 50 R H S C B +AB 41(i) CS 4 CS 4 44† C E R +PSW 222(g) sD6 CS 3 sD6 CS 3 45† B E M†2 P†1 R +PSW 222(L)(g) sD6 CS 3 sD6 CS 3 45† B E M†2 P†1 R +PSW 223(g) sD6 CS 3 sD6 CS 3 46† B E M†1 P†2 R +Komsomolet(r) cs 2†[1] cs 2†[1] 47† B C E F H I†1 J R S +RSO(g) cs 5 cs 5 48 B S +Light Tractor cs 4 cs 4 49 B C H R S +Medium Tractor cs 5 cs 5 49 B C H R S +Heavy Tractor cs 6 cs 6 49 B C H R S +Light Truck cs 4 cs 4 50 B C H R S +Medium Truck cs 5 cs 5 50 B C H R S +Heavy Truck cs 7 cs 7 50 B C H R S diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/axis-minor-common/1942.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/axis-minor-common/1942.txt index 06a824e..2d2574f 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/axis-minor-common/1942.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/axis-minor-common/1942.txt @@ -2,36 +2,36 @@ Name Capabilities (effective) # Notes Comments -------------- ---------------------- ------------------ --- --------------------------------------- ---------- -L3/35(i) ® CS 2 ® CS 2 29† K†1 E F G†2 H C B -FT-17M(f) ® no IF CS 2 ® no IF CS 2 30† D R C -FT-17C(f) ® AP9 CS 2 ® AP9 CS 2 30† D R C -PzKpfw IB(g) sD6 CS 2 sD6 CS 2 31† K†1 E H C -R-35(f) ® AP10 CS 2 ® AP10 CS 2 32† A†1 D E R H B -H39(f) ® AP10 CS 2 ® AP10 CS 2 33† A†1 D E H C B -LT vz 35(g) sD5 CS 4 sD5 CS 4 34† E R S B -LT vz 38(t)A A3[1]4[2]3[3] sD6 CS 4 A4 sD6 CS 4 35† E R H S -LT vz 38(t)E A4[2]3[3] sD7 CS 4 A4 sD7 CS 4 35† E H S B -S-35(f) CS 4 CS 4 36† A†1 D E H S -PzKpfw IIIL(g) A5[2]4[3]3[4] sD5 CS 5 A5 sD5 CS 5 37† E O†1 Q R H C +L3/35(i) ® CS 2 ® CS 2 29† B C E F G†2 H K†1 +FT-17M(f) ® no IF CS 2 ® no IF CS 2 30† C D R +FT-17C(f) ® AP9 CS 2 ® AP9 CS 2 30† C D R +PzKpfw IB(g) sD6 CS 2 sD6 CS 2 31† C E H K†1 +R-35(f) ® AP10 CS 2 ® AP10 CS 2 32† A†1 B D E H R +H39(f) ® AP10 CS 2 ® AP10 CS 2 33† A†1 B C D E H +LT vz 35(g) sD5 CS 4 sD5 CS 4 34† B E R S +LT vz 38(t)A A3[1]4[2]3[3] sD6 CS 4 A4 sD6 CS 4 35† E H R S +LT vz 38(t)E A4[2]3[3] sD7 CS 4 A4 sD7 CS 4 35† B E H S +S35(f) CS 4 CS 4 36† A†1 D E H S +PzKpfw IIIL(g) A5[2]4[3]3[4] sD5 CS 5 A5 sD5 CS 5 37† C E H O†1 Q R PzKpfw IIIN(g) H8[3+] s8 sD7 CS 5 s8 sD7 CS 5 38† E O†1 Q R S PzKpfw IVD(g) AP7 H5[3+] s8 sD7 CS 5 AP7 s8 sD7 CS 5 39† E Q R -PzKpfw IVF1(g) AP7 H5[3+] s8 sD7 CS 6 AP7 s8 sD7 CS 6 39† E Q R H B -PzKpfw IVH(g) A4[2]3[3] s7 sD5 CS 6 A4 s7 sD5 CS 6 39† E O†1 Q R H B -StuG IIIG(g) A3[4] s8 sD7 CS 4 s8 sD7 CS 4 40† E Q R H B -JgdPz 38(t) A3[4] HE7 CS 4 HE7 CS 4 41† E H B -SPW 250/1(g) CS 4 CS 4 42† E R -SPW 251/1(g) CS 5 CS 5 42† E R C +PzKpfw IVF1(g) AP7 H5[3+] s8 sD7 CS 6 AP7 s8 sD7 CS 6 39† B E H Q R +PzKpfw IVH(g) A4[2]3[3] s7 sD5 CS 6 A4 s7 sD5 CS 6 39† B E H O†1 Q R +StuG IIIG(g) A3[4] s8 sD7 CS 4 s8 sD7 CS 4 40† B E H Q R +JgdPz 38(t) A3[4] HE7 CS 4 HE7 CS 4 41† B E H +SPW 250/1(g) CS 4 CS 4 42 E R +SPW 251/1(g) CS 5 CS 5 42† C E R SPW 251/9(g) H5 s8 CS 4[brewup] H5 s8 CS 4[brewup] 42† E R OA vz 30(t) ® CS 2 ® CS 2 43† E R S -AB 41(i) CS 4 CS 4 44† E R C -PSW 222(g) sD6 CS 3 sD6 CS 3 45† P†1 E M†2 R B -PSW 222(L)(g) sD6 CS 3 sD6 CS 3 45† P†1 E M†2 R B -PSW 223(g) sD6 CS 3 sD6 CS 3 46† E M†1 P†2 R B -Komsomolet(r) cs 2†[1] cs 2†[1] 47† E F I†1 J R H S C B -RSO(g) cs 5 cs 5 48 S B -Light Tractor cs 4 cs 4 49 R H S C B -Medium Tractor cs 5 cs 5 49 R H S C B -Heavy Tractor cs 6 cs 6 49 R H S C B -Light Truck cs 4 cs 4 50 R H S C B -Medium Truck cs 5 cs 5 50 R H S C B -Heavy Truck cs 7 cs 7 50 R H S C B +AB 41(i) CS 4 CS 4 44† C E R +PSW 222(g) sD6 CS 3 sD6 CS 3 45† B E M†2 P†1 R +PSW 222(L)(g) sD6 CS 3 sD6 CS 3 45† B E M†2 P†1 R +PSW 223(g) sD6 CS 3 sD6 CS 3 46† B E M†1 P†2 R +Komsomolet(r) cs 2†[1] cs 2†[1] 47† B C E F H I†1 J R S +RSO(g) cs 5 cs 5 48 B S +Light Tractor cs 4 cs 4 49 B C H R S +Medium Tractor cs 5 cs 5 49 B C H R S +Heavy Tractor cs 6 cs 6 49 B C H R S +Light Truck cs 4 cs 4 50 B C H R S +Medium Truck cs 5 cs 5 50 B C H R S +Heavy Truck cs 7 cs 7 50 B C H R S diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/axis-minor-common/1943.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/axis-minor-common/1943.txt index 1ac8c7c..4342577 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/axis-minor-common/1943.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/axis-minor-common/1943.txt @@ -2,36 +2,36 @@ Name Capabilities (effective) # Notes Comments -------------- ---------------------- ------------------ --- --------------------------------------- ---------- -L3/35(i) ® CS 2 ® CS 2 29† K†1 E F G†2 H C B -FT-17M(f) ® no IF CS 2 ® no IF CS 2 30† D R C -FT-17C(f) ® AP9 CS 2 ® AP9 CS 2 30† D R C -PzKpfw IB(g) sD6 CS 2 sD6 CS 2 31† K†1 E H C -R-35(f) ® AP10 CS 2 ® AP10 CS 2 32† A†1 D E R H B -H39(f) ® AP10 CS 2 ® AP10 CS 2 33† A†1 D E H C B -LT vz 35(g) sD5 CS 4 sD5 CS 4 34† E R S B -LT vz 38(t)A A3[1]4[2]3[3] sD6 CS 4 A3 sD6 CS 4 35† E R H S -LT vz 38(t)E A4[2]3[3] sD7 CS 4 A3 sD7 CS 4 35† E H S B -S-35(f) CS 4 CS 4 36† A†1 D E H S -PzKpfw IIIL(g) A5[2]4[3]3[4] sD5 CS 5 A4 sD5 CS 5 37† E O†1 Q R H C +L3/35(i) ® CS 2 ® CS 2 29† B C E F G†2 H K†1 +FT-17M(f) ® no IF CS 2 ® no IF CS 2 30† C D R +FT-17C(f) ® AP9 CS 2 ® AP9 CS 2 30† C D R +PzKpfw IB(g) sD6 CS 2 sD6 CS 2 31† C E H K†1 +R-35(f) ® AP10 CS 2 ® AP10 CS 2 32† A†1 B D E H R +H39(f) ® AP10 CS 2 ® AP10 CS 2 33† A†1 B C D E H +LT vz 35(g) sD5 CS 4 sD5 CS 4 34† B E R S +LT vz 38(t)A A3[1]4[2]3[3] sD6 CS 4 A3 sD6 CS 4 35† E H R S +LT vz 38(t)E A4[2]3[3] sD7 CS 4 A3 sD7 CS 4 35† B E H S +S35(f) CS 4 CS 4 36† A†1 D E H S +PzKpfw IIIL(g) A5[2]4[3]3[4] sD5 CS 5 A4 sD5 CS 5 37† C E H O†1 Q R PzKpfw IIIN(g) H8[3+] s8 sD7 CS 5 H8 s8 sD7 CS 5 38† E O†1 Q R S PzKpfw IVD(g) AP7 H5[3+] s8 sD7 CS 5 AP7 H5 s8 sD7 CS 5 39† E Q R -PzKpfw IVF1(g) AP7 H5[3+] s8 sD7 CS 6 AP7 H5 s8 sD7 CS 6 39† E Q R H B -PzKpfw IVH(g) A4[2]3[3] s7 sD5 CS 6 A3 s7 sD5 CS 6 39† E O†1 Q R H B -StuG IIIG(g) A3[4] s8 sD7 CS 4 s8 sD7 CS 4 40† E Q R H B -JgdPz 38(t) A3[4] HE7 CS 4 HE7 CS 4 41† E H B -SPW 250/1(g) CS 4 CS 4 42† E R -SPW 251/1(g) CS 5 CS 5 42† E R C +PzKpfw IVF1(g) AP7 H5[3+] s8 sD7 CS 6 AP7 H5 s8 sD7 CS 6 39† B E H Q R +PzKpfw IVH(g) A4[2]3[3] s7 sD5 CS 6 A3 s7 sD5 CS 6 39† B E H O†1 Q R +StuG IIIG(g) A3[4] s8 sD7 CS 4 s8 sD7 CS 4 40† B E H Q R +JgdPz 38(t) A3[4] HE7 CS 4 HE7 CS 4 41† B E H +SPW 250/1(g) CS 4 CS 4 42 E R +SPW 251/1(g) CS 5 CS 5 42† C E R SPW 251/9(g) H5 s8 CS 4[brewup] H5 s8 CS 4[brewup] 42† E R OA vz 30(t) ® CS 2 ® CS 2 43† E R S -AB 41(i) CS 4 CS 4 44† E R C -PSW 222(g) sD6 CS 3 sD6 CS 3 45† P†1 E M†2 R B -PSW 222(L)(g) sD6 CS 3 sD6 CS 3 45† P†1 E M†2 R B -PSW 223(g) sD6 CS 3 sD6 CS 3 46† E M†1 P†2 R B -Komsomolet(r) cs 2†[1] cs 2†[1] 47† E F I†1 J R H S C B -RSO(g) cs 5 cs 5 48 S B -Light Tractor cs 4 cs 4 49 R H S C B -Medium Tractor cs 5 cs 5 49 R H S C B -Heavy Tractor cs 6 cs 6 49 R H S C B -Light Truck cs 4 cs 4 50 R H S C B -Medium Truck cs 5 cs 5 50 R H S C B -Heavy Truck cs 7 cs 7 50 R H S C B +AB 41(i) CS 4 CS 4 44† C E R +PSW 222(g) sD6 CS 3 sD6 CS 3 45† B E M†2 P†1 R +PSW 222(L)(g) sD6 CS 3 sD6 CS 3 45† B E M†2 P†1 R +PSW 223(g) sD6 CS 3 sD6 CS 3 46† B E M†1 P†2 R +Komsomolet(r) cs 2†[1] cs 2†[1] 47† B C E F H I†1 J R S +RSO(g) cs 5 cs 5 48 B S +Light Tractor cs 4 cs 4 49 B C H R S +Medium Tractor cs 5 cs 5 49 B C H R S +Heavy Tractor cs 6 cs 6 49 B C H R S +Light Truck cs 4 cs 4 50 B C H R S +Medium Truck cs 5 cs 5 50 B C H R S +Heavy Truck cs 7 cs 7 50 B C H R S diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/axis-minor-common/1944.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/axis-minor-common/1944.txt index c8b09c8..ebd2082 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/axis-minor-common/1944.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/axis-minor-common/1944.txt @@ -2,36 +2,36 @@ Name Capabilities (effective) # Notes Comments -------------- ---------------------- ------------------ --- --------------------------------------- ---------- -L3/35(i) ® CS 2 ® CS 2 29† K†1 E F G†2 H C B -FT-17M(f) ® no IF CS 2 ® no IF CS 2 30† D R C -FT-17C(f) ® AP9 CS 2 ® AP9 CS 2 30† D R C -PzKpfw IB(g) sD6 CS 2 sD6 CS 2 31† K†1 E H C -R-35(f) ® AP10 CS 2 ® AP10 CS 2 32† A†1 D E R H B -H39(f) ® AP10 CS 2 ® AP10 CS 2 33† A†1 D E H C B -LT vz 35(g) sD5 CS 4 sD5 CS 4 34† E R S B -LT vz 38(t)A A3[1]4[2]3[3] sD6 CS 4 A3 sD6 CS 4 35† E R H S -LT vz 38(t)E A4[2]3[3] sD7 CS 4 A3 sD7 CS 4 35† E H S B -S-35(f) CS 4 CS 4 36† A†1 D E H S -PzKpfw IIIL(g) A5[2]4[3]3[4] sD5 CS 5 A3 sD5 CS 5 37† E O†1 Q R H C +L3/35(i) ® CS 2 ® CS 2 29† B C E F G†2 H K†1 +FT-17M(f) ® no IF CS 2 ® no IF CS 2 30† C D R +FT-17C(f) ® AP9 CS 2 ® AP9 CS 2 30† C D R +PzKpfw IB(g) sD6 CS 2 sD6 CS 2 31† C E H K†1 +R-35(f) ® AP10 CS 2 ® AP10 CS 2 32† A†1 B D E H R +H39(f) ® AP10 CS 2 ® AP10 CS 2 33† A†1 B C D E H +LT vz 35(g) sD5 CS 4 sD5 CS 4 34† B E R S +LT vz 38(t)A A3[1]4[2]3[3] sD6 CS 4 A3 sD6 CS 4 35† E H R S +LT vz 38(t)E A4[2]3[3] sD7 CS 4 A3 sD7 CS 4 35† B E H S +S35(f) CS 4 CS 4 36† A†1 D E H S +PzKpfw IIIL(g) A5[2]4[3]3[4] sD5 CS 5 A3 sD5 CS 5 37† C E H O†1 Q R PzKpfw IIIN(g) H8[3+] s8 sD7 CS 5 H8 s8 sD7 CS 5 38† E O†1 Q R S PzKpfw IVD(g) AP7 H5[3+] s8 sD7 CS 5 AP7 H5 s8 sD7 CS 5 39† E Q R -PzKpfw IVF1(g) AP7 H5[3+] s8 sD7 CS 6 AP7 H5 s8 sD7 CS 6 39† E Q R H B -PzKpfw IVH(g) A4[2]3[3] s7 sD5 CS 6 A3 s7 sD5 CS 6 39† E O†1 Q R H B -StuG IIIG(g) A3[4] s8 sD7 CS 4 A3 s8 sD7 CS 4 40† E Q R H B -JgdPz 38(t) A3[4] HE7 CS 4 A3 HE7 CS 4 41† E H B -SPW 250/1(g) CS 4 CS 4 42† E R -SPW 251/1(g) CS 5 CS 5 42† E R C +PzKpfw IVF1(g) AP7 H5[3+] s8 sD7 CS 6 AP7 H5 s8 sD7 CS 6 39† B E H Q R +PzKpfw IVH(g) A4[2]3[3] s7 sD5 CS 6 A3 s7 sD5 CS 6 39† B E H O†1 Q R +StuG IIIG(g) A3[4] s8 sD7 CS 4 A3 s8 sD7 CS 4 40† B E H Q R +JgdPz 38(t) A3[4] HE7 CS 4 A3 HE7 CS 4 41† B E H +SPW 250/1(g) CS 4 CS 4 42 E R +SPW 251/1(g) CS 5 CS 5 42† C E R SPW 251/9(g) H5 s8 CS 4[brewup] H5 s8 CS 4[brewup] 42† E R OA vz 30(t) ® CS 2 ® CS 2 43† E R S -AB 41(i) CS 4 CS 4 44† E R C -PSW 222(g) sD6 CS 3 sD6 CS 3 45† P†1 E M†2 R B -PSW 222(L)(g) sD6 CS 3 sD6 CS 3 45† P†1 E M†2 R B -PSW 223(g) sD6 CS 3 sD6 CS 3 46† E M†1 P†2 R B -Komsomolet(r) cs 2†[1] cs 2†[1] 47† E F I†1 J R H S C B -RSO(g) cs 5 cs 5 48 S B -Light Tractor cs 4 cs 4 49 R H S C B -Medium Tractor cs 5 cs 5 49 R H S C B -Heavy Tractor cs 6 cs 6 49 R H S C B -Light Truck cs 4 cs 4 50 R H S C B -Medium Truck cs 5 cs 5 50 R H S C B -Heavy Truck cs 7 cs 7 50 R H S C B +AB 41(i) CS 4 CS 4 44† C E R +PSW 222(g) sD6 CS 3 sD6 CS 3 45† B E M†2 P†1 R +PSW 222(L)(g) sD6 CS 3 sD6 CS 3 45† B E M†2 P†1 R +PSW 223(g) sD6 CS 3 sD6 CS 3 46† B E M†1 P†2 R +Komsomolet(r) cs 2†[1] cs 2†[1] 47† B C E F H I†1 J R S +RSO(g) cs 5 cs 5 48 B S +Light Tractor cs 4 cs 4 49 B C H R S +Medium Tractor cs 5 cs 5 49 B C H R S +Heavy Tractor cs 6 cs 6 49 B C H R S +Light Truck cs 4 cs 4 50 B C H R S +Medium Truck cs 5 cs 5 50 B C H R S +Heavy Truck cs 7 cs 7 50 B C H R S diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/axis-minor-common/1945.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/axis-minor-common/1945.txt index 0dd5fa3..95825c8 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/axis-minor-common/1945.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/axis-minor-common/1945.txt @@ -2,36 +2,36 @@ Name Capabilities (effective) # Notes Comments -------------- ---------------------- ------------------ --- --------------------------------------- ---------- -L3/35(i) ® CS 2 ® CS 2 29† K†1 E F G†2 H C B -FT-17M(f) ® no IF CS 2 ® no IF CS 2 30† D R C -FT-17C(f) ® AP9 CS 2 ® AP9 CS 2 30† D R C -PzKpfw IB(g) sD6 CS 2 sD6 CS 2 31† K†1 E H C -R-35(f) ® AP10 CS 2 ® AP10 CS 2 32† A†1 D E R H B -H39(f) ® AP10 CS 2 ® AP10 CS 2 33† A†1 D E H C B -LT vz 35(g) sD5 CS 4 sD5 CS 4 34† E R S B -LT vz 38(t)A A3[1]4[2]3[3] sD6 CS 4 A3 sD6 CS 4 35† E R H S -LT vz 38(t)E A4[2]3[3] sD7 CS 4 A3 sD7 CS 4 35† E H S B -S-35(f) CS 4 CS 4 36† A†1 D E H S -PzKpfw IIIL(g) A5[2]4[3]3[4] sD5 CS 5 A3 sD5 CS 5 37† E O†1 Q R H C +L3/35(i) ® CS 2 ® CS 2 29† B C E F G†2 H K†1 +FT-17M(f) ® no IF CS 2 ® no IF CS 2 30† C D R +FT-17C(f) ® AP9 CS 2 ® AP9 CS 2 30† C D R +PzKpfw IB(g) sD6 CS 2 sD6 CS 2 31† C E H K†1 +R-35(f) ® AP10 CS 2 ® AP10 CS 2 32† A†1 B D E H R +H39(f) ® AP10 CS 2 ® AP10 CS 2 33† A†1 B C D E H +LT vz 35(g) sD5 CS 4 sD5 CS 4 34† B E R S +LT vz 38(t)A A3[1]4[2]3[3] sD6 CS 4 A3 sD6 CS 4 35† E H R S +LT vz 38(t)E A4[2]3[3] sD7 CS 4 A3 sD7 CS 4 35† B E H S +S35(f) CS 4 CS 4 36† A†1 D E H S +PzKpfw IIIL(g) A5[2]4[3]3[4] sD5 CS 5 A3 sD5 CS 5 37† C E H O†1 Q R PzKpfw IIIN(g) H8[3+] s8 sD7 CS 5 H8 s8 sD7 CS 5 38† E O†1 Q R S PzKpfw IVD(g) AP7 H5[3+] s8 sD7 CS 5 AP7 H5 s8 sD7 CS 5 39† E Q R -PzKpfw IVF1(g) AP7 H5[3+] s8 sD7 CS 6 AP7 H5 s8 sD7 CS 6 39† E Q R H B -PzKpfw IVH(g) A4[2]3[3] s7 sD5 CS 6 A3 s7 sD5 CS 6 39† E O†1 Q R H B -StuG IIIG(g) A3[4] s8 sD7 CS 4 A3 s8 sD7 CS 4 40† E Q R H B -JgdPz 38(t) A3[4] HE7 CS 4 A3 HE7 CS 4 41† E H B -SPW 250/1(g) CS 4 CS 4 42† E R -SPW 251/1(g) CS 5 CS 5 42† E R C +PzKpfw IVF1(g) AP7 H5[3+] s8 sD7 CS 6 AP7 H5 s8 sD7 CS 6 39† B E H Q R +PzKpfw IVH(g) A4[2]3[3] s7 sD5 CS 6 A3 s7 sD5 CS 6 39† B E H O†1 Q R +StuG IIIG(g) A3[4] s8 sD7 CS 4 A3 s8 sD7 CS 4 40† B E H Q R +JgdPz 38(t) A3[4] HE7 CS 4 A3 HE7 CS 4 41† B E H +SPW 250/1(g) CS 4 CS 4 42 E R +SPW 251/1(g) CS 5 CS 5 42† C E R SPW 251/9(g) H5 s8 CS 4[brewup] H5 s8 CS 4[brewup] 42† E R OA vz 30(t) ® CS 2 ® CS 2 43† E R S -AB 41(i) CS 4 CS 4 44† E R C -PSW 222(g) sD6 CS 3 sD6 CS 3 45† P†1 E M†2 R B -PSW 222(L)(g) sD6 CS 3 sD6 CS 3 45† P†1 E M†2 R B -PSW 223(g) sD6 CS 3 sD6 CS 3 46† E M†1 P†2 R B -Komsomolet(r) cs 2†[1] cs 2†[1] 47† E F I†1 J R H S C B -RSO(g) cs 5 cs 5 48 S B -Light Tractor cs 4 cs 4 49 R H S C B -Medium Tractor cs 5 cs 5 49 R H S C B -Heavy Tractor cs 6 cs 6 49 R H S C B -Light Truck cs 4 cs 4 50 R H S C B -Medium Truck cs 5 cs 5 50 R H S C B -Heavy Truck cs 7 cs 7 50 R H S C B +AB 41(i) CS 4 CS 4 44† C E R +PSW 222(g) sD6 CS 3 sD6 CS 3 45† B E M†2 P†1 R +PSW 222(L)(g) sD6 CS 3 sD6 CS 3 45† B E M†2 P†1 R +PSW 223(g) sD6 CS 3 sD6 CS 3 46† B E M†1 P†2 R +Komsomolet(r) cs 2†[1] cs 2†[1] 47† B C E F H I†1 J R S +RSO(g) cs 5 cs 5 48 B S +Light Tractor cs 4 cs 4 49 B C H R S +Medium Tractor cs 5 cs 5 49 B C H R S +Heavy Tractor cs 6 cs 6 49 B C H R S +Light Truck cs 4 cs 4 50 B C H R S +Medium Truck cs 5 cs 5 50 B C H R S +Heavy Truck cs 7 cs 7 50 B C H R S diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1940.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1940.txt index e4ea7d2..4bd37db 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1940.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1940.txt @@ -1,131 +1,162 @@ === vehicles/british/1940 === -Name Capabilities (effective) # Notes Comments -------------------------- ---------------------------------------------------- -------------------------- ------ ---------------------------------------------------- ---------- -Mark VIB sD6 CS 3 sD6 CS 3 1† N P -Mark VIC sD6 CS 3 sD6 CS 3 1† n/a -Tetrarch sD6 CS 3 sD6 CS 3 2† n/a -Tetrarch CS HE9†[1] s†[1] sD6 CS 3 HE9†[1] s†[1] sD6 CS 3 2† S†1 -Stuart I(a) sD5 CS 4 sD5 CS 4 3† A N P -Stuart III(a) C6[4+]†[1] HE[4+] sD5 CS 4 sD5 CS 4 3† A C†1 G N P -Stuart V(a) C6†[1] sD5 CS 4 C6†[1] sD5 CS 4 4† A C†1 G -Locust(a) C6† sD6 CS 3 C6† sD6 CS 3 5 A C† -A9 sD6 CS 5[brewup] sD6 CS 5[brewup] 6† K†1 N -A9 CS s†[2] sD6 CS 5[brewup] s†[2] sD6 CS 5[brewup] 6† K†1 N S†2 -A10 Mk IA sD6 CS 5[brewup]† sD6 CS 5[brewup]† 7† B†1 K†2 N -A10 Mk IA CS s†[2] sD6 CS 5[brewup]† s†[2] sD6 CS 5[brewup]† 7† K†1 N S†2 -A13 Mk I sD6 CS 4[brewup] sD6 CS 4[brewup] 8 K† -A13 Mk II sD6 CS 4[brewup] sD6 CS 4[brewup] 8† B†1 K†2 N -A13 Mk II CS s†[2] sD6 CS 4[brewup] s†[2] sD6 CS 4[brewup] 8† K†1 N S†2 -Crusader I sM8 CS 5[brewup] sM8 CS 5[brewup] 9† K†1 N -Crusader I CS HE9 s†[2] sM8 CS 5[brewup] HE9 s†[2] sM8 CS 5[brewup] 9† K†1 N S†2 -Crusader II sM8 CS 4[brewup] sM8 CS 4[brewup] 9† K†1 N -Crusader II CS HE9 s†[2] sM8 CS 4[brewup] HE9 s†[2] sM8 CS 4[brewup] 9† K†1 N S†2 -Crusader III HE7[F3+]†[1] sD7 sM8†[2] CS 3[brewup] sD7 sM8†[2] CS 3[brewup] 10† N Y†1 Z†2 -Grant(a) C5[4+]†[1] HE[4+] s8† sM8 CS 6 s8† sM8 CS 6 11† A C†1 G N P -Lee(a) C5[4+]†[1] HE[4+] s8† sD6 CS 7 s8† sD6 CS 7 11† A C†1 G N P -Sherman II(a) WP6[J4+]†[3] s8 sD6 CS 5[brewup] s8 sD6 CS 5[brewup] 12† A G K†2 N R†1 W†3 -Sherman III(a) WP6[J4+]†[3] s8 sD6 CS 5[brewup] s8 sD6 CS 5[brewup] 13† A G K†2 N R†1 W†3 -Sherman V(a) WP6[J4+]†[3] s8 sD6 CS 5[brewup] s8 sD6 CS 5[brewup] 14† A G K†2 P R†1 W†3 -Sherman IIA(a) A4[4]5[5] s5[5] sM8 CS 6 sM8 CS 6 15† A G K†1 -Sherman IIC(a) D5[S4]6[5]†[2] HE7 sM8 CS 5[brewup] HE7 sM8 CS 5[brewup] 16† A J†2 K†1 -Sherman VC(a) D5[S4]6[5]†[2] HE7 sM8 CS 5[brewup] HE7 sM8 CS 5[brewup] 16† A J†2 K†1 -Sherman IB(a) H9 WP9 s7 sM8 CS 6 H9 WP9 s7 sM8 CS 6 17† A K†1 -Centaur IV H6 s9 sD7 sM8† CS 5 H6 s9 sD7 sM8† CS 5 18 S Z† -Cromwell IV WP6 s8 sD7 sM8†[1] CS 5 WP6 s8 sD7 sM8†[1] CS 5 19† Z†1 -Cromwell VI H6 s9 sD7 sM8†[1] CS 5 H6 s9 sD7 sM8†[1] CS 5 20† S Z†1 -Cromwell VII WP6 s8 sD7 sM8† CS 6 WP6 s8 sD7 sM8† CS 6 19† Z†1 -Cromwell VIII H6 s9 sD7 sM8†[1] CS 6 H6 s9 sD7 sM8†[1] CS 6 20† S Z†1 -Challenger D5[S4]6[5]†[1] HE7 sD7 sM8†[2] CS 6 HE7 sD7 sM8†[2] CS 6 21† J†1 Z†2 -Comet sD7 sM8† CS 6 sD7 sM8† CS 6 22 Z† -Sherman Dozer(a) WP6 s8 sD6 CS 5[brewup] WP6 s8 sD6 CS 5[brewup] 23† A G K†2 P R†1 -Sherman Crab(a) WP6 s8 sD6 CS 5[brewup] WP6 s8 sD6 CS 5[brewup] 24† A G K†2 P R†1 -Matilda I ® sD5 CS 2 ® sD5 CS 2 25† B†1 -Matilda II sD6 CS 5 sD6 CS 5 26† B†1 K†2 N P -Matilda II CS HE9†[2] s†[2] sD6 CS 5 HE9†[2] s†[2] sD6 CS 5 26† K†1 N P S†2 -Valentine II sM8 CS 4 sM8 CS 4 27† N -Valentine V sM8 CS 4 sM8 CS 4 28† K†1 NT -Valentine VIII HE7 sD6 CS 4 HE7 sD6 CS 4 29 NT -Valentine XI WP6 s8 sD8 CS 4 WP6 s8 sD8 CS 4 30 n/a -Churchill I HE9†[2] s†[2] sD5[4] sM8†[1] CS 7 HE9†[2] s†[2] sM8†[1] CS 7 31† NT S†2 Z†1 CC -Churchill IV D6[J4]7[5]†[2] HE7[F3]8[4+]†[1] sD6[4+] sM8†[3] CS 7 sM8†[3] CS 7 32† J†2 N Y†1 Z†3 CC -Churchill V H6 s9 sD7 sM8†[1] CS 7 H6 s9 sD7 sM8†[1] CS 7 33† S Z†1 CC -Churchill VI WP6[J4+]†[1] s8 sD7 sM8†[2] CS 7 s8 sD7 sM8†[2] CS 7 34† W†1 Z†2 CC -Churchill VII WP6 s8 sD7 sM8†[1] CS 7 WP6 s8 sD7 sM8†[1] CS 7 35† Z†1 CC -Churchill VIII H6 s9 sD7 sM8†[1] CS 7 H6 s9 sD7 sM8†[1] CS 7 35† S Z†1 CC -Valentine Bridgelayer sD7 CS 2 sD7 CS 2 36† M P -Churchill Bridgelayer sD7 CS 2 sD7 CS 2 36† M CC -Churchill AVRE no IF sD7 sM8†[1] CS 8 no IF sD7 sM8†[1] CS 8 37† Z†1 CC -Churchill Crocodile WP6 s8 sD7 sM8†[1] CS 7 WP6 s8 sD7 sM8†[1] CS 7 38† Z†1 CC -Deacon HE7[F3+]†[2] CS 5 CS 5 39† L†1 N Y†2 -Wolverine(a) A5[S4]6[5]†[1] HE7 s5[5] CS 7 HE7 CS 7 40† A J†1 -Achilles(a) D6[S4]7[5]†[1] HE7 CS 7 HE7 CS 7 40† A J†1 -Archer D6[4]7[5]†[1] HE7 sD7 CS 5 HE7 sD7 CS 5 41† J†1 -Daimler sD4[4+]† CS 2 CS 2 42† M N P -Lynx sD5 CS 2 sD5 CS 2 42† L†1 M P -Humber sD4[4+]† CS 2 CS 2 43† L†1 M P BB†2 -Stuart Recce CS 5 CS 5 44† A D NT P -Humber III LRC sD5 CS 3 sD5 CS 3 45† L†1 N P Q†2 -Otter LRC sD5 CS 3 sD5 CS 3 45† L†1 P Q†2 -Morris CS9 sD5 CS 4 sD5 CS 4 46† N Q†2 T†3 X†1 -Rolls Royce sD5 CS 3 sD5 CS 3 47† N Q†2 T†3 X†1 -Marmon-Herrington II ME CS 4 CS 4 48† L†1 N Q†2 T†3 -Marmon-Herrington IIv CS 4 CS 4 49† L†1 N AA†2 -Marmon-Herrington III MFF CS 4 CS 4 48† L†1 P Q†2 -Marmon-Herrington III ME CS 4 CS 4 48† L†1 N Q†2 T†3 -Marmon-Herrington IIIv CS 4 CS 4 49† K†2 L†1 N T†2 -Humber II sD6 CS 3 sD6 CS 3 50† L†1 N -Humber III sD6 CS 4 sD6 CS 4 50† K†2 L†1 N P -Humber IV C6[4+]†[2] sD6 CS 3 sD6 CS 3 51† A C†2 L†1 P -Daimler sD6 CS 3 sD6 CS 3 52† K†1 N P -AEC I sM8 CS 3 sM8 CS 3 53† N X†1 -AEC II D6[J4]7[5]†[2] HE7[3]8[4+]†[1] sM8 CS 4 sM8 CS 4 53 J†2 X† Y†1 -AEC III WP6 s8 sM8 CS 4 WP6 s8 sM8 CS 4 53 X† -Staghound I(a) C6[4+]†[3] sM8 CS 5 sM8 CS 5 54† A C†3 G K†2 X†1 -Staghound II(a) s9 sD6 CS 4 s9 sD6 CS 4 54† A K†3 S†2 X†1 -Bishop no IF s8 CS 5 no IF s8 CS 5 55† K†1 N P -Priest(a) H6 WP7 s8 CS 7 H6 WP7 s8 CS 7 56† A N P -Sexton(a) s8 CS 7 s8 CS 7 57† A K†1 -M3 GMC(a) WP7[J4+]†[1] s8 CS 4 s8 CS 4 58† A NT W†1 -Mk VI AA CS 2 CS 2 59† N O†1 AA†2 -Crusader AA sD7 CS 4[brewup] sD7 CS 4[brewup] 60† AA†1 -M17 MGMC(a) CS 4 CS 4 61† A F† AA†1 -Humber AA CS 2 CS 2 62† L†1 N O†2 AA†3 -Staghound AA(a) CS 3 CS 3 62† A F† X†1 AA†2 -M5(a) cs 5†[1] cs 5†[1] 63† A I†1 N -M9(a) cs 4†[1] cs 4†[1] 63† A I†1 N -M5A1(a) cs 5† cs 5† 63 A I† -M9A1(a) cs 4† cs 4† 63 A I† -Carrier A sD5[4+]†[1] CS 3 CS 3 64† N P U†1 -Carrier B sD5[4+]†[2] CS 3 CS 3 64† N P Q†1 U†2 -Carrier C sD5[4+]†[1] CS 3 CS 3 64† N P U†1 -Carrier, MMG A sD5[4+]†[2] CS 3 CS 3 65† N P Q†1 U†2 -Carrier, MMG B sD5[4+]†[2] CS 4 CS 4 65† U†2 BB†1 -Carrier, 2-in. MTR IR[2+]† s7 CS 3 s7 CS 3 66† N P U†1 -Carrier, 3-in. MTR CS 4[brewup]†[1] CS 4[brewup]†[1] 67† H†1 N P U BB†2 -Priest Kangaroo(a) CS 7 CS 7 68† A D -Ram Kangaroo(a) CS 7 CS 7 68† A D K†1 -White(a) SC cs 4†[1] cs 4†[1] 69† A I†1 N -IP Carrier Mk IIA CS 4 CS 4 70† N P V X†1 -IP Carrier Mk IIB CS 4 CS 4 70† N P Q†2 V X†1 -IP Carrier AOV CS 4 CS 4 70† P Q†1 V X† -IP Carrier, 3-in. MTR IR WP7 s8 CS 5[brewup]† IR WP7 s8 CS 5[brewup]† 71†[2] E†3 H† P V X†1 BB†4 -Wasp sD5† CS 3[brewup] sD5† CS 3[brewup] 72† K†1 U -Badger(a) CS 3 CS 3 72† A K†1 M -Buffalo Mk II(a) sD5† CS 6 sD5† CS 6 73† A D AA†1 -Buffalo Mk IV(a) sD5† CS 6 sD5† CS 6 73† A D E†1 AA†2 -Sherman III DD(a) WP6 s8 sD6 CS 5[brewup] WP6 s8 sD6 CS 5[brewup] 74† A G K†2 R†1 -DUKW(a) cs 7†[1] cs 7†[1] 75† A D I†1 P -Terrapin Mk I cs 7 cs 7 76† D -2pdr Portee CS 4†[1] CS 4†[1] 77† H†1 N P -Morris C9/B CS 4 CS 4 78† P AA†1 -Loyd Carrier cs 5 cs 5 79† N P -Quad FAT CS 5[brewup]† CS 5[brewup]† 80† N P -15-cwt Truck cs 5 cs 5 81† N P -30-cwt Lorry cs 6 cs 6 82† N P -3-Ton Lorry cs 7 cs 7 83† N P -¼-Ton Jeep(a) cs 2†[1] cs 2†[1] 84† A I†1 N P -¾-Ton Truck(a) cs 4 cs 4 85 A N -1½-Ton Truck(a) cs 6 cs 6 85 A N -2½-Ton Truck(a) cs 7 cs 7 85 A N -7½-Ton Truck(a) cs 7 cs 7 85† A N +Name Capabilities (effective) # Notes Comments +------------------------- ---------------------------------------------------- ------------------------------ ------ ------------------------------------------------------------------ ---------- +Mark VIB sD6 CS 3 sD6 CS 3 1† N P +Mark VIC sD6 CS 3 sD6 CS 3 1† n/a +Tetrarch sD6 CS 3 sD6 CS 3 2† n/a +Tetrarch CS HE9†[1] s†[1] sD6 CS 3 HE9†[1] s†[1] sD6 CS 3 2† S†1 +Stuart I(a) sD5 CS 4 sD5 CS 4 3† A N P +Stuart III(a) C6[4+]†[1] HE[4+] sD5 CS 4 sD5 CS 4 3† A C†1 G N P +Stuart V(a) C6†[1] sD5 CS 4 C6†[1] sD5 CS 4 4† A C†1 G +Locust(a) C6† sD6 CS 3 C6† sD6 CS 3 5 A C† +A9 sD6 CS 5[brewup] sD6 CS 5[brewup] 6† K†1 N +A9 CS s†[2] sD6 CS 5[brewup] s†[2] sD6 CS 5[brewup] 6† K†1 N S†2 +A10 Mk IA sD6 CS 5[brewup]† sD6 CS 5[brewup]† 7† B†1 K†2 N +A10 Mk IA CS s†[2] sD6 CS 5[brewup]† s†[2] sD6 CS 5[brewup]† 7† K†1 N S†2 +A13 Mk I sD6 CS 4[brewup] sD6 CS 4[brewup] 8 K† +A13 Mk II sD6 CS 4[brewup] sD6 CS 4[brewup] 8† B†1 K†2 N +A13 Mk II CS s†[2] sD6 CS 4[brewup] s†[2] sD6 CS 4[brewup] 8† K†1 N S†2 +Crusader I sM8 CS 5[brewup] sM8 CS 5[brewup] 9† K†1 N +Crusader I CS HE9 s†[2] sM8 CS 5[brewup] HE9 s†[2] sM8 CS 5[brewup] 9† K†1 N S†2 +Crusader II sM8 CS 4[brewup] sM8 CS 4[brewup] 9† K†1 N +Crusader II CS HE9 s†[2] sM8 CS 4[brewup] HE9 s†[2] sM8 CS 4[brewup] 9† K†1 N S†2 +Crusader III HE7[F3+]†[1] sD7 sM8†[2] CS 3[brewup] sD7 sM8†[2] CS 3[brewup] 10† N Y†1 Z†2 +Grant(a) C5[4+]†[1] HE[4+] s8† sM8 CS 6 s8† sM8 CS 6 11† A C†1 G N P +Lee(a) C5[4+]†[1] HE[4+] s8† sD6 CS 7 s8† sD6 CS 7 11† A C†1 G N P +Sherman II(a) WP6[J4+]†[3] s8 sD6 CS 5[brewup] s8 sD6 CS 5[brewup] 12† A G K†2 N R†1 W†3 +Sherman III(a) WP6[J4+]†[3] s8 sD6 CS 5[brewup] s8 sD6 CS 5[brewup] 13† A G K†2 N R†1 W†3 +Sherman V(a) WP6[J4+]†[3] s8 sD6 CS 5[brewup] s8 sD6 CS 5[brewup] 14† A G K†2 P R†1 W†3 +Sherman IIA(a) A4[4]5[5] s5[5] sM8 CS 6 sM8 CS 6 15† A G K†1 +Sherman IIC(a) D5[S4]6[5]†[2] HE7 sM8 CS 5[brewup] HE7 sM8 CS 5[brewup] 16† A J†2 K†1 +Sherman VC(a) D5[S4]6[5]†[2] HE7 sM8 CS 5[brewup] HE7 sM8 CS 5[brewup] 16† A J†2 K†1 +Sherman IB(a) H9 WP9 s7 sM8 CS 6 H9 WP9 s7 sM8 CS 6 17† A K†1 +Centaur IV H6 s9 sD7 sM8† CS 5 H6 s9 sD7 sM8† CS 5 18 S Z† +Cromwell IV WP6 s8 sD7 sM8†[1] CS 5 WP6 s8 sD7 sM8†[1] CS 5 19† Z†1 +Cromwell VI H6 s9 sD7 sM8†[1] CS 5 H6 s9 sD7 sM8†[1] CS 5 20† S Z†1 +Cromwell VII WP6 s8 sD7 sM8† CS 6 WP6 s8 sD7 sM8† CS 6 19† Z†1 +Cromwell VIII H6 s9 sD7 sM8†[1] CS 6 H6 s9 sD7 sM8†[1] CS 6 20† S Z†1 +Challenger D5[S4]6[5]†[1] HE7 sD7 sM8†[2] CS 6 HE7 sD7 sM8†[2] CS 6 21† J†1 Z†2 +Comet sD7 sM8† CS 6 sD7 sM8† CS 6 22 Z† +Sherman Dozer(a) WP6 s8 sD6 CS 5[brewup] WP6 s8 sD6 CS 5[brewup] 23† A G K†2 P R†1 +Sherman Crab(a) WP6 s8 sD6 CS 5[brewup] WP6 s8 sD6 CS 5[brewup] 24† A G K†2 P R†1 +Matilda I ® sD5 CS 2 ® sD5 CS 2 25† B†1 +Matilda II sD6 CS 5 sD6 CS 5 26† B†1 K†2 N P +Matilda II CS HE9†[2] s†[2] sD6 CS 5 HE9†[2] s†[2] sD6 CS 5 26† K†1 N P S†2 +Valentine II sM8 CS 4 sM8 CS 4 27† N +Valentine V sM8 CS 4 sM8 CS 4 28† K†1 NT +Valentine VIII HE7 sD6 CS 4 HE7 sD6 CS 4 29 NT +Valentine XI WP6 s8 sD8 CS 4 WP6 s8 sD8 CS 4 30 n/a +Churchill I HE9†[2] s†[2] sD5[4] sM8†[1] CS 7 HE9†[2] s†[2] sM8†[1] CS 7 31† NT S†2 Z†1 CC +Churchill IV D6[J4]7[5]†[2] HE7[F3]8[4+]†[1] sD6[4+] sM8†[3] CS 7 sM8†[3] CS 7 32† J†2 N Y†1 Z†3 CC +Churchill V H6 s9 sD7 sM8†[1] CS 7 H6 s9 sD7 sM8†[1] CS 7 33† S Z†1 CC +Churchill VI WP6[J4+]†[1] s8 sD7 sM8†[2] CS 7 s8 sD7 sM8†[2] CS 7 34† W†1 Z†2 CC +Churchill VII WP6 s8 sD7 sM8†[1] CS 7 WP6 s8 sD7 sM8†[1] CS 7 35† Z†1 CC +Churchill VIII H6 s9 sD7 sM8†[1] CS 7 H6 s9 sD7 sM8†[1] CS 7 35† S Z†1 CC +Valentine Bridgelayer sD7 CS 2 sD7 CS 2 36† M P +Churchill Bridgelayer sD7 CS 2 sD7 CS 2 36† M CC +Churchill AVRE no IF sD7 sM8†[1] CS 8 no IF sD7 sM8†[1] CS 8 37† Z†1 CC +Churchill Crocodile WP6 s8 sD7 sM8†[1] CS 7 WP6 s8 sD7 sM8†[1] CS 7 38† Z†1 CC +Deacon HE7[F3+]†[2] CS 5 CS 5 39† L†1 N Y†2 +Wolverine(a) A5[S4]6[5]†[1] HE7 s5[5] CS 7 HE7 CS 7 40† A J†1 +Achilles(a) D6[S4]7[5]†[1] HE7 CS 7 HE7 CS 7 40† A J†1 +Archer D6[4]7[5]†[1] HE7 sD7 CS 5 HE7 sD7 CS 5 41† J†1 +Daimler sD4[4+]† CS 2 CS 2 42† M N P +Lynx sD5 CS 2 sD5 CS 2 42† L†1 M P +Humber sD4[4+]† CS 2 CS 2 43† L†1 M P BB†2 +Stuart Recce CS 5 CS 5 44† A D NT P +Humber III LRC sD5 CS 3 sD5 CS 3 45† L†1 N P Q†2 +Otter LRC sD5 CS 3 sD5 CS 3 45† L†1 P Q†2 +Morris CS9 sD5 CS 4 sD5 CS 4 46† N Q†2 T†3 X†1 +Rolls Royce sD5 CS 3 sD5 CS 3 47† N Q†2 T†3 X†1 +Marmon-Herrington II ME CS 4 CS 4 48† L†1 N Q†2 T†3 +Marmon-Herrington IIv CS 4 CS 4 49† L†1 N AA†2 +Marmon-Herrington III MFF CS 4 CS 4 48† L†1 P Q†2 +Marmon-Herrington III ME CS 4 CS 4 48† L†1 N Q†2 T†3 +Marmon-Herrington IIIv CS 4 CS 4 49† K†2 L†1 N T†2 +Humber II sD6 CS 3 sD6 CS 3 50† L†1 N +Humber III sD6 CS 4 sD6 CS 4 50† K†2 L†1 N P +Humber IV C6[4+]†[2] sD6 CS 3 sD6 CS 3 51† A C†2 L†1 P +Daimler sD6 CS 3 sD6 CS 3 52† K†1 N P +AEC I sM8 CS 3 sM8 CS 3 53† N X†1 +AEC II D6[J4]7[5]†[2] HE7[3]8[4+]†[1] sM8 CS 4 sM8 CS 4 53 J†2 X† Y†1 +AEC III WP6 s8 sM8 CS 4 WP6 s8 sM8 CS 4 53 X† +Staghound I(a) C6[4+]†[3] sM8 CS 5 sM8 CS 5 54† A C†3 G K†2 X†1 +Staghound II(a) s9 sD6 CS 4 s9 sD6 CS 4 54† A K†3 S†2 X†1 +Bishop no IF s8 CS 5 no IF s8 CS 5 55† K†1 N P +Priest(a) H6 WP7 s8 CS 7 H6 WP7 s8 CS 7 56† A N P +Sexton(a) s8 CS 7 s8 CS 7 57† A K†1 +M3 GMC(a) WP7[J4+]†[1] s8 CS 4 s8 CS 4 58† A NT W†1 +Mk VI AA CS 2 CS 2 59† N O†1 AA†2 +Crusader AA sD7 CS 4[brewup] sD7 CS 4[brewup] 60† AA†1 +M17 MGMC(a) CS 4 CS 4 61† A F† AA†1 +Humber AA CS 2 CS 2 62† L†1 N O†2 AA†3 +Staghound AA(a) CS 3 CS 3 62† A F† X†1 AA†2 +M5(a) cs 5†[1] cs 5†[1] 63† A I†1 N +M9(a) cs 4†[1] cs 4†[1] 63† A I†1 N +M5A1(a) cs 5† cs 5† 63 A I† +M9A1(a) cs 4† cs 4† 63 A I† +Carrier A sD5[4+]†[1] CS 3 CS 3 64† N P U†1 +Carrier B sD5[4+]†[2] CS 3 CS 3 64† N P Q†1 U†2 +Carrier C sD5[4+]†[1] CS 3 CS 3 64† N P U†1 +Carrier, MMG A sD5[4+]†[2] CS 3 CS 3 65† N P Q†1 U†2 +Carrier, MMG B sD5[4+]†[2] CS 4 CS 4 65† U†2 BB†1 +Carrier, 2-in. MTR IR[2+]† s7 CS 3 s7 CS 3 66† N P U†1 +Carrier, 3-in. MTR CS 4[brewup]†[1] CS 4[brewup]†[1] 67† H†1 N P U BB†2 +Priest Kangaroo(a) CS 7 CS 7 68† A D +Ram Kangaroo(a) CS 7 CS 7 68† A D K†1 +White(a) SC cs 4†[1] cs 4†[1] 69† A I†1 N +IP Carrier Mk IIA CS 4 CS 4 70† N P V X†1 +IP Carrier Mk IIB CS 4 CS 4 70† N P Q†2 V X†1 +IP Carrier AOV CS 4 CS 4 70† P Q†1 V X† +IP Carrier, 3-in. MTR IR WP7 s8 CS 5[brewup]† IR WP7 s8 CS 5[brewup]† 71†[2] E†3 H† P V X†1 BB†4 +Wasp sD5† CS 3[brewup] sD5† CS 3[brewup] 72† K†1 U +Badger(a) CS 3 CS 3 72† A K†1 M +Buffalo Mk II(a) sD5† CS 6 sD5† CS 6 73† A D AA†1 +Buffalo Mk IV(a) sD5† CS 6 sD5† CS 6 73† A D E†1 AA†2 +Sherman III DD(a) WP6 s8 sD6 CS 5[brewup] WP6 s8 sD6 CS 5[brewup] 74† A G K†2 R†1 +DUKW(a) cs 7†[1] cs 7†[1] 75† A D I†1 P +Terrapin Mk I cs 7 cs 7 76† D +2pdr Portee CS 4†[1] CS 4†[1] 77† H†1 N P +Morris C9/B CS 4 CS 4 78† P AA†1 +Loyd Carrier cs 5 cs 5 79† N P +Quad FAT CS 5[brewup]† CS 5[brewup]† 80† N P +15-cwt Truck cs 5 cs 5 81† N P +30-cwt Lorry cs 6 cs 6 82† N P +3-Ton Lorry cs 7 cs 7 83† N P +¼-Ton Jeep(a) cs 2†[1] cs 2†[1] 84† A I†1 N P +¾-Ton Truck(a) cs 4 cs 4 85 A N +1½-Ton Truck(a) cs 6 cs 6 85 A N +2½-Ton Truck(a) cs 7 cs 7 85 A N +7½-Ton Truck(a) cs 7 cs 7 85† A N +M4A3E8(a) A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 34 A†1 FF† UU +M4A3E8 Dozer(a) A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 34 A†1 TT† UU +Cromwell VII s8† sD7 sM8†[1] CS 6 s8† sD7 sM8†[1] CS 6 35† N ZZ†1 +Centaur Dozer sD7 CS 2†[1] sD7 CS 2†[1] 36†[1] TT† +Churchill VII WP6 s8 sD7 sM8†[1] CS 7 WP6 s8 sD7 sM8†[1] CS 7 37† N CC ZZ†1 +Centurion III D† HE8 WP6 s8 sD7 sM8†[1] CS 7 D† HE8 WP6 s8 sD7 sM8†[1] CS 7 38† CC ZZ†1 +Centurion III(L) D8 WP6 s8 sD7 sM8†[2] CS 7 D8 WP6 s8 sD7 sM8†[2] CS 7 38† CC FF†1 ZZ†2 +Churchill Bridgelayer sD7 CS 2 sD7 CS 2 39† N CC +M4A1 MC(a) IR WP8 CS 4[brewup] IR WP8 CS 4[brewup] 40† Q†1 NN UU +M9(a) cs 4 cs 4 41 N UU +Daimler sD4 CS 2 sD4 CS 2 42† N +Carrier A sD5 CS 3 sD5 CS 3 43† N U†1 +Carrier C sD5 CS 3 sD5 CS 3 43† N U†2 Z†1 +Carrier, MMG A sD5 CS 3 sD5 CS 3 44† N U†1 +Carrier, 3-in. Mtr CS 4[brewup] CS 4[brewup] 45† U MM†1 NN +Oxford Carrier CS 5† CS 5† 46† EE†1 +Oxford Carrier, MMG CS 5 CS 5 47† EE†1 +Oxford Carrier, HMG CS 5 CS 5 47† G†1 EE†2 +Oxford Carrier, 3-in Mtr CS 5 CS 5 48† EE†2 MM†1 NN +IP Carrier AOV CS 4 CS 4 49† N W†1 +Wasp sD5† CS 3[brewup] sD5† CS 3[brewup] 50† N U +Morris C9/B CS 4 CS 4 51† N AA†1 +Quad FAT cs 5[brewup]† cs 5[brewup]† 52† N +15-cwt cs 5 cs 5 53† N +3-Ton Lorry cs 7 cs 7 53† N +M3A1 CS 5 CS 5 54† E† H K Y Z†1 UU +M20 sP5 CS 4 sP5 CS 4 55† D†4 K Q†2 W†1 Y Z†3 UU +M8 C7 sP5 CS 4 C7 sP5 CS 4 56† C K W†1 Y UU +¼-Ton Jeep cs 2†[1] cs 2†[1] 57† K L†2 M N O P Q†1 Y UU +¾-Ton cs 4 cs 4 57† K N O Y UU +2½-Ton cs 7 cs 7 57† K M N O P Y UU diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1941.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1941.txt index 5208476..af596ae 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1941.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1941.txt @@ -1,131 +1,162 @@ === vehicles/british/1941 === -Name Capabilities (effective) # Notes Comments -------------------------- ---------------------------------------------------- -------------------------- ------ ---------------------------------------------------- ---------- -Mark VIB sD6 CS 3 sD6 CS 3 1† N P -Mark VIC sD6 CS 3 sD6 CS 3 1† n/a -Tetrarch sD6 CS 3 sD6 CS 3 2† n/a -Tetrarch CS HE9†[1] s†[1] sD6 CS 3 HE9†[1] s†[1] sD6 CS 3 2† S†1 -Stuart I(a) sD5 CS 4 sD5 CS 4 3† A N P -Stuart III(a) C6[4+]†[1] HE[4+] sD5 CS 4 sD5 CS 4 3† A C†1 G N P -Stuart V(a) C6†[1] sD5 CS 4 C6†[1] sD5 CS 4 4† A C†1 G -Locust(a) C6† sD6 CS 3 C6† sD6 CS 3 5 A C† -A9 sD6 CS 5[brewup] sD6 CS 5[brewup] 6† K†1 N -A9 CS s†[2] sD6 CS 5[brewup] s†[2] sD6 CS 5[brewup] 6† K†1 N S†2 -A10 Mk IA sD6 CS 5[brewup]† sD6 CS 5[brewup]† 7† B†1 K†2 N -A10 Mk IA CS s†[2] sD6 CS 5[brewup]† s†[2] sD6 CS 5[brewup]† 7† K†1 N S†2 -A13 Mk I sD6 CS 4[brewup] sD6 CS 4[brewup] 8 K† -A13 Mk II sD6 CS 4[brewup] sD6 CS 4[brewup] 8† B†1 K†2 N -A13 Mk II CS s†[2] sD6 CS 4[brewup] s†[2] sD6 CS 4[brewup] 8† K†1 N S†2 -Crusader I sM8 CS 5[brewup] sM8 CS 5[brewup] 9† K†1 N -Crusader I CS HE9 s†[2] sM8 CS 5[brewup] HE9 s†[2] sM8 CS 5[brewup] 9† K†1 N S†2 -Crusader II sM8 CS 4[brewup] sM8 CS 4[brewup] 9† K†1 N -Crusader II CS HE9 s†[2] sM8 CS 4[brewup] HE9 s†[2] sM8 CS 4[brewup] 9† K†1 N S†2 -Crusader III HE7[F3+]†[1] sD7 sM8†[2] CS 3[brewup] sD7 sM8†[2] CS 3[brewup] 10† N Y†1 Z†2 -Grant(a) C5[4+]†[1] HE[4+] s8† sM8 CS 6 s8† sM8 CS 6 11† A C†1 G N P -Lee(a) C5[4+]†[1] HE[4+] s8† sD6 CS 7 s8† sD6 CS 7 11† A C†1 G N P -Sherman II(a) WP6[J4+]†[3] s8 sD6 CS 5[brewup] s8 sD6 CS 5[brewup] 12† A G K†2 N R†1 W†3 -Sherman III(a) WP6[J4+]†[3] s8 sD6 CS 5[brewup] s8 sD6 CS 5[brewup] 13† A G K†2 N R†1 W†3 -Sherman V(a) WP6[J4+]†[3] s8 sD6 CS 5[brewup] s8 sD6 CS 5[brewup] 14† A G K†2 P R†1 W†3 -Sherman IIA(a) A4[4]5[5] s5[5] sM8 CS 6 sM8 CS 6 15† A G K†1 -Sherman IIC(a) D5[S4]6[5]†[2] HE7 sM8 CS 5[brewup] HE7 sM8 CS 5[brewup] 16† A J†2 K†1 -Sherman VC(a) D5[S4]6[5]†[2] HE7 sM8 CS 5[brewup] HE7 sM8 CS 5[brewup] 16† A J†2 K†1 -Sherman IB(a) H9 WP9 s7 sM8 CS 6 H9 WP9 s7 sM8 CS 6 17† A K†1 -Centaur IV H6 s9 sD7 sM8† CS 5 H6 s9 sD7 sM8† CS 5 18 S Z† -Cromwell IV WP6 s8 sD7 sM8†[1] CS 5 WP6 s8 sD7 sM8†[1] CS 5 19† Z†1 -Cromwell VI H6 s9 sD7 sM8†[1] CS 5 H6 s9 sD7 sM8†[1] CS 5 20† S Z†1 -Cromwell VII WP6 s8 sD7 sM8† CS 6 WP6 s8 sD7 sM8† CS 6 19† Z†1 -Cromwell VIII H6 s9 sD7 sM8†[1] CS 6 H6 s9 sD7 sM8†[1] CS 6 20† S Z†1 -Challenger D5[S4]6[5]†[1] HE7 sD7 sM8†[2] CS 6 HE7 sD7 sM8†[2] CS 6 21† J†1 Z†2 -Comet sD7 sM8† CS 6 sD7 sM8† CS 6 22 Z† -Sherman Dozer(a) WP6 s8 sD6 CS 5[brewup] WP6 s8 sD6 CS 5[brewup] 23† A G K†2 P R†1 -Sherman Crab(a) WP6 s8 sD6 CS 5[brewup] WP6 s8 sD6 CS 5[brewup] 24† A G K†2 P R†1 -Matilda I ® sD5 CS 2 ® sD5 CS 2 25† B†1 -Matilda II sD6 CS 5 sD6 CS 5 26† B†1 K†2 N P -Matilda II CS HE9†[2] s†[2] sD6 CS 5 HE9†[2] s†[2] sD6 CS 5 26† K†1 N P S†2 -Valentine II sM8 CS 4 sM8 CS 4 27† N -Valentine V sM8 CS 4 sM8 CS 4 28† K†1 NT -Valentine VIII HE7 sD6 CS 4 HE7 sD6 CS 4 29 NT -Valentine XI WP6 s8 sD8 CS 4 WP6 s8 sD8 CS 4 30 n/a -Churchill I HE9†[2] s†[2] sD5[4] sM8†[1] CS 7 HE9†[2] s†[2] sM8†[1] CS 7 31† NT S†2 Z†1 CC -Churchill IV D6[J4]7[5]†[2] HE7[F3]8[4+]†[1] sD6[4+] sM8†[3] CS 7 sM8†[3] CS 7 32† J†2 N Y†1 Z†3 CC -Churchill V H6 s9 sD7 sM8†[1] CS 7 H6 s9 sD7 sM8†[1] CS 7 33† S Z†1 CC -Churchill VI WP6[J4+]†[1] s8 sD7 sM8†[2] CS 7 s8 sD7 sM8†[2] CS 7 34† W†1 Z†2 CC -Churchill VII WP6 s8 sD7 sM8†[1] CS 7 WP6 s8 sD7 sM8†[1] CS 7 35† Z†1 CC -Churchill VIII H6 s9 sD7 sM8†[1] CS 7 H6 s9 sD7 sM8†[1] CS 7 35† S Z†1 CC -Valentine Bridgelayer sD7 CS 2 sD7 CS 2 36† M P -Churchill Bridgelayer sD7 CS 2 sD7 CS 2 36† M CC -Churchill AVRE no IF sD7 sM8†[1] CS 8 no IF sD7 sM8†[1] CS 8 37† Z†1 CC -Churchill Crocodile WP6 s8 sD7 sM8†[1] CS 7 WP6 s8 sD7 sM8†[1] CS 7 38† Z†1 CC -Deacon HE7[F3+]†[2] CS 5 CS 5 39† L†1 N Y†2 -Wolverine(a) A5[S4]6[5]†[1] HE7 s5[5] CS 7 HE7 CS 7 40† A J†1 -Achilles(a) D6[S4]7[5]†[1] HE7 CS 7 HE7 CS 7 40† A J†1 -Archer D6[4]7[5]†[1] HE7 sD7 CS 5 HE7 sD7 CS 5 41† J†1 -Daimler sD4[4+]† CS 2 CS 2 42† M N P -Lynx sD5 CS 2 sD5 CS 2 42† L†1 M P -Humber sD4[4+]† CS 2 CS 2 43† L†1 M P BB†2 -Stuart Recce CS 5 CS 5 44† A D NT P -Humber III LRC sD5 CS 3 sD5 CS 3 45† L†1 N P Q†2 -Otter LRC sD5 CS 3 sD5 CS 3 45† L†1 P Q†2 -Morris CS9 sD5 CS 4 sD5 CS 4 46† N Q†2 T†3 X†1 -Rolls Royce sD5 CS 3 sD5 CS 3 47† N Q†2 T†3 X†1 -Marmon-Herrington II ME CS 4 CS 4 48† L†1 N Q†2 T†3 -Marmon-Herrington IIv CS 4 CS 4 49† L†1 N AA†2 -Marmon-Herrington III MFF CS 4 CS 4 48† L†1 P Q†2 -Marmon-Herrington III ME CS 4 CS 4 48† L†1 N Q†2 T†3 -Marmon-Herrington IIIv CS 4 CS 4 49† K†2 L†1 N T†2 -Humber II sD6 CS 3 sD6 CS 3 50† L†1 N -Humber III sD6 CS 4 sD6 CS 4 50† K†2 L†1 N P -Humber IV C6[4+]†[2] sD6 CS 3 sD6 CS 3 51† A C†2 L†1 P -Daimler sD6 CS 3 sD6 CS 3 52† K†1 N P -AEC I sM8 CS 3 sM8 CS 3 53† N X†1 -AEC II D6[J4]7[5]†[2] HE7[3]8[4+]†[1] sM8 CS 4 sM8 CS 4 53 J†2 X† Y†1 -AEC III WP6 s8 sM8 CS 4 WP6 s8 sM8 CS 4 53 X† -Staghound I(a) C6[4+]†[3] sM8 CS 5 sM8 CS 5 54† A C†3 G K†2 X†1 -Staghound II(a) s9 sD6 CS 4 s9 sD6 CS 4 54† A K†3 S†2 X†1 -Bishop no IF s8 CS 5 no IF s8 CS 5 55† K†1 N P -Priest(a) H6 WP7 s8 CS 7 H6 WP7 s8 CS 7 56† A N P -Sexton(a) s8 CS 7 s8 CS 7 57† A K†1 -M3 GMC(a) WP7[J4+]†[1] s8 CS 4 s8 CS 4 58† A NT W†1 -Mk VI AA CS 2 CS 2 59† N O†1 AA†2 -Crusader AA sD7 CS 4[brewup] sD7 CS 4[brewup] 60† AA†1 -M17 MGMC(a) CS 4 CS 4 61† A F† AA†1 -Humber AA CS 2 CS 2 62† L†1 N O†2 AA†3 -Staghound AA(a) CS 3 CS 3 62† A F† X†1 AA†2 -M5(a) cs 5†[1] cs 5†[1] 63† A I†1 N -M9(a) cs 4†[1] cs 4†[1] 63† A I†1 N -M5A1(a) cs 5† cs 5† 63 A I† -M9A1(a) cs 4† cs 4† 63 A I† -Carrier A sD5[4+]†[1] CS 3 CS 3 64† N P U†1 -Carrier B sD5[4+]†[2] CS 3 CS 3 64† N P Q†1 U†2 -Carrier C sD5[4+]†[1] CS 3 CS 3 64† N P U†1 -Carrier, MMG A sD5[4+]†[2] CS 3 CS 3 65† N P Q†1 U†2 -Carrier, MMG B sD5[4+]†[2] CS 4 CS 4 65† U†2 BB†1 -Carrier, 2-in. MTR IR[2+]† s7 CS 3 s7 CS 3 66† N P U†1 -Carrier, 3-in. MTR CS 4[brewup]†[1] CS 4[brewup]†[1] 67† H†1 N P U BB†2 -Priest Kangaroo(a) CS 7 CS 7 68† A D -Ram Kangaroo(a) CS 7 CS 7 68† A D K†1 -White(a) SC cs 4†[1] cs 4†[1] 69† A I†1 N -IP Carrier Mk IIA CS 4 CS 4 70† N P V X†1 -IP Carrier Mk IIB CS 4 CS 4 70† N P Q†2 V X†1 -IP Carrier AOV CS 4 CS 4 70† P Q†1 V X† -IP Carrier, 3-in. MTR IR WP7 s8 CS 5[brewup]† IR WP7 s8 CS 5[brewup]† 71†[2] E†3 H† P V X†1 BB†4 -Wasp sD5† CS 3[brewup] sD5† CS 3[brewup] 72† K†1 U -Badger(a) CS 3 CS 3 72† A K†1 M -Buffalo Mk II(a) sD5† CS 6 sD5† CS 6 73† A D AA†1 -Buffalo Mk IV(a) sD5† CS 6 sD5† CS 6 73† A D E†1 AA†2 -Sherman III DD(a) WP6 s8 sD6 CS 5[brewup] WP6 s8 sD6 CS 5[brewup] 74† A G K†2 R†1 -DUKW(a) cs 7†[1] cs 7†[1] 75† A D I†1 P -Terrapin Mk I cs 7 cs 7 76† D -2pdr Portee CS 4†[1] CS 4†[1] 77† H†1 N P -Morris C9/B CS 4 CS 4 78† P AA†1 -Loyd Carrier cs 5 cs 5 79† N P -Quad FAT CS 5[brewup]† CS 5[brewup]† 80† N P -15-cwt Truck cs 5 cs 5 81† N P -30-cwt Lorry cs 6 cs 6 82† N P -3-Ton Lorry cs 7 cs 7 83† N P -¼-Ton Jeep(a) cs 2†[1] cs 2†[1] 84† A I†1 N P -¾-Ton Truck(a) cs 4 cs 4 85 A N -1½-Ton Truck(a) cs 6 cs 6 85 A N -2½-Ton Truck(a) cs 7 cs 7 85 A N -7½-Ton Truck(a) cs 7 cs 7 85† A N +Name Capabilities (effective) # Notes Comments +------------------------- ---------------------------------------------------- ------------------------------ ------ ------------------------------------------------------------------ ---------- +Mark VIB sD6 CS 3 sD6 CS 3 1† N P +Mark VIC sD6 CS 3 sD6 CS 3 1† n/a +Tetrarch sD6 CS 3 sD6 CS 3 2† n/a +Tetrarch CS HE9†[1] s†[1] sD6 CS 3 HE9†[1] s†[1] sD6 CS 3 2† S†1 +Stuart I(a) sD5 CS 4 sD5 CS 4 3† A N P +Stuart III(a) C6[4+]†[1] HE[4+] sD5 CS 4 sD5 CS 4 3† A C†1 G N P +Stuart V(a) C6†[1] sD5 CS 4 C6†[1] sD5 CS 4 4† A C†1 G +Locust(a) C6† sD6 CS 3 C6† sD6 CS 3 5 A C† +A9 sD6 CS 5[brewup] sD6 CS 5[brewup] 6† K†1 N +A9 CS s†[2] sD6 CS 5[brewup] s†[2] sD6 CS 5[brewup] 6† K†1 N S†2 +A10 Mk IA sD6 CS 5[brewup]† sD6 CS 5[brewup]† 7† B†1 K†2 N +A10 Mk IA CS s†[2] sD6 CS 5[brewup]† s†[2] sD6 CS 5[brewup]† 7† K†1 N S†2 +A13 Mk I sD6 CS 4[brewup] sD6 CS 4[brewup] 8 K† +A13 Mk II sD6 CS 4[brewup] sD6 CS 4[brewup] 8† B†1 K†2 N +A13 Mk II CS s†[2] sD6 CS 4[brewup] s†[2] sD6 CS 4[brewup] 8† K†1 N S†2 +Crusader I sM8 CS 5[brewup] sM8 CS 5[brewup] 9† K†1 N +Crusader I CS HE9 s†[2] sM8 CS 5[brewup] HE9 s†[2] sM8 CS 5[brewup] 9† K†1 N S†2 +Crusader II sM8 CS 4[brewup] sM8 CS 4[brewup] 9† K†1 N +Crusader II CS HE9 s†[2] sM8 CS 4[brewup] HE9 s†[2] sM8 CS 4[brewup] 9† K†1 N S†2 +Crusader III HE7[F3+]†[1] sD7 sM8†[2] CS 3[brewup] sD7 sM8†[2] CS 3[brewup] 10† N Y†1 Z†2 +Grant(a) C5[4+]†[1] HE[4+] s8† sM8 CS 6 s8† sM8 CS 6 11† A C†1 G N P +Lee(a) C5[4+]†[1] HE[4+] s8† sD6 CS 7 s8† sD6 CS 7 11† A C†1 G N P +Sherman II(a) WP6[J4+]†[3] s8 sD6 CS 5[brewup] s8 sD6 CS 5[brewup] 12† A G K†2 N R†1 W†3 +Sherman III(a) WP6[J4+]†[3] s8 sD6 CS 5[brewup] s8 sD6 CS 5[brewup] 13† A G K†2 N R†1 W†3 +Sherman V(a) WP6[J4+]†[3] s8 sD6 CS 5[brewup] s8 sD6 CS 5[brewup] 14† A G K†2 P R†1 W†3 +Sherman IIA(a) A4[4]5[5] s5[5] sM8 CS 6 sM8 CS 6 15† A G K†1 +Sherman IIC(a) D5[S4]6[5]†[2] HE7 sM8 CS 5[brewup] HE7 sM8 CS 5[brewup] 16† A J†2 K†1 +Sherman VC(a) D5[S4]6[5]†[2] HE7 sM8 CS 5[brewup] HE7 sM8 CS 5[brewup] 16† A J†2 K†1 +Sherman IB(a) H9 WP9 s7 sM8 CS 6 H9 WP9 s7 sM8 CS 6 17† A K†1 +Centaur IV H6 s9 sD7 sM8† CS 5 H6 s9 sD7 sM8† CS 5 18 S Z† +Cromwell IV WP6 s8 sD7 sM8†[1] CS 5 WP6 s8 sD7 sM8†[1] CS 5 19† Z†1 +Cromwell VI H6 s9 sD7 sM8†[1] CS 5 H6 s9 sD7 sM8†[1] CS 5 20† S Z†1 +Cromwell VII WP6 s8 sD7 sM8† CS 6 WP6 s8 sD7 sM8† CS 6 19† Z†1 +Cromwell VIII H6 s9 sD7 sM8†[1] CS 6 H6 s9 sD7 sM8†[1] CS 6 20† S Z†1 +Challenger D5[S4]6[5]†[1] HE7 sD7 sM8†[2] CS 6 HE7 sD7 sM8†[2] CS 6 21† J†1 Z†2 +Comet sD7 sM8† CS 6 sD7 sM8† CS 6 22 Z† +Sherman Dozer(a) WP6 s8 sD6 CS 5[brewup] WP6 s8 sD6 CS 5[brewup] 23† A G K†2 P R†1 +Sherman Crab(a) WP6 s8 sD6 CS 5[brewup] WP6 s8 sD6 CS 5[brewup] 24† A G K†2 P R†1 +Matilda I ® sD5 CS 2 ® sD5 CS 2 25† B†1 +Matilda II sD6 CS 5 sD6 CS 5 26† B†1 K†2 N P +Matilda II CS HE9†[2] s†[2] sD6 CS 5 HE9†[2] s†[2] sD6 CS 5 26† K†1 N P S†2 +Valentine II sM8 CS 4 sM8 CS 4 27† N +Valentine V sM8 CS 4 sM8 CS 4 28† K†1 NT +Valentine VIII HE7 sD6 CS 4 HE7 sD6 CS 4 29 NT +Valentine XI WP6 s8 sD8 CS 4 WP6 s8 sD8 CS 4 30 n/a +Churchill I HE9†[2] s†[2] sD5[4] sM8†[1] CS 7 HE9†[2] s†[2] sM8†[1] CS 7 31† NT S†2 Z†1 CC +Churchill IV D6[J4]7[5]†[2] HE7[F3]8[4+]†[1] sD6[4+] sM8†[3] CS 7 sM8†[3] CS 7 32† J†2 N Y†1 Z†3 CC +Churchill V H6 s9 sD7 sM8†[1] CS 7 H6 s9 sD7 sM8†[1] CS 7 33† S Z†1 CC +Churchill VI WP6[J4+]†[1] s8 sD7 sM8†[2] CS 7 s8 sD7 sM8†[2] CS 7 34† W†1 Z†2 CC +Churchill VII WP6 s8 sD7 sM8†[1] CS 7 WP6 s8 sD7 sM8†[1] CS 7 35† Z†1 CC +Churchill VIII H6 s9 sD7 sM8†[1] CS 7 H6 s9 sD7 sM8†[1] CS 7 35† S Z†1 CC +Valentine Bridgelayer sD7 CS 2 sD7 CS 2 36† M P +Churchill Bridgelayer sD7 CS 2 sD7 CS 2 36† M CC +Churchill AVRE no IF sD7 sM8†[1] CS 8 no IF sD7 sM8†[1] CS 8 37† Z†1 CC +Churchill Crocodile WP6 s8 sD7 sM8†[1] CS 7 WP6 s8 sD7 sM8†[1] CS 7 38† Z†1 CC +Deacon HE7[F3+]†[2] CS 5 CS 5 39† L†1 N Y†2 +Wolverine(a) A5[S4]6[5]†[1] HE7 s5[5] CS 7 HE7 CS 7 40† A J†1 +Achilles(a) D6[S4]7[5]†[1] HE7 CS 7 HE7 CS 7 40† A J†1 +Archer D6[4]7[5]†[1] HE7 sD7 CS 5 HE7 sD7 CS 5 41† J†1 +Daimler sD4[4+]† CS 2 CS 2 42† M N P +Lynx sD5 CS 2 sD5 CS 2 42† L†1 M P +Humber sD4[4+]† CS 2 CS 2 43† L†1 M P BB†2 +Stuart Recce CS 5 CS 5 44† A D NT P +Humber III LRC sD5 CS 3 sD5 CS 3 45† L†1 N P Q†2 +Otter LRC sD5 CS 3 sD5 CS 3 45† L†1 P Q†2 +Morris CS9 sD5 CS 4 sD5 CS 4 46† N Q†2 T†3 X†1 +Rolls Royce sD5 CS 3 sD5 CS 3 47† N Q†2 T†3 X†1 +Marmon-Herrington II ME CS 4 CS 4 48† L†1 N Q†2 T†3 +Marmon-Herrington IIv CS 4 CS 4 49† L†1 N AA†2 +Marmon-Herrington III MFF CS 4 CS 4 48† L†1 P Q†2 +Marmon-Herrington III ME CS 4 CS 4 48† L†1 N Q†2 T†3 +Marmon-Herrington IIIv CS 4 CS 4 49† K†2 L†1 N T†2 +Humber II sD6 CS 3 sD6 CS 3 50† L†1 N +Humber III sD6 CS 4 sD6 CS 4 50† K†2 L†1 N P +Humber IV C6[4+]†[2] sD6 CS 3 sD6 CS 3 51† A C†2 L†1 P +Daimler sD6 CS 3 sD6 CS 3 52† K†1 N P +AEC I sM8 CS 3 sM8 CS 3 53† N X†1 +AEC II D6[J4]7[5]†[2] HE7[3]8[4+]†[1] sM8 CS 4 sM8 CS 4 53 J†2 X† Y†1 +AEC III WP6 s8 sM8 CS 4 WP6 s8 sM8 CS 4 53 X† +Staghound I(a) C6[4+]†[3] sM8 CS 5 sM8 CS 5 54† A C†3 G K†2 X†1 +Staghound II(a) s9 sD6 CS 4 s9 sD6 CS 4 54† A K†3 S†2 X†1 +Bishop no IF s8 CS 5 no IF s8 CS 5 55† K†1 N P +Priest(a) H6 WP7 s8 CS 7 H6 WP7 s8 CS 7 56† A N P +Sexton(a) s8 CS 7 s8 CS 7 57† A K†1 +M3 GMC(a) WP7[J4+]†[1] s8 CS 4 s8 CS 4 58† A NT W†1 +Mk VI AA CS 2 CS 2 59† N O†1 AA†2 +Crusader AA sD7 CS 4[brewup] sD7 CS 4[brewup] 60† AA†1 +M17 MGMC(a) CS 4 CS 4 61† A F† AA†1 +Humber AA CS 2 CS 2 62† L†1 N O†2 AA†3 +Staghound AA(a) CS 3 CS 3 62† A F† X†1 AA†2 +M5(a) cs 5†[1] cs 5†[1] 63† A I†1 N +M9(a) cs 4†[1] cs 4†[1] 63† A I†1 N +M5A1(a) cs 5† cs 5† 63 A I† +M9A1(a) cs 4† cs 4† 63 A I† +Carrier A sD5[4+]†[1] CS 3 CS 3 64† N P U†1 +Carrier B sD5[4+]†[2] CS 3 CS 3 64† N P Q†1 U†2 +Carrier C sD5[4+]†[1] CS 3 CS 3 64† N P U†1 +Carrier, MMG A sD5[4+]†[2] CS 3 CS 3 65† N P Q†1 U†2 +Carrier, MMG B sD5[4+]†[2] CS 4 CS 4 65† U†2 BB†1 +Carrier, 2-in. MTR IR[2+]† s7 CS 3 s7 CS 3 66† N P U†1 +Carrier, 3-in. MTR CS 4[brewup]†[1] CS 4[brewup]†[1] 67† H†1 N P U BB†2 +Priest Kangaroo(a) CS 7 CS 7 68† A D +Ram Kangaroo(a) CS 7 CS 7 68† A D K†1 +White(a) SC cs 4†[1] cs 4†[1] 69† A I†1 N +IP Carrier Mk IIA CS 4 CS 4 70† N P V X†1 +IP Carrier Mk IIB CS 4 CS 4 70† N P Q†2 V X†1 +IP Carrier AOV CS 4 CS 4 70† P Q†1 V X† +IP Carrier, 3-in. MTR IR WP7 s8 CS 5[brewup]† IR WP7 s8 CS 5[brewup]† 71†[2] E†3 H† P V X†1 BB†4 +Wasp sD5† CS 3[brewup] sD5† CS 3[brewup] 72† K†1 U +Badger(a) CS 3 CS 3 72† A K†1 M +Buffalo Mk II(a) sD5† CS 6 sD5† CS 6 73† A D AA†1 +Buffalo Mk IV(a) sD5† CS 6 sD5† CS 6 73† A D E†1 AA†2 +Sherman III DD(a) WP6 s8 sD6 CS 5[brewup] WP6 s8 sD6 CS 5[brewup] 74† A G K†2 R†1 +DUKW(a) cs 7†[1] cs 7†[1] 75† A D I†1 P +Terrapin Mk I cs 7 cs 7 76† D +2pdr Portee CS 4†[1] CS 4†[1] 77† H†1 N P +Morris C9/B CS 4 CS 4 78† P AA†1 +Loyd Carrier cs 5 cs 5 79† N P +Quad FAT CS 5[brewup]† CS 5[brewup]† 80† N P +15-cwt Truck cs 5 cs 5 81† N P +30-cwt Lorry cs 6 cs 6 82† N P +3-Ton Lorry cs 7 cs 7 83† N P +¼-Ton Jeep(a) cs 2†[1] cs 2†[1] 84† A I†1 N P +¾-Ton Truck(a) cs 4 cs 4 85 A N +1½-Ton Truck(a) cs 6 cs 6 85 A N +2½-Ton Truck(a) cs 7 cs 7 85 A N +7½-Ton Truck(a) cs 7 cs 7 85† A N +M4A3E8(a) A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 34 A†1 FF† UU +M4A3E8 Dozer(a) A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 34 A†1 TT† UU +Cromwell VII s8† sD7 sM8†[1] CS 6 s8† sD7 sM8†[1] CS 6 35† N ZZ†1 +Centaur Dozer sD7 CS 2†[1] sD7 CS 2†[1] 36†[1] TT† +Churchill VII WP6 s8 sD7 sM8†[1] CS 7 WP6 s8 sD7 sM8†[1] CS 7 37† N CC ZZ†1 +Centurion III D† HE8 WP6 s8 sD7 sM8†[1] CS 7 D† HE8 WP6 s8 sD7 sM8†[1] CS 7 38† CC ZZ†1 +Centurion III(L) D8 WP6 s8 sD7 sM8†[2] CS 7 D8 WP6 s8 sD7 sM8†[2] CS 7 38† CC FF†1 ZZ†2 +Churchill Bridgelayer sD7 CS 2 sD7 CS 2 39† N CC +M4A1 MC(a) IR WP8 CS 4[brewup] IR WP8 CS 4[brewup] 40† Q†1 NN UU +M9(a) cs 4 cs 4 41 N UU +Daimler sD4 CS 2 sD4 CS 2 42† N +Carrier A sD5 CS 3 sD5 CS 3 43† N U†1 +Carrier C sD5 CS 3 sD5 CS 3 43† N U†2 Z†1 +Carrier, MMG A sD5 CS 3 sD5 CS 3 44† N U†1 +Carrier, 3-in. Mtr CS 4[brewup] CS 4[brewup] 45† U MM†1 NN +Oxford Carrier CS 5† CS 5† 46† EE†1 +Oxford Carrier, MMG CS 5 CS 5 47† EE†1 +Oxford Carrier, HMG CS 5 CS 5 47† G†1 EE†2 +Oxford Carrier, 3-in Mtr CS 5 CS 5 48† EE†2 MM†1 NN +IP Carrier AOV CS 4 CS 4 49† N W†1 +Wasp sD5† CS 3[brewup] sD5† CS 3[brewup] 50† N U +Morris C9/B CS 4 CS 4 51† N AA†1 +Quad FAT cs 5[brewup]† cs 5[brewup]† 52† N +15-cwt cs 5 cs 5 53† N +3-Ton Lorry cs 7 cs 7 53† N +M3A1 CS 5 CS 5 54† E† H K Y Z†1 UU +M20 sP5 CS 4 sP5 CS 4 55† D†4 K Q†2 W†1 Y Z†3 UU +M8 C7 sP5 CS 4 C7 sP5 CS 4 56† C K W†1 Y UU +¼-Ton Jeep cs 2†[1] cs 2†[1] 57† K L†2 M N O P Q†1 Y UU +¾-Ton cs 4 cs 4 57† K N O Y UU +2½-Ton cs 7 cs 7 57† K M N O P Y UU diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1942.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1942.txt index 33bf2d8..7369311 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1942.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1942.txt @@ -1,131 +1,162 @@ === vehicles/british/1942 === -Name Capabilities (effective) # Notes Comments -------------------------- ---------------------------------------------------- -------------------------- ------ ---------------------------------------------------- ---------- -Mark VIB sD6 CS 3 sD6 CS 3 1† N P -Mark VIC sD6 CS 3 sD6 CS 3 1† n/a -Tetrarch sD6 CS 3 sD6 CS 3 2† n/a -Tetrarch CS HE9†[1] s†[1] sD6 CS 3 HE9†[1] s†[1] sD6 CS 3 2† S†1 -Stuart I(a) sD5 CS 4 sD5 CS 4 3† A N P -Stuart III(a) C6[4+]†[1] HE[4+] sD5 CS 4 sD5 CS 4 3† A C†1 G N P -Stuart V(a) C6†[1] sD5 CS 4 C6†[1] sD5 CS 4 4† A C†1 G -Locust(a) C6† sD6 CS 3 C6† sD6 CS 3 5 A C† -A9 sD6 CS 5[brewup] sD6 CS 5[brewup] 6† K†1 N -A9 CS s†[2] sD6 CS 5[brewup] s†[2] sD6 CS 5[brewup] 6† K†1 N S†2 -A10 Mk IA sD6 CS 5[brewup]† sD6 CS 5[brewup]† 7† B†1 K†2 N -A10 Mk IA CS s†[2] sD6 CS 5[brewup]† s†[2] sD6 CS 5[brewup]† 7† K†1 N S†2 -A13 Mk I sD6 CS 4[brewup] sD6 CS 4[brewup] 8 K† -A13 Mk II sD6 CS 4[brewup] sD6 CS 4[brewup] 8† B†1 K†2 N -A13 Mk II CS s†[2] sD6 CS 4[brewup] s†[2] sD6 CS 4[brewup] 8† K†1 N S†2 -Crusader I sM8 CS 5[brewup] sM8 CS 5[brewup] 9† K†1 N -Crusader I CS HE9 s†[2] sM8 CS 5[brewup] HE9 s†[2] sM8 CS 5[brewup] 9† K†1 N S†2 -Crusader II sM8 CS 4[brewup] sM8 CS 4[brewup] 9† K†1 N -Crusader II CS HE9 s†[2] sM8 CS 4[brewup] HE9 s†[2] sM8 CS 4[brewup] 9† K†1 N S†2 -Crusader III HE7[F3+]†[1] sD7 sM8†[2] CS 3[brewup] sD7 sM8†[2] CS 3[brewup] 10† N Y†1 Z†2 -Grant(a) C5[4+]†[1] HE[4+] s8† sM8 CS 6 s8† sM8 CS 6 11† A C†1 G N P -Lee(a) C5[4+]†[1] HE[4+] s8† sD6 CS 7 s8† sD6 CS 7 11† A C†1 G N P -Sherman II(a) WP6[J4+]†[3] s8 sD6 CS 5[brewup] s8 sD6 CS 5[brewup] 12† A G K†2 N R†1 W†3 -Sherman III(a) WP6[J4+]†[3] s8 sD6 CS 5[brewup] s8 sD6 CS 5[brewup] 13† A G K†2 N R†1 W†3 -Sherman V(a) WP6[J4+]†[3] s8 sD6 CS 5[brewup] s8 sD6 CS 5[brewup] 14† A G K†2 P R†1 W†3 -Sherman IIA(a) A4[4]5[5] s5[5] sM8 CS 6 sM8 CS 6 15† A G K†1 -Sherman IIC(a) D5[S4]6[5]†[2] HE7 sM8 CS 5[brewup] HE7 sM8 CS 5[brewup] 16† A J†2 K†1 -Sherman VC(a) D5[S4]6[5]†[2] HE7 sM8 CS 5[brewup] HE7 sM8 CS 5[brewup] 16† A J†2 K†1 -Sherman IB(a) H9 WP9 s7 sM8 CS 6 H9 WP9 s7 sM8 CS 6 17† A K†1 -Centaur IV H6 s9 sD7 sM8† CS 5 H6 s9 sD7 sM8† CS 5 18 S Z† -Cromwell IV WP6 s8 sD7 sM8†[1] CS 5 WP6 s8 sD7 sM8†[1] CS 5 19† Z†1 -Cromwell VI H6 s9 sD7 sM8†[1] CS 5 H6 s9 sD7 sM8†[1] CS 5 20† S Z†1 -Cromwell VII WP6 s8 sD7 sM8† CS 6 WP6 s8 sD7 sM8† CS 6 19† Z†1 -Cromwell VIII H6 s9 sD7 sM8†[1] CS 6 H6 s9 sD7 sM8†[1] CS 6 20† S Z†1 -Challenger D5[S4]6[5]†[1] HE7 sD7 sM8†[2] CS 6 HE7 sD7 sM8†[2] CS 6 21† J†1 Z†2 -Comet sD7 sM8† CS 6 sD7 sM8† CS 6 22 Z† -Sherman Dozer(a) WP6 s8 sD6 CS 5[brewup] WP6 s8 sD6 CS 5[brewup] 23† A G K†2 P R†1 -Sherman Crab(a) WP6 s8 sD6 CS 5[brewup] WP6 s8 sD6 CS 5[brewup] 24† A G K†2 P R†1 -Matilda I ® sD5 CS 2 ® sD5 CS 2 25† B†1 -Matilda II sD6 CS 5 sD6 CS 5 26† B†1 K†2 N P -Matilda II CS HE9†[2] s†[2] sD6 CS 5 HE9†[2] s†[2] sD6 CS 5 26† K†1 N P S†2 -Valentine II sM8 CS 4 sM8 CS 4 27† N -Valentine V sM8 CS 4 sM8 CS 4 28† K†1 NT -Valentine VIII HE7 sD6 CS 4 HE7 sD6 CS 4 29 NT -Valentine XI WP6 s8 sD8 CS 4 WP6 s8 sD8 CS 4 30 n/a -Churchill I HE9†[2] s†[2] sD5[4] sM8†[1] CS 7 HE9†[2] s†[2] sM8†[1] CS 7 31† NT S†2 Z†1 CC -Churchill IV D6[J4]7[5]†[2] HE7[F3]8[4+]†[1] sD6[4+] sM8†[3] CS 7 sM8†[3] CS 7 32† J†2 N Y†1 Z†3 CC -Churchill V H6 s9 sD7 sM8†[1] CS 7 H6 s9 sD7 sM8†[1] CS 7 33† S Z†1 CC -Churchill VI WP6[J4+]†[1] s8 sD7 sM8†[2] CS 7 s8 sD7 sM8†[2] CS 7 34† W†1 Z†2 CC -Churchill VII WP6 s8 sD7 sM8†[1] CS 7 WP6 s8 sD7 sM8†[1] CS 7 35† Z†1 CC -Churchill VIII H6 s9 sD7 sM8†[1] CS 7 H6 s9 sD7 sM8†[1] CS 7 35† S Z†1 CC -Valentine Bridgelayer sD7 CS 2 sD7 CS 2 36† M P -Churchill Bridgelayer sD7 CS 2 sD7 CS 2 36† M CC -Churchill AVRE no IF sD7 sM8†[1] CS 8 no IF sD7 sM8†[1] CS 8 37† Z†1 CC -Churchill Crocodile WP6 s8 sD7 sM8†[1] CS 7 WP6 s8 sD7 sM8†[1] CS 7 38† Z†1 CC -Deacon HE7[F3+]†[2] CS 5 CS 5 39† L†1 N Y†2 -Wolverine(a) A5[S4]6[5]†[1] HE7 s5[5] CS 7 HE7 CS 7 40† A J†1 -Achilles(a) D6[S4]7[5]†[1] HE7 CS 7 HE7 CS 7 40† A J†1 -Archer D6[4]7[5]†[1] HE7 sD7 CS 5 HE7 sD7 CS 5 41† J†1 -Daimler sD4[4+]† CS 2 CS 2 42† M N P -Lynx sD5 CS 2 sD5 CS 2 42† L†1 M P -Humber sD4[4+]† CS 2 CS 2 43† L†1 M P BB†2 -Stuart Recce CS 5 CS 5 44† A D NT P -Humber III LRC sD5 CS 3 sD5 CS 3 45† L†1 N P Q†2 -Otter LRC sD5 CS 3 sD5 CS 3 45† L†1 P Q†2 -Morris CS9 sD5 CS 4 sD5 CS 4 46† N Q†2 T†3 X†1 -Rolls Royce sD5 CS 3 sD5 CS 3 47† N Q†2 T†3 X†1 -Marmon-Herrington II ME CS 4 CS 4 48† L†1 N Q†2 T†3 -Marmon-Herrington IIv CS 4 CS 4 49† L†1 N AA†2 -Marmon-Herrington III MFF CS 4 CS 4 48† L†1 P Q†2 -Marmon-Herrington III ME CS 4 CS 4 48† L†1 N Q†2 T†3 -Marmon-Herrington IIIv CS 4 CS 4 49† K†2 L†1 N T†2 -Humber II sD6 CS 3 sD6 CS 3 50† L†1 N -Humber III sD6 CS 4 sD6 CS 4 50† K†2 L†1 N P -Humber IV C6[4+]†[2] sD6 CS 3 sD6 CS 3 51† A C†2 L†1 P -Daimler sD6 CS 3 sD6 CS 3 52† K†1 N P -AEC I sM8 CS 3 sM8 CS 3 53† N X†1 -AEC II D6[J4]7[5]†[2] HE7[3]8[4+]†[1] sM8 CS 4 sM8 CS 4 53 J†2 X† Y†1 -AEC III WP6 s8 sM8 CS 4 WP6 s8 sM8 CS 4 53 X† -Staghound I(a) C6[4+]†[3] sM8 CS 5 sM8 CS 5 54† A C†3 G K†2 X†1 -Staghound II(a) s9 sD6 CS 4 s9 sD6 CS 4 54† A K†3 S†2 X†1 -Bishop no IF s8 CS 5 no IF s8 CS 5 55† K†1 N P -Priest(a) H6 WP7 s8 CS 7 H6 WP7 s8 CS 7 56† A N P -Sexton(a) s8 CS 7 s8 CS 7 57† A K†1 -M3 GMC(a) WP7[J4+]†[1] s8 CS 4 s8 CS 4 58† A NT W†1 -Mk VI AA CS 2 CS 2 59† N O†1 AA†2 -Crusader AA sD7 CS 4[brewup] sD7 CS 4[brewup] 60† AA†1 -M17 MGMC(a) CS 4 CS 4 61† A F† AA†1 -Humber AA CS 2 CS 2 62† L†1 N O†2 AA†3 -Staghound AA(a) CS 3 CS 3 62† A F† X†1 AA†2 -M5(a) cs 5†[1] cs 5†[1] 63† A I†1 N -M9(a) cs 4†[1] cs 4†[1] 63† A I†1 N -M5A1(a) cs 5† cs 5† 63 A I† -M9A1(a) cs 4† cs 4† 63 A I† -Carrier A sD5[4+]†[1] CS 3 CS 3 64† N P U†1 -Carrier B sD5[4+]†[2] CS 3 CS 3 64† N P Q†1 U†2 -Carrier C sD5[4+]†[1] CS 3 CS 3 64† N P U†1 -Carrier, MMG A sD5[4+]†[2] CS 3 CS 3 65† N P Q†1 U†2 -Carrier, MMG B sD5[4+]†[2] CS 4 CS 4 65† U†2 BB†1 -Carrier, 2-in. MTR IR[2+]† s7 CS 3 IR† s7 CS 3 66† N P U†1 -Carrier, 3-in. MTR CS 4[brewup]†[1] CS 4[brewup]†[1] 67† H†1 N P U BB†2 -Priest Kangaroo(a) CS 7 CS 7 68† A D -Ram Kangaroo(a) CS 7 CS 7 68† A D K†1 -White(a) SC cs 4†[1] cs 4†[1] 69† A I†1 N -IP Carrier Mk IIA CS 4 CS 4 70† N P V X†1 -IP Carrier Mk IIB CS 4 CS 4 70† N P Q†2 V X†1 -IP Carrier AOV CS 4 CS 4 70† P Q†1 V X† -IP Carrier, 3-in. MTR IR WP7 s8 CS 5[brewup]† IR WP7 s8 CS 5[brewup]† 71†[2] E†3 H† P V X†1 BB†4 -Wasp sD5† CS 3[brewup] sD5† CS 3[brewup] 72† K†1 U -Badger(a) CS 3 CS 3 72† A K†1 M -Buffalo Mk II(a) sD5† CS 6 sD5† CS 6 73† A D AA†1 -Buffalo Mk IV(a) sD5† CS 6 sD5† CS 6 73† A D E†1 AA†2 -Sherman III DD(a) WP6 s8 sD6 CS 5[brewup] WP6 s8 sD6 CS 5[brewup] 74† A G K†2 R†1 -DUKW(a) cs 7†[1] cs 7†[1] 75† A D I†1 P -Terrapin Mk I cs 7 cs 7 76† D -2pdr Portee CS 4†[1] CS 4†[1] 77† H†1 N P -Morris C9/B CS 4 CS 4 78† P AA†1 -Loyd Carrier cs 5 cs 5 79† N P -Quad FAT CS 5[brewup]† CS 5[brewup]† 80† N P -15-cwt Truck cs 5 cs 5 81† N P -30-cwt Lorry cs 6 cs 6 82† N P -3-Ton Lorry cs 7 cs 7 83† N P -¼-Ton Jeep(a) cs 2†[1] cs 2†[1] 84† A I†1 N P -¾-Ton Truck(a) cs 4 cs 4 85 A N -1½-Ton Truck(a) cs 6 cs 6 85 A N -2½-Ton Truck(a) cs 7 cs 7 85 A N -7½-Ton Truck(a) cs 7 cs 7 85† A N +Name Capabilities (effective) # Notes Comments +------------------------- ---------------------------------------------------- ------------------------------ ------ ------------------------------------------------------------------ ---------- +Mark VIB sD6 CS 3 sD6 CS 3 1† N P +Mark VIC sD6 CS 3 sD6 CS 3 1† n/a +Tetrarch sD6 CS 3 sD6 CS 3 2† n/a +Tetrarch CS HE9†[1] s†[1] sD6 CS 3 HE9†[1] s†[1] sD6 CS 3 2† S†1 +Stuart I(a) sD5 CS 4 sD5 CS 4 3† A N P +Stuart III(a) C6[4+]†[1] HE[4+] sD5 CS 4 sD5 CS 4 3† A C†1 G N P +Stuart V(a) C6†[1] sD5 CS 4 C6†[1] sD5 CS 4 4† A C†1 G +Locust(a) C6† sD6 CS 3 C6† sD6 CS 3 5 A C† +A9 sD6 CS 5[brewup] sD6 CS 5[brewup] 6† K†1 N +A9 CS s†[2] sD6 CS 5[brewup] s†[2] sD6 CS 5[brewup] 6† K†1 N S†2 +A10 Mk IA sD6 CS 5[brewup]† sD6 CS 5[brewup]† 7† B†1 K†2 N +A10 Mk IA CS s†[2] sD6 CS 5[brewup]† s†[2] sD6 CS 5[brewup]† 7† K†1 N S†2 +A13 Mk I sD6 CS 4[brewup] sD6 CS 4[brewup] 8 K† +A13 Mk II sD6 CS 4[brewup] sD6 CS 4[brewup] 8† B†1 K†2 N +A13 Mk II CS s†[2] sD6 CS 4[brewup] s†[2] sD6 CS 4[brewup] 8† K†1 N S†2 +Crusader I sM8 CS 5[brewup] sM8 CS 5[brewup] 9† K†1 N +Crusader I CS HE9 s†[2] sM8 CS 5[brewup] HE9 s†[2] sM8 CS 5[brewup] 9† K†1 N S†2 +Crusader II sM8 CS 4[brewup] sM8 CS 4[brewup] 9† K†1 N +Crusader II CS HE9 s†[2] sM8 CS 4[brewup] HE9 s†[2] sM8 CS 4[brewup] 9† K†1 N S†2 +Crusader III HE7[F3+]†[1] sD7 sM8†[2] CS 3[brewup] sD7 sM8†[2] CS 3[brewup] 10† N Y†1 Z†2 +Grant(a) C5[4+]†[1] HE[4+] s8† sM8 CS 6 s8† sM8 CS 6 11† A C†1 G N P +Lee(a) C5[4+]†[1] HE[4+] s8† sD6 CS 7 s8† sD6 CS 7 11† A C†1 G N P +Sherman II(a) WP6[J4+]†[3] s8 sD6 CS 5[brewup] s8 sD6 CS 5[brewup] 12† A G K†2 N R†1 W†3 +Sherman III(a) WP6[J4+]†[3] s8 sD6 CS 5[brewup] s8 sD6 CS 5[brewup] 13† A G K†2 N R†1 W†3 +Sherman V(a) WP6[J4+]†[3] s8 sD6 CS 5[brewup] s8 sD6 CS 5[brewup] 14† A G K†2 P R†1 W†3 +Sherman IIA(a) A4[4]5[5] s5[5] sM8 CS 6 sM8 CS 6 15† A G K†1 +Sherman IIC(a) D5[S4]6[5]†[2] HE7 sM8 CS 5[brewup] HE7 sM8 CS 5[brewup] 16† A J†2 K†1 +Sherman VC(a) D5[S4]6[5]†[2] HE7 sM8 CS 5[brewup] HE7 sM8 CS 5[brewup] 16† A J†2 K†1 +Sherman IB(a) H9 WP9 s7 sM8 CS 6 H9 WP9 s7 sM8 CS 6 17† A K†1 +Centaur IV H6 s9 sD7 sM8† CS 5 H6 s9 sD7 sM8† CS 5 18 S Z† +Cromwell IV WP6 s8 sD7 sM8†[1] CS 5 WP6 s8 sD7 sM8†[1] CS 5 19† Z†1 +Cromwell VI H6 s9 sD7 sM8†[1] CS 5 H6 s9 sD7 sM8†[1] CS 5 20† S Z†1 +Cromwell VII WP6 s8 sD7 sM8† CS 6 WP6 s8 sD7 sM8† CS 6 19† Z†1 +Cromwell VIII H6 s9 sD7 sM8†[1] CS 6 H6 s9 sD7 sM8†[1] CS 6 20† S Z†1 +Challenger D5[S4]6[5]†[1] HE7 sD7 sM8†[2] CS 6 HE7 sD7 sM8†[2] CS 6 21† J†1 Z†2 +Comet sD7 sM8† CS 6 sD7 sM8† CS 6 22 Z† +Sherman Dozer(a) WP6 s8 sD6 CS 5[brewup] WP6 s8 sD6 CS 5[brewup] 23† A G K†2 P R†1 +Sherman Crab(a) WP6 s8 sD6 CS 5[brewup] WP6 s8 sD6 CS 5[brewup] 24† A G K†2 P R†1 +Matilda I ® sD5 CS 2 ® sD5 CS 2 25† B†1 +Matilda II sD6 CS 5 sD6 CS 5 26† B†1 K†2 N P +Matilda II CS HE9†[2] s†[2] sD6 CS 5 HE9†[2] s†[2] sD6 CS 5 26† K†1 N P S†2 +Valentine II sM8 CS 4 sM8 CS 4 27† N +Valentine V sM8 CS 4 sM8 CS 4 28† K†1 NT +Valentine VIII HE7 sD6 CS 4 HE7 sD6 CS 4 29 NT +Valentine XI WP6 s8 sD8 CS 4 WP6 s8 sD8 CS 4 30 n/a +Churchill I HE9†[2] s†[2] sD5[4] sM8†[1] CS 7 HE9†[2] s†[2] sM8†[1] CS 7 31† NT S†2 Z†1 CC +Churchill IV D6[J4]7[5]†[2] HE7[F3]8[4+]†[1] sD6[4+] sM8†[3] CS 7 sM8†[3] CS 7 32† J†2 N Y†1 Z†3 CC +Churchill V H6 s9 sD7 sM8†[1] CS 7 H6 s9 sD7 sM8†[1] CS 7 33† S Z†1 CC +Churchill VI WP6[J4+]†[1] s8 sD7 sM8†[2] CS 7 s8 sD7 sM8†[2] CS 7 34† W†1 Z†2 CC +Churchill VII WP6 s8 sD7 sM8†[1] CS 7 WP6 s8 sD7 sM8†[1] CS 7 35† Z†1 CC +Churchill VIII H6 s9 sD7 sM8†[1] CS 7 H6 s9 sD7 sM8†[1] CS 7 35† S Z†1 CC +Valentine Bridgelayer sD7 CS 2 sD7 CS 2 36† M P +Churchill Bridgelayer sD7 CS 2 sD7 CS 2 36† M CC +Churchill AVRE no IF sD7 sM8†[1] CS 8 no IF sD7 sM8†[1] CS 8 37† Z†1 CC +Churchill Crocodile WP6 s8 sD7 sM8†[1] CS 7 WP6 s8 sD7 sM8†[1] CS 7 38† Z†1 CC +Deacon HE7[F3+]†[2] CS 5 CS 5 39† L†1 N Y†2 +Wolverine(a) A5[S4]6[5]†[1] HE7 s5[5] CS 7 HE7 CS 7 40† A J†1 +Achilles(a) D6[S4]7[5]†[1] HE7 CS 7 HE7 CS 7 40† A J†1 +Archer D6[4]7[5]†[1] HE7 sD7 CS 5 HE7 sD7 CS 5 41† J†1 +Daimler sD4[4+]† CS 2 CS 2 42† M N P +Lynx sD5 CS 2 sD5 CS 2 42† L†1 M P +Humber sD4[4+]† CS 2 CS 2 43† L†1 M P BB†2 +Stuart Recce CS 5 CS 5 44† A D NT P +Humber III LRC sD5 CS 3 sD5 CS 3 45† L†1 N P Q†2 +Otter LRC sD5 CS 3 sD5 CS 3 45† L†1 P Q†2 +Morris CS9 sD5 CS 4 sD5 CS 4 46† N Q†2 T†3 X†1 +Rolls Royce sD5 CS 3 sD5 CS 3 47† N Q†2 T†3 X†1 +Marmon-Herrington II ME CS 4 CS 4 48† L†1 N Q†2 T†3 +Marmon-Herrington IIv CS 4 CS 4 49† L†1 N AA†2 +Marmon-Herrington III MFF CS 4 CS 4 48† L†1 P Q†2 +Marmon-Herrington III ME CS 4 CS 4 48† L†1 N Q†2 T†3 +Marmon-Herrington IIIv CS 4 CS 4 49† K†2 L†1 N T†2 +Humber II sD6 CS 3 sD6 CS 3 50† L†1 N +Humber III sD6 CS 4 sD6 CS 4 50† K†2 L†1 N P +Humber IV C6[4+]†[2] sD6 CS 3 sD6 CS 3 51† A C†2 L†1 P +Daimler sD6 CS 3 sD6 CS 3 52† K†1 N P +AEC I sM8 CS 3 sM8 CS 3 53† N X†1 +AEC II D6[J4]7[5]†[2] HE7[3]8[4+]†[1] sM8 CS 4 sM8 CS 4 53 J†2 X† Y†1 +AEC III WP6 s8 sM8 CS 4 WP6 s8 sM8 CS 4 53 X† +Staghound I(a) C6[4+]†[3] sM8 CS 5 sM8 CS 5 54† A C†3 G K†2 X†1 +Staghound II(a) s9 sD6 CS 4 s9 sD6 CS 4 54† A K†3 S†2 X†1 +Bishop no IF s8 CS 5 no IF s8 CS 5 55† K†1 N P +Priest(a) H6 WP7 s8 CS 7 H6 WP7 s8 CS 7 56† A N P +Sexton(a) s8 CS 7 s8 CS 7 57† A K†1 +M3 GMC(a) WP7[J4+]†[1] s8 CS 4 s8 CS 4 58† A NT W†1 +Mk VI AA CS 2 CS 2 59† N O†1 AA†2 +Crusader AA sD7 CS 4[brewup] sD7 CS 4[brewup] 60† AA†1 +M17 MGMC(a) CS 4 CS 4 61† A F† AA†1 +Humber AA CS 2 CS 2 62† L†1 N O†2 AA†3 +Staghound AA(a) CS 3 CS 3 62† A F† X†1 AA†2 +M5(a) cs 5†[1] cs 5†[1] 63† A I†1 N +M9(a) cs 4†[1] cs 4†[1] 63† A I†1 N +M5A1(a) cs 5† cs 5† 63 A I† +M9A1(a) cs 4† cs 4† 63 A I† +Carrier A sD5[4+]†[1] CS 3 CS 3 64† N P U†1 +Carrier B sD5[4+]†[2] CS 3 CS 3 64† N P Q†1 U†2 +Carrier C sD5[4+]†[1] CS 3 CS 3 64† N P U†1 +Carrier, MMG A sD5[4+]†[2] CS 3 CS 3 65† N P Q†1 U†2 +Carrier, MMG B sD5[4+]†[2] CS 4 CS 4 65† U†2 BB†1 +Carrier, 2-in. MTR IR[2+]† s7 CS 3 IR† s7 CS 3 66† N P U†1 +Carrier, 3-in. MTR CS 4[brewup]†[1] CS 4[brewup]†[1] 67† H†1 N P U BB†2 +Priest Kangaroo(a) CS 7 CS 7 68† A D +Ram Kangaroo(a) CS 7 CS 7 68† A D K†1 +White(a) SC cs 4†[1] cs 4†[1] 69† A I†1 N +IP Carrier Mk IIA CS 4 CS 4 70† N P V X†1 +IP Carrier Mk IIB CS 4 CS 4 70† N P Q†2 V X†1 +IP Carrier AOV CS 4 CS 4 70† P Q†1 V X† +IP Carrier, 3-in. MTR IR WP7 s8 CS 5[brewup]† IR WP7 s8 CS 5[brewup]† 71†[2] E†3 H† P V X†1 BB†4 +Wasp sD5† CS 3[brewup] sD5† CS 3[brewup] 72† K†1 U +Badger(a) CS 3 CS 3 72† A K†1 M +Buffalo Mk II(a) sD5† CS 6 sD5† CS 6 73† A D AA†1 +Buffalo Mk IV(a) sD5† CS 6 sD5† CS 6 73† A D E†1 AA†2 +Sherman III DD(a) WP6 s8 sD6 CS 5[brewup] WP6 s8 sD6 CS 5[brewup] 74† A G K†2 R†1 +DUKW(a) cs 7†[1] cs 7†[1] 75† A D I†1 P +Terrapin Mk I cs 7 cs 7 76† D +2pdr Portee CS 4†[1] CS 4†[1] 77† H†1 N P +Morris C9/B CS 4 CS 4 78† P AA†1 +Loyd Carrier cs 5 cs 5 79† N P +Quad FAT CS 5[brewup]† CS 5[brewup]† 80† N P +15-cwt Truck cs 5 cs 5 81† N P +30-cwt Lorry cs 6 cs 6 82† N P +3-Ton Lorry cs 7 cs 7 83† N P +¼-Ton Jeep(a) cs 2†[1] cs 2†[1] 84† A I†1 N P +¾-Ton Truck(a) cs 4 cs 4 85 A N +1½-Ton Truck(a) cs 6 cs 6 85 A N +2½-Ton Truck(a) cs 7 cs 7 85 A N +7½-Ton Truck(a) cs 7 cs 7 85† A N +M4A3E8(a) A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 34 A†1 FF† UU +M4A3E8 Dozer(a) A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 34 A†1 TT† UU +Cromwell VII s8† sD7 sM8†[1] CS 6 s8† sD7 sM8†[1] CS 6 35† N ZZ†1 +Centaur Dozer sD7 CS 2†[1] sD7 CS 2†[1] 36†[1] TT† +Churchill VII WP6 s8 sD7 sM8†[1] CS 7 WP6 s8 sD7 sM8†[1] CS 7 37† N CC ZZ†1 +Centurion III D† HE8 WP6 s8 sD7 sM8†[1] CS 7 D† HE8 WP6 s8 sD7 sM8†[1] CS 7 38† CC ZZ†1 +Centurion III(L) D8 WP6 s8 sD7 sM8†[2] CS 7 D8 WP6 s8 sD7 sM8†[2] CS 7 38† CC FF†1 ZZ†2 +Churchill Bridgelayer sD7 CS 2 sD7 CS 2 39† N CC +M4A1 MC(a) IR WP8 CS 4[brewup] IR WP8 CS 4[brewup] 40† Q†1 NN UU +M9(a) cs 4 cs 4 41 N UU +Daimler sD4 CS 2 sD4 CS 2 42† N +Carrier A sD5 CS 3 sD5 CS 3 43† N U†1 +Carrier C sD5 CS 3 sD5 CS 3 43† N U†2 Z†1 +Carrier, MMG A sD5 CS 3 sD5 CS 3 44† N U†1 +Carrier, 3-in. Mtr CS 4[brewup] CS 4[brewup] 45† U MM†1 NN +Oxford Carrier CS 5† CS 5† 46† EE†1 +Oxford Carrier, MMG CS 5 CS 5 47† EE†1 +Oxford Carrier, HMG CS 5 CS 5 47† G†1 EE†2 +Oxford Carrier, 3-in Mtr CS 5 CS 5 48† EE†2 MM†1 NN +IP Carrier AOV CS 4 CS 4 49† N W†1 +Wasp sD5† CS 3[brewup] sD5† CS 3[brewup] 50† N U +Morris C9/B CS 4 CS 4 51† N AA†1 +Quad FAT cs 5[brewup]† cs 5[brewup]† 52† N +15-cwt cs 5 cs 5 53† N +3-Ton Lorry cs 7 cs 7 53† N +M3A1 CS 5 CS 5 54† E† H K Y Z†1 UU +M20 sP5 CS 4 sP5 CS 4 55† D†4 K Q†2 W†1 Y Z†3 UU +M8 C7 sP5 CS 4 C7 sP5 CS 4 56† C K W†1 Y UU +¼-Ton Jeep cs 2†[1] cs 2†[1] 57† K L†2 M N O P Q†1 Y UU +¾-Ton cs 4 cs 4 57† K N O Y UU +2½-Ton cs 7 cs 7 57† K M N O P Y UU diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1943.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1943.txt index 88f8649..16bf7c5 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1943.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1943.txt @@ -1,131 +1,162 @@ === vehicles/british/1943 === -Name Capabilities (effective) # Notes Comments -------------------------- ---------------------------------------------------- -------------------------- ------ ---------------------------------------------------- ---------- -Mark VIB sD6 CS 3 sD6 CS 3 1† N P -Mark VIC sD6 CS 3 sD6 CS 3 1† n/a -Tetrarch sD6 CS 3 sD6 CS 3 2† n/a -Tetrarch CS HE9†[1] s†[1] sD6 CS 3 HE9†[1] s†[1] sD6 CS 3 2† S†1 -Stuart I(a) sD5 CS 4 sD5 CS 4 3† A N P -Stuart III(a) C6[4+]†[1] HE[4+] sD5 CS 4 sD5 CS 4 3† A C†1 G N P -Stuart V(a) C6†[1] sD5 CS 4 C6†[1] sD5 CS 4 4† A C†1 G -Locust(a) C6† sD6 CS 3 C6† sD6 CS 3 5 A C† -A9 sD6 CS 5[brewup] sD6 CS 5[brewup] 6† K†1 N -A9 CS s†[2] sD6 CS 5[brewup] s†[2] sD6 CS 5[brewup] 6† K†1 N S†2 -A10 Mk IA sD6 CS 5[brewup]† sD6 CS 5[brewup]† 7† B†1 K†2 N -A10 Mk IA CS s†[2] sD6 CS 5[brewup]† s†[2] sD6 CS 5[brewup]† 7† K†1 N S†2 -A13 Mk I sD6 CS 4[brewup] sD6 CS 4[brewup] 8 K† -A13 Mk II sD6 CS 4[brewup] sD6 CS 4[brewup] 8† B†1 K†2 N -A13 Mk II CS s†[2] sD6 CS 4[brewup] s†[2] sD6 CS 4[brewup] 8† K†1 N S†2 -Crusader I sM8 CS 5[brewup] sM8 CS 5[brewup] 9† K†1 N -Crusader I CS HE9 s†[2] sM8 CS 5[brewup] HE9 s†[2] sM8 CS 5[brewup] 9† K†1 N S†2 -Crusader II sM8 CS 4[brewup] sM8 CS 4[brewup] 9† K†1 N -Crusader II CS HE9 s†[2] sM8 CS 4[brewup] HE9 s†[2] sM8 CS 4[brewup] 9† K†1 N S†2 -Crusader III HE7[F3+]†[1] sD7 sM8†[2] CS 3[brewup] sD7 sM8†[2] CS 3[brewup] 10† N Y†1 Z†2 -Grant(a) C5[4+]†[1] HE[4+] s8† sM8 CS 6 s8† sM8 CS 6 11† A C†1 G N P -Lee(a) C5[4+]†[1] HE[4+] s8† sD6 CS 7 s8† sD6 CS 7 11† A C†1 G N P -Sherman II(a) WP6[J4+]†[3] s8 sD6 CS 5[brewup] s8 sD6 CS 5[brewup] 12† A G K†2 N R†1 W†3 -Sherman III(a) WP6[J4+]†[3] s8 sD6 CS 5[brewup] s8 sD6 CS 5[brewup] 13† A G K†2 N R†1 W†3 -Sherman V(a) WP6[J4+]†[3] s8 sD6 CS 5[brewup] s8 sD6 CS 5[brewup] 14† A G K†2 P R†1 W†3 -Sherman IIA(a) A4[4]5[5] s5[5] sM8 CS 6 sM8 CS 6 15† A G K†1 -Sherman IIC(a) D5[S4]6[5]†[2] HE7 sM8 CS 5[brewup] HE7 sM8 CS 5[brewup] 16† A J†2 K†1 -Sherman VC(a) D5[S4]6[5]†[2] HE7 sM8 CS 5[brewup] HE7 sM8 CS 5[brewup] 16† A J†2 K†1 -Sherman IB(a) H9 WP9 s7 sM8 CS 6 H9 WP9 s7 sM8 CS 6 17† A K†1 -Centaur IV H6 s9 sD7 sM8† CS 5 H6 s9 sD7 sM8† CS 5 18 S Z† -Cromwell IV WP6 s8 sD7 sM8†[1] CS 5 WP6 s8 sD7 sM8†[1] CS 5 19† Z†1 -Cromwell VI H6 s9 sD7 sM8†[1] CS 5 H6 s9 sD7 sM8†[1] CS 5 20† S Z†1 -Cromwell VII WP6 s8 sD7 sM8† CS 6 WP6 s8 sD7 sM8† CS 6 19† Z†1 -Cromwell VIII H6 s9 sD7 sM8†[1] CS 6 H6 s9 sD7 sM8†[1] CS 6 20† S Z†1 -Challenger D5[S4]6[5]†[1] HE7 sD7 sM8†[2] CS 6 HE7 sD7 sM8†[2] CS 6 21† J†1 Z†2 -Comet sD7 sM8† CS 6 sD7 sM8† CS 6 22 Z† -Sherman Dozer(a) WP6 s8 sD6 CS 5[brewup] WP6 s8 sD6 CS 5[brewup] 23† A G K†2 P R†1 -Sherman Crab(a) WP6 s8 sD6 CS 5[brewup] WP6 s8 sD6 CS 5[brewup] 24† A G K†2 P R†1 -Matilda I ® sD5 CS 2 ® sD5 CS 2 25† B†1 -Matilda II sD6 CS 5 sD6 CS 5 26† B†1 K†2 N P -Matilda II CS HE9†[2] s†[2] sD6 CS 5 HE9†[2] s†[2] sD6 CS 5 26† K†1 N P S†2 -Valentine II sM8 CS 4 sM8 CS 4 27† N -Valentine V sM8 CS 4 sM8 CS 4 28† K†1 NT -Valentine VIII HE7 sD6 CS 4 HE7 sD6 CS 4 29 NT -Valentine XI WP6 s8 sD8 CS 4 WP6 s8 sD8 CS 4 30 n/a -Churchill I HE9†[2] s†[2] sD5[4] sM8†[1] CS 7 HE9†[2] s†[2] sM8†[1] CS 7 31† NT S†2 Z†1 CC -Churchill IV D6[J4]7[5]†[2] HE7[F3]8[4+]†[1] sD6[4+] sM8†[3] CS 7 sM8†[3] CS 7 32† J†2 N Y†1 Z†3 CC -Churchill V H6 s9 sD7 sM8†[1] CS 7 H6 s9 sD7 sM8†[1] CS 7 33† S Z†1 CC -Churchill VI WP6[J4+]†[1] s8 sD7 sM8†[2] CS 7 s8 sD7 sM8†[2] CS 7 34† W†1 Z†2 CC -Churchill VII WP6 s8 sD7 sM8†[1] CS 7 WP6 s8 sD7 sM8†[1] CS 7 35† Z†1 CC -Churchill VIII H6 s9 sD7 sM8†[1] CS 7 H6 s9 sD7 sM8†[1] CS 7 35† S Z†1 CC -Valentine Bridgelayer sD7 CS 2 sD7 CS 2 36† M P -Churchill Bridgelayer sD7 CS 2 sD7 CS 2 36† M CC -Churchill AVRE no IF sD7 sM8†[1] CS 8 no IF sD7 sM8†[1] CS 8 37† Z†1 CC -Churchill Crocodile WP6 s8 sD7 sM8†[1] CS 7 WP6 s8 sD7 sM8†[1] CS 7 38† Z†1 CC -Deacon HE7[F3+]†[2] CS 5 CS 5 39† L†1 N Y†2 -Wolverine(a) A5[S4]6[5]†[1] HE7 s5[5] CS 7 HE7 CS 7 40† A J†1 -Achilles(a) D6[S4]7[5]†[1] HE7 CS 7 HE7 CS 7 40† A J†1 -Archer D6[4]7[5]†[1] HE7 sD7 CS 5 HE7 sD7 CS 5 41† J†1 -Daimler sD4[4+]† CS 2 CS 2 42† M N P -Lynx sD5 CS 2 sD5 CS 2 42† L†1 M P -Humber sD4[4+]† CS 2 CS 2 43† L†1 M P BB†2 -Stuart Recce CS 5 CS 5 44† A D NT P -Humber III LRC sD5 CS 3 sD5 CS 3 45† L†1 N P Q†2 -Otter LRC sD5 CS 3 sD5 CS 3 45† L†1 P Q†2 -Morris CS9 sD5 CS 4 sD5 CS 4 46† N Q†2 T†3 X†1 -Rolls Royce sD5 CS 3 sD5 CS 3 47† N Q†2 T†3 X†1 -Marmon-Herrington II ME CS 4 CS 4 48† L†1 N Q†2 T†3 -Marmon-Herrington IIv CS 4 CS 4 49† L†1 N AA†2 -Marmon-Herrington III MFF CS 4 CS 4 48† L†1 P Q†2 -Marmon-Herrington III ME CS 4 CS 4 48† L†1 N Q†2 T†3 -Marmon-Herrington IIIv CS 4 CS 4 49† K†2 L†1 N T†2 -Humber II sD6 CS 3 sD6 CS 3 50† L†1 N -Humber III sD6 CS 4 sD6 CS 4 50† K†2 L†1 N P -Humber IV C6[4+]†[2] sD6 CS 3 sD6 CS 3 51† A C†2 L†1 P -Daimler sD6 CS 3 sD6 CS 3 52† K†1 N P -AEC I sM8 CS 3 sM8 CS 3 53† N X†1 -AEC II D6[J4]7[5]†[2] HE7[3]8[4+]†[1] sM8 CS 4 HE7†[1] sM8 CS 4 53 J†2 X† Y†1 -AEC III WP6 s8 sM8 CS 4 WP6 s8 sM8 CS 4 53 X† -Staghound I(a) C6[4+]†[3] sM8 CS 5 sM8 CS 5 54† A C†3 G K†2 X†1 -Staghound II(a) s9 sD6 CS 4 s9 sD6 CS 4 54† A K†3 S†2 X†1 -Bishop no IF s8 CS 5 no IF s8 CS 5 55† K†1 N P -Priest(a) H6 WP7 s8 CS 7 H6 WP7 s8 CS 7 56† A N P -Sexton(a) s8 CS 7 s8 CS 7 57† A K†1 -M3 GMC(a) WP7[J4+]†[1] s8 CS 4 s8 CS 4 58† A NT W†1 -Mk VI AA CS 2 CS 2 59† N O†1 AA†2 -Crusader AA sD7 CS 4[brewup] sD7 CS 4[brewup] 60† AA†1 -M17 MGMC(a) CS 4 CS 4 61† A F† AA†1 -Humber AA CS 2 CS 2 62† L†1 N O†2 AA†3 -Staghound AA(a) CS 3 CS 3 62† A F† X†1 AA†2 -M5(a) cs 5†[1] cs 5†[1] 63† A I†1 N -M9(a) cs 4†[1] cs 4†[1] 63† A I†1 N -M5A1(a) cs 5† cs 5† 63 A I† -M9A1(a) cs 4† cs 4† 63 A I† -Carrier A sD5[4+]†[1] CS 3 CS 3 64† N P U†1 -Carrier B sD5[4+]†[2] CS 3 CS 3 64† N P Q†1 U†2 -Carrier C sD5[4+]†[1] CS 3 CS 3 64† N P U†1 -Carrier, MMG A sD5[4+]†[2] CS 3 CS 3 65† N P Q†1 U†2 -Carrier, MMG B sD5[4+]†[2] CS 4 CS 4 65† U†2 BB†1 -Carrier, 2-in. MTR IR[2+]† s7 CS 3 IR† s7 CS 3 66† N P U†1 -Carrier, 3-in. MTR CS 4[brewup]†[1] CS 4[brewup]†[1] 67† H†1 N P U BB†2 -Priest Kangaroo(a) CS 7 CS 7 68† A D -Ram Kangaroo(a) CS 7 CS 7 68† A D K†1 -White(a) SC cs 4†[1] cs 4†[1] 69† A I†1 N -IP Carrier Mk IIA CS 4 CS 4 70† N P V X†1 -IP Carrier Mk IIB CS 4 CS 4 70† N P Q†2 V X†1 -IP Carrier AOV CS 4 CS 4 70† P Q†1 V X† -IP Carrier, 3-in. MTR IR WP7 s8 CS 5[brewup]† IR WP7 s8 CS 5[brewup]† 71†[2] E†3 H† P V X†1 BB†4 -Wasp sD5† CS 3[brewup] sD5† CS 3[brewup] 72† K†1 U -Badger(a) CS 3 CS 3 72† A K†1 M -Buffalo Mk II(a) sD5† CS 6 sD5† CS 6 73† A D AA†1 -Buffalo Mk IV(a) sD5† CS 6 sD5† CS 6 73† A D E†1 AA†2 -Sherman III DD(a) WP6 s8 sD6 CS 5[brewup] WP6 s8 sD6 CS 5[brewup] 74† A G K†2 R†1 -DUKW(a) cs 7†[1] cs 7†[1] 75† A D I†1 P -Terrapin Mk I cs 7 cs 7 76† D -2pdr Portee CS 4†[1] CS 4†[1] 77† H†1 N P -Morris C9/B CS 4 CS 4 78† P AA†1 -Loyd Carrier cs 5 cs 5 79† N P -Quad FAT CS 5[brewup]† CS 5[brewup]† 80† N P -15-cwt Truck cs 5 cs 5 81† N P -30-cwt Lorry cs 6 cs 6 82† N P -3-Ton Lorry cs 7 cs 7 83† N P -¼-Ton Jeep(a) cs 2†[1] cs 2†[1] 84† A I†1 N P -¾-Ton Truck(a) cs 4 cs 4 85 A N -1½-Ton Truck(a) cs 6 cs 6 85 A N -2½-Ton Truck(a) cs 7 cs 7 85 A N -7½-Ton Truck(a) cs 7 cs 7 85† A N +Name Capabilities (effective) # Notes Comments +------------------------- ---------------------------------------------------- ------------------------------ ------ ------------------------------------------------------------------ ---------- +Mark VIB sD6 CS 3 sD6 CS 3 1† N P +Mark VIC sD6 CS 3 sD6 CS 3 1† n/a +Tetrarch sD6 CS 3 sD6 CS 3 2† n/a +Tetrarch CS HE9†[1] s†[1] sD6 CS 3 HE9†[1] s†[1] sD6 CS 3 2† S†1 +Stuart I(a) sD5 CS 4 sD5 CS 4 3† A N P +Stuart III(a) C6[4+]†[1] HE[4+] sD5 CS 4 sD5 CS 4 3† A C†1 G N P +Stuart V(a) C6†[1] sD5 CS 4 C6†[1] sD5 CS 4 4† A C†1 G +Locust(a) C6† sD6 CS 3 C6† sD6 CS 3 5 A C† +A9 sD6 CS 5[brewup] sD6 CS 5[brewup] 6† K†1 N +A9 CS s†[2] sD6 CS 5[brewup] s†[2] sD6 CS 5[brewup] 6† K†1 N S†2 +A10 Mk IA sD6 CS 5[brewup]† sD6 CS 5[brewup]† 7† B†1 K†2 N +A10 Mk IA CS s†[2] sD6 CS 5[brewup]† s†[2] sD6 CS 5[brewup]† 7† K†1 N S†2 +A13 Mk I sD6 CS 4[brewup] sD6 CS 4[brewup] 8 K† +A13 Mk II sD6 CS 4[brewup] sD6 CS 4[brewup] 8† B†1 K†2 N +A13 Mk II CS s†[2] sD6 CS 4[brewup] s†[2] sD6 CS 4[brewup] 8† K†1 N S†2 +Crusader I sM8 CS 5[brewup] sM8 CS 5[brewup] 9† K†1 N +Crusader I CS HE9 s†[2] sM8 CS 5[brewup] HE9 s†[2] sM8 CS 5[brewup] 9† K†1 N S†2 +Crusader II sM8 CS 4[brewup] sM8 CS 4[brewup] 9† K†1 N +Crusader II CS HE9 s†[2] sM8 CS 4[brewup] HE9 s†[2] sM8 CS 4[brewup] 9† K†1 N S†2 +Crusader III HE7[F3+]†[1] sD7 sM8†[2] CS 3[brewup] sD7 sM8†[2] CS 3[brewup] 10† N Y†1 Z†2 +Grant(a) C5[4+]†[1] HE[4+] s8† sM8 CS 6 s8† sM8 CS 6 11† A C†1 G N P +Lee(a) C5[4+]†[1] HE[4+] s8† sD6 CS 7 s8† sD6 CS 7 11† A C†1 G N P +Sherman II(a) WP6[J4+]†[3] s8 sD6 CS 5[brewup] s8 sD6 CS 5[brewup] 12† A G K†2 N R†1 W†3 +Sherman III(a) WP6[J4+]†[3] s8 sD6 CS 5[brewup] s8 sD6 CS 5[brewup] 13† A G K†2 N R†1 W†3 +Sherman V(a) WP6[J4+]†[3] s8 sD6 CS 5[brewup] s8 sD6 CS 5[brewup] 14† A G K†2 P R†1 W†3 +Sherman IIA(a) A4[4]5[5] s5[5] sM8 CS 6 sM8 CS 6 15† A G K†1 +Sherman IIC(a) D5[S4]6[5]†[2] HE7 sM8 CS 5[brewup] HE7 sM8 CS 5[brewup] 16† A J†2 K†1 +Sherman VC(a) D5[S4]6[5]†[2] HE7 sM8 CS 5[brewup] HE7 sM8 CS 5[brewup] 16† A J†2 K†1 +Sherman IB(a) H9 WP9 s7 sM8 CS 6 H9 WP9 s7 sM8 CS 6 17† A K†1 +Centaur IV H6 s9 sD7 sM8† CS 5 H6 s9 sD7 sM8† CS 5 18 S Z† +Cromwell IV WP6 s8 sD7 sM8†[1] CS 5 WP6 s8 sD7 sM8†[1] CS 5 19† Z†1 +Cromwell VI H6 s9 sD7 sM8†[1] CS 5 H6 s9 sD7 sM8†[1] CS 5 20† S Z†1 +Cromwell VII WP6 s8 sD7 sM8† CS 6 WP6 s8 sD7 sM8† CS 6 19† Z†1 +Cromwell VIII H6 s9 sD7 sM8†[1] CS 6 H6 s9 sD7 sM8†[1] CS 6 20† S Z†1 +Challenger D5[S4]6[5]†[1] HE7 sD7 sM8†[2] CS 6 HE7 sD7 sM8†[2] CS 6 21† J†1 Z†2 +Comet sD7 sM8† CS 6 sD7 sM8† CS 6 22 Z† +Sherman Dozer(a) WP6 s8 sD6 CS 5[brewup] WP6 s8 sD6 CS 5[brewup] 23† A G K†2 P R†1 +Sherman Crab(a) WP6 s8 sD6 CS 5[brewup] WP6 s8 sD6 CS 5[brewup] 24† A G K†2 P R†1 +Matilda I ® sD5 CS 2 ® sD5 CS 2 25† B†1 +Matilda II sD6 CS 5 sD6 CS 5 26† B†1 K†2 N P +Matilda II CS HE9†[2] s†[2] sD6 CS 5 HE9†[2] s†[2] sD6 CS 5 26† K†1 N P S†2 +Valentine II sM8 CS 4 sM8 CS 4 27† N +Valentine V sM8 CS 4 sM8 CS 4 28† K†1 NT +Valentine VIII HE7 sD6 CS 4 HE7 sD6 CS 4 29 NT +Valentine XI WP6 s8 sD8 CS 4 WP6 s8 sD8 CS 4 30 n/a +Churchill I HE9†[2] s†[2] sD5[4] sM8†[1] CS 7 HE9†[2] s†[2] sM8†[1] CS 7 31† NT S†2 Z†1 CC +Churchill IV D6[J4]7[5]†[2] HE7[F3]8[4+]†[1] sD6[4+] sM8†[3] CS 7 sM8†[3] CS 7 32† J†2 N Y†1 Z†3 CC +Churchill V H6 s9 sD7 sM8†[1] CS 7 H6 s9 sD7 sM8†[1] CS 7 33† S Z†1 CC +Churchill VI WP6[J4+]†[1] s8 sD7 sM8†[2] CS 7 s8 sD7 sM8†[2] CS 7 34† W†1 Z†2 CC +Churchill VII WP6 s8 sD7 sM8†[1] CS 7 WP6 s8 sD7 sM8†[1] CS 7 35† Z†1 CC +Churchill VIII H6 s9 sD7 sM8†[1] CS 7 H6 s9 sD7 sM8†[1] CS 7 35† S Z†1 CC +Valentine Bridgelayer sD7 CS 2 sD7 CS 2 36† M P +Churchill Bridgelayer sD7 CS 2 sD7 CS 2 36† M CC +Churchill AVRE no IF sD7 sM8†[1] CS 8 no IF sD7 sM8†[1] CS 8 37† Z†1 CC +Churchill Crocodile WP6 s8 sD7 sM8†[1] CS 7 WP6 s8 sD7 sM8†[1] CS 7 38† Z†1 CC +Deacon HE7[F3+]†[2] CS 5 CS 5 39† L†1 N Y†2 +Wolverine(a) A5[S4]6[5]†[1] HE7 s5[5] CS 7 HE7 CS 7 40† A J†1 +Achilles(a) D6[S4]7[5]†[1] HE7 CS 7 HE7 CS 7 40† A J†1 +Archer D6[4]7[5]†[1] HE7 sD7 CS 5 HE7 sD7 CS 5 41† J†1 +Daimler sD4[4+]† CS 2 CS 2 42† M N P +Lynx sD5 CS 2 sD5 CS 2 42† L†1 M P +Humber sD4[4+]† CS 2 CS 2 43† L†1 M P BB†2 +Stuart Recce CS 5 CS 5 44† A D NT P +Humber III LRC sD5 CS 3 sD5 CS 3 45† L†1 N P Q†2 +Otter LRC sD5 CS 3 sD5 CS 3 45† L†1 P Q†2 +Morris CS9 sD5 CS 4 sD5 CS 4 46† N Q†2 T†3 X†1 +Rolls Royce sD5 CS 3 sD5 CS 3 47† N Q†2 T†3 X†1 +Marmon-Herrington II ME CS 4 CS 4 48† L†1 N Q†2 T†3 +Marmon-Herrington IIv CS 4 CS 4 49† L†1 N AA†2 +Marmon-Herrington III MFF CS 4 CS 4 48† L†1 P Q†2 +Marmon-Herrington III ME CS 4 CS 4 48† L†1 N Q†2 T†3 +Marmon-Herrington IIIv CS 4 CS 4 49† K†2 L†1 N T†2 +Humber II sD6 CS 3 sD6 CS 3 50† L†1 N +Humber III sD6 CS 4 sD6 CS 4 50† K†2 L†1 N P +Humber IV C6[4+]†[2] sD6 CS 3 sD6 CS 3 51† A C†2 L†1 P +Daimler sD6 CS 3 sD6 CS 3 52† K†1 N P +AEC I sM8 CS 3 sM8 CS 3 53† N X†1 +AEC II D6[J4]7[5]†[2] HE7[3]8[4+]†[1] sM8 CS 4 HE7†[1] sM8 CS 4 53 J†2 X† Y†1 +AEC III WP6 s8 sM8 CS 4 WP6 s8 sM8 CS 4 53 X† +Staghound I(a) C6[4+]†[3] sM8 CS 5 sM8 CS 5 54† A C†3 G K†2 X†1 +Staghound II(a) s9 sD6 CS 4 s9 sD6 CS 4 54† A K†3 S†2 X†1 +Bishop no IF s8 CS 5 no IF s8 CS 5 55† K†1 N P +Priest(a) H6 WP7 s8 CS 7 H6 WP7 s8 CS 7 56† A N P +Sexton(a) s8 CS 7 s8 CS 7 57† A K†1 +M3 GMC(a) WP7[J4+]†[1] s8 CS 4 s8 CS 4 58† A NT W†1 +Mk VI AA CS 2 CS 2 59† N O†1 AA†2 +Crusader AA sD7 CS 4[brewup] sD7 CS 4[brewup] 60† AA†1 +M17 MGMC(a) CS 4 CS 4 61† A F† AA†1 +Humber AA CS 2 CS 2 62† L†1 N O†2 AA†3 +Staghound AA(a) CS 3 CS 3 62† A F† X†1 AA†2 +M5(a) cs 5†[1] cs 5†[1] 63† A I†1 N +M9(a) cs 4†[1] cs 4†[1] 63† A I†1 N +M5A1(a) cs 5† cs 5† 63 A I† +M9A1(a) cs 4† cs 4† 63 A I† +Carrier A sD5[4+]†[1] CS 3 CS 3 64† N P U†1 +Carrier B sD5[4+]†[2] CS 3 CS 3 64† N P Q†1 U†2 +Carrier C sD5[4+]†[1] CS 3 CS 3 64† N P U†1 +Carrier, MMG A sD5[4+]†[2] CS 3 CS 3 65† N P Q†1 U†2 +Carrier, MMG B sD5[4+]†[2] CS 4 CS 4 65† U†2 BB†1 +Carrier, 2-in. MTR IR[2+]† s7 CS 3 IR† s7 CS 3 66† N P U†1 +Carrier, 3-in. MTR CS 4[brewup]†[1] CS 4[brewup]†[1] 67† H†1 N P U BB†2 +Priest Kangaroo(a) CS 7 CS 7 68† A D +Ram Kangaroo(a) CS 7 CS 7 68† A D K†1 +White(a) SC cs 4†[1] cs 4†[1] 69† A I†1 N +IP Carrier Mk IIA CS 4 CS 4 70† N P V X†1 +IP Carrier Mk IIB CS 4 CS 4 70† N P Q†2 V X†1 +IP Carrier AOV CS 4 CS 4 70† P Q†1 V X† +IP Carrier, 3-in. MTR IR WP7 s8 CS 5[brewup]† IR WP7 s8 CS 5[brewup]† 71†[2] E†3 H† P V X†1 BB†4 +Wasp sD5† CS 3[brewup] sD5† CS 3[brewup] 72† K†1 U +Badger(a) CS 3 CS 3 72† A K†1 M +Buffalo Mk II(a) sD5† CS 6 sD5† CS 6 73† A D AA†1 +Buffalo Mk IV(a) sD5† CS 6 sD5† CS 6 73† A D E†1 AA†2 +Sherman III DD(a) WP6 s8 sD6 CS 5[brewup] WP6 s8 sD6 CS 5[brewup] 74† A G K†2 R†1 +DUKW(a) cs 7†[1] cs 7†[1] 75† A D I†1 P +Terrapin Mk I cs 7 cs 7 76† D +2pdr Portee CS 4†[1] CS 4†[1] 77† H†1 N P +Morris C9/B CS 4 CS 4 78† P AA†1 +Loyd Carrier cs 5 cs 5 79† N P +Quad FAT CS 5[brewup]† CS 5[brewup]† 80† N P +15-cwt Truck cs 5 cs 5 81† N P +30-cwt Lorry cs 6 cs 6 82† N P +3-Ton Lorry cs 7 cs 7 83† N P +¼-Ton Jeep(a) cs 2†[1] cs 2†[1] 84† A I†1 N P +¾-Ton Truck(a) cs 4 cs 4 85 A N +1½-Ton Truck(a) cs 6 cs 6 85 A N +2½-Ton Truck(a) cs 7 cs 7 85 A N +7½-Ton Truck(a) cs 7 cs 7 85† A N +M4A3E8(a) A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 34 A†1 FF† UU +M4A3E8 Dozer(a) A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 34 A†1 TT† UU +Cromwell VII s8† sD7 sM8†[1] CS 6 s8† sD7 sM8†[1] CS 6 35† N ZZ†1 +Centaur Dozer sD7 CS 2†[1] sD7 CS 2†[1] 36†[1] TT† +Churchill VII WP6 s8 sD7 sM8†[1] CS 7 WP6 s8 sD7 sM8†[1] CS 7 37† N CC ZZ†1 +Centurion III D† HE8 WP6 s8 sD7 sM8†[1] CS 7 D† HE8 WP6 s8 sD7 sM8†[1] CS 7 38† CC ZZ†1 +Centurion III(L) D8 WP6 s8 sD7 sM8†[2] CS 7 D8 WP6 s8 sD7 sM8†[2] CS 7 38† CC FF†1 ZZ†2 +Churchill Bridgelayer sD7 CS 2 sD7 CS 2 39† N CC +M4A1 MC(a) IR WP8 CS 4[brewup] IR WP8 CS 4[brewup] 40† Q†1 NN UU +M9(a) cs 4 cs 4 41 N UU +Daimler sD4 CS 2 sD4 CS 2 42† N +Carrier A sD5 CS 3 sD5 CS 3 43† N U†1 +Carrier C sD5 CS 3 sD5 CS 3 43† N U†2 Z†1 +Carrier, MMG A sD5 CS 3 sD5 CS 3 44† N U†1 +Carrier, 3-in. Mtr CS 4[brewup] CS 4[brewup] 45† U MM†1 NN +Oxford Carrier CS 5† CS 5† 46† EE†1 +Oxford Carrier, MMG CS 5 CS 5 47† EE†1 +Oxford Carrier, HMG CS 5 CS 5 47† G†1 EE†2 +Oxford Carrier, 3-in Mtr CS 5 CS 5 48† EE†2 MM†1 NN +IP Carrier AOV CS 4 CS 4 49† N W†1 +Wasp sD5† CS 3[brewup] sD5† CS 3[brewup] 50† N U +Morris C9/B CS 4 CS 4 51† N AA†1 +Quad FAT cs 5[brewup]† cs 5[brewup]† 52† N +15-cwt cs 5 cs 5 53† N +3-Ton Lorry cs 7 cs 7 53† N +M3A1 CS 5 CS 5 54† E† H K Y Z†1 UU +M20 sP5 CS 4 sP5 CS 4 55† D†4 K Q†2 W†1 Y Z†3 UU +M8 C7 sP5 CS 4 C7 sP5 CS 4 56† C K W†1 Y UU +¼-Ton Jeep cs 2†[1] cs 2†[1] 57† K L†2 M N O P Q†1 Y UU +¾-Ton cs 4 cs 4 57† K N O Y UU +2½-Ton cs 7 cs 7 57† K M N O P Y UU diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1944.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1944.txt index b392f7e..ba91ccd 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1944.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1944.txt @@ -1,7 +1,7 @@ === vehicles/british/1944 === -Name Capabilities (effective) # Notes Comments -------------------------- ---------------------------------------------------- -------------------------------- ------ ---------------------------------------------------- ---------- +Name Capabilities (effective) # Notes Comments +------------------------- ---------------------------------------------------- -------------------------------- ------ ------------------------------------------------------------------ ---------- Mark VIB sD6 CS 3 sD6 CS 3 1† N P Mark VIC sD6 CS 3 sD6 CS 3 1† n/a Tetrarch sD6 CS 3 sD6 CS 3 2† n/a @@ -129,3 +129,34 @@ Quad FAT CS 5[brewup]† 1½-Ton Truck(a) cs 6 cs 6 85 A N 2½-Ton Truck(a) cs 7 cs 7 85 A N 7½-Ton Truck(a) cs 7 cs 7 85† A N +M4A3E8(a) A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 34 A†1 FF† UU +M4A3E8 Dozer(a) A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 34 A†1 TT† UU +Cromwell VII s8† sD7 sM8†[1] CS 6 s8† sD7 sM8†[1] CS 6 35† N ZZ†1 +Centaur Dozer sD7 CS 2†[1] sD7 CS 2†[1] 36†[1] TT† +Churchill VII WP6 s8 sD7 sM8†[1] CS 7 WP6 s8 sD7 sM8†[1] CS 7 37† N CC ZZ†1 +Centurion III D† HE8 WP6 s8 sD7 sM8†[1] CS 7 D† HE8 WP6 s8 sD7 sM8†[1] CS 7 38† CC ZZ†1 +Centurion III(L) D8 WP6 s8 sD7 sM8†[2] CS 7 D8 WP6 s8 sD7 sM8†[2] CS 7 38† CC FF†1 ZZ†2 +Churchill Bridgelayer sD7 CS 2 sD7 CS 2 39† N CC +M4A1 MC(a) IR WP8 CS 4[brewup] IR WP8 CS 4[brewup] 40† Q†1 NN UU +M9(a) cs 4 cs 4 41 N UU +Daimler sD4 CS 2 sD4 CS 2 42† N +Carrier A sD5 CS 3 sD5 CS 3 43† N U†1 +Carrier C sD5 CS 3 sD5 CS 3 43† N U†2 Z†1 +Carrier, MMG A sD5 CS 3 sD5 CS 3 44† N U†1 +Carrier, 3-in. Mtr CS 4[brewup] CS 4[brewup] 45† U MM†1 NN +Oxford Carrier CS 5† CS 5† 46† EE†1 +Oxford Carrier, MMG CS 5 CS 5 47† EE†1 +Oxford Carrier, HMG CS 5 CS 5 47† G†1 EE†2 +Oxford Carrier, 3-in Mtr CS 5 CS 5 48† EE†2 MM†1 NN +IP Carrier AOV CS 4 CS 4 49† N W†1 +Wasp sD5† CS 3[brewup] sD5† CS 3[brewup] 50† N U +Morris C9/B CS 4 CS 4 51† N AA†1 +Quad FAT cs 5[brewup]† cs 5[brewup]† 52† N +15-cwt cs 5 cs 5 53† N +3-Ton Lorry cs 7 cs 7 53† N +M3A1 CS 5 CS 5 54† E† H K Y Z†1 UU +M20 sP5 CS 4 sP5 CS 4 55† D†4 K Q†2 W†1 Y Z†3 UU +M8 C7 sP5 CS 4 C7 sP5 CS 4 56† C K W†1 Y UU +¼-Ton Jeep cs 2†[1] cs 2†[1] 57† K L†2 M N O P Q†1 Y UU +¾-Ton cs 4 cs 4 57† K N O Y UU +2½-Ton cs 7 cs 7 57† K M N O P Y UU diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1945.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1945.txt index ec9a5d2..f1ea1a2 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1945.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1945.txt @@ -1,7 +1,7 @@ === vehicles/british/1945 === -Name Capabilities (effective) # Notes Comments -------------------------- ---------------------------------------------------- -------------------------------- ------ ---------------------------------------------------- ---------- +Name Capabilities (effective) # Notes Comments +------------------------- ---------------------------------------------------- -------------------------------- ------ ------------------------------------------------------------------ ---------- Mark VIB sD6 CS 3 sD6 CS 3 1† N P Mark VIC sD6 CS 3 sD6 CS 3 1† n/a Tetrarch sD6 CS 3 sD6 CS 3 2† n/a @@ -129,3 +129,34 @@ Quad FAT CS 5[brewup]† 1½-Ton Truck(a) cs 6 cs 6 85 A N 2½-Ton Truck(a) cs 7 cs 7 85 A N 7½-Ton Truck(a) cs 7 cs 7 85† A N +M4A3E8(a) A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 34 A†1 FF† UU +M4A3E8 Dozer(a) A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 34 A†1 TT† UU +Cromwell VII s8† sD7 sM8†[1] CS 6 s8† sD7 sM8†[1] CS 6 35† N ZZ†1 +Centaur Dozer sD7 CS 2†[1] sD7 CS 2†[1] 36†[1] TT† +Churchill VII WP6 s8 sD7 sM8†[1] CS 7 WP6 s8 sD7 sM8†[1] CS 7 37† N CC ZZ†1 +Centurion III D† HE8 WP6 s8 sD7 sM8†[1] CS 7 D† HE8 WP6 s8 sD7 sM8†[1] CS 7 38† CC ZZ†1 +Centurion III(L) D8 WP6 s8 sD7 sM8†[2] CS 7 D8 WP6 s8 sD7 sM8†[2] CS 7 38† CC FF†1 ZZ†2 +Churchill Bridgelayer sD7 CS 2 sD7 CS 2 39† N CC +M4A1 MC(a) IR WP8 CS 4[brewup] IR WP8 CS 4[brewup] 40† Q†1 NN UU +M9(a) cs 4 cs 4 41 N UU +Daimler sD4 CS 2 sD4 CS 2 42† N +Carrier A sD5 CS 3 sD5 CS 3 43† N U†1 +Carrier C sD5 CS 3 sD5 CS 3 43† N U†2 Z†1 +Carrier, MMG A sD5 CS 3 sD5 CS 3 44† N U†1 +Carrier, 3-in. Mtr CS 4[brewup] CS 4[brewup] 45† U MM†1 NN +Oxford Carrier CS 5† CS 5† 46† EE†1 +Oxford Carrier, MMG CS 5 CS 5 47† EE†1 +Oxford Carrier, HMG CS 5 CS 5 47† G†1 EE†2 +Oxford Carrier, 3-in Mtr CS 5 CS 5 48† EE†2 MM†1 NN +IP Carrier AOV CS 4 CS 4 49† N W†1 +Wasp sD5† CS 3[brewup] sD5† CS 3[brewup] 50† N U +Morris C9/B CS 4 CS 4 51† N AA†1 +Quad FAT cs 5[brewup]† cs 5[brewup]† 52† N +15-cwt cs 5 cs 5 53† N +3-Ton Lorry cs 7 cs 7 53† N +M3A1 CS 5 CS 5 54† E† H K Y Z†1 UU +M20 sP5 CS 4 sP5 CS 4 55† D†4 K Q†2 W†1 Y Z†3 UU +M8 C7 sP5 CS 4 C7 sP5 CS 4 56† C K W†1 Y UU +¼-Ton Jeep cs 2†[1] cs 2†[1] 57† K L†2 M N O P Q†1 Y UU +¾-Ton cs 4 cs 4 57† K N O Y UU +2½-Ton cs 7 cs 7 57† K M N O P Y UU diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-kpa/1950.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-kpa/1950.txt new file mode 100644 index 0000000..cb1c6c2 --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-kpa/1950.txt @@ -0,0 +1,13 @@ +=== vehicles/kfw-kpa/1950 === + +Name Capabilities (effective) # Notes Comments +------- --------------- --------------- --- ------- ---------- +T-34/85 A6 sD6† CS 6 A6 sD6† CS 6 1† n/a +SU-76M A7 CS 4[brewup] A7 CS 4[brewup] 2† n/a +BA-64B CS 2 CS 2 3† B +GAZ-67B cs 2 cs 2 4† B +GAZ-MM cs 6 cs 6 4† B +ZIS-5 cs 7 cs 7 4† B +IAG-6 cs 7 cs 7 4† B +GAZ-51 cs 6 cs 6 5† n/a +ZIS-151 cs 7 cs 7 6† n/a diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-kpa/1951.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-kpa/1951.txt new file mode 100644 index 0000000..f563839 --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-kpa/1951.txt @@ -0,0 +1,13 @@ +=== vehicles/kfw-kpa/1951 === + +Name Capabilities (effective) # Notes Comments +------- --------------- --------------- --- ------- ---------- +T-34/85 A6 sD6† CS 6 A6 sD6† CS 6 1† n/a +SU-76M A7 CS 4[brewup] A7 CS 4[brewup] 2† n/a +BA-64B CS 2 CS 2 3† B +GAZ-67B cs 2 cs 2 4† B +GAZ-MM cs 6 cs 6 4† B +ZIS-5 cs 7 cs 7 4† B +IAG-6 cs 7 cs 7 4† B +GAZ-51 cs 6 cs 6 5† n/a +ZIS-151 cs 7 cs 7 6† n/a diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-kpa/1952.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-kpa/1952.txt new file mode 100644 index 0000000..e665ee4 --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-kpa/1952.txt @@ -0,0 +1,13 @@ +=== vehicles/kfw-kpa/1952 === + +Name Capabilities (effective) # Notes Comments +------- --------------- --------------- --- ------- ---------- +T-34/85 A6 sD6† CS 6 A6 sD6† CS 6 1† n/a +SU-76M A7 CS 4[brewup] A7 CS 4[brewup] 2† n/a +BA-64B CS 2 CS 2 3† B +GAZ-67B cs 2 cs 2 4† B +GAZ-MM cs 6 cs 6 4† B +ZIS-5 cs 7 cs 7 4† B +IAG-6 cs 7 cs 7 4† B +GAZ-51 cs 6 cs 6 5† n/a +ZIS-151 cs 7 cs 7 6† n/a diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-kpa/1953.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-kpa/1953.txt new file mode 100644 index 0000000..7c7d565 --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-kpa/1953.txt @@ -0,0 +1,13 @@ +=== vehicles/kfw-kpa/1953 === + +Name Capabilities (effective) # Notes Comments +------- --------------- --------------- --- ------- ---------- +T-34/85 A6 sD6† CS 6 A6 sD6† CS 6 1† n/a +SU-76M A7 CS 4[brewup] A7 CS 4[brewup] 2† n/a +BA-64B CS 2 CS 2 3† B +GAZ-67B cs 2 cs 2 4† B +GAZ-MM cs 6 cs 6 4† B +ZIS-5 cs 7 cs 7 4† B +IAG-6 cs 7 cs 7 4† B +GAZ-51 cs 6 cs 6 5† n/a +ZIS-151 cs 7 cs 7 6† n/a diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-ounc/1950.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-ounc/1950.txt new file mode 100644 index 0000000..ba0e7b8 --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-ounc/1950.txt @@ -0,0 +1,49 @@ +=== vehicles/kfw-ounc/1950 === + +Name Capabilities (effective) # Notes Comments +----------------- ------------------------ --------------------- --- ------------------------------------------------------------------ ---------- +M24 WP7 s5 sM8 CS 5 WP7 s5 sM8 CS 5 1† O Y +M4A3E8 A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 2† A†1 P +M4A3E8(105) C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 3† C M +M4A3E8 Dozer A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 4 A†1 TT† +M4A3E8(105) Dozer C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 4† C M TT†1 +POA-CWS-H5 C5 sM8 CS 6 C5 sM8 CS 6 5† C M +M32A1B3 TRV CS 6 CS 6 6† K M P +M26A1 A†[1] WP6[M51+]†[2] CS 6 A†[1] CS 6 7† A†1 J†2 M +M45 H7 WP9 s7 CS 6 H7 WP9 s7 CS 6 8 n/a +M46 A†[2] WP6[M51+]†[3] CS 6 A†[2] CS 6 9† A†2 J†3 M FF†1 +M36B2 GMC(a) A† sP5 CS 7 A† sP5 CS 7 10 A† K UU +M38A1C Jeep H† CS 2 H† CS 2 11† n/a +M3 CS 5 CS 5 12† K Y +M3(MMG) CS 5 CS 5 13† E† H K Y +M3(HMG) CS 5 CS 5 13† E† H K Y +M19A1 MGMC CS 4 CS 4 14† AA†1 +M15A1 MGMC CS 4 CS 4 15† O V†1 Y AA†2 DD†1 +M15 Special CS 4 CS 4 16† AA†2 DD†1 +M16 MGMC CS 4 CS 4 17† F†1 V†1 Y AA†2 DD†1 +M16A1 MGMC CS 5 CS 5 18† F†1 V†1 AA†2 DD†1 +M39 AUV CS 6 CS 6 19† G†1 M +M39 MC WP8 CS 5[brewup] WP8 CS 5[brewup] 19† n/a +M7 HMC C7 H7 WP8 s7 CS 7 C7 H7 WP8 s7 CS 7 20† C Y +M37 HMC H9 WP9 s7 CS 7 H9 WP9 s7 CS 7 21 n/a +M41 HMC no IF WP8 s7 CS 9 no IF WP8 s7 CS 9 22† S†1 +M40 GMC no IF AP4 WP8 s7 CS 9 no IF AP4 WP8 s7 CS 9 23 S† +M43 HMC no IF CS 9 no IF CS 9 23 S† +LVT(A)5 C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24† H T†1 X†2 +LVT(A)5m C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24 M T† +LVT3 CS 7 CS 7 25† D† H M T†1 X†2 +LVT3C CS 7 CS 7 25† D† M T†1 X†2 BB† +M75 CS 6 CS 6 26 G† BB†1 +M29 Weasel CS 3 CS 3 27† B†1 M T†1 +M29C Weasel CS 3 CS 3 28† B†1 M T†1 +M4 hst CS 6 CS 6 29 G† Y +DUKW CS 7†[1] CS 7†[1] 30† D†2 M Q†1 Y +TACP Jeep CS 2† CS 2† 31† L†1 M +7½-Ton CS 7 CS 7 32 Y +Searchlight Truck CS 7† CS 7† 33† n/a +M3A1 CS 5 CS 5 54† E† H K Y Z†1 UU +M20 sP5 CS 4 sP5 CS 4 55† D†4 K Q†2 W†1 Y Z†3 UU +M8 C7 sP5 CS 4 C7 sP5 CS 4 56† C K W†1 Y UU +¼-Ton Jeep cs 2†[1] cs 2†[1] 57† K L†2 M N O P Q†1 Y UU +¾-Ton cs 4 cs 4 57† K N O Y UU +2½-Ton cs 7 cs 7 57† K M N O P Y UU diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-ounc/1951.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-ounc/1951.txt new file mode 100644 index 0000000..8852e43 --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-ounc/1951.txt @@ -0,0 +1,49 @@ +=== vehicles/kfw-ounc/1951 === + +Name Capabilities (effective) # Notes Comments +----------------- ------------------------ --------------------- --- ------------------------------------------------------------------ ---------- +M24 WP7 s5 sM8 CS 5 WP7 s5 sM8 CS 5 1† O Y +M4A3E8 A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 2† A†1 P +M4A3E8(105) C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 3† C M +M4A3E8 Dozer A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 4 A†1 TT† +M4A3E8(105) Dozer C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 4† C M TT†1 +POA-CWS-H5 C5 sM8 CS 6 C5 sM8 CS 6 5† C M +M32A1B3 TRV CS 6 CS 6 6† K M P +M26A1 A†[1] WP6[M51+]†[2] CS 6 A†[1] CS 6 7† A†1 J†2 M +M45 H7 WP9 s7 CS 6 H7 WP9 s7 CS 6 8 n/a +M46 A†[2] WP6[M51+]†[3] CS 6 A†[2] CS 6 9† A†2 J†3 M FF†1 +M36B2 GMC(a) A† sP5 CS 7 A† sP5 CS 7 10 A† K UU +M38A1C Jeep H† CS 2 H† CS 2 11† n/a +M3 CS 5 CS 5 12† K Y +M3(MMG) CS 5 CS 5 13† E† H K Y +M3(HMG) CS 5 CS 5 13† E† H K Y +M19A1 MGMC CS 4 CS 4 14† AA†1 +M15A1 MGMC CS 4 CS 4 15† O V†1 Y AA†2 DD†1 +M15 Special CS 4 CS 4 16† AA†2 DD†1 +M16 MGMC CS 4 CS 4 17† F†1 V†1 Y AA†2 DD†1 +M16A1 MGMC CS 5 CS 5 18† F†1 V†1 AA†2 DD†1 +M39 AUV CS 6 CS 6 19† G†1 M +M39 MC WP8 CS 5[brewup] WP8 CS 5[brewup] 19† n/a +M7 HMC C7 H7 WP8 s7 CS 7 C7 H7 WP8 s7 CS 7 20† C Y +M37 HMC H9 WP9 s7 CS 7 H9 WP9 s7 CS 7 21 n/a +M41 HMC no IF WP8 s7 CS 9 no IF WP8 s7 CS 9 22† S†1 +M40 GMC no IF AP4 WP8 s7 CS 9 no IF AP4 WP8 s7 CS 9 23 S† +M43 HMC no IF CS 9 no IF CS 9 23 S† +LVT(A)5 C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24† H T†1 X†2 +LVT(A)5m C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24 M T† +LVT3 CS 7 CS 7 25† D† H M T†1 X†2 +LVT3C CS 7 CS 7 25† D† M T†1 X†2 BB† +M75 CS 6 CS 6 26 G† BB†1 +M29 Weasel CS 3 CS 3 27† B†1 M T†1 +M29C Weasel CS 3 CS 3 28† B†1 M T†1 +M4 hst CS 6 CS 6 29 G† Y +DUKW CS 7†[1] CS 7†[1] 30† D†2 M Q†1 Y +TACP Jeep CS 2† CS 2† 31† L†1 M +7½-Ton CS 7 CS 7 32 Y +Searchlight Truck CS 7† CS 7† 33† n/a +M3A1 CS 5 CS 5 54† E† H K Y Z†1 UU +M20 sP5 CS 4 sP5 CS 4 55† D†4 K Q†2 W†1 Y Z†3 UU +M8 C7 sP5 CS 4 C7 sP5 CS 4 56† C K W†1 Y UU +¼-Ton Jeep cs 2†[1] cs 2†[1] 57† K L†2 M N O P Q†1 Y UU +¾-Ton cs 4 cs 4 57† K N O Y UU +2½-Ton cs 7 cs 7 57† K M N O P Y UU diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-ounc/1952.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-ounc/1952.txt new file mode 100644 index 0000000..360de2c --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-ounc/1952.txt @@ -0,0 +1,49 @@ +=== vehicles/kfw-ounc/1952 === + +Name Capabilities (effective) # Notes Comments +----------------- ------------------------ --------------------- --- ------------------------------------------------------------------ ---------- +M24 WP7 s5 sM8 CS 5 WP7 s5 sM8 CS 5 1† O Y +M4A3E8 A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 2† A†1 P +M4A3E8(105) C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 3† C M +M4A3E8 Dozer A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 4 A†1 TT† +M4A3E8(105) Dozer C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 4† C M TT†1 +POA-CWS-H5 C5 sM8 CS 6 C5 sM8 CS 6 5† C M +M32A1B3 TRV CS 6 CS 6 6† K M P +M26A1 A†[1] WP6[M51+]†[2] CS 6 A†[1] WP6†[2] CS 6 7† A†1 J†2 M +M45 H7 WP9 s7 CS 6 H7 WP9 s7 CS 6 8 n/a +M46 A†[2] WP6[M51+]†[3] CS 6 A†[2] WP6†[3] CS 6 9† A†2 J†3 M FF†1 +M36B2 GMC(a) A† sP5 CS 7 A† sP5 CS 7 10 A† K UU +M38A1C Jeep H† CS 2 H† CS 2 11† n/a +M3 CS 5 CS 5 12† K Y +M3(MMG) CS 5 CS 5 13† E† H K Y +M3(HMG) CS 5 CS 5 13† E† H K Y +M19A1 MGMC CS 4 CS 4 14† AA†1 +M15A1 MGMC CS 4 CS 4 15† O V†1 Y AA†2 DD†1 +M15 Special CS 4 CS 4 16† AA†2 DD†1 +M16 MGMC CS 4 CS 4 17† F†1 V†1 Y AA†2 DD†1 +M16A1 MGMC CS 5 CS 5 18† F†1 V†1 AA†2 DD†1 +M39 AUV CS 6 CS 6 19† G†1 M +M39 MC WP8 CS 5[brewup] WP8 CS 5[brewup] 19† n/a +M7 HMC C7 H7 WP8 s7 CS 7 C7 H7 WP8 s7 CS 7 20† C Y +M37 HMC H9 WP9 s7 CS 7 H9 WP9 s7 CS 7 21 n/a +M41 HMC no IF WP8 s7 CS 9 no IF WP8 s7 CS 9 22† S†1 +M40 GMC no IF AP4 WP8 s7 CS 9 no IF AP4 WP8 s7 CS 9 23 S† +M43 HMC no IF CS 9 no IF CS 9 23 S† +LVT(A)5 C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24† H T†1 X†2 +LVT(A)5m C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24 M T† +LVT3 CS 7 CS 7 25† D† H M T†1 X†2 +LVT3C CS 7 CS 7 25† D† M T†1 X†2 BB† +M75 CS 6 CS 6 26 G† BB†1 +M29 Weasel CS 3 CS 3 27† B†1 M T†1 +M29C Weasel CS 3 CS 3 28† B†1 M T†1 +M4 hst CS 6 CS 6 29 G† Y +DUKW CS 7†[1] CS 7†[1] 30† D†2 M Q†1 Y +TACP Jeep CS 2† CS 2† 31† L†1 M +7½-Ton CS 7 CS 7 32 Y +Searchlight Truck CS 7† CS 7† 33† n/a +M3A1 CS 5 CS 5 54† E† H K Y Z†1 UU +M20 sP5 CS 4 sP5 CS 4 55† D†4 K Q†2 W†1 Y Z†3 UU +M8 C7 sP5 CS 4 C7 sP5 CS 4 56† C K W†1 Y UU +¼-Ton Jeep cs 2†[1] cs 2†[1] 57† K L†2 M N O P Q†1 Y UU +¾-Ton cs 4 cs 4 57† K N O Y UU +2½-Ton cs 7 cs 7 57† K M N O P Y UU diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-ounc/1953.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-ounc/1953.txt new file mode 100644 index 0000000..615330f --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-ounc/1953.txt @@ -0,0 +1,49 @@ +=== vehicles/kfw-ounc/1953 === + +Name Capabilities (effective) # Notes Comments +----------------- ------------------------ --------------------- --- ------------------------------------------------------------------ ---------- +M24 WP7 s5 sM8 CS 5 WP7 s5 sM8 CS 5 1† O Y +M4A3E8 A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 2† A†1 P +M4A3E8(105) C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 3† C M +M4A3E8 Dozer A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 4 A†1 TT† +M4A3E8(105) Dozer C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 4† C M TT†1 +POA-CWS-H5 C5 sM8 CS 6 C5 sM8 CS 6 5† C M +M32A1B3 TRV CS 6 CS 6 6† K M P +M26A1 A†[1] WP6[M51+]†[2] CS 6 A†[1] WP6†[2] CS 6 7† A†1 J†2 M +M45 H7 WP9 s7 CS 6 H7 WP9 s7 CS 6 8 n/a +M46 A†[2] WP6[M51+]†[3] CS 6 A†[2] WP6†[3] CS 6 9† A†2 J†3 M FF†1 +M36B2 GMC(a) A† sP5 CS 7 A† sP5 CS 7 10 A† K UU +M38A1C Jeep H† CS 2 H† CS 2 11† n/a +M3 CS 5 CS 5 12† K Y +M3(MMG) CS 5 CS 5 13† E† H K Y +M3(HMG) CS 5 CS 5 13† E† H K Y +M19A1 MGMC CS 4 CS 4 14† AA†1 +M15A1 MGMC CS 4 CS 4 15† O V†1 Y AA†2 DD†1 +M15 Special CS 4 CS 4 16† AA†2 DD†1 +M16 MGMC CS 4 CS 4 17† F†1 V†1 Y AA†2 DD†1 +M16A1 MGMC CS 5 CS 5 18† F†1 V†1 AA†2 DD†1 +M39 AUV CS 6 CS 6 19† G†1 M +M39 MC WP8 CS 5[brewup] WP8 CS 5[brewup] 19† n/a +M7 HMC C7 H7 WP8 s7 CS 7 C7 H7 WP8 s7 CS 7 20† C Y +M37 HMC H9 WP9 s7 CS 7 H9 WP9 s7 CS 7 21 n/a +M41 HMC no IF WP8 s7 CS 9 no IF WP8 s7 CS 9 22† S†1 +M40 GMC no IF AP4 WP8 s7 CS 9 no IF AP4 WP8 s7 CS 9 23 S† +M43 HMC no IF CS 9 no IF CS 9 23 S† +LVT(A)5 C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24† H T†1 X†2 +LVT(A)5m C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24 M T† +LVT3 CS 7 CS 7 25† D† H M T†1 X†2 +LVT3C CS 7 CS 7 25† D† M T†1 X†2 BB† +M75 CS 6 CS 6 26 G† BB†1 +M29 Weasel CS 3 CS 3 27† B†1 M T†1 +M29C Weasel CS 3 CS 3 28† B†1 M T†1 +M4 hst CS 6 CS 6 29 G† Y +DUKW CS 7†[1] CS 7†[1] 30† D†2 M Q†1 Y +TACP Jeep CS 2† CS 2† 31† L†1 M +7½-Ton CS 7 CS 7 32 Y +Searchlight Truck CS 7† CS 7† 33† n/a +M3A1 CS 5 CS 5 54† E† H K Y Z†1 UU +M20 sP5 CS 4 sP5 CS 4 55† D†4 K Q†2 W†1 Y Z†3 UU +M8 C7 sP5 CS 4 C7 sP5 CS 4 56† C K W†1 Y UU +¼-Ton Jeep cs 2†[1] cs 2†[1] 57† K L†2 M N O P Q†1 Y UU +¾-Ton cs 4 cs 4 57† K N O Y UU +2½-Ton cs 7 cs 7 57† K M N O P Y UU diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-rok/1950.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-rok/1950.txt new file mode 100644 index 0000000..6bc5414 --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-rok/1950.txt @@ -0,0 +1,49 @@ +=== vehicles/kfw-rok/1950 === + +Name Capabilities (effective) # Notes Comments +----------------- ------------------------ --------------------- --- ------------------------------------------------------------------ ---------- +M24 WP7 s5 sM8 CS 5 WP7 s5 sM8 CS 5 1† O Y +M4A3E8 A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 2† A†1 P +M4A3E8(105) C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 3† C M +M4A3E8 Dozer A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 4 A†1 TT† +M4A3E8(105) Dozer C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 4† C M TT†1 +POA-CWS-H5 C5 sM8 CS 6 C5 sM8 CS 6 5† C M +M32A1B3 TRV CS 6 CS 6 6† K M P +M26A1 A†[1] WP6[M51+]†[2] CS 6 A†[1] CS 6 7† A†1 J†2 M +M45 H7 WP9 s7 CS 6 H7 WP9 s7 CS 6 8 n/a +M46 A†[2] WP6[M51+]†[3] CS 6 A†[2] CS 6 9† A†2 J†3 M FF†1 +M36B2 GMC(a) A† sP5 CS 7 A† sP5 CS 7 10 A† K UU +M38A1C Jeep H† CS 2 H† CS 2 11† n/a +M3 CS 5 CS 5 12† K Y +M3(MMG) CS 5 CS 5 13† E† H K Y +M3(HMG) CS 5 CS 5 13† E† H K Y +M19A1 MGMC CS 4 CS 4 14† AA†1 +M15A1 MGMC CS 4 CS 4 15† O V†1 Y AA†2 DD†1 +M15 Special CS 4 CS 4 16† AA†2 DD†1 +M16 MGMC CS 4 CS 4 17† F†1 V†1 Y AA†2 DD†1 +M16A1 MGMC CS 5 CS 5 18† F†1 V†1 AA†2 DD†1 +M39 AUV CS 6 CS 6 19† G†1 M +M39 MC WP8 CS 5[brewup] WP8 CS 5[brewup] 19† n/a +M7 HMC C7 H7 WP8 s7 CS 7 C7 H7 WP8 s7 CS 7 20† C Y +M37 HMC H9 WP9 s7 CS 7 H9 WP9 s7 CS 7 21 n/a +M41 HMC no IF WP8 s7 CS 9 no IF WP8 s7 CS 9 22† S†1 +M40 GMC no IF AP4 WP8 s7 CS 9 no IF AP4 WP8 s7 CS 9 23 S† +M43 HMC no IF CS 9 no IF CS 9 23 S† +LVT(A)5 C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24† H T†1 X†2 +LVT(A)5m C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24 M T† +LVT3 CS 7 CS 7 25† D† H M T†1 X†2 +LVT3C CS 7 CS 7 25† D† M T†1 X†2 BB† +M75 CS 6 CS 6 26 G† BB†1 +M29 Weasel CS 3 CS 3 27† B†1 M T†1 +M29C Weasel CS 3 CS 3 28† B†1 M T†1 +M4 hst CS 6 CS 6 29 G† Y +DUKW CS 7†[1] CS 7†[1] 30† D†2 M Q†1 Y +TACP Jeep CS 2† CS 2† 31† L†1 M +7½-Ton CS 7 CS 7 32 Y +Searchlight Truck CS 7† CS 7† 33† n/a +M3A1 CS 5 CS 5 54† E† H K Y Z†1 UU +M20 sP5 CS 4 sP5 CS 4 55† D†4 K Q†2 W†1 Y Z†3 UU +M8 C7 sP5 CS 4 C7 sP5 CS 4 56† C K W†1 Y UU +¼-Ton Jeep cs 2†[1] cs 2†[1] 57† K L†2 M N O P Q†1 Y UU +¾-Ton cs 4 cs 4 57† K N O Y UU +2½-Ton cs 7 cs 7 57† K M N O P Y UU diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-rok/1951.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-rok/1951.txt new file mode 100644 index 0000000..3e29e81 --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-rok/1951.txt @@ -0,0 +1,49 @@ +=== vehicles/kfw-rok/1951 === + +Name Capabilities (effective) # Notes Comments +----------------- ------------------------ --------------------- --- ------------------------------------------------------------------ ---------- +M24 WP7 s5 sM8 CS 5 WP7 s5 sM8 CS 5 1† O Y +M4A3E8 A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 2† A†1 P +M4A3E8(105) C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 3† C M +M4A3E8 Dozer A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 4 A†1 TT† +M4A3E8(105) Dozer C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 4† C M TT†1 +POA-CWS-H5 C5 sM8 CS 6 C5 sM8 CS 6 5† C M +M32A1B3 TRV CS 6 CS 6 6† K M P +M26A1 A†[1] WP6[M51+]†[2] CS 6 A†[1] CS 6 7† A†1 J†2 M +M45 H7 WP9 s7 CS 6 H7 WP9 s7 CS 6 8 n/a +M46 A†[2] WP6[M51+]†[3] CS 6 A†[2] CS 6 9† A†2 J†3 M FF†1 +M36B2 GMC(a) A† sP5 CS 7 A† sP5 CS 7 10 A† K UU +M38A1C Jeep H† CS 2 H† CS 2 11† n/a +M3 CS 5 CS 5 12† K Y +M3(MMG) CS 5 CS 5 13† E† H K Y +M3(HMG) CS 5 CS 5 13† E† H K Y +M19A1 MGMC CS 4 CS 4 14† AA†1 +M15A1 MGMC CS 4 CS 4 15† O V†1 Y AA†2 DD†1 +M15 Special CS 4 CS 4 16† AA†2 DD†1 +M16 MGMC CS 4 CS 4 17† F†1 V†1 Y AA†2 DD†1 +M16A1 MGMC CS 5 CS 5 18† F†1 V†1 AA†2 DD†1 +M39 AUV CS 6 CS 6 19† G†1 M +M39 MC WP8 CS 5[brewup] WP8 CS 5[brewup] 19† n/a +M7 HMC C7 H7 WP8 s7 CS 7 C7 H7 WP8 s7 CS 7 20† C Y +M37 HMC H9 WP9 s7 CS 7 H9 WP9 s7 CS 7 21 n/a +M41 HMC no IF WP8 s7 CS 9 no IF WP8 s7 CS 9 22† S†1 +M40 GMC no IF AP4 WP8 s7 CS 9 no IF AP4 WP8 s7 CS 9 23 S† +M43 HMC no IF CS 9 no IF CS 9 23 S† +LVT(A)5 C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24† H T†1 X†2 +LVT(A)5m C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24 M T† +LVT3 CS 7 CS 7 25† D† H M T†1 X†2 +LVT3C CS 7 CS 7 25† D† M T†1 X†2 BB† +M75 CS 6 CS 6 26 G† BB†1 +M29 Weasel CS 3 CS 3 27† B†1 M T†1 +M29C Weasel CS 3 CS 3 28† B†1 M T†1 +M4 hst CS 6 CS 6 29 G† Y +DUKW CS 7†[1] CS 7†[1] 30† D†2 M Q†1 Y +TACP Jeep CS 2† CS 2† 31† L†1 M +7½-Ton CS 7 CS 7 32 Y +Searchlight Truck CS 7† CS 7† 33† n/a +M3A1 CS 5 CS 5 54† E† H K Y Z†1 UU +M20 sP5 CS 4 sP5 CS 4 55† D†4 K Q†2 W†1 Y Z†3 UU +M8 C7 sP5 CS 4 C7 sP5 CS 4 56† C K W†1 Y UU +¼-Ton Jeep cs 2†[1] cs 2†[1] 57† K L†2 M N O P Q†1 Y UU +¾-Ton cs 4 cs 4 57† K N O Y UU +2½-Ton cs 7 cs 7 57† K M N O P Y UU diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-rok/1952.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-rok/1952.txt new file mode 100644 index 0000000..84f4b25 --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-rok/1952.txt @@ -0,0 +1,49 @@ +=== vehicles/kfw-rok/1952 === + +Name Capabilities (effective) # Notes Comments +----------------- ------------------------ --------------------- --- ------------------------------------------------------------------ ---------- +M24 WP7 s5 sM8 CS 5 WP7 s5 sM8 CS 5 1† O Y +M4A3E8 A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 2† A†1 P +M4A3E8(105) C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 3† C M +M4A3E8 Dozer A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 4 A†1 TT† +M4A3E8(105) Dozer C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 4† C M TT†1 +POA-CWS-H5 C5 sM8 CS 6 C5 sM8 CS 6 5† C M +M32A1B3 TRV CS 6 CS 6 6† K M P +M26A1 A†[1] WP6[M51+]†[2] CS 6 A†[1] WP6†[2] CS 6 7† A†1 J†2 M +M45 H7 WP9 s7 CS 6 H7 WP9 s7 CS 6 8 n/a +M46 A†[2] WP6[M51+]†[3] CS 6 A†[2] WP6†[3] CS 6 9† A†2 J†3 M FF†1 +M36B2 GMC(a) A† sP5 CS 7 A† sP5 CS 7 10 A† K UU +M38A1C Jeep H† CS 2 H† CS 2 11† n/a +M3 CS 5 CS 5 12† K Y +M3(MMG) CS 5 CS 5 13† E† H K Y +M3(HMG) CS 5 CS 5 13† E† H K Y +M19A1 MGMC CS 4 CS 4 14† AA†1 +M15A1 MGMC CS 4 CS 4 15† O V†1 Y AA†2 DD†1 +M15 Special CS 4 CS 4 16† AA†2 DD†1 +M16 MGMC CS 4 CS 4 17† F†1 V†1 Y AA†2 DD†1 +M16A1 MGMC CS 5 CS 5 18† F†1 V†1 AA†2 DD†1 +M39 AUV CS 6 CS 6 19† G†1 M +M39 MC WP8 CS 5[brewup] WP8 CS 5[brewup] 19† n/a +M7 HMC C7 H7 WP8 s7 CS 7 C7 H7 WP8 s7 CS 7 20† C Y +M37 HMC H9 WP9 s7 CS 7 H9 WP9 s7 CS 7 21 n/a +M41 HMC no IF WP8 s7 CS 9 no IF WP8 s7 CS 9 22† S†1 +M40 GMC no IF AP4 WP8 s7 CS 9 no IF AP4 WP8 s7 CS 9 23 S† +M43 HMC no IF CS 9 no IF CS 9 23 S† +LVT(A)5 C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24† H T†1 X†2 +LVT(A)5m C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24 M T† +LVT3 CS 7 CS 7 25† D† H M T†1 X†2 +LVT3C CS 7 CS 7 25† D† M T†1 X†2 BB† +M75 CS 6 CS 6 26 G† BB†1 +M29 Weasel CS 3 CS 3 27† B†1 M T†1 +M29C Weasel CS 3 CS 3 28† B†1 M T†1 +M4 hst CS 6 CS 6 29 G† Y +DUKW CS 7†[1] CS 7†[1] 30† D†2 M Q†1 Y +TACP Jeep CS 2† CS 2† 31† L†1 M +7½-Ton CS 7 CS 7 32 Y +Searchlight Truck CS 7† CS 7† 33† n/a +M3A1 CS 5 CS 5 54† E† H K Y Z†1 UU +M20 sP5 CS 4 sP5 CS 4 55† D†4 K Q†2 W†1 Y Z†3 UU +M8 C7 sP5 CS 4 C7 sP5 CS 4 56† C K W†1 Y UU +¼-Ton Jeep cs 2†[1] cs 2†[1] 57† K L†2 M N O P Q†1 Y UU +¾-Ton cs 4 cs 4 57† K N O Y UU +2½-Ton cs 7 cs 7 57† K M N O P Y UU diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-rok/1953.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-rok/1953.txt new file mode 100644 index 0000000..b18f217 --- /dev/null +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/kfw-rok/1953.txt @@ -0,0 +1,49 @@ +=== vehicles/kfw-rok/1953 === + +Name Capabilities (effective) # Notes Comments +----------------- ------------------------ --------------------- --- ------------------------------------------------------------------ ---------- +M24 WP7 s5 sM8 CS 5 WP7 s5 sM8 CS 5 1† O Y +M4A3E8 A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 2† A†1 P +M4A3E8(105) C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 3† C M +M4A3E8 Dozer A†[1] s5 sM8 CS 6 A†[1] s5 sM8 CS 6 4 A†1 TT† +M4A3E8(105) Dozer C7 H9 WP9 s7 sM8 CS 6 C7 H9 WP9 s7 sM8 CS 6 4† C M TT†1 +POA-CWS-H5 C5 sM8 CS 6 C5 sM8 CS 6 5† C M +M32A1B3 TRV CS 6 CS 6 6† K M P +M26A1 A†[1] WP6[M51+]†[2] CS 6 A†[1] WP6†[2] CS 6 7† A†1 J†2 M +M45 H7 WP9 s7 CS 6 H7 WP9 s7 CS 6 8 n/a +M46 A†[2] WP6[M51+]†[3] CS 6 A†[2] WP6†[3] CS 6 9† A†2 J†3 M FF†1 +M36B2 GMC(a) A† sP5 CS 7 A† sP5 CS 7 10 A† K UU +M38A1C Jeep H† CS 2 H† CS 2 11† n/a +M3 CS 5 CS 5 12† K Y +M3(MMG) CS 5 CS 5 13† E† H K Y +M3(HMG) CS 5 CS 5 13† E† H K Y +M19A1 MGMC CS 4 CS 4 14† AA†1 +M15A1 MGMC CS 4 CS 4 15† O V†1 Y AA†2 DD†1 +M15 Special CS 4 CS 4 16† AA†2 DD†1 +M16 MGMC CS 4 CS 4 17† F†1 V†1 Y AA†2 DD†1 +M16A1 MGMC CS 5 CS 5 18† F†1 V†1 AA†2 DD†1 +M39 AUV CS 6 CS 6 19† G†1 M +M39 MC WP8 CS 5[brewup] WP8 CS 5[brewup] 19† n/a +M7 HMC C7 H7 WP8 s7 CS 7 C7 H7 WP8 s7 CS 7 20† C Y +M37 HMC H9 WP9 s7 CS 7 H9 WP9 s7 CS 7 21 n/a +M41 HMC no IF WP8 s7 CS 9 no IF WP8 s7 CS 9 22† S†1 +M40 GMC no IF AP4 WP8 s7 CS 9 no IF AP4 WP8 s7 CS 9 23 S† +M43 HMC no IF CS 9 no IF CS 9 23 S† +LVT(A)5 C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24† H T†1 X†2 +LVT(A)5m C7 H8 WP8 CS 6 C7 H8 WP8 CS 6 24 M T† +LVT3 CS 7 CS 7 25† D† H M T†1 X†2 +LVT3C CS 7 CS 7 25† D† M T†1 X†2 BB† +M75 CS 6 CS 6 26 G† BB†1 +M29 Weasel CS 3 CS 3 27† B†1 M T†1 +M29C Weasel CS 3 CS 3 28† B†1 M T†1 +M4 hst CS 6 CS 6 29 G† Y +DUKW CS 7†[1] CS 7†[1] 30† D†2 M Q†1 Y +TACP Jeep CS 2† CS 2† 31† L†1 M +7½-Ton CS 7 CS 7 32 Y +Searchlight Truck CS 7† CS 7† 33† n/a +M3A1 CS 5 CS 5 54† E† H K Y Z†1 UU +M20 sP5 CS 4 sP5 CS 4 55† D†4 K Q†2 W†1 Y Z†3 UU +M8 C7 sP5 CS 4 C7 sP5 CS 4 56† C K W†1 Y UU +¼-Ton Jeep cs 2†[1] cs 2†[1] 57† K L†2 M N O P Q†1 Y UU +¾-Ton cs 4 cs 4 57† K N O Y UU +2½-Ton cs 7 cs 7 57† K M N O P Y UU diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/slovakian/1940.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/slovakian/1940.txt index 04c3bd8..2ad495b 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/slovakian/1940.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/slovakian/1940.txt @@ -2,10 +2,10 @@ Name Capabilities (effective) # Notes Comments -------------- --------------------------------- ----------------------- --- --------------------------------- ---------- -T vz 33(t) ® CS 2 ® CS 2 17† K†1 E F G†2 +T vz 33(t) ® CS 2 ® CS 2 17† E F G†2 K†1 LT vz 34 ® CS 2 ® CS 2 18 n/a PzKpfw IIA(g) sD6 CS 3 sD6 CS 3 19 E -LT vz 40(t) sD6 CS 4 sD6 CS 4 20† K†1 E +LT vz 40(t) sD6 CS 4 sD6 CS 4 20† E K†1 Marder III(t)H A4[3]3[4] HE7 s7 sD6 CS 4[brewup] HE7 s7 sD6 CS 4[brewup] 21† E -Kfz 1(g) cs 2†[1] cs 2†[1] 22† E L†2 I†1 +Kfz 1(g) cs 2†[1] cs 2†[1] 22† E I†1 L†2 SdKfz 2(g) cs 2 cs 2 23† E L†1 diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/slovakian/1941.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/slovakian/1941.txt index 33c270e..8954c96 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/slovakian/1941.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/slovakian/1941.txt @@ -2,10 +2,10 @@ Name Capabilities (effective) # Notes Comments -------------- --------------------------------- ----------------------- --- --------------------------------- ---------- -T vz 33(t) ® CS 2 ® CS 2 17† K†1 E F G†2 +T vz 33(t) ® CS 2 ® CS 2 17† E F G†2 K†1 LT vz 34 ® CS 2 ® CS 2 18 n/a PzKpfw IIA(g) sD6 CS 3 sD6 CS 3 19 E -LT vz 40(t) sD6 CS 4 sD6 CS 4 20† K†1 E +LT vz 40(t) sD6 CS 4 sD6 CS 4 20† E K†1 Marder III(t)H A4[3]3[4] HE7 s7 sD6 CS 4[brewup] HE7 s7 sD6 CS 4[brewup] 21† E -Kfz 1(g) cs 2†[1] cs 2†[1] 22† E L†2 I†1 +Kfz 1(g) cs 2†[1] cs 2†[1] 22† E I†1 L†2 SdKfz 2(g) cs 2 cs 2 23† E L†1 diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/slovakian/1942.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/slovakian/1942.txt index 14fe081..8aa4ec5 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/slovakian/1942.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/slovakian/1942.txt @@ -2,10 +2,10 @@ Name Capabilities (effective) # Notes Comments -------------- --------------------------------- ----------------------- --- --------------------------------- ---------- -T vz 33(t) ® CS 2 ® CS 2 17† K†1 E F G†2 +T vz 33(t) ® CS 2 ® CS 2 17† E F G†2 K†1 LT vz 34 ® CS 2 ® CS 2 18 n/a PzKpfw IIA(g) sD6 CS 3 sD6 CS 3 19 E -LT vz 40(t) sD6 CS 4 sD6 CS 4 20† K†1 E +LT vz 40(t) sD6 CS 4 sD6 CS 4 20† E K†1 Marder III(t)H A4[3]3[4] HE7 s7 sD6 CS 4[brewup] HE7 s7 sD6 CS 4[brewup] 21† E -Kfz 1(g) cs 2†[1] cs 2†[1] 22† E L†2 I†1 +Kfz 1(g) cs 2†[1] cs 2†[1] 22† E I†1 L†2 SdKfz 2(g) cs 2 cs 2 23† E L†1 diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/slovakian/1943.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/slovakian/1943.txt index 1d1c69a..c57bfc4 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/slovakian/1943.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/slovakian/1943.txt @@ -2,10 +2,10 @@ Name Capabilities (effective) # Notes Comments -------------- --------------------------------- -------------------------- --- --------------------------------- ---------- -T vz 33(t) ® CS 2 ® CS 2 17† K†1 E F G†2 +T vz 33(t) ® CS 2 ® CS 2 17† E F G†2 K†1 LT vz 34 ® CS 2 ® CS 2 18 n/a PzKpfw IIA(g) sD6 CS 3 sD6 CS 3 19 E -LT vz 40(t) sD6 CS 4 sD6 CS 4 20† K†1 E +LT vz 40(t) sD6 CS 4 sD6 CS 4 20† E K†1 Marder III(t)H A4[3]3[4] HE7 s7 sD6 CS 4[brewup] A4 HE7 s7 sD6 CS 4[brewup] 21† E -Kfz 1(g) cs 2†[1] cs 2†[1] 22† E L†2 I†1 +Kfz 1(g) cs 2†[1] cs 2†[1] 22† E I†1 L†2 SdKfz 2(g) cs 2 cs 2 23† E L†1 diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/slovakian/1944.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/slovakian/1944.txt index dcc6442..3a79ab5 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/slovakian/1944.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/slovakian/1944.txt @@ -2,10 +2,10 @@ Name Capabilities (effective) # Notes Comments -------------- --------------------------------- -------------------------- --- --------------------------------- ---------- -T vz 33(t) ® CS 2 ® CS 2 17† K†1 E F G†2 +T vz 33(t) ® CS 2 ® CS 2 17† E F G†2 K†1 LT vz 34 ® CS 2 ® CS 2 18 n/a PzKpfw IIA(g) sD6 CS 3 sD6 CS 3 19 E -LT vz 40(t) sD6 CS 4 sD6 CS 4 20† K†1 E +LT vz 40(t) sD6 CS 4 sD6 CS 4 20† E K†1 Marder III(t)H A4[3]3[4] HE7 s7 sD6 CS 4[brewup] A3 HE7 s7 sD6 CS 4[brewup] 21† E -Kfz 1(g) cs 2†[1] cs 2†[1] 22† E L†2 I†1 +Kfz 1(g) cs 2†[1] cs 2†[1] 22† E I†1 L†2 SdKfz 2(g) cs 2 cs 2 23† E L†1 diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/slovakian/1945.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/slovakian/1945.txt index fe12383..b66fd00 100644 --- a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/slovakian/1945.txt +++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/slovakian/1945.txt @@ -2,10 +2,10 @@ Name Capabilities (effective) # Notes Comments -------------- --------------------------------- -------------------------- --- --------------------------------- ---------- -T vz 33(t) ® CS 2 ® CS 2 17† K†1 E F G†2 +T vz 33(t) ® CS 2 ® CS 2 17† E F G†2 K†1 LT vz 34 ® CS 2 ® CS 2 18 n/a PzKpfw IIA(g) sD6 CS 3 sD6 CS 3 19 E -LT vz 40(t) sD6 CS 4 sD6 CS 4 20† K†1 E +LT vz 40(t) sD6 CS 4 sD6 CS 4 20† E K†1 Marder III(t)H A4[3]3[4] HE7 s7 sD6 CS 4[brewup] A3 HE7 s7 sD6 CS 4[brewup] 21† E -Kfz 1(g) cs 2†[1] cs 2†[1] 22† E L†2 I†1 +Kfz 1(g) cs 2†[1] cs 2†[1] 22† E I†1 L†2 SdKfz 2(g) cs 2 cs 2 23† E L†1 diff --git a/vasl_templates/webapp/tests/test_capabilities.py b/vasl_templates/webapp/tests/test_capabilities.py index 22252f2..a3ae00d 100644 --- a/vasl_templates/webapp/tests/test_capabilities.py +++ b/vasl_templates/webapp/tests/test_capabilities.py @@ -43,25 +43,25 @@ def test_month_capabilities( webapp, webdriver ): # M3A1 37mm AT Gun: NT, QSU, C7(A2+)†1 ordnance = [ "american", "ordnance", "M3A1 37mm AT Gun" ] - _check_capabilities( webdriver, webapp, *ordnance, "ETO", "12/1941", "NT QSU" ) - _check_capabilities( webdriver, webapp, *ordnance, "ETO", "07/1942", "NT QSU" ) - _check_capabilities( webdriver, webapp, *ordnance, "ETO", "08/1942", "NT QSU C7[!1]" ) + _check_capabilities( webdriver, webapp, *ordnance, "ETO", "12/1941", "NT QSU", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance, "ETO", "07/1942", "NT QSU", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance, "ETO", "08/1942", "NT QSU C7[!1]", (1,2) ) # M1 57mm AT Gun: NT, QSU, HE7(J4E)/7(5)†, D4(J4+E)† ordnance = [ "american", "ordnance", "M1 57mm AT Gun" ] - _check_capabilities( webdriver, webapp, *ordnance, "ETO", "12/1943", "NT QSU" ) - _check_capabilities( webdriver, webapp, *ordnance, "ETO", "05/1944", "NT QSU" ) - _check_capabilities( webdriver, webapp, *ordnance, "ETO", "06/1944", "NT QSU D4[!] HE7[!]" ) - _check_capabilities( webdriver, webapp, *ordnance, "PTO", "06/1944", "NT QSU" ) - _check_capabilities( webdriver, webapp, *ordnance, "ETO", "01/1945", "NT QSU D4[!] HE7[!]" ) - _check_capabilities( webdriver, webapp, *ordnance, "PTO", "01/1945", "NT QSU HE7[!]" ) + _check_capabilities( webdriver, webapp, *ordnance, "ETO", "12/1943", "NT QSU", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance, "ETO", "05/1944", "NT QSU", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance, "ETO", "06/1944", "NT QSU D4[!] HE7[!]", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance, "PTO", "06/1944", "NT QSU", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance, "ETO", "01/1945", "NT QSU D4[!] HE7[!]", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance, "PTO", "01/1945", "NT QSU HE7[!]", (1,2) ) # M3: C7(A2+)†2 vehicle = [ "american", "vehicles", "M3" ] - _check_capabilities( webdriver, webapp, *vehicle, "ETO", "12/1941", "CS 4", (1,3) ) - _check_capabilities( webdriver, webapp, *vehicle, "ETO", "07/1942", "CS 4", (1,3) ) - _check_capabilities( webdriver, webapp, *vehicle, "ETO", "08/1942", "C7[!2] CS 4", (1,3) ) - _check_capabilities( webdriver, webapp, *vehicle, "ETO", "01/1943", "C7[!2] CS 4", (1,3) ) + _check_capabilities( webdriver, webapp, *vehicle, "ETO", "12/1941", "CS 4", (1,4) ) + _check_capabilities( webdriver, webapp, *vehicle, "ETO", "07/1942", "CS 4", (1,4) ) + _check_capabilities( webdriver, webapp, *vehicle, "ETO", "08/1942", "C7[!2] CS 4", (1,4) ) + _check_capabilities( webdriver, webapp, *vehicle, "ETO", "01/1943", "C7[!2] CS 4", (1,4) ) # M4/M4A1/M4A2/M4A3: WP7(J4+)†3 s5(J4+) sM5(4+) for vo_name in ("M4","M4A1","M4A2","M4A3"): @@ -109,15 +109,15 @@ def test_month_capabilities( webapp, webdriver ): # OML 2-in. Mortar: IR(2)+† ordnance = [ "british", "ordnance", "OML 2-in. Mortar" ] - _check_capabilities( webdriver, webapp, *ordnance, "ETO", "12/1941", "4PP s7" ) - _check_capabilities( webdriver, webapp, *ordnance, "ETO", "01/1942", "4PP IR[!] s7" ) - _check_capabilities( webdriver, webapp, *ordnance, "ETO", "01/1943", "4PP IR[!] s7" ) + _check_capabilities( webdriver, webapp, *ordnance, "ETO", "12/1941", "4PP s7", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance, "ETO", "01/1942", "4PP IR[!] s7", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance, "ETO", "01/1943", "4PP IR[!] s7", (1,2) ) # OML 3-in. Mortar: IR(2)+†1 ordnance = [ "british", "ordnance", "OML 3-in. Mortar" ] - _check_capabilities( webdriver, webapp, *ordnance, "ETO", "12/1941", "NT QSU WP7 s8[!]" ) - _check_capabilities( webdriver, webapp, *ordnance, "ETO", "01/1942", "NT QSU IR[!1] WP7 s8[!]" ) - _check_capabilities( webdriver, webapp, *ordnance, "ETO", "01/1943", "NT QSU IR[!1] WP7 s8[!]" ) + _check_capabilities( webdriver, webapp, *ordnance, "ETO", "12/1941", "NT QSU WP7 s8[!]", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance, "ETO", "01/1942", "NT QSU IR[!1] WP7 s8[!]", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance, "ETO", "01/1943", "NT QSU IR[!1] WP7 s8[!]", (1,2) ) # OQF 6-Pounder 7-cwt: D6(J4E)7(5)† HE7(F3)8(4+)† ordnance = [ "british", "ordnance", "OQF 6-Pounder 7-cwt" ] @@ -132,11 +132,11 @@ def test_month_capabilities( webapp, webdriver ): # OQF 17-Pounder: D5(S4)6(5)† HE8(J4+)† ordnance = [ "british", "ordnance", "OQF 17-Pounder" ] - _check_capabilities( webdriver, webapp, *ordnance, "ETO", "12/1943", "NT" ) - _check_capabilities( webdriver, webapp, *ordnance, "ETO", "05/1944", "NT" ) - _check_capabilities( webdriver, webapp, *ordnance, "ETO", "06/1944", "NT HE8[!]" ) - _check_capabilities( webdriver, webapp, *ordnance, "ETO", "09/1944", "NT D5[!] HE8[!]" ) - _check_capabilities( webdriver, webapp, *ordnance, "ETO", "01/1945", "NT D6[!] HE8[!]" ) + _check_capabilities( webdriver, webapp, *ordnance, "ETO", "12/1943", "NT", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance, "ETO", "05/1944", "NT", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance, "ETO", "06/1944", "NT HE8[!]", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance, "ETO", "09/1944", "NT D5[!] HE8[!]", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance, "ETO", "01/1945", "NT D6[!] HE8[!]", (1,2) ) # Crusader III: HE7(F3+)†1 vehicle = [ "british", "vehicles", "Crusader III" ] @@ -310,6 +310,29 @@ def test_month_capabilities( webapp, webdriver ): assert "H6[!]" in val assert _get_capabilities( webdriver, webapp, *ordnance, "ETO", "01/1945" ) == val +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +@pytest.mark.skipif( + pytest.config.option.short_tests, #pylint: disable=no-member + reason = "--short-tests specified" +) #pylint: disable=too-many-statements +def test_kfw( webapp, webdriver ): + """Test date-based capabilities for K:FW vehicles/ordnance.""" + + # M26A1: WP6(M51+)†2 + vehicle = [ "american", "vehicles", "M26A1" ] + _check_capabilities( webdriver, webapp, *vehicle, "PTO", "12/1950", "A[!1] CS 6" ) + _check_capabilities( webdriver, webapp, *vehicle, "PTO", "02/1951", "A[!1] CS 6" ) + _check_capabilities( webdriver, webapp, *vehicle, "PTO", "03/1951", "A[!1] WP6[!2] CS 6" ) + _check_capabilities( webdriver, webapp, *vehicle, "PTO", "01/1952", "A[!1] WP6[!2] CS 6" ) + + # M46: WP6(M51+)†3 + vehicle = [ "american", "vehicles", "M46" ] + _check_capabilities( webdriver, webapp, *vehicle, "PTO", "12/1950", "A[!2] CS 6" ) + _check_capabilities( webdriver, webapp, *vehicle, "PTO", "02/1951", "A[!2] CS 6" ) + _check_capabilities( webdriver, webapp, *vehicle, "PTO", "03/1951", "A[!2] WP6[!3] CS 6" ) + _check_capabilities( webdriver, webapp, *vehicle, "PTO", "01/1952", "A[!2] WP6[!3] CS 6" ) + # --------------------------------------------------------------------- @pytest.mark.skipif( @@ -321,17 +344,17 @@ def test_theater_capabilities( webapp, webdriver ): # M2A1 105mm Howitzer: C7(4+P)†1 ordnance = [ "american", "ordnance", "M2A1 105mm Howitzer" ] - _check_capabilities( webdriver, webapp, *ordnance , "ETO", "12/1943", "NT H6 WP8 s7" ) - _check_capabilities( webdriver, webapp, *ordnance , "ETO", "01/1944", "NT H6 WP8 s7" ) - _check_capabilities( webdriver, webapp, *ordnance , "ETO", "01/1945", "NT H6 WP8 s7" ) - _check_capabilities( webdriver, webapp, *ordnance , "PTO", "12/1943", "NT H6 WP8 s7" ) - _check_capabilities( webdriver, webapp, *ordnance , "PTO", "01/1944", "NT C7[!1] H6 WP8 s7" ) - _check_capabilities( webdriver, webapp, *ordnance , "PTO", "01/1945", "NT C7[!1] H6 WP8 s7" ) + _check_capabilities( webdriver, webapp, *ordnance , "ETO", "12/1943", "NT H6 WP8 s7", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance , "ETO", "01/1944", "NT H6 WP8 s7", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance , "ETO", "01/1945", "NT H6 WP8 s7", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance , "PTO", "12/1943", "NT H6 WP8 s7", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance , "PTO", "01/1944", "NT C7[!1] H6 WP8 s7", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance , "PTO", "01/1945", "NT C7[!1] H6 WP8 s7", (1,2) ) # M3 105mm Howitzer: C7(P)†1 ordnance = [ "american", "ordnance", "M3 105mm Howitzer" ] - _check_capabilities( webdriver, webapp, *ordnance, "ETO", "01/1940", "NT H7 WP8 s7" ) - _check_capabilities( webdriver, webapp, *ordnance, "PTO", "01/1940", "NT C7[!1] H7 WP8 s7" ) + _check_capabilities( webdriver, webapp, *ordnance, "ETO", "01/1940", "NT H7 WP8 s7", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance, "PTO", "01/1940", "NT C7[!1] H7 WP8 s7", (1,2) ) # M2A4: C10(P)†1 vehicle = [ "american", "vehicles", "M2A4" ] @@ -364,8 +387,8 @@ def test_theater_capabilities( webapp, webdriver ): # M7 HMC: C7(P)†1 vehicle = [ "american", "vehicles", "M7 HMC" ] - _check_capabilities( webdriver, webapp, *vehicle, "PTO", "01/1940", "C7[!1] H7 WP8 s7 CS 7" ) - _check_capabilities( webdriver, webapp, *vehicle, "ETO", "01/1940", "H7 WP8 s7 CS 7" ) + _check_capabilities( webdriver, webapp, *vehicle, "PTO", "01/1940", "C7[!1] H7 WP8 s7 CS 7", (1,2) ) + _check_capabilities( webdriver, webapp, *vehicle, "ETO", "01/1940", "H7 WP8 s7 CS 7", (1,2) ) # LVT(A)1: C10(P)†2 vehicle = [ "american", "vehicles", "LVT(A)1" ] @@ -408,7 +431,9 @@ def test_theater_capabilities_bfp( webapp, webdriver ): # initialize init_webapp( webapp, webdriver, - reset = lambda ct: ct.set_vasl_mod( vmod="random", extns_dtype="real" ) + reset = lambda ct: + ct.set_data_dir( dtype="real" ) \ + .set_vasl_mod( vmod="random", extns_dtype="real" ) ) # LVT(A)1(L): C10(P)†2 @@ -437,22 +462,22 @@ def test_american_ordnance_note_c( webapp, webdriver ): # M3A1 37mm AT Gun: QSU C7[A2+]†[1] ordnance = [ "american", "ordnance", "M3A1 37mm AT Gun" ] - _check_capabilities( webdriver, webapp, *ordnance , "ETO", "07/1942", "QSU" ) - _check_capabilities( webdriver, webapp, *ordnance , "PTO", "07/1942", "QSU" ) - _check_capabilities( webdriver, webapp, *ordnance , "ETO", "08/1942", "QSU C7[!1]" ) - _check_capabilities( webdriver, webapp, *ordnance , "PTO", "08/1942", "QSU C10[!1]" ) # nb: C# += 3 + _check_capabilities( webdriver, webapp, *ordnance , "ETO", "07/1942", "QSU", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance , "PTO", "07/1942", "QSU", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance , "ETO", "08/1942", "QSU C7[!1]", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance , "PTO", "08/1942", "QSU C10[!1]", (1,2) ) # nb: C# += 3 # M2A1 105mm Howitzer: C7[4+P]†[1] H6 WP8 s7 ordnance = [ "american", "ordnance", "M2A1 105mm Howitzer" ] - _check_capabilities( webdriver, webapp, *ordnance , "ETO", "12/1943", "H6 WP8 s7" ) - _check_capabilities( webdriver, webapp, *ordnance , "PTO", "12/1943", "H6 WP8 s7" ) - _check_capabilities( webdriver, webapp, *ordnance , "ETO", "01/1944", "H6 WP8 s7" ) - _check_capabilities( webdriver, webapp, *ordnance , "PTO", "01/1944", "C7[!1] H6 WP8 s7" ) # nb: no += 3 + _check_capabilities( webdriver, webapp, *ordnance , "ETO", "12/1943", "H6 WP8 s7", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance , "PTO", "12/1943", "H6 WP8 s7", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance , "ETO", "01/1944", "H6 WP8 s7", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance , "PTO", "01/1944", "C7[!1] H6 WP8 s7", (1,2) ) # nb: no += 3 # M3 105mm Howitzer: C7[P]†[1] H7 WP8 s7 ordnance = [ "american", "ordnance", "M3 105mm Howitzer" ] - _check_capabilities( webdriver, webapp, *ordnance , "ETO", "01/1940", "H7 WP8 s7" ) - _check_capabilities( webdriver, webapp, *ordnance , "PTO", "01/1940", "C7[!1] H7 WP8 s7" ) # nb: no += 3 + _check_capabilities( webdriver, webapp, *ordnance , "ETO", "01/1940", "H7 WP8 s7", (1,2) ) + _check_capabilities( webdriver, webapp, *ordnance , "PTO", "01/1940", "C7[!1] H7 WP8 s7", (1,2) ) # nb: no += 3 # --------------------------------------------------------------------- diff --git a/vasl_templates/webapp/tests/test_counters.py b/vasl_templates/webapp/tests/test_counters.py index 41d6736..5810948 100644 --- a/vasl_templates/webapp/tests/test_counters.py +++ b/vasl_templates/webapp/tests/test_counters.py @@ -11,6 +11,7 @@ import tabulate from vasl_templates.webapp.vasl_mod import VaslMod, get_vo_gpids, compare_vasl_versions, SUPPORTED_VASL_MOD_VERSIONS from vasl_templates.webapp.config.constants import DATA_DIR +from vasl_templates.webapp.vo import _kfw_listings #pylint: disable=protected-access from vasl_templates.webapp.tests.utils import init_webapp, select_tab, find_child, find_children from vasl_templates.webapp.tests.test_scenario_persistence import load_scenario from vasl_templates.webapp.tests.remote import ControlTests @@ -24,7 +25,7 @@ from vasl_templates.webapp.tests.remote import ControlTests @pytest.mark.skipif( pytest.config.option.short_tests, #pylint: disable=no-member reason = "--short-tests specified" -) #pylint: disable=too-many-statements +) #pylint: disable=too-many-statements,too-many-locals def test_counter_images( webapp ): """Test that counter images are served correctly.""" @@ -33,6 +34,7 @@ def test_counter_images( webapp ): def check_images( gpids, check_front, check_back ): #pylint: disable=unused-argument """Check getting the front and back images for each counter.""" for gpid in gpids: + for side in ("front","back"): url = webapp.url_for( "get_counter_image", gpid=gpid, side=side ) try: @@ -42,21 +44,65 @@ def test_counter_images( webapp ): except urllib.error.HTTPError as ex: resp_code = ex.code resp_data = None - assert locals()["check_"+side]( resp_code, resp_data ) + assert locals()["check_"+side]( gpid, resp_code, resp_data ) # test counter images when no VASL module has been configured control_tests = ControlTests( webapp ) control_tests.set_vasl_mod( vmod=None ) # NOTE: It doesn't really matter which set of GPID's we use, since we're expecting # a missing image for everything anyway. We just use the most recent supported version. - gpids = get_vo_gpids( SUPPORTED_VASL_MOD_VERSIONS[-1], DATA_DIR, None ) + gpids = get_vo_gpids( None ) fname = os.path.join( os.path.split(__file__)[0], "../static/images/missing-image.png" ) missing_image_data = open( fname, "rb" ).read() check_images( gpids, - check_front = lambda code,data: code == 200 and data == missing_image_data, - check_back = lambda code,data: code == 200 and data == missing_image_data + check_front = lambda gpid,code,data: code == 200 and data == missing_image_data, + check_back = lambda gpid,code,data: code == 200 and data == missing_image_data ) + # FUDGE! 6.5.0 introduced a lot of new counters for K:FW. The vehicle/ordnance entries for these + # will always be loaded, but if an older version of VASL has been configured, requests to get images + # for these counters will, of course, fail, since the new counters won't be in the older VASL modules. + # We figure out here what those GPID's are. + # NOTE: All of this is horrendously complicated, and the problem will re-appear if new counters + # are added to the core VASL module in the future. At that point, we should probably drop testing + # against older versions of VASL and just test against the latest version :-/ + expected_missing_gpids = set() + for vo_type in ("vehicles","ordnance"): + kfw_listings = _kfw_listings[ vo_type ] + for entries in kfw_listings.values(): + for entry in entries: + if isinstance( entry["gpid"], list ): + expected_missing_gpids.update( entry["gpid"] ) + else: + expected_missing_gpids.add( entry["gpid"] ) + expected_missing_gpids = set( str(e) for e in expected_missing_gpids ) + # NOTE: However, some of the GPID's used by the new K:FW counters use old images that are available + # even in older versions of VASL, so we figure out here what those are. + def get_gpids( fname ): + """Extract the GPID's from the specified file.""" + dname = os.path.join( os.path.split(__file__)[0], "fixtures" ) + fname = os.path.join( dname, fname ) + gpids = set() + for line_buf in open(fname,"r"): + mo = re.search( "^[0-9a-z:]+", line_buf ) + if mo: + gpids.add( mo.group() ) + return gpids + legacy_gpids = get_gpids( "vasl-pieces-legacy.txt" ) + latest_gpids = get_gpids( "vasl-pieces-6.5.0.txt" ) + common_gpids = legacy_gpids.intersection( latest_gpids ) + expected_missing_gpids = expected_missing_gpids.difference( common_gpids ) + expected_missing_gpids.remove( "1002" ) # FUDGE! this is a remapped GPID (11340) + + def _do_check_front( gpid, code, data ): + if vasl_version != SUPPORTED_VASL_MOD_VERSIONS[-1] and gpid in expected_missing_gpids: + return code == 404 and not data + return code == 200 and data + def _do_check_back( gpid, code, data ): + if vasl_version != SUPPORTED_VASL_MOD_VERSIONS[-1] and gpid in expected_missing_gpids: + return code == 404 and not data + return (code == 200 and data) or (code == 404 and not data) + # test each VASL module file in the specified directory vmod_fnames = control_tests.get_vasl_mods() for vmod_fname in vmod_fnames: @@ -73,8 +119,9 @@ def test_counter_images( webapp ): # figure out what we're expecting to see # NOTE: The results were the same across 6.4.0-6.4.4, but 6.5.0 introduced some changes. vasl_mod = VaslMod( fname, DATA_DIR, None ) + vasl_version = vasl_mod.vasl_version dname = os.path.join( os.path.split(__file__)[0], "fixtures" ) - fname = os.path.join( dname, "vasl-pieces-{}.txt".format( vasl_mod.vasl_version ) ) + fname = os.path.join( dname, "vasl-pieces-{}.txt".format( vasl_version ) ) if not os.path.isfile( fname ): fname = os.path.join( dname, "vasl-pieces-legacy.txt" ) expected_vasl_pieces = open( fname, "r" ).read() @@ -85,11 +132,8 @@ def test_counter_images( webapp ): assert buf.getvalue() == expected_vasl_pieces # check each counter - gpids = get_vo_gpids( vasl_mod.vasl_version, DATA_DIR, None ) - check_images( gpids, - check_front = lambda code,data: code == 200 and data, - check_back = lambda code,data: (code == 200 and data) or (code == 404 and not data) - ) + gpids = get_vo_gpids( vasl_mod ) + check_images( gpids, check_front=_do_check_front, check_back=_do_check_back ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vasl_templates/webapp/tests/test_ob.py b/vasl_templates/webapp/tests/test_ob.py index 274d236..a62e6b6 100644 --- a/vasl_templates/webapp/tests/test_ob.py +++ b/vasl_templates/webapp/tests/test_ob.py @@ -3,11 +3,13 @@ import re import types +from selenium.webdriver.support.ui import Select + from vasl_templates.webapp.tests.utils import \ get_nationalities, wait_for_clipboard, get_stored_msg, set_stored_msg_marker, select_tab, \ find_child, find_children, \ add_simple_note, edit_simple_note, get_sortable_entry_count, drag_sortable_entry_to_trash, \ - init_webapp, wait_for, adjust_html, set_scenario_date, set_player + init_webapp, wait_for, adjust_html, set_scenario_date, set_player, select_droplist_val # --------------------------------------------------------------------- @@ -182,6 +184,10 @@ def test_nationality_specific( webapp, webdriver ): #pylint: disable=too-many-lo "psk": [ "german", check_psk_snippets ], "atmm": [ "german", check_atmm_snippets ], "baz": [ "american", check_baz_snippets ], + "baz45": [ ("american","Korea"), "BAZ 45 (from K:FW)" ], + "baz50": [ ("american","Korea"), "BAZ 50 (from K:FW)" ], + "baz-cpva16": [ "kfw-cpva", "BAZ 44 (from K:FW)" ], + "baz-cpva17": [ "kfw-cpva", "BAZ Type 51 (from K:FW)" ], "piat": [ "british", "piat template ; col=[OBCOL:british]/[OBCOL-BORDER:british]" ], "thh": [ "japanese", "Banzai!!!" ], } @@ -200,7 +206,13 @@ def test_nationality_specific( webapp, webdriver ): #pylint: disable=too-many-lo select_tab( "ob1" ) for button_id,expected in nationality_specific_buttons.items(): elem = btn_elems[ button_id ] - if nat == expected[0]: + if isinstance( expected[0], str ): + nat2 = expected[0] + else: + nat2 = expected[0][0] + sel = Select( find_child( "select[name='SCENARIO_THEATER']" ) ) + select_droplist_val( sel, expected[0][1] ) + if nat == nat2: # the button should be shown for this nationality assert elem.is_displayed() # make sure that the template works diff --git a/vasl_templates/webapp/tests/test_vasl_extensions.py b/vasl_templates/webapp/tests/test_vasl_extensions.py index 29d6da1..df74f17 100644 --- a/vasl_templates/webapp/tests/test_vasl_extensions.py +++ b/vasl_templates/webapp/tests/test_vasl_extensions.py @@ -74,7 +74,8 @@ def test_vasl_extension_info( webapp, webdriver ): _set_test_vasl_extn( control_tests, open(fname,"r").read() ) def do_test( dtype, expected ): #pylint: disable=missing-docstring - control_tests.set_vasl_extn_info_dir( dtype=dtype ) \ + control_tests.set_data_dir( dtype="real" ) \ + .set_vasl_extn_info_dir( dtype=dtype ) \ .set_vasl_mod( vmod="random", extns_dtype="test" ) _check_warning_msgs( control_tests, expected ) diff --git a/vasl_templates/webapp/tests/test_vassal.py b/vasl_templates/webapp/tests/test_vassal.py index fb010fb..c6b411b 100644 --- a/vasl_templates/webapp/tests/test_vassal.py +++ b/vasl_templates/webapp/tests/test_vassal.py @@ -316,7 +316,9 @@ def test_dump_vsav( webapp, webdriver ): """Test dumping a scenario.""" # initialize - control_tests = init_webapp( webapp, webdriver ) + control_tests = init_webapp( webapp, webdriver, + reset = lambda ct: ct.set_data_dir( dtype="real" ) + ) def do_test(): #pylint: disable=missing-docstring @@ -634,6 +636,52 @@ def test_reverse_remapped_gpids( webapp, webdriver ): min_vasl_version="6.5.0" ) +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +@pytest.mark.skipif( not pytest.config.option.vasl_mods, reason="--vasl-mods not specified" ) #pylint: disable=no-member +@pytest.mark.skipif( not pytest.config.option.vassal, reason="--vassal not specified" ) #pylint: disable=no-member +def test_vo_entry_selection_for_theater( webapp, webdriver ): + """Test selection of vehicle/ordnance entries by theater.""" + + # initialize + control_tests = init_webapp( webapp, webdriver, vsav_persistence=1, scenario_persistence=1, + reset = lambda ct: + ct.set_data_dir( dtype="real" ) + ) + + def do_test( theater, expected ): #pylint: disable=missing-docstring + new_scenario() + load_scenario_params( { "scenario": { + "SCENARIO_THEATER": theater, + "PLAYER_1": "american", + } } ) + _analyze_vsav( "vo-entry-selection-for-theater.vsav", + [ [], expected ], + [ [], [] ], + [ "Imported 4 American ordnance." ] + ) + + # do the tests + def do_tests(): #pylint: disable=missing-docstring + # NOTE: The .vsav file contains ROK and OUNC variants of the M2 60* Mortar which, strictly speaking, + # should only be imported for ROK and OUNC players respectively. However, due to the way the data files + # are currently set up (the kfw/un-common.json file gets appended to the US, British, ROK and OUNC + # player lists, and all the GPID's become available to all the players), they are currently (incorrectly) + # imported. However, this isn't a big problem since these players will never be fighting against each other. + do_test( "ETO", [ + # NOTE: The normal M2 60* Mortar gets imported as an old-style American entry (because we're in ETO). + ("am/o:000",None), + # NOTE The other variants always get imported as K:FW counters. + ("kfw-un-common/o:002","12689/0"), ("kfw-un-common/o:002","11391/0"), ("kfw-un-common/o:002","11440/0") + ] ) + do_test( "Korea", [ + # NOTE: The normal M2 60* Mortar gets imported as new-style K:FW entry (because we're in Korea). + ("kfw-un-common/o:002","849/0"), + # NOTE The other variants always get imported as K:FW counters. + ("kfw-un-common/o:002","12689/0"), ("kfw-un-common/o:002","11391/0"), ("kfw-un-common/o:002","11440/0") + ] ) + _run_tests( control_tests, do_tests, True, min_vasl_version="6.5.0" ) + # --------------------------------------------------------------------- def _run_tests( control_tests, func, test_all, min_vasl_version=None ): diff --git a/vasl_templates/webapp/tests/test_vehicles_ordnance.py b/vasl_templates/webapp/tests/test_vehicles_ordnance.py index 8c1cf19..6160021 100644 --- a/vasl_templates/webapp/tests/test_vehicles_ordnance.py +++ b/vasl_templates/webapp/tests/test_vehicles_ordnance.py @@ -430,6 +430,9 @@ def test_common_vo( webapp, webdriver ): if nat in ["thai","indonesian","anzac","burmese","filipino"]: # nb: these are in the BFP extension assert last_warning.startswith( "There are no" ) continue + elif nat == "kfw-cpva" and vo_type == "vehicles": + assert last_warning.startswith( "There are no" ) + continue else: assert last_warning == last_warning_marker vo_entries = find_children( "#select-vo .select2-results li" ) diff --git a/vasl_templates/webapp/tests/test_vo_notes.py b/vasl_templates/webapp/tests/test_vo_notes.py index ba9b07c..a06794f 100644 --- a/vasl_templates/webapp/tests/test_vo_notes.py +++ b/vasl_templates/webapp/tests/test_vo_notes.py @@ -471,7 +471,7 @@ def test_vo_notes_reports( webapp, webdriver ): # initialize check_dir = os.path.join( vo_notes_dir, "tests/" ) - save_dir = None # nb: define this to save the generated reports + save_dir = None # nb: define this to save the generated reports (compare against ~/projects/chapter-h-data/tests/) # initialize if save_dir and os.path.isdir(save_dir): @@ -480,12 +480,14 @@ def test_vo_notes_reports( webapp, webdriver ): # check each nationality's multi-applicable notes nationalities = list( get_nationalities( webapp ).keys() ) nationalities.extend( [ "allied-minor", "axis-minor", "landing-craft" ] ) + failed = False for nat in nationalities: for vo_type in ["vehicles","ordnance"]: # get the next report vo_notes, ma_notes, keys = get_vo_notes_report( webapp, webdriver, nat, vo_type ) - if nat in ("burmese","filipino") or (nat,vo_type) in [("landing-craft","ordnance"),("anzac","ordnance")]: + if nat in ("burmese","filipino") \ + or (nat,vo_type) in [ ("landing-craft","ordnance"), ("anzac","ordnance"), ("kfw-cpva","vehicles") ]: assert not vo_notes and not ma_notes and not keys continue @@ -523,7 +525,14 @@ def test_vo_notes_reports( webapp, webdriver ): # check the report fname = os.path.join( check_dir, fname ) - assert open( fname, "r", encoding="utf-8" ).read() == report + if open( fname, "r", encoding="utf-8" ).read() != report: + if save_dir: + print( "FAILED:", fname ) + failed = True + else: + assert False, "Report mismatch: {}".format( fname ) + + assert not failed # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vasl_templates/webapp/tests/test_vo_reports.py b/vasl_templates/webapp/tests/test_vo_reports.py index e8cf25f..f481732 100644 --- a/vasl_templates/webapp/tests/test_vo_reports.py +++ b/vasl_templates/webapp/tests/test_vo_reports.py @@ -24,7 +24,7 @@ from vasl_templates.webapp.tests.utils import init_webapp, get_nationalities, fi @pytest.mark.skipif( not pytest.config.option.vasl_extensions, #pylint: disable=no-member reason = "--vasl-extensions not specified" -) #pylint: disable=too-many-locals +) #pylint: disable=too-many-statements,too-many-locals def test_vo_reports( webapp, webdriver ): #pylint: disable=too-many-locals """Check the vehicle/ordnance reports.""" @@ -55,13 +55,22 @@ def test_vo_reports( webapp, webdriver ): #pylint: disable=too-many-locals # check each vehicle/ordnance report nationalities = list( get_nationalities( webapp ).keys() ) nationalities.extend( [ "allied-minor-common", "axis-minor-common" ] ) + failed = False for nat in nationalities: + for vo_type in ["vehicles","ordnance"]: - for year in range(1940,1945+1): + + # figure out which years we should generate reports for + # NOTE: The Americans and British are in K:FW, so we should really check 1950-53 for these as well, + # but there are only a few vehicles that have date-specific capabilities, so we don't bother testing + # for them here, and check those specific cases in test_kfw(). + years = (1950,1953) if nat.startswith( "kfw-" ) else (1940,1945) + + for year in range(years[0],years[1]+1): # get the next report results = get_vo_report( webapp, webdriver, vo_type, nat, "ETO", year, 1 ) - if nat in ("burmese","filipino") or (nat,vo_type) in [("anzac","ordnance")]: + if nat in ("burmese","filipino") or (nat,vo_type) in [("anzac","ordnance"),("kfw-cpva","vehicles")]: assert not results continue @@ -97,7 +106,14 @@ def test_vo_reports( webapp, webdriver ): #pylint: disable=too-many-locals # check the report fname = os.path.join( check_dir, fname ) - assert open(fname,"r",encoding="utf-8").read() == report + if open(fname,"r",encoding="utf-8").read() != report: + if save_dir: + print( "FAILED:", fname ) + failed = True + else: + assert False, "Report mismatch: {}".format( fname ) + + assert not failed # get the landing craft report url = webapp.url_for( "get_lc_report" ) diff --git a/vasl_templates/webapp/tests/utils.py b/vasl_templates/webapp/tests/utils.py index 824d66b..2e607ad 100644 --- a/vasl_templates/webapp/tests/utils.py +++ b/vasl_templates/webapp/tests/utils.py @@ -38,6 +38,7 @@ _NAT_TEMPLATES = { "american": [ "baz" ], "british": [ "piat" ], "japanese": [ "thh" ], + "kfw-cpva": [ "baz-cpva16", "baz-cpva17" ], } _webapp = None @@ -147,6 +148,16 @@ def for_each_template( func ): #pylint: disable=too-many-branches func( template_id, template_id ) templates_to_test.remove( template_id ) + # test the American BAZ 45 and BAZ 50 + load_scenario_params( { "scenario": { + "PLAYER_1": "american", + "SCENARIO_THEATER": "Korea", + } } ) + select_tab( "ob1" ) + for template_id in ("baz45","baz50"): + func( template_id, template_id ) + templates_to_test.remove( template_id ) + # make sure we tested everything assert not templates_to_test diff --git a/vasl_templates/webapp/vasl_mod.py b/vasl_templates/webapp/vasl_mod.py index 0f9d93b..1fa3ae3 100644 --- a/vasl_templates/webapp/vasl_mod.py +++ b/vasl_templates/webapp/vasl_mod.py @@ -12,6 +12,7 @@ _logger = logging.getLogger( "vasl_mod" ) from vasl_templates.webapp import app, globvars from vasl_templates.webapp.config.constants import DATA_DIR +from vasl_templates.webapp.vo import get_vo_listings SUPPORTED_VASL_MOD_VERSIONS = [ "6.4.0", "6.4.1", "6.4.2", "6.4.3", "6.4.4", "6.5.0" ] SUPPORTED_VASL_MOD_VERSIONS_DISPLAY = "6.4.0-6.5.0" @@ -158,7 +159,7 @@ class VaslMod: ) # load the VASL module and any extensions - self.vasl_version = self._load_vmod( data_dir ) + self._load_vmod( data_dir ) if self.vasl_version not in SUPPORTED_VASL_MOD_VERSIONS: _logger.warning( "Unsupported VASL version: %s", self.vasl_version ) @@ -166,7 +167,7 @@ class VaslMod: """Get the image for the specified piece.""" # get the image path - gpid = get_remapped_gpid( self.vasl_version, gpid ) + gpid = get_remapped_gpid( self, gpid ) if gpid not in self._pieces: return None, None piece = self._pieces[ gpid ] @@ -197,7 +198,7 @@ class VaslMod: paths = piece[ "front_images" ] return paths if isinstance(paths,list) else [paths] return { - get_reverse_remapped_gpid( self.vasl_version, p["gpid"] ): { + get_reverse_remapped_gpid( self, p["gpid"] ): { "name": p["name"], "front_images": image_count( p, "front_images" ), "back_images": image_count( p, "back_images" ), @@ -227,17 +228,20 @@ class VaslMod: # get the VASL version build_info = self._files[0][0].read( "buildFile" ) doc = xml.etree.ElementTree.fromstring( build_info ) - vasl_version = doc.attrib.get( "version" ) + self.vasl_version = doc.attrib.get( "version" ) # figure out which pieces we're interested in - target_gpids = get_vo_gpids( vasl_version, data_dir, self.get_extns() ) + target_gpids = get_vo_gpids( self ) # parse the VASL module and any extensions for i,files in enumerate( self._files ): _logger.info( "Loading VASL %s: %s", ("module" if i == 0 else "extension"), files[0].filename ) - version = self._parse_zip_file( files[0], target_gpids, vasl_overrides, expected_multiple_images ) - if i == 0: - vasl_version = version + self._parse_zip_file( files[0], target_gpids, vasl_overrides, expected_multiple_images ) + + # NOTE: The code below may log warnings if we're using an older version of VASL (because we know + # about pieces that were added in a later version, but, of course, aren't in the older version). + # However, we don't disable these log messages, since they might be useful if somebody reports + # a problem, and it turns out they have an older version of VASL configured :-/ # make sure we found all the pieces we need _logger.info( "Loaded %d pieces.", len(self._pieces) ) @@ -252,8 +256,6 @@ class VaslMod: gpids = ", ".join( expected_multiple_images.keys() ) _logger.warning( "Expected multiple images but didn't find them: %s", gpids ) - return vasl_version - def _parse_zip_file( self, zip_file, target_gpids, vasl_overrides, expected_multiple_images ): #pylint: disable=too-many-locals """Parse a VASL module or extension.""" @@ -336,7 +338,7 @@ class VaslMod: return True if val.startswith( "," ): val = val[1:] - if val.startswith( ("ru/","ge/","am/","br/","it/","ja/","ch/","sh/","fr/","al/","ax/","hu/","fi/") ): + if val.startswith( ("ru/","ge/","am/","br/","it/","ja/","ch/","sh/","fr/","al/","ax/","hu/","fi/","nk/") ): return True return False fields = [ f for f in fields if is_image_path(f) ] @@ -355,34 +357,38 @@ class VaslMod: front_images, back_images = split_fields(fields[0]), None else: # the piece has front and back image(s) - if len(fields) > 2: - _logger.warning( "Found > 2 image paths for gpid=%s", gpid ) front_images, back_images = split_fields(fields[1]), split_fields(fields[0]) + def check_pair( pair ): + """Check if the front/back images end with the specified strings.""" + return front_images[-1].endswith( pair[0] ) and back_images[-1].endswith( pair[1] ) + # ignore dismantled ordnance if len(front_images) > 1: - if front_images[-1].endswith( "dm" ): - if back_images[-1].endswith( "dmb" ): + for pair in [ + ("dm","dmb"), ("dm.png","dmm.png"), ("-dm.png","-dm-malf.png"), ("(KFW)dm.png","(KFW)dmx.png") + ]: + if check_pair( pair ): _logger.debug( "Ignoring dismantled images: gpid=%s, front=%s, back=%s", gpid, front_images, back_images ) front_images.pop() back_images.pop() - else: - _logger.warning( "Unexpected dismantled images: %s %s", front_images, back_images ) # ignore limbered ordnance if len(front_images) > 1: - if front_images[-1].endswith( "l" ): - if back_images[-1].endswith( ("lb","l-b") ): + for pair in [ ("l","lb"), ("l","l-b"), + ("(KFW)l.png","(KFW)lx.png"), ("(KFW)-limbered.png","(KFW)-limbered-malf.png"), + ("l(KFW).png","lm(KFW).png") + ]: + if check_pair( pair ): + # nb: this is for some K:FW ordnance _logger.debug( "Ignoring limbered images: gpid=%s, front=%s, back=%s", gpid, front_images, back_images ) front_images.pop() back_images.pop() - else: - _logger.warning( "Unexpected limbered images: %s %s", front_images, back_images ) - elif front_images[-1].endswith( "B.png" ) and front_images[0] == front_images[-1][:-5]+".png": + if front_images[-1].endswith( "B.png" ) and front_images[0] == front_images[-1][:-5]+".png": # nb: this is for Finnish Guns _logger.debug( "Ignoring limbered images: gpid=%s, front=%s, back=%s", gpid, front_images, back_images @@ -412,52 +418,28 @@ class VaslMod: # --------------------------------------------------------------------- -def get_vo_gpids( vasl_version, data_dir, extns ): #pylint: disable=too-many-locals,too-many-branches +def get_vo_gpids( vasl_mod ): """Get the GPID's for the vehicles/ordnance.""" - gpids = set() - for vo_type in ("vehicles","ordnance"): #pylint: disable=too-many-nested-blocks - - # process each file - dname = os.path.join( data_dir, vo_type ) - for root,_,fnames in os.walk(dname): - for fname in fnames: - - if os.path.splitext( fname )[1] != ".json": - continue + # initialize + listings = get_vo_listings( vasl_mod ) - # load the GPID's from the next file - # NOTE: We originally assumed that GPID's are integers, but the main VASL build file started - # to have non-numeric values, as do, apparently, extensions :-/ For back-compat, we support both. - entries = json.load( open( os.path.join(root,fname), "r" ) ) - for entry in entries: - entry_gpids = entry.get( "gpid" ) - if not entry_gpids: - entry_gpids = entry.get( "extra_gpids" ) # nb: for lend-lease vehicles/ordnance - if not entry_gpids: - continue - if not isinstance( entry_gpids, list ): - entry_gpids = [ entry_gpids ] - for gpid in entry_gpids: - if gpid: - gpids.add( get_remapped_gpid( vasl_version, str(gpid) ) ) - - # process any extensions - if extns: #pylint: disable=too-many-nested-blocks - for extn in extns: - extn_info = extn[1] - for nat in extn_info: - if not isinstance( extn_info[nat], dict ): + # figure out which GPID's we know about + gpids = set() + for vo_type in ("vehicles","ordnance"): + for vo_entries in listings[ vo_type ].values(): + for vo_entry in vo_entries: + vo_gpids = vo_entry[ "gpid" ] + if not vo_gpids: continue - 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"] ) + gpids.update( + get_remapped_gpid( vasl_mod, str(gpid) ) + for gpid in (vo_gpids if isinstance(vo_gpids,list) else [vo_gpids]) + ) return gpids + def compare_vasl_versions( lhs, rhs ): """Compare two VASL version strings.""" # NOTE: We can do this with a simple string comparison, but see test_compare_vasl_versions(). @@ -510,19 +492,23 @@ REVERSE_GPID_REMAPPINGS = [ for row in GPID_REMAPPINGS ] -def get_remapped_gpid( vasl_version, gpid ): +def get_remapped_gpid( vasl_mod, gpid ): """Check if a GPID has been remapped.""" + if not vasl_mod: + return gpid for remappings in GPID_REMAPPINGS: # FUDGE! Early versions of this code (pre-6.5.0) always applied the remappings for 6.4.3, # even for versions of VASL earlier than that. For simplicity, we preserve that behavior. if compare_vasl_versions( remappings[0], "6.5.0" ) < 0 \ - or compare_vasl_versions( vasl_version, remappings[0] ) >= 0: + or compare_vasl_versions( vasl_mod.vasl_version, remappings[0] ) >= 0: gpid = remappings[1].get( gpid, gpid ) return gpid -def get_reverse_remapped_gpid( vasl_version, gpid ): +def get_reverse_remapped_gpid( vasl_mod, gpid ): """Check if a GPID has been remapped.""" + if not vasl_mod: + return gpid for remappings in REVERSE_GPID_REMAPPINGS: - if compare_vasl_versions( vasl_version, remappings[0] ) >= 0: + if compare_vasl_versions( vasl_mod.vasl_version, remappings[0] ) >= 0: gpid = remappings[1].get( gpid, gpid ) return gpid diff --git a/vasl_templates/webapp/vassal.py b/vasl_templates/webapp/vassal.py index f8ef46d..b90ba4c 100644 --- a/vasl_templates/webapp/vassal.py +++ b/vasl_templates/webapp/vassal.py @@ -229,7 +229,7 @@ def analyze_vsav(): # back-compatibility for as long as we can :-/ report2 = {} for gpid,vals in report.items(): - orig_gpid = get_reverse_remapped_gpid( globvars.vasl_mod.vasl_version, gpid ) + orig_gpid = get_reverse_remapped_gpid( globvars.vasl_mod, gpid ) if orig_gpid == gpid: report2[ gpid ] = vals else: diff --git a/vasl_templates/webapp/vo.py b/vasl_templates/webapp/vo.py index 0d7b883..aee8436 100644 --- a/vasl_templates/webapp/vo.py +++ b/vasl_templates/webapp/vo.py @@ -10,6 +10,8 @@ from flask import request, render_template, jsonify, abort from vasl_templates.webapp import app, globvars from vasl_templates.webapp.config.constants import DATA_DIR +_kfw_listings = { "vehicles": {}, "ordnance": {} } + # --------------------------------------------------------------------- @app.route( "/vehicles" ) @@ -30,24 +32,28 @@ def _do_get_listings( vo_type ): else: # nb: we should only get here during tests return _do_load_vo_listings( - vo_type, + globvars.vasl_mod, vo_type, request.args.get("merge_common") == "1", request.args.get("report") == "1" ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - def load_vo_listings(): - """Load the vehicle/ordnance listings.""" - globvars.vo_listings = { - "vehicles": _do_load_vo_listings( "vehicles", True, False ), - "ordnance": _do_load_vo_listings( "ordnance", True, False ) + """Load and install the vehicle/ordnance listings.""" + globvars.vo_listings = get_vo_listings( globvars.vasl_mod ) + +def get_vo_listings( vasl_mod ): + """Get the vehicle/ordnance listings.""" + return { + "vehicles": _do_load_vo_listings( vasl_mod, "vehicles", True, False ), + "ordnance": _do_load_vo_listings( vasl_mod, "ordnance", True, False ) } -def _do_load_vo_listings( vo_type, merge_common, report ): #pylint: disable=too-many-locals,too-many-branches,too-many-statements +def _do_load_vo_listings( vasl_mod, vo_type, merge_common, real_data_dir ): #pylint: disable=too-many-locals,too-many-branches,too-many-statements """Load the vehicle/ordnance listings.""" # locate the data directory - if report: + if real_data_dir: dname = DATA_DIR # nb: always use the real data for reports, not the test fixtures else: dname = app.config.get( "DATA_DIR", DATA_DIR ) @@ -64,6 +70,9 @@ def _do_load_vo_listings( vo_type, merge_common, report ): #pylint: disable=too- if extn != ".json" or fname_stem.endswith( ".lend-lease" ): continue nat = os.path.splitext( os.path.split(fname)[1] )[ 0 ] + is_kfw = os.path.split( root )[1] == "kfw" + if is_kfw: + nat = "kfw-" + ("uro" if nat == "us-rok-ounc" else nat) if os.path.split(root)[1] in ("allied-minor","axis-minor"): minor_type = os.path.split( root )[1] if nat == "common": @@ -71,7 +80,7 @@ def _do_load_vo_listings( vo_type, merge_common, report ): #pylint: disable=too- else: minor_nats[minor_type].add( nat ) with open( os.path.join(root,fname), "r" ) as fp: - listings[nat] = json.load( fp ) + ( _kfw_listings[vo_type] if is_kfw else listings )[ nat ] = json.load( fp ) fname2 = os.path.join( root, "{}.lend-lease.json".format( fname_stem ) ) if os.path.isfile( fname2 ): with open( fname2, "r" ) as fp: @@ -88,10 +97,10 @@ def _do_load_vo_listings( vo_type, merge_common, report ): #pylint: disable=too- # apply any changes for VASL extensions # NOTE: We do this here, rather than in VaslMod, because VaslMod is a wrapper around a VASL module, and so # only knows about GPID's and counter images, rather than Chapter H pieces and piece ID's (e.g. "ge/v:001"). - if globvars.vasl_mod: + if vasl_mod: # process each VASL extension vo_index = _make_vo_index( listings ) - for extn in globvars.vasl_mod.get_extns(): + for extn in vasl_mod.get_extns(): _apply_extn_info( listings, extn[0], extn[1], vo_index, vo_type ) # update nationality variants with the listings from their base nationality @@ -101,6 +110,34 @@ def _do_load_vo_listings( vo_type, merge_common, report ): #pylint: disable=too- base_nat = nat.split( "~" )[0] listings[nat] = listings[base_nat] + listings[nat] + # install the K:FW entries + # NOTE: We do this after updating the nationality variants so that e.g. the British Canadians + # don't get the BCFK vehicles/ordnance. + def extend_listings( key, kfw_key ): + """Extend the listings with new entries.""" + if key in listings and kfw_key in _kfw_listings[vo_type]: + listings[ key ].extend( _kfw_listings[vo_type][ kfw_key ] ) + if vo_type == "vehicles": + for nat in ( "american", "kfw-rok", "kfw-ounc", "british" ): + extend_listings( nat, "kfw-bcfk" if nat == "british" else "kfw-uro" ) + extend_listings( nat, "kfw-un-common" ) + extend_listings( "kfw-kpa", "kfw-kpa" ) + elif vo_type == "ordnance": + # NOTE: Appending the common ordnance to each of the American, ROK and OUNC ordnance lists isn't + # quite the right thing to do, since it will cause incorrect behavior when analyzing a scenario. + # For example, the M2 60* Mortar has variants for each nationality, each with its own GPID, + # which should really only be imported if the owning player's nationality matches the counter. + # However, this shouldn't really be a problem since these nationalities will never be playing + # against each other. + for nat in ( "american", "kfw-rok", "kfw-ounc" ): + extend_listings( nat, "kfw-uro" ) + extend_listings( nat, "kfw-un-common" ) + for pair in [ ("british","kfw-bcfk"), ("kfw-kpa","kfw-kpa"), ("kfw-cpva","kfw-cpva") ]: + extend_listings( pair[0], pair[1] ) + extend_listings( "british", "kfw-un-common" ) + else: + assert False, "Unknown V/O type: {}".format( vo_type ) + # add in any common vehicles/ordnance and landing craft # NOTE: We do this after updating nationality variants, so that the British variants (i.e. Canada # and New Zealand) don't get the landing craft. diff --git a/vasl_templates/webapp/vo_notes.py b/vasl_templates/webapp/vo_notes.py index c5c2950..a441530 100644 --- a/vasl_templates/webapp/vo_notes.py +++ b/vasl_templates/webapp/vo_notes.py @@ -4,6 +4,7 @@ import os import io import re +import copy import logging from collections import defaultdict @@ -52,10 +53,11 @@ def load_vo_notes( msg_store ): #pylint: disable=too-many-statements,too-many-lo file_server = FileServer( dname ) # generate a list of extension ID's - extn_ids = {} + extn_ids = set() if globvars.vasl_mod: extns = globvars.vasl_mod.get_extns() extn_ids = set( e[1]["extensionId"] for e in extns ) + extn_ids.update( [ "kfw-un", "kfw-comm" ] ) def get_ma_note_key( nat, fname ): """Get the key for a multi-applicable note.""" @@ -180,11 +182,64 @@ def load_vo_notes( msg_store ): #pylint: disable=too-many-statements,too-many-lo # update nationality variants with the notes from their base nationality for vo_type2 in vo_notes: # FUDGE! Some nationalities don't have any vehicles/ordnance of their own, so we have to do this manually. + # NOTE: We do a deep copy so that these new nationalities don't get affected by changes we make + # to the base nationality later (e.g. adding K:FW counters to the British). if "chinese" in vo_notes[vo_type2]: - vo_notes[vo_type2]["chinese~gmd"] = vo_notes[vo_type2]["chinese"] + vo_notes[vo_type2]["chinese~gmd"] = copy.deepcopy( vo_notes[vo_type2]["chinese"] ) if "british" in vo_notes[vo_type2]: - vo_notes[vo_type2]["british~canadian"] = vo_notes[vo_type2]["british"] - vo_notes[vo_type2]["british~newzealand"] = vo_notes[vo_type2]["british"] + vo_notes[vo_type2]["british~canadian"] = copy.deepcopy( vo_notes[vo_type2]["british"] ) + vo_notes[vo_type2]["british~newzealand"] = copy.deepcopy( vo_notes[vo_type2]["british"] ) + + def install_kfw_vo_notes( nat, vo_type, extn_id, include ): + """Install the K:FW vehicle/ordnance notes into the specified nationality.""" + target_vo_notes = vo_notes[vo_type].get( nat ) + if not target_vo_notes: + return + kfw_vo_notes = vo_notes[vo_type].get( extn_id ) + if not kfw_vo_notes: + return + target_vo_notes.update( { + "{}:{}".format( extn_id, key ): val + for key,val in kfw_vo_notes.items() + if not include or include( int(key) ) + } ) + def install_kfw_ma_notes( nat, vo_type, kfw_ma_notes, extn_id ): + """Install the K:FW vehicle/ordnance multi-applicable notes into the specified nationality.""" + if not kfw_ma_notes: + return + if nat not in vo_notes[vo_type]: + vo_notes[vo_type][nat] = {} + ma_notes = vo_notes[vo_type][nat].get( "multi-applicable" ) + if not ma_notes: + ma_notes = vo_notes[vo_type][nat]["multi-applicable"] = {} + ma_notes.update( { + "{}:{}".format( extn_id, key ): val + for key,val in kfw_ma_notes.items() + } ) + + # install the UN vehicle/ordnance notes and multi-applicable notes + kfw_ma_notes = vo_notes["vehicles"].get( "kfw-un", {} ).pop( "multi-applicable", None ) + for nat in ("american","kfw-rok","kfw-ounc"): + install_kfw_ma_notes( nat, "vehicles", kfw_ma_notes, "kfw-un" ) + install_kfw_vo_notes( nat, "vehicles", "kfw-un", lambda key: key <= 33 or key >= 54 ) + install_kfw_ma_notes( "british", "vehicles", kfw_ma_notes, "kfw-un" ) + install_kfw_vo_notes( "british", "vehicles", "kfw-un", lambda key: key >= 34 ) + kfw_ma_notes = vo_notes["ordnance"].get( "kfw-un", {} ).pop( "multi-applicable", None ) + for nat in ("american","kfw-rok","kfw-ounc"): + install_kfw_ma_notes( nat, "ordnance", kfw_ma_notes, "kfw-un" ) + install_kfw_vo_notes( nat, "ordnance", "kfw-un", lambda key: key <= 13 or key >= 21 ) + install_kfw_ma_notes( "british", "ordnance", kfw_ma_notes, "kfw-un" ) + install_kfw_vo_notes( "british", "ordnance", "kfw-un", lambda key: key >= 14 ) + + # install the Communist vehicle/ordnance notes and multi-applicable notes + kfw_ma_notes = vo_notes["vehicles"].get( "kfw-comm", {} ).pop( "multi-applicable", None ) + install_kfw_ma_notes( "kfw-kpa", "vehicles", kfw_ma_notes, "kfw-comm" ) + install_kfw_vo_notes( "kfw-kpa", "vehicles", "kfw-comm", None ) + kfw_ma_notes = vo_notes["ordnance"].get( "kfw-comm", {} ).pop( "multi-applicable", None ) + for nat in ("kfw-kpa","kfw-cpva"): + install_kfw_ma_notes( nat, "ordnance", kfw_ma_notes, "kfw-comm" ) + install_kfw_vo_notes( "kfw-kpa", "ordnance", "kfw-comm", lambda key: key <= 15 ) + install_kfw_vo_notes( "kfw-cpva", "ordnance", "kfw-comm", lambda key: key >= 16 ) # install the vehicle/ordnance notes globvars.vo_notes = { k: dict(v) for k,v in vo_notes.items() }