diff --git a/BoSData/Fonts/Airborne.otf b/BoSData/Fonts/Airborne.otf new file mode 100644 index 000000000..05c205511 Binary files /dev/null and b/BoSData/Fonts/Airborne.otf differ diff --git a/BoSData/Fonts/AlegreyaSansSC-MediumItalic.ttf b/BoSData/Fonts/AlegreyaSansSC-MediumItalic.ttf new file mode 100644 index 000000000..a95950a0c Binary files /dev/null and b/BoSData/Fonts/AlegreyaSansSC-MediumItalic.ttf differ diff --git a/BoSData/Fonts/Arimo-Bold.ttf b/BoSData/Fonts/Arimo-Bold.ttf new file mode 100644 index 000000000..0b05b445e Binary files /dev/null and b/BoSData/Fonts/Arimo-Bold.ttf differ diff --git a/BoSData/Fonts/Blockschrift.otf b/BoSData/Fonts/Blockschrift.otf new file mode 100644 index 000000000..4b9193664 Binary files /dev/null and b/BoSData/Fonts/Blockschrift.otf differ diff --git a/BoSData/Fonts/CormorantSC-SemiBold.ttf b/BoSData/Fonts/CormorantSC-SemiBold.ttf new file mode 100644 index 000000000..ed1be56e8 Binary files /dev/null and b/BoSData/Fonts/CormorantSC-SemiBold.ttf differ diff --git a/BoSData/Fonts/RAF_PW_ATH.otf b/BoSData/Fonts/RAF_PW_ATH.otf new file mode 100644 index 000000000..323eb790c Binary files /dev/null and b/BoSData/Fonts/RAF_PW_ATH.otf differ diff --git a/BoSData/Fonts/RAF_WW2_851ATH.otf b/BoSData/Fonts/RAF_WW2_851ATH.otf new file mode 100644 index 000000000..e40bf813d Binary files /dev/null and b/BoSData/Fonts/RAF_WW2_851ATH.otf differ diff --git a/BoSData/Fonts/VVSNumbers1.otf b/BoSData/Fonts/VVSNumbers1.otf new file mode 100644 index 000000000..d45b49adf Binary files /dev/null and b/BoSData/Fonts/VVSNumbers1.otf differ diff --git a/BoSData/Fonts/VVSNumbers2.otf b/BoSData/Fonts/VVSNumbers2.otf new file mode 100644 index 000000000..3327f6799 Binary files /dev/null and b/BoSData/Fonts/VVSNumbers2.otf differ diff --git a/BoSData/Images/Insignia/2_StG2.png b/BoSData/Images/Insignia/2_StG2.png new file mode 100644 index 000000000..3e0c79337 Binary files /dev/null and b/BoSData/Images/Insignia/2_StG2.png differ diff --git a/BoSData/Images/Insignia/3_KG76.png b/BoSData/Images/Insignia/3_KG76.png new file mode 100644 index 000000000..468b60517 Binary files /dev/null and b/BoSData/Images/Insignia/3_KG76.png differ diff --git a/BoSData/Images/Insignia/4_StG2.png b/BoSData/Images/Insignia/4_StG2.png new file mode 100644 index 000000000..1f10550d5 Binary files /dev/null and b/BoSData/Images/Insignia/4_StG2.png differ diff --git a/BoSData/Images/Insignia/I_JG52.png b/BoSData/Images/Insignia/I_JG52.png new file mode 100644 index 000000000..09c73aeab Binary files /dev/null and b/BoSData/Images/Insignia/I_JG52.png differ diff --git a/BoSData/Images/Insignia/JG51.png b/BoSData/Images/Insignia/JG51.png new file mode 100644 index 000000000..4f0f23eeb Binary files /dev/null and b/BoSData/Images/Insignia/JG51.png differ diff --git a/BoSData/Images/Insignia/JG52.png b/BoSData/Images/Insignia/JG52.png new file mode 100644 index 000000000..589cc2193 Binary files /dev/null and b/BoSData/Images/Insignia/JG52.png differ diff --git a/BoSData/Images/Insignia/a20_stripes_usaaf_full.png b/BoSData/Images/Insignia/a20_stripes_usaaf_full.png new file mode 100644 index 000000000..0193e8e79 Binary files /dev/null and b/BoSData/Images/Insignia/a20_stripes_usaaf_full.png differ diff --git a/BoSData/Images/Insignia/a20_stripes_usaaf_full_1.png b/BoSData/Images/Insignia/a20_stripes_usaaf_full_1.png new file mode 100644 index 000000000..6ad05e5f1 Binary files /dev/null and b/BoSData/Images/Insignia/a20_stripes_usaaf_full_1.png differ diff --git a/BoSData/Images/Insignia/a20_stripes_usaaf_full_2.png b/BoSData/Images/Insignia/a20_stripes_usaaf_full_2.png new file mode 100644 index 000000000..2750b7ba6 Binary files /dev/null and b/BoSData/Images/Insignia/a20_stripes_usaaf_full_2.png differ diff --git a/BoSData/Images/Insignia/a20_stripes_usaaf_full_3.png b/BoSData/Images/Insignia/a20_stripes_usaaf_full_3.png new file mode 100644 index 000000000..44d672ec5 Binary files /dev/null and b/BoSData/Images/Insignia/a20_stripes_usaaf_full_3.png differ diff --git a/BoSData/Images/Insignia/a20_stripes_usaaf_full_4.png b/BoSData/Images/Insignia/a20_stripes_usaaf_full_4.png new file mode 100644 index 000000000..bc6a72f92 Binary files /dev/null and b/BoSData/Images/Insignia/a20_stripes_usaaf_full_4.png differ diff --git a/BoSData/Images/Insignia/a20_stripes_usaaf_full_5.png b/BoSData/Images/Insignia/a20_stripes_usaaf_full_5.png new file mode 100644 index 000000000..eb523b35e Binary files /dev/null and b/BoSData/Images/Insignia/a20_stripes_usaaf_full_5.png differ diff --git a/BoSData/Images/Insignia/a20_stripes_usaaf_under.png b/BoSData/Images/Insignia/a20_stripes_usaaf_under.png new file mode 100644 index 000000000..4ae8a48f9 Binary files /dev/null and b/BoSData/Images/Insignia/a20_stripes_usaaf_under.png differ diff --git a/BoSData/Images/Insignia/a20_stripes_usaaf_under_1.png b/BoSData/Images/Insignia/a20_stripes_usaaf_under_1.png new file mode 100644 index 000000000..f339b7c39 Binary files /dev/null and b/BoSData/Images/Insignia/a20_stripes_usaaf_under_1.png differ diff --git a/BoSData/Images/Insignia/a20_stripes_usaaf_under_2.png b/BoSData/Images/Insignia/a20_stripes_usaaf_under_2.png new file mode 100644 index 000000000..34ad3deda Binary files /dev/null and b/BoSData/Images/Insignia/a20_stripes_usaaf_under_2.png differ diff --git a/BoSData/Images/Insignia/a20_stripes_usaaf_under_3.png b/BoSData/Images/Insignia/a20_stripes_usaaf_under_3.png new file mode 100644 index 000000000..8bfdc1aa4 Binary files /dev/null and b/BoSData/Images/Insignia/a20_stripes_usaaf_under_3.png differ diff --git a/BoSData/Images/Insignia/a20_stripes_usaaf_under_4.png b/BoSData/Images/Insignia/a20_stripes_usaaf_under_4.png new file mode 100644 index 000000000..e66681952 Binary files /dev/null and b/BoSData/Images/Insignia/a20_stripes_usaaf_under_4.png differ diff --git a/BoSData/Images/Insignia/a20_stripes_usaaf_under_5.png b/BoSData/Images/Insignia/a20_stripes_usaaf_under_5.png new file mode 100644 index 000000000..7c40c326c Binary files /dev/null and b/BoSData/Images/Insignia/a20_stripes_usaaf_under_5.png differ diff --git a/BoSData/Images/Insignia/bf109_tail_band_aft.png b/BoSData/Images/Insignia/bf109_tail_band_aft.png new file mode 100644 index 000000000..2f8b8c5f9 Binary files /dev/null and b/BoSData/Images/Insignia/bf109_tail_band_aft.png differ diff --git a/BoSData/Images/Insignia/bf109_tail_band_fore.png b/BoSData/Images/Insignia/bf109_tail_band_fore.png new file mode 100644 index 000000000..2e804a624 Binary files /dev/null and b/BoSData/Images/Insignia/bf109_tail_band_fore.png differ diff --git a/BoSData/Images/Insignia/bf109_tail_band_mid.png b/BoSData/Images/Insignia/bf109_tail_band_mid.png new file mode 100644 index 000000000..83f537e18 Binary files /dev/null and b/BoSData/Images/Insignia/bf109_tail_band_mid.png differ diff --git a/BoSData/Images/Insignia/fw190_tail_band_aft.png b/BoSData/Images/Insignia/fw190_tail_band_aft.png new file mode 100644 index 000000000..f3278f7b6 Binary files /dev/null and b/BoSData/Images/Insignia/fw190_tail_band_aft.png differ diff --git a/BoSData/Images/Insignia/fw190_tail_band_fore.png b/BoSData/Images/Insignia/fw190_tail_band_fore.png new file mode 100644 index 000000000..942b15762 Binary files /dev/null and b/BoSData/Images/Insignia/fw190_tail_band_fore.png differ diff --git a/BoSData/Images/Insignia/fw190_tail_band_mid.png b/BoSData/Images/Insignia/fw190_tail_band_mid.png new file mode 100644 index 000000000..7ef7355a0 Binary files /dev/null and b/BoSData/Images/Insignia/fw190_tail_band_mid.png differ diff --git a/BoSData/Images/Insignia/fw190d_tail_band_aft.png b/BoSData/Images/Insignia/fw190d_tail_band_aft.png new file mode 100644 index 000000000..0fd12947a Binary files /dev/null and b/BoSData/Images/Insignia/fw190d_tail_band_aft.png differ diff --git a/BoSData/Images/Insignia/fw190d_tail_band_fore.png b/BoSData/Images/Insignia/fw190d_tail_band_fore.png new file mode 100644 index 000000000..f263ac8b7 Binary files /dev/null and b/BoSData/Images/Insignia/fw190d_tail_band_fore.png differ diff --git a/BoSData/Images/Insignia/fw190d_tail_band_mid.png b/BoSData/Images/Insignia/fw190d_tail_band_mid.png new file mode 100644 index 000000000..e956adb2f Binary files /dev/null and b/BoSData/Images/Insignia/fw190d_tail_band_mid.png differ diff --git a/BoSData/Images/Insignia/me262_tail_band_aft.png b/BoSData/Images/Insignia/me262_tail_band_aft.png new file mode 100644 index 000000000..1d5e3b562 Binary files /dev/null and b/BoSData/Images/Insignia/me262_tail_band_aft.png differ diff --git a/BoSData/Images/Insignia/me262_tail_band_checks.png b/BoSData/Images/Insignia/me262_tail_band_checks.png new file mode 100644 index 000000000..0dce552d0 Binary files /dev/null and b/BoSData/Images/Insignia/me262_tail_band_checks.png differ diff --git a/BoSData/Images/Insignia/me262_tail_band_fore.png b/BoSData/Images/Insignia/me262_tail_band_fore.png new file mode 100644 index 000000000..832d3ae1a Binary files /dev/null and b/BoSData/Images/Insignia/me262_tail_band_fore.png differ diff --git a/BoSData/Images/Insignia/p38_stripes_usaaf_under_1.png b/BoSData/Images/Insignia/p38_stripes_usaaf_under_1.png new file mode 100644 index 000000000..304c9fc3c Binary files /dev/null and b/BoSData/Images/Insignia/p38_stripes_usaaf_under_1.png differ diff --git a/BoSData/Images/Insignia/p38_stripes_usaaf_under_2.png b/BoSData/Images/Insignia/p38_stripes_usaaf_under_2.png new file mode 100644 index 000000000..b1ce14d2d Binary files /dev/null and b/BoSData/Images/Insignia/p38_stripes_usaaf_under_2.png differ diff --git a/BoSData/Images/Insignia/p38_stripes_usaaf_under_3.png b/BoSData/Images/Insignia/p38_stripes_usaaf_under_3.png new file mode 100644 index 000000000..43d73e184 Binary files /dev/null and b/BoSData/Images/Insignia/p38_stripes_usaaf_under_3.png differ diff --git a/BoSData/Images/Insignia/p38_stripes_usaaf_under_4.png b/BoSData/Images/Insignia/p38_stripes_usaaf_under_4.png new file mode 100644 index 000000000..dfbf2973a Binary files /dev/null and b/BoSData/Images/Insignia/p38_stripes_usaaf_under_4.png differ diff --git a/BoSData/Images/Insignia/p38_stripes_usaaf_under_5.png b/BoSData/Images/Insignia/p38_stripes_usaaf_under_5.png new file mode 100644 index 000000000..8b1c5409a Binary files /dev/null and b/BoSData/Images/Insignia/p38_stripes_usaaf_under_5.png differ diff --git a/BoSData/Images/Insignia/p47d_stripes_fuselage_usaaf_full.png b/BoSData/Images/Insignia/p47d_stripes_fuselage_usaaf_full.png new file mode 100644 index 000000000..dcda9dcd3 Binary files /dev/null and b/BoSData/Images/Insignia/p47d_stripes_fuselage_usaaf_full.png differ diff --git a/BoSData/Images/Insignia/p47d_stripes_fuselage_usaaf_under.png b/BoSData/Images/Insignia/p47d_stripes_fuselage_usaaf_under.png new file mode 100644 index 000000000..dea0c6fd3 Binary files /dev/null and b/BoSData/Images/Insignia/p47d_stripes_fuselage_usaaf_under.png differ diff --git a/BoSData/Images/Insignia/p47d_stripes_shackles.png b/BoSData/Images/Insignia/p47d_stripes_shackles.png new file mode 100644 index 000000000..7f4f2e229 Binary files /dev/null and b/BoSData/Images/Insignia/p47d_stripes_shackles.png differ diff --git a/BoSData/Images/Insignia/p47d_stripes_wings_usaaf_full.png b/BoSData/Images/Insignia/p47d_stripes_wings_usaaf_full.png new file mode 100644 index 000000000..6dffc996c Binary files /dev/null and b/BoSData/Images/Insignia/p47d_stripes_wings_usaaf_full.png differ diff --git a/BoSData/Images/Insignia/p47d_stripes_wings_usaaf_under.png b/BoSData/Images/Insignia/p47d_stripes_wings_usaaf_under.png new file mode 100644 index 000000000..2b1f8a8e7 Binary files /dev/null and b/BoSData/Images/Insignia/p47d_stripes_wings_usaaf_under.png differ diff --git a/BoSData/Images/Insignia/p51_stripes_usaaf_full_1.png b/BoSData/Images/Insignia/p51_stripes_usaaf_full_1.png new file mode 100644 index 000000000..e01a17a94 Binary files /dev/null and b/BoSData/Images/Insignia/p51_stripes_usaaf_full_1.png differ diff --git a/BoSData/Images/Insignia/p51_stripes_usaaf_full_2.png b/BoSData/Images/Insignia/p51_stripes_usaaf_full_2.png new file mode 100644 index 000000000..92df87b3e Binary files /dev/null and b/BoSData/Images/Insignia/p51_stripes_usaaf_full_2.png differ diff --git a/BoSData/Images/Insignia/p51_stripes_usaaf_full_3.png b/BoSData/Images/Insignia/p51_stripes_usaaf_full_3.png new file mode 100644 index 000000000..f96cbfa69 Binary files /dev/null and b/BoSData/Images/Insignia/p51_stripes_usaaf_full_3.png differ diff --git a/BoSData/Images/Insignia/p51_stripes_usaaf_full_4.png b/BoSData/Images/Insignia/p51_stripes_usaaf_full_4.png new file mode 100644 index 000000000..cdfacbf34 Binary files /dev/null and b/BoSData/Images/Insignia/p51_stripes_usaaf_full_4.png differ diff --git a/BoSData/Images/Insignia/p51_stripes_usaaf_full_5.png b/BoSData/Images/Insignia/p51_stripes_usaaf_full_5.png new file mode 100644 index 000000000..197aed58e Binary files /dev/null and b/BoSData/Images/Insignia/p51_stripes_usaaf_full_5.png differ diff --git a/BoSData/Images/Insignia/p51_stripes_usaaf_full_6.png b/BoSData/Images/Insignia/p51_stripes_usaaf_full_6.png new file mode 100644 index 000000000..446efe5ba Binary files /dev/null and b/BoSData/Images/Insignia/p51_stripes_usaaf_full_6.png differ diff --git a/BoSData/Images/Insignia/p51_stripes_usaaf_full_7.png b/BoSData/Images/Insignia/p51_stripes_usaaf_full_7.png new file mode 100644 index 000000000..d8800fa27 Binary files /dev/null and b/BoSData/Images/Insignia/p51_stripes_usaaf_full_7.png differ diff --git a/BoSData/Images/Insignia/p51_stripes_usaaf_under_1.png b/BoSData/Images/Insignia/p51_stripes_usaaf_under_1.png new file mode 100644 index 000000000..a68c91925 Binary files /dev/null and b/BoSData/Images/Insignia/p51_stripes_usaaf_under_1.png differ diff --git a/BoSData/Images/Insignia/p51_stripes_usaaf_under_2.png b/BoSData/Images/Insignia/p51_stripes_usaaf_under_2.png new file mode 100644 index 000000000..0de3d7a40 Binary files /dev/null and b/BoSData/Images/Insignia/p51_stripes_usaaf_under_2.png differ diff --git a/BoSData/Images/Insignia/p51_stripes_usaaf_under_3.png b/BoSData/Images/Insignia/p51_stripes_usaaf_under_3.png new file mode 100644 index 000000000..4f8ecf4e9 Binary files /dev/null and b/BoSData/Images/Insignia/p51_stripes_usaaf_under_3.png differ diff --git a/BoSData/Images/Insignia/p51_stripes_usaaf_under_4.png b/BoSData/Images/Insignia/p51_stripes_usaaf_under_4.png new file mode 100644 index 000000000..2d4d06917 Binary files /dev/null and b/BoSData/Images/Insignia/p51_stripes_usaaf_under_4.png differ diff --git a/BoSData/Images/Insignia/p51_stripes_usaaf_under_5.png b/BoSData/Images/Insignia/p51_stripes_usaaf_under_5.png new file mode 100644 index 000000000..fd94ab9c3 Binary files /dev/null and b/BoSData/Images/Insignia/p51_stripes_usaaf_under_5.png differ diff --git a/BoSData/Images/Insignia/p51_stripes_usaaf_under_6.png b/BoSData/Images/Insignia/p51_stripes_usaaf_under_6.png new file mode 100644 index 000000000..d340f1e61 Binary files /dev/null and b/BoSData/Images/Insignia/p51_stripes_usaaf_under_6.png differ diff --git a/BoSData/Images/Insignia/p51_stripes_usaaf_under_7.png b/BoSData/Images/Insignia/p51_stripes_usaaf_under_7.png new file mode 100644 index 000000000..8dd75e90c Binary files /dev/null and b/BoSData/Images/Insignia/p51_stripes_usaaf_under_7.png differ diff --git a/BoSData/Images/Insignia/raf_sqn_ldr.png b/BoSData/Images/Insignia/raf_sqn_ldr.png new file mode 100644 index 000000000..c7247b154 Binary files /dev/null and b/BoSData/Images/Insignia/raf_sqn_ldr.png differ diff --git a/BoSData/Input/Configuration/ConfigSetUserPref.json b/BoSData/Input/Configuration/ConfigSetUserPref.json index a9110b6e8..572a4d3cb 100644 --- a/BoSData/Input/Configuration/ConfigSetUserPref.json +++ b/BoSData/Input/Configuration/ConfigSetUserPref.json @@ -40,6 +40,16 @@ "value": "10", "label": "Volume control for sounds", "help": "10 is normal, less reduces volume, cannot raise above 10" + }, + "GenerateSkins": { + "value": 0, + "label": "Generate skins", + "help": "0 \u003d Skin generation disabled, 1 \u003d Generate skins for player flight only, 2 \u003d Generate skins for all planes" + }, + "GenerateSkinsLimit": { + "value": 20, + "label": "Skin generation limit", + "help": "Maximum number of skins in one go, 0 for no limit" } } } \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/a20b.json b/BoSData/Input/Skins/Templates/a20b.json new file mode 100644 index 000000000..d7d1b21f1 --- /dev/null +++ b/BoSData/Input/Skins/Templates/a20b.json @@ -0,0 +1,304 @@ +{ + "templates": { + "vvs_green": { + "templateName": "VVS_GREEN", + "planeType": "a20b", + "credit": "Based on official 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null, + "TAIL_CODE": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 210, + "x": 3736, + "y": 3048, + "orientation": 0, + "fillColor": "{1,choice,0#e7e7e7|1#912617}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 210, + "x": 3736, + "y": 792, + "orientation": 180, + "fillColor": "{1,choice,0#e7e7e7|1#912617}" + }, + { + "text": "{2}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "font": "Airborne.otf", + "size": 55, + "x": 3651, + "y": 3191, + "orientation": 0, + "fillColor": "dab03f" + }, + { + "text": "{2}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "font": "Airborne.otf", + "size": 55, + "x": 3651, + "y": 654, + "orientation": 180, + "fillColor": "dab03f" + } + ], + "baseImagePath": "a20b_vvs_{1,choice,0#green|1#winter}_base.png", + "weatherImagePath": "a20b_weather.png" + }, + "raf_late_olive": { + "templateName": "RAF_LATE_OLIVE", + "planeType": "a20b", + "credit": "Based on official 4K template, with invasion stripes by BOO", + "parameters": { + "UNIT_ID_CODE": null, + "AIRCRAFT_ID_CODE": null, + "RANK_FLAG": null, + "STRIPES": null, + "SERIAL": null, + "FLAG_NUM": "" + }, + "defs": [ + { + "text": "{4}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "font": "RAF_PW_ATH.otf", + "size": 70, + "x": 3494, + "y": 3525, + "orientation": 0, + "fillColor": "13120e" + }, + { + "text": "{4}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "font": "RAF_PW_ATH.otf", + "size": 70, + "x": 3494, + "y": 315, + "orientation": 180, + "fillColor": "13120e" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "RAF_WW2_851ATH.otf", + "size": 170, + "x": 2987, + "y": 3691, + "orientation": 0, + "fillColor": "7a312a" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "RAF_WW2_851ATH.otf", + "size": 170, + "x": 1483, + "y": 3607, + "orientation": 0, + "fillColor": "7a312a" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "RAF_WW2_851ATH.otf", + "size": 170, + "x": 2987, + "y": 154, + "orientation": 180, + "fillColor": "7a312a" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "RAF_WW2_851ATH.otf", + "size": 170, + "x": 1483, + "y": 232, + "orientation": 180, + "fillColor": "7a312a" + }, + { + "image": "{2}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 1112, + "y": 3520, + "width": 96, + "height": 56, + "orientation": 0 + }, + { + "image": "{2}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "x": 1112, + "y": 320, + "width": 96, + "height": 56, + "orientation": 180 + }, + { + "text": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "font": "RAF_PW_ATH.otf", + "size": 10, + "x": 1132, + "y": 3554, + "orientation": 0, + "fillColor": "00247d" + }, + { + "text": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "font": "RAF_PW_ATH.otf", + "size": 10, + "x": 1176, + "y": 286, + "orientation": 180, + "fillColor": "00247d" + } + ], + "baseImagePath": "a20b_raf_late_olive_{3,choice,0#|1#stripes_under_|2#stripes_}base.png", + "weatherImagePath": "a20b_weather.png" + }, + "usaaf_late_olive": { + "templateName": "USAAF_LATE_OLIVE", + "planeType": "a20b", + "credit": "Based on official 4K template, with invasion stripes by BOO", + "parameters": { + "UNIT_ID_CODE": null, + "AIRCRAFT_ID_CODE": null, + "STRIPES": null, + "TAIL_CODE": null, + "SQUADRON_NUM": 0 + }, + "defs": [ + { + "image": "{2,choice,0#|1#Insignia\\a20_stripes_usaaf_under_1.png|2#Insignia\\a20_stripes_usaaf_full_1.png}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 1218, + "y": 0 + }, + { + "image": "{2,choice,0#|1#Insignia\\a20_stripes_usaaf_under_2.png|2#Insignia\\a20_stripes_usaaf_full_2.png}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 538, + "y": 949 + }, + { + "image": "{2,choice,0#|1#Insignia\\a20_stripes_usaaf_under_3.png|2#Insignia\\a20_stripes_usaaf_full_3.png}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 2482, + "y": 0 + }, + { + "image": "{2,choice,0#|1#Insignia\\a20_stripes_usaaf_under_4.png|2#Insignia\\a20_stripes_usaaf_full_4.png}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 2803, + "y": 981 + }, + { + "image": "{2,choice,0#|1#Insignia\\a20_stripes_usaaf_under_5.png|2#Insignia\\a20_stripes_usaaf_full_5.png}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 2631, + "y": 3285 + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "Airborne.otf", + "size": 220, + "x": 2973, + "y": 3693, + "orientation": 0, + "fillColor": "c6c6c6" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "Airborne.otf", + "size": 210, + "x": 3439, + "y": 3663, + "orientation": 0, + "fillColor": "c6c6c6" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "Airborne.otf", + "size": 220, + "x": 2973, + "y": 149, + "orientation": 180, + "fillColor": "c6c6c6" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "Airborne.otf", + "size": 210, + "x": 3439, + "y": 179, + "orientation": 180, + "fillColor": "c6c6c6" + }, + { + "text": "{3}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "font": "Airborne.otf", + "size": 55, + "x": 3651, + "y": 3191, + "orientation": 0, + "fillColor": "dab03f" + }, + { + "text": "{3}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "font": "Airborne.otf", + "size": 55, + "x": 3651, + "y": 654, + "orientation": 180, + "fillColor": "dab03f" + } + ], + "baseImagePath": "a20b_usaaf_late_olive{4,choice,0#|0<_{4}}_base.png", + "weatherImagePath": "a20b_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/b25draf.json b/BoSData/Input/Skins/Templates/b25draf.json new file mode 100644 index 000000000..785fe46ed --- /dev/null +++ b/BoSData/Input/Skins/Templates/b25draf.json @@ -0,0 +1,129 @@ +{ + "templates": { + "raf_late_olive": { + "templateName": "RAF_LATE_OLIVE", + "planeType": "b25draf", + "credit": "Based on official 4K template", + "parameters": { + "UNIT_ID_CODE": null, + "AIRCRAFT_ID_CODE": null, + "RANK_FLAG": null, + "STRIPES": null, + "SERIAL": null, + "FLAG_NUM": "" + }, + "defs": [ + { + "text": "{4}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "RAF_PW_ATH.otf", + "size": 40, + "x": 1632, + "y": 746, + "orientation": 0, + "fillColor": "13120e" + }, + { + "text": "{4}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "RAF_PW_ATH.otf", + "size": 40, + "x": 1632, + "y": 232, + "orientation": 180, + "fillColor": "13120e" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "RAF_WW2_851ATH.otf", + "size": 210, + "x": 2004, + "y": 793, + "orientation": 0, + "fillColor": "871b1b" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "font": "RAF_WW2_851ATH.otf", + "size": 210, + "x": 3631, + "y": 730, + "orientation": 0, + "fillColor": "871b1b" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "RAF_WW2_851ATH.otf", + "size": 210, + "x": 2004, + "y": 192, + "orientation": 180, + "fillColor": "871b1b" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "font": "RAF_WW2_851ATH.otf", + "size": 210, + "x": 3631, + "y": 243, + "orientation": 180, + "fillColor": "871b1b" + }, + { + "image": "{2}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "x": 4016, + "y": 837, + "width": 96, + "height": 56, + "orientation": 0 + }, + { + "image": "{2}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 4016, + "y": 138, + "width": 96, + "height": 56, + "orientation": 180 + }, + { + "text": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "font": "RAF_PW_ATH.otf", + "size": 10, + "x": 3952, + "y": 871, + "orientation": 0, + "fillColor": "00247d" + }, + { + "text": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "font": "RAF_PW_ATH.otf", + "size": 10, + "x": 3996, + "y": 104, + "orientation": 180, + "fillColor": "00247d" + } + ], + "baseImagePath": "b25d_raf_late_olive_{3,choice,0#|1#stripes_}base.png", + "weatherImagePath": "b25d_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/bf109e7.json b/BoSData/Input/Skins/Templates/bf109e7.json new file mode 100644 index 000000000..04a841c99 --- /dev/null +++ b/BoSData/Input/Skins/Templates/bf109e7.json @@ -0,0 +1,134 @@ +{ + "templates": { + "lw_attack_schg1": { + "templateName": "LW_ATTACK_SCHG1", + "planeType": "bf109e7", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_NOSE": null, + "INSIGNIA_CP_FORE": null, + "INSIGNIA_CP_MID": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 2014, + "y": 2500, + "orientation": 270, + "fillColor": "{2,choice,0#101010|1#d0d0d0|2#941515|3#fcbe0e|4#3b46b1}", + "strokeWidth": 8, + "strokeColor": "{2,choice,0#'{6,choice,0#d0d0d0|1#101010}'|1#101010|2#d0d0d0|3#101010|4#d0d0d0}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 2879, + "y": 2500, + "orientation": 90, + "fillColor": "{2,choice,0#101010|1#d0d0d0|2#941515|3#fcbe0e|4#3b46b1}", + "strokeWidth": 8, + "strokeColor": "{2,choice,0#'{6,choice,0#d0d0d0|1#101010}'|1#101010|2#d0d0d0|3#101010|4#d0d0d0}" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 2014, + "y": 2924, + "orientation": 270, + "fillColor": "101010", + "strokeWidth": 8, + "strokeColor": "{6,choice,0#d0d0d0|1#101010}" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 2879, + "y": 2924, + "orientation": 90, + "fillColor": "101010", + "strokeWidth": 8, + "strokeColor": "{6,choice,0#d0d0d0|1#101010}" + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 3342, + "y": 944, + "width": 383, + "height": 142, + "orientation": 270 + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 2876, + "y": 944, + "width": 383, + "height": 142, + "orientation": 90 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 1958, + "y": 1660, + "width": 133, + "height": 153, + "orientation": 270 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2922, + "y": 1660, + "width": 133, + "height": 153, + "orientation": 90 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 1958, + "y": 1865, + "width": 252, + "height": 179, + "orientation": 270 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2922, + "y": 1865, + "width": 252, + "height": 179, + "orientation": 90 + } + ], + "baseImagePath": "bf109e7_lw{6,choice,0#|1#_winter}_base.png", + "weatherImagePath": "bf109e7_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/bf109f2.json b/BoSData/Input/Skins/Templates/bf109f2.json new file mode 100644 index 000000000..496f697df --- /dev/null +++ b/BoSData/Input/Skins/Templates/bf109f2.json @@ -0,0 +1,155 @@ +{ + "templates": { + "lw_fighter_mid": { + "templateName": "LW_FIGHTER_MID", + "planeType": "bf109f2", + "credit": "Based on BlackHellHound1's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_NOSE": null, + "INSIGNIA_CP_FORE": null, + "INSIGNIA_CP_MID": null, + "INSIGNIA_TAIL": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1500, + "y": 586, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1520, + "y": 1802, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1000, + "y": 586, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1000, + "y": 1802, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 2961, + "y": 608, + "width": 422, + "height": 117, + "orientation": 0 + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 2961, + "y": 1779, + "width": 422, + "height": 117, + "orientation": 180 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2369, + "y": 534, + "width": 152, + "height": 176, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2369, + "y": 1857, + "width": 152, + "height": 176, + "orientation": 180 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2094, + "y": 541, + "width": 277, + "height": 108, + "orientation": 0 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2094, + "y": 1847, + "width": 277, + "height": 108, + "orientation": 180 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 979, + "y": 583, + "width": 144, + "height": 200, + "orientation": 0 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 979, + "y": 1805, + "width": 144, + "height": 200, + "orientation": 180 + } + ], + "baseImagePath": "bf109f2_lw{7,choice,0#|1#_winter}_base.png", + "weatherImagePath": "bf109f2_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/bf109f4.json b/BoSData/Input/Skins/Templates/bf109f4.json new file mode 100644 index 000000000..b214a4694 --- /dev/null +++ b/BoSData/Input/Skins/Templates/bf109f4.json @@ -0,0 +1,155 @@ +{ + "templates": { + "lw_fighter_mid": { + "templateName": "LW_FIGHTER_MID", + "planeType": "bf109f4", + "credit": "Based on BlackHellHound1's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_NOSE": null, + "INSIGNIA_CP_FORE": null, + "INSIGNIA_CP_MID": null, + "INSIGNIA_TAIL": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1500, + "y": 586, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1520, + "y": 1802, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1000, + "y": 586, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1000, + "y": 1802, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 2961, + "y": 608, + "width": 422, + "height": 117, + "orientation": 0 + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 2961, + "y": 1779, + "width": 422, + "height": 117, + "orientation": 180 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2369, + "y": 534, + "width": 152, + "height": 176, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2369, + "y": 1857, + "width": 152, + "height": 176, + "orientation": 180 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2094, + "y": 541, + "width": 277, + "height": 108, + "orientation": 0 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2094, + "y": 1847, + "width": 277, + "height": 108, + "orientation": 180 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 979, + "y": 583, + "width": 144, + "height": 200, + "orientation": 0 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 979, + "y": 1805, + "width": 144, + "height": 200, + "orientation": 180 + } + ], + "baseImagePath": "bf109f4_lw{7,choice,0#|1#_winter}_base.png", + "weatherImagePath": "bf109f4_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/bf109g14.json b/BoSData/Input/Skins/Templates/bf109g14.json new file mode 100644 index 000000000..5b1c18f1f --- /dev/null +++ b/BoSData/Input/Skins/Templates/bf109g14.json @@ -0,0 +1,364 @@ +{ + "templates": { + "lw_fighter_mid": { + "templateName": "LW_FIGHTER_MID", + "planeType": "bf109g14", + "credit": "Based on official 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_NOSE": null, + "INSIGNIA_CP_FORE": null, + "INSIGNIA_CP_MID": null, + "INSIGNIA_TAIL": null, + "ID_BAND_FORE": null, + "ID_BAND_AFT": null, + "ID_BAND_MID": null + }, + "defs": [ + { + "image": "Insignia\\bf109_tail_band_fore.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 878, + "y": 208, + "orientation": 0, + "fillColor": "{7}" + }, + { + "image": "Insignia\\bf109_tail_band_aft.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 730, + "y": 208, + "orientation": 0, + "fillColor": "{8}" + }, + { + "image": "Insignia\\bf109_tail_band_mid.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 829, + "y": 208, + "orientation": 0, + "fillColor": "{9}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1500, + "y": 586, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1520, + "y": 1802, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1000, + "y": 586, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1000, + "y": 1802, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 2961, + "y": 608, + "width": 422, + "height": 117, + "orientation": 0 + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 2961, + "y": 1779, + "width": 422, + "height": 117, + "orientation": 180 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2369, + "y": 534, + "width": 152, + "height": 176, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2369, + "y": 1857, + "width": 152, + "height": 176, + "orientation": 180 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2094, + "y": 541, + "width": 277, + "height": 108, + "orientation": 0 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2094, + "y": 1847, + "width": 277, + "height": 108, + "orientation": 180 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 979, + "y": 583, + "width": 144, + "height": 200, + "orientation": 0 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 979, + "y": 1805, + "width": 144, + "height": 200, + "orientation": 180 + } + ], + "baseImagePath": "bf109g14_lw_mid_base.png", + "weatherImagePath": "bf109g14_weather.png" + }, + "lw_fighter_late": { + "templateName": "LW_FIGHTER_LATE", + "planeType": "bf109g14", + "credit": "Based on official 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_NOSE": null, + "INSIGNIA_CP_FORE": null, + "INSIGNIA_CP_MID": null, + "INSIGNIA_TAIL": null, + "ID_BAND_FORE": null, + "ID_BAND_AFT": null, + "ID_BAND_MID": null + }, + "defs": [ + { + "image": "Insignia\\bf109_tail_band_fore.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 878, + "y": 208, + "orientation": 0, + "fillColor": "{7}" + }, + { + "image": "Insignia\\bf109_tail_band_aft.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 730, + "y": 208, + "orientation": 0, + "fillColor": "{8}" + }, + { + "image": "Insignia\\bf109_tail_band_mid.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 829, + "y": 208, + "orientation": 0, + "fillColor": "{9}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1500, + "y": 586, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1520, + "y": 1802, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1000, + "y": 586, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1000, + "y": 1802, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 2961, + "y": 608, + "width": 422, + "height": 117, + "orientation": 0 + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 2961, + "y": 1779, + "width": 422, + "height": 117, + "orientation": 180 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2369, + "y": 534, + "width": 152, + "height": 176, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2369, + "y": 1857, + "width": 152, + "height": 176, + "orientation": 180 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2094, + "y": 541, + "width": 277, + "height": 108, + "orientation": 0 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2094, + "y": 1847, + "width": 277, + "height": 108, + "orientation": 180 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 979, + "y": 583, + "width": 144, + "height": 200, + "orientation": 0 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 979, + "y": 1805, + "width": 144, + "height": 200, + "orientation": 180 + } + ], + "baseImagePath": "bf109g14_lw_late_base.png", + "weatherImagePath": "bf109g14_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/bf109g2.json b/BoSData/Input/Skins/Templates/bf109g2.json new file mode 100644 index 000000000..3048d705e --- /dev/null +++ b/BoSData/Input/Skins/Templates/bf109g2.json @@ -0,0 +1,155 @@ +{ + "templates": { + "lw_fighter_mid": { + "templateName": "LW_FIGHTER_MID", + "planeType": "bf109g2", + "credit": "Based on Boomerang's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_NOSE": null, + "INSIGNIA_CP_FORE": null, + "INSIGNIA_CP_MID": null, + "INSIGNIA_TAIL": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1500, + "y": 586, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1520, + "y": 1802, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1000, + "y": 586, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1000, + "y": 1802, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 2961, + "y": 608, + "width": 422, + "height": 117, + "orientation": 0 + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 2961, + "y": 1779, + "width": 422, + "height": 117, + "orientation": 180 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2369, + "y": 534, + "width": 152, + "height": 176, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2369, + "y": 1857, + "width": 152, + "height": 176, + "orientation": 180 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2094, + "y": 541, + "width": 277, + "height": 108, + "orientation": 0 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2094, + "y": 1847, + "width": 277, + "height": 108, + "orientation": 180 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 979, + "y": 583, + "width": 144, + "height": 200, + "orientation": 0 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 979, + "y": 1805, + "width": 144, + "height": 200, + "orientation": 180 + } + ], + "baseImagePath": "bf109g2_lw{7,choice,0#|1#_winter}_base.png", + "weatherImagePath": "bf109g2_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/bf109g4.json b/BoSData/Input/Skins/Templates/bf109g4.json new file mode 100644 index 000000000..0aaf188bc --- /dev/null +++ b/BoSData/Input/Skins/Templates/bf109g4.json @@ -0,0 +1,155 @@ +{ + "templates": { + "lw_fighter_mid": { + "templateName": "LW_FIGHTER_MID", + "planeType": "bf109g4", + "credit": "Based on RaFiGer's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_NOSE": null, + "INSIGNIA_CP_FORE": null, + "INSIGNIA_CP_MID": null, + "INSIGNIA_TAIL": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1500, + "y": 586, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1520, + "y": 1802, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1000, + "y": 586, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1000, + "y": 1802, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 2961, + "y": 608, + "width": 422, + "height": 117, + "orientation": 0 + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 2961, + "y": 1779, + "width": 422, + "height": 117, + "orientation": 180 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2369, + "y": 534, + "width": 152, + "height": 176, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2369, + "y": 1857, + "width": 152, + "height": 176, + "orientation": 180 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2094, + "y": 541, + "width": 277, + "height": 108, + "orientation": 0 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2094, + "y": 1847, + "width": 277, + "height": 108, + "orientation": 180 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 979, + "y": 583, + "width": 144, + "height": 200, + "orientation": 0 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 979, + "y": 1805, + "width": 144, + "height": 200, + "orientation": 180 + } + ], + "baseImagePath": "bf109g4_lw{7,choice,0#|1#_winter}_base.png", + "weatherImagePath": "bf109g4_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/bf109g6.json b/BoSData/Input/Skins/Templates/bf109g6.json new file mode 100644 index 000000000..5376df886 --- /dev/null +++ b/BoSData/Input/Skins/Templates/bf109g6.json @@ -0,0 +1,186 @@ +{ + "templates": { + "lw_fighter_mid": { + "templateName": "LW_FIGHTER_MID", + "planeType": "bf109g6", + "credit": "Based on RaFiGer's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_NOSE": null, + "INSIGNIA_CP_FORE": null, + "INSIGNIA_CP_MID": null, + "INSIGNIA_TAIL": null, + "WINTER": null, + "WESTERN_FRONT": null, + "ID_BAND_FORE": null, + "ID_BAND_AFT": null, + "ID_BAND_MID": null + }, + "defs": [ + { + "image": "Insignia\\bf109_tail_band_fore.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 878, + "y": 208, + "orientation": 0, + "fillColor": "{9}" + }, + { + "image": "Insignia\\bf109_tail_band_aft.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 730, + "y": 208, + "orientation": 0, + "fillColor": "{10}" + }, + { + "image": "Insignia\\bf109_tail_band_mid.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 829, + "y": 208, + "orientation": 0, + "fillColor": "{11}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1500, + "y": 586, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1520, + "y": 1802, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1000, + "y": 586, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1000, + "y": 1802, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 2961, + "y": 608, + "width": 422, + "height": 117, + "orientation": 0 + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 2961, + "y": 1779, + "width": 422, + "height": 117, + "orientation": 180 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2369, + "y": 534, + "width": 152, + "height": 176, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2369, + "y": 1857, + "width": 152, + "height": 176, + "orientation": 180 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2094, + "y": 541, + "width": 277, + "height": 108, + "orientation": 0 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2094, + "y": 1847, + "width": 277, + "height": 108, + "orientation": 180 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 979, + "y": 583, + "width": 144, + "height": 200, + "orientation": 0 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 979, + "y": 1805, + "width": 144, + "height": 200, + "orientation": 180 + } + ], + "baseImagePath": "bf109g6_lw{8,choice,0#'{7,choice,0#|1#_winter}'|1#_wf}_base.png", + "weatherImagePath": "bf109g6_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/bf109k4.json b/BoSData/Input/Skins/Templates/bf109k4.json new file mode 100644 index 000000000..b5f4ef4ff --- /dev/null +++ b/BoSData/Input/Skins/Templates/bf109k4.json @@ -0,0 +1,364 @@ +{ + "templates": { + "lw_fighter_late": { + "templateName": "LW_FIGHTER_LATE", + "planeType": "bf109k4", + "credit": "Based on official 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_NOSE": null, + "INSIGNIA_CP_FORE": null, + "INSIGNIA_CP_MID": null, + "INSIGNIA_TAIL": null, + "ID_BAND_FORE": null, + "ID_BAND_AFT": null, + "ID_BAND_MID": null + }, + "defs": [ + { + "image": "Insignia\\bf109_tail_band_fore.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 878, + "y": 208, + "orientation": 0, + "fillColor": "{7}" + }, + { + "image": "Insignia\\bf109_tail_band_aft.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 730, + "y": 208, + "orientation": 0, + "fillColor": "{8}" + }, + { + "image": "Insignia\\bf109_tail_band_mid.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 829, + "y": 208, + "orientation": 0, + "fillColor": "{9}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1500, + "y": 586, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1520, + "y": 1802, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1000, + "y": 586, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1000, + "y": 1802, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 2961, + "y": 608, + "width": 422, + "height": 117, + "orientation": 0 + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 2961, + "y": 1779, + "width": 422, + "height": 117, + "orientation": 180 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2369, + "y": 534, + "width": 152, + "height": 176, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2369, + "y": 1857, + "width": 152, + "height": 176, + "orientation": 180 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2094, + "y": 541, + "width": 277, + "height": 108, + "orientation": 0 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2094, + "y": 1847, + "width": 277, + "height": 108, + "orientation": 180 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 979, + "y": 583, + "width": 144, + "height": 200, + "orientation": 0 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 979, + "y": 1805, + "width": 144, + "height": 200, + "orientation": 180 + } + ], + "baseImagePath": "bf109k4_lw_late_base.png", + "weatherImagePath": "bf109k4_weather.png" + }, + "lw_fighter_later": { + "templateName": "LW_FIGHTER_LATER", + "planeType": "bf109k4", + "credit": "Based on official 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_NOSE": null, + "INSIGNIA_CP_FORE": null, + "INSIGNIA_CP_MID": null, + "INSIGNIA_TAIL": null, + "ID_BAND_FORE": null, + "ID_BAND_AFT": null, + "ID_BAND_MID": null + }, + "defs": [ + { + "image": "Insignia\\bf109_tail_band_fore.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 878, + "y": 208, + "orientation": 0, + "fillColor": "{7}" + }, + { + "image": "Insignia\\bf109_tail_band_aft.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 730, + "y": 208, + "orientation": 0, + "fillColor": "{8}" + }, + { + "image": "Insignia\\bf109_tail_band_mid.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 829, + "y": 208, + "orientation": 0, + "fillColor": "{9}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1500, + "y": 586, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1520, + "y": 1802, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1000, + "y": 586, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1000, + "y": 1802, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 2961, + "y": 608, + "width": 422, + "height": 117, + "orientation": 0 + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 2961, + "y": 1779, + "width": 422, + "height": 117, + "orientation": 180 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2369, + "y": 534, + "width": 152, + "height": 176, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2369, + "y": 1857, + "width": 152, + "height": 176, + "orientation": 180 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2094, + "y": 541, + "width": 277, + "height": 108, + "orientation": 0 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2094, + "y": 1847, + "width": 277, + "height": 108, + "orientation": 180 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 979, + "y": 583, + "width": 144, + "height": 200, + "orientation": 0 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 979, + "y": 1805, + "width": 144, + "height": 200, + "orientation": 180 + } + ], + "baseImagePath": "bf109k4_lw_later_base.png", + "weatherImagePath": "bf109k4_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/bf110e2.json b/BoSData/Input/Skins/Templates/bf110e2.json new file mode 100644 index 000000000..4a695a9e4 --- /dev/null +++ b/BoSData/Input/Skins/Templates/bf110e2.json @@ -0,0 +1,154 @@ +{ + "templates": { + "lw_bomber_mid": { + "templateName": "LW_BOMBER_MID", + "planeType": "bf110e2", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "UNIT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_NOSE": null, + "INSIGNIA_CP_FORE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 946, + "y": 3272, + "orientation": 0, + "fillColor": "191919" + }, + { + "text": "{0}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 1293, + "y": 3272, + "orientation": 0, + "fillColor": "{3,choice,0#009900|1#e1e1e1|2#a62121|3#ddb63a|4#3e48d5}", + "strokeWidth": 2, + "strokeColor": "191919" + }, + { + "text": "{2}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 1383, + "y": 3272, + "orientation": 0, + "fillColor": "191919" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 1234, + "y": 3867, + "orientation": 180, + "fillColor": "191919" + }, + { + "text": "{0}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 894, + "y": 3867, + "orientation": 180, + "fillColor": "{3,choice,0#009900|1#e1e1e1|2#a62121|3#ddb63a|4#3e48d5}", + "strokeWidth": 2, + "strokeColor": "191919" + }, + { + "text": "{2}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 794, + "y": 3867, + "orientation": 180, + "fillColor": "191919" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 280, + "x": 415, + "y": 1245, + "orientation": 270, + "fillColor": "191919" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 280, + "x": 2129, + "y": 1245, + "orientation": 90, + "fillColor": "191919" + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 3053, + "y": 3294, + "width": 225, + "height": 125, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 3053, + "y": 3842, + "width": 225, + "height": 125, + "orientation": 180 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2793, + "y": 3201, + "width": 147, + "height": 142, + "orientation": 0 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2793, + "y": 3935, + "width": 147, + "height": 142, + "orientation": 180 + } + ], + "baseImagePath": "bf110e2_lw{6,choice,0#|1#_winter}_base.png", + "weatherImagePath": "bf110e2_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/bf110g2.json b/BoSData/Input/Skins/Templates/bf110g2.json new file mode 100644 index 000000000..1ba35fdae --- /dev/null +++ b/BoSData/Input/Skins/Templates/bf110g2.json @@ -0,0 +1,154 @@ +{ + "templates": { + "lw_bomber_mid": { + "templateName": "LW_BOMBER_MID", + "planeType": "bf110g2", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "UNIT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_NOSE": null, + "INSIGNIA_CP_FORE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 946, + "y": 3272, + "orientation": 0, + "fillColor": "191919" + }, + { + "text": "{0}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 1293, + "y": 3272, + "orientation": 0, + "fillColor": "{3,choice,0#009900|1#e1e1e1|2#a62121|3#ddb63a|4#3e48d5}", + "strokeWidth": 2, + "strokeColor": "191919" + }, + { + "text": "{2}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 1383, + "y": 3272, + "orientation": 0, + "fillColor": "191919" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 1234, + "y": 3867, + "orientation": 180, + "fillColor": "191919" + }, + { + "text": "{0}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 894, + "y": 3867, + "orientation": 180, + "fillColor": "{3,choice,0#009900|1#e1e1e1|2#a62121|3#ddb63a|4#3e48d5}", + "strokeWidth": 2, + "strokeColor": "191919" + }, + { + "text": "{2}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 794, + "y": 3867, + "orientation": 180, + "fillColor": "191919" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 280, + "x": 415, + "y": 1245, + "orientation": 270, + "fillColor": "191919" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 280, + "x": 2129, + "y": 1245, + "orientation": 90, + "fillColor": "191919" + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 3053, + "y": 3294, + "width": 225, + "height": 125, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 3053, + "y": 3842, + "width": 225, + "height": 125, + "orientation": 180 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2793, + "y": 3201, + "width": 147, + "height": 142, + "orientation": 0 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 2793, + "y": 3935, + "width": 147, + "height": 142, + "orientation": 180 + } + ], + "baseImagePath": "bf110g2_lw{6,choice,0#|1#_winter}_base.png", + "weatherImagePath": "bf110g2_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/fw190a3.json b/BoSData/Input/Skins/Templates/fw190a3.json new file mode 100644 index 000000000..281c3834e --- /dev/null +++ b/BoSData/Input/Skins/Templates/fw190a3.json @@ -0,0 +1,306 @@ +{ + "templates": { + "lw_fighter_mid": { + "templateName": "LW_FIGHTER_MID", + "planeType": "fw190a3", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_NOSE": null, + "INSIGNIA_CP_FORE": null, + "INSIGNIA_CP_MID": null, + "INSIGNIA_TAIL": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1322, + "y": 3842, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1322, + "y": 2858, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1713, + "y": 3842, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1713, + "y": 2858, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 448, + "y": 2155, + "width": 334, + "height": 127, + "orientation": 0 + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 448, + "y": 1681, + "width": 334, + "height": 127, + "orientation": 180 + }, + { + "image": "{4}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 571, + "y": 3741, + "width": 120, + "height": 120, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "x": 571, + "y": 2952, + "width": 120, + "height": 120, + "orientation": 180 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 872, + "y": 3736, + "width": 179, + "height": 187, + "orientation": 0 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 872, + "y": 2956, + "width": 179, + "height": 187, + "orientation": 180 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 1957, + "y": 3842, + "width": 144, + "height": 200, + "orientation": 0 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 1957, + "y": 2858, + "width": 144, + "height": 200, + "orientation": 180 + } + ], + "baseImagePath": "fw190a3_lw{7,choice,0#|1#_winter}_base.png", + "weatherImagePath": "fw190a3_weather.png" + }, + "lw_attack_schg1": { + "templateName": "LW_ATTACK_SCHG1", + "planeType": "fw190a3", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_NOSE": null, + "INSIGNIA_CP_FORE": null, + "INSIGNIA_CP_MID": null, + "INSIGNIA_TAIL": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1322, + "y": 3842, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1322, + "y": 2858, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1713, + "y": 3842, + "orientation": 0, + "fillColor": "262627", + "strokeWidth": 8, + "strokeColor": "{7,choice,0#faf7f1|1#262627}" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1713, + "y": 2858, + "orientation": 180, + "fillColor": "262627", + "strokeWidth": 8, + "strokeColor": "{7,choice,0#faf7f1|1#262627}" + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 448, + "y": 2155, + "width": 334, + "height": 127, + "orientation": 0 + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 448, + "y": 1681, + "width": 334, + "height": 127, + "orientation": 180 + }, + { + "image": "{4}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 571, + "y": 3741, + "width": 120, + "height": 120, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 571, + "y": 2952, + "width": 120, + "height": 120, + "orientation": 180 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 872, + "y": 3736, + "width": 179, + "height": 187, + "orientation": 0 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 872, + "y": 2956, + "width": 179, + "height": 187, + "orientation": 180 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 957, + "y": 3842, + "width": 144, + "height": 200, + "orientation": 0 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 957, + "y": 2858, + "width": 144, + "height": 200, + "orientation": 180 + } + ], + "baseImagePath": "fw190a3_lw{7,choice,0#|1#_winter}_base.png", + "weatherImagePath": "fw190a3_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/fw190a5.json b/BoSData/Input/Skins/Templates/fw190a5.json new file mode 100644 index 000000000..212d95055 --- /dev/null +++ b/BoSData/Input/Skins/Templates/fw190a5.json @@ -0,0 +1,337 @@ +{ + "templates": { + "lw_fighter_mid": { + "templateName": "LW_FIGHTER_MID", + "planeType": "fw190a5", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_NOSE": null, + "INSIGNIA_CP_FORE": null, + "INSIGNIA_CP_MID": null, + "INSIGNIA_TAIL": null, + "WINTER": null, + "WESTERN_FRONT": null, + "ID_BAND_FORE": null, + "ID_BAND_AFT": null, + "ID_BAND_MID": null + }, + "defs": [ + { + "image": "Insignia\\fw190_tail_band_fore.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 1767, + "y": 1885, + "orientation": 0, + "fillColor": "{9}" + }, + { + "image": "Insignia\\fw190_tail_band_aft.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 1871, + "y": 1891, + "orientation": 0, + "fillColor": "{10}" + }, + { + "image": "Insignia\\fw190_tail_band_mid.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 1838, + "y": 1891, + "orientation": 0, + "fillColor": "{11}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1322, + "y": 3842, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1322, + "y": 2858, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1713, + "y": 3842, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1713, + "y": 2858, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 448, + "y": 2155, + "width": 334, + "height": 127, + "orientation": 0 + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 448, + "y": 1681, + "width": 334, + "height": 127, + "orientation": 180 + }, + { + "image": "{4}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 571, + "y": 3741, + "width": 120, + "height": 120, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "x": 571, + "y": 2952, + "width": 120, + "height": 120, + "orientation": 180 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 872, + "y": 3736, + "width": 179, + "height": 187, + "orientation": 0 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 872, + "y": 2956, + "width": 179, + "height": 187, + "orientation": 180 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 1957, + "y": 3842, + "width": 144, + "height": 200, + "orientation": 0 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 1957, + "y": 2858, + "width": 144, + "height": 200, + "orientation": 180 + } + ], + "baseImagePath": "fw190a5_lw{8,choice,0#'{7,choice,0#|1#_winter}'|1#_wf}_base.png", + "weatherImagePath": "fw190a5_weather.png" + }, + "lw_attack_schg1": { + "templateName": "LW_ATTACK_SCHG1", + "planeType": "fw190a5", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_NOSE": null, + "INSIGNIA_CP_FORE": null, + "INSIGNIA_CP_MID": null, + "INSIGNIA_TAIL": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1322, + "y": 3842, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1322, + "y": 2858, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#'{7,choice,0#faf7f1|1#262627}'|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1713, + "y": 3842, + "orientation": 0, + "fillColor": "262627", + "strokeWidth": 8, + "strokeColor": "{7,choice,0#faf7f1|1#262627}" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1713, + "y": 2858, + "orientation": 180, + "fillColor": "262627", + "strokeWidth": 8, + "strokeColor": "{7,choice,0#faf7f1|1#262627}" + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 448, + "y": 2155, + "width": 334, + "height": 127, + "orientation": 0 + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 448, + "y": 1681, + "width": 334, + "height": 127, + "orientation": 180 + }, + { + "image": "{4}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 571, + "y": 3741, + "width": 120, + "height": 120, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 571, + "y": 2952, + "width": 120, + "height": 120, + "orientation": 180 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 872, + "y": 3736, + "width": 179, + "height": 187, + "orientation": 0 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 872, + "y": 2956, + "width": 179, + "height": 187, + "orientation": 180 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 957, + "y": 3842, + "width": 144, + "height": 200, + "orientation": 0 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 957, + "y": 2858, + "width": 144, + "height": 200, + "orientation": 180 + } + ], + "baseImagePath": "fw190a5_lw{7,choice,0#|1#_winter}_base.png", + "weatherImagePath": "fw190a5_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/fw190a8.json b/BoSData/Input/Skins/Templates/fw190a8.json new file mode 100644 index 000000000..f5d58e342 --- /dev/null +++ b/BoSData/Input/Skins/Templates/fw190a8.json @@ -0,0 +1,544 @@ +{ + "templates": { + "lw_fighter_mid": { + "templateName": "LW_FIGHTER_MID", + "planeType": "fw190a8", + "credit": "Based on official 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_NOSE": null, + "INSIGNIA_CP_FORE": null, + "INSIGNIA_CP_MID": null, + "INSIGNIA_TAIL": null, + "ID_BAND_FORE": null, + "ID_BAND_AFT": null, + "ID_BAND_MID": null + }, + "defs": [ + { + "image": "Insignia\\fw190_tail_band_fore.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 1767, + "y": 1885, + "orientation": 0, + "fillColor": "{7}" + }, + { + "image": "Insignia\\fw190_tail_band_aft.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 1871, + "y": 1891, + "orientation": 0, + "fillColor": "{8}" + }, + { + "image": "Insignia\\fw190_tail_band_mid.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 1838, + "y": 1891, + "orientation": 0, + "fillColor": "{9}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1322, + "y": 3842, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1322, + "y": 2858, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1713, + "y": 3842, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1713, + "y": 2858, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 448, + "y": 2155, + "width": 334, + "height": 127, + "orientation": 0 + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 448, + "y": 1681, + "width": 334, + "height": 127, + "orientation": 180 + }, + { + "image": "{4}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 571, + "y": 3741, + "width": 120, + "height": 120, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "x": 571, + "y": 2952, + "width": 120, + "height": 120, + "orientation": 180 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 872, + "y": 3736, + "width": 179, + "height": 187, + "orientation": 0 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 872, + "y": 2956, + "width": 179, + "height": 187, + "orientation": 180 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 1957, + "y": 3842, + "width": 144, + "height": 200, + "orientation": 0 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 1957, + "y": 2858, + "width": 144, + "height": 200, + "orientation": 180 + } + ], + "baseImagePath": "fw190a8_lw_mid_base.png", + "weatherImagePath": "fw190a8_weather.png" + }, + "lw_fighter_late": { + "templateName": "LW_FIGHTER_LATE", + "planeType": "fw190a8", + "credit": "Based on official 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_NOSE": null, + "INSIGNIA_CP_FORE": null, + "INSIGNIA_CP_MID": null, + "INSIGNIA_TAIL": null, + "ID_BAND_FORE": null, + "ID_BAND_AFT": null, + "ID_BAND_MID": null + }, + "defs": [ + { + "image": "Insignia\\fw190_tail_band_fore.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 1767, + "y": 1885, + "orientation": 0, + "fillColor": "{7}" + }, + { + "image": "Insignia\\fw190_tail_band_aft.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 1871, + "y": 1891, + "orientation": 0, + "fillColor": "{8}" + }, + { + "image": "Insignia\\fw190_tail_band_mid.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 1838, + "y": 1891, + "orientation": 0, + "fillColor": "{9}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1322, + "y": 3842, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1322, + "y": 2858, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1713, + "y": 3842, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1713, + "y": 2858, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 448, + "y": 2155, + "width": 334, + "height": 127, + "orientation": 0 + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 448, + "y": 1681, + "width": 334, + "height": 127, + "orientation": 180 + }, + { + "image": "{4}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 571, + "y": 3741, + "width": 120, + "height": 120, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "x": 571, + "y": 2952, + "width": 120, + "height": 120, + "orientation": 180 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 872, + "y": 3736, + "width": 179, + "height": 187, + "orientation": 0 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 872, + "y": 2956, + "width": 179, + "height": 187, + "orientation": 180 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 1957, + "y": 3842, + "width": 144, + "height": 200, + "orientation": 0 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 1957, + "y": 2858, + "width": 144, + "height": 200, + "orientation": 180 + } + ], + "baseImagePath": "fw190a8_lw_late_base.png", + "weatherImagePath": "fw190a8_weather.png" + }, + "lw_fighter_later": { + "templateName": "LW_FIGHTER_LATER", + "planeType": "fw190a8", + "credit": "Based on official 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_NOSE": null, + "INSIGNIA_CP_FORE": null, + "INSIGNIA_CP_MID": null, + "INSIGNIA_TAIL": null, + "ID_BAND_FORE": null, + "ID_BAND_AFT": null, + "ID_BAND_MID": null + }, + "defs": [ + { + "image": "Insignia\\fw190_tail_band_fore.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 1767, + "y": 1885, + "orientation": 0, + "fillColor": "{7}" + }, + { + "image": "Insignia\\fw190_tail_band_aft.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 1871, + "y": 1891, + "orientation": 0, + "fillColor": "{8}" + }, + { + "image": "Insignia\\fw190_tail_band_mid.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 1838, + "y": 1891, + "orientation": 0, + "fillColor": "{9}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1322, + "y": 3842, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1322, + "y": 2858, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1713, + "y": 3842, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 1713, + "y": 2858, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 448, + "y": 2155, + "width": 334, + "height": 127, + "orientation": 0 + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 448, + "y": 1681, + "width": 334, + "height": 127, + "orientation": 180 + }, + { + "image": "{4}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 571, + "y": 3741, + "width": 120, + "height": 120, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "x": 571, + "y": 2952, + "width": 120, + "height": 120, + "orientation": 180 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 872, + "y": 3736, + "width": 179, + "height": 187, + "orientation": 0 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 872, + "y": 2956, + "width": 179, + "height": 187, + "orientation": 180 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 1957, + "y": 3842, + "width": 144, + "height": 200, + "orientation": 0 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 1957, + "y": 2858, + "width": 144, + "height": 200, + "orientation": 180 + } + ], + "baseImagePath": "fw190a8_lw_later_base.png", + "weatherImagePath": "fw190a8_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/fw190d9.json b/BoSData/Input/Skins/Templates/fw190d9.json new file mode 100644 index 000000000..a6efab494 --- /dev/null +++ b/BoSData/Input/Skins/Templates/fw190d9.json @@ -0,0 +1,514 @@ +{ + "templates": { + "lw_fighter_mid": { + "templateName": "LW_FIGHTER_MID", + "planeType": "fw190d9", + "credit": "Based on official 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_NOSE": null, + "INSIGNIA_CP_FORE": null, + "INSIGNIA_CP_MID": null, + "INSIGNIA_TAIL": null, + "ID_BAND_FORE": null, + "ID_BAND_AFT": null, + "ID_BAND_MID": null + }, + "defs": [ + { + "image": "Insignia\\fw190d_tail_band_fore.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 2575, + "y": 870, + "orientation": 0, + "fillColor": "{7}" + }, + { + "image": "Insignia\\fw190d_tail_band_aft.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 2747, + "y": 847, + "orientation": 0, + "fillColor": "{8}" + }, + { + "image": "Insignia\\fw190d_tail_band_mid.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 2689, + "y": 864, + "orientation": 0, + "fillColor": "{9}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 2290, + "y": 1086, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 2290, + "y": 1558, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 2678, + "y": 1086, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 2678, + "y": 1558, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 713, + "y": 980, + "width": 398, + "height": 130, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 1427, + "y": 951, + "width": 142, + "height": 142, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "x": 1427, + "y": 1697, + "width": 142, + "height": 142, + "orientation": 180 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 1720, + "y": 945, + "width": 171, + "height": 171, + "orientation": 0 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 1720, + "y": 1703, + "width": 171, + "height": 171, + "orientation": 180 + }, + { + "image": "{6}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "x": 2678, + "y": 1086, + "width": 144, + "height": 200, + "orientation": 0 + }, + { + "image": "{6}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "x": 2678, + "y": 1558, + "width": 144, + "height": 200, + "orientation": 180 + } + ], + "baseImagePath": "fw190d9_lw_mid_base.png", + "weatherImagePath": "fw190d9_weather.png" + }, + "lw_fighter_late": { + "templateName": "LW_FIGHTER_LATE", + "planeType": "fw190d9", + "credit": "Based on official 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_NOSE": null, + "INSIGNIA_CP_FORE": null, + "INSIGNIA_CP_MID": null, + "INSIGNIA_TAIL": null, + "ID_BAND_FORE": null, + "ID_BAND_AFT": null, + "ID_BAND_MID": null + }, + "defs": [ + { + "image": "Insignia\\fw190d_tail_band_fore.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 2575, + "y": 870, + "orientation": 0, + "fillColor": "{7}" + }, + { + "image": "Insignia\\fw190d_tail_band_aft.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 2747, + "y": 847, + "orientation": 0, + "fillColor": "{8}" + }, + { + "image": "Insignia\\fw190d_tail_band_mid.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 2689, + "y": 864, + "orientation": 0, + "fillColor": "{9}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 2290, + "y": 1086, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 2290, + "y": 1558, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 2678, + "y": 1086, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 2678, + "y": 1558, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 713, + "y": 980, + "width": 398, + "height": 130, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 1427, + "y": 951, + "width": 142, + "height": 142, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "x": 1427, + "y": 1697, + "width": 142, + "height": 142, + "orientation": 180 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 1720, + "y": 945, + "width": 171, + "height": 171, + "orientation": 0 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 1720, + "y": 1703, + "width": 171, + "height": 171, + "orientation": 180 + }, + { + "image": "{6}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "x": 2678, + "y": 1086, + "width": 144, + "height": 200, + "orientation": 0 + }, + { + "image": "{6}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "x": 2678, + "y": 1558, + "width": 144, + "height": 200, + "orientation": 180 + } + ], + "baseImagePath": "fw190d9_lw_mid_late.png", + "weatherImagePath": "fw190d9_weather.png" + }, + "lw_fighter_later": { + "templateName": "LW_FIGHTER_LATER", + "planeType": "fw190d9", + "credit": "Based on official 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_NOSE": null, + "INSIGNIA_CP_FORE": null, + "INSIGNIA_CP_MID": null, + "INSIGNIA_TAIL": null, + "ID_BAND_FORE": null, + "ID_BAND_AFT": null, + "ID_BAND_MID": null + }, + "defs": [ + { + "image": "Insignia\\fw190d_tail_band_fore.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 2575, + "y": 870, + "orientation": 0, + "fillColor": "{7}" + }, + { + "image": "Insignia\\fw190d_tail_band_aft.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 2747, + "y": 847, + "orientation": 0, + "fillColor": "{8}" + }, + { + "image": "Insignia\\fw190d_tail_band_mid.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 2689, + "y": 864, + "orientation": 0, + "fillColor": "{9}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 2290, + "y": 1086, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 2290, + "y": 1558, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 2678, + "y": 1086, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 350, + "x": 2678, + "y": 1558, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 8, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 713, + "y": 980, + "width": 398, + "height": 130, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 1427, + "y": 951, + "width": 142, + "height": 142, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "x": 1427, + "y": 1697, + "width": 142, + "height": 142, + "orientation": 180 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 1720, + "y": 945, + "width": 171, + "height": 171, + "orientation": 0 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 1720, + "y": 1703, + "width": 171, + "height": 171, + "orientation": 180 + }, + { + "image": "{6}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "x": 2678, + "y": 1086, + "width": 144, + "height": 200, + "orientation": 0 + }, + { + "image": "{6}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "x": 2678, + "y": 1558, + "width": 144, + "height": 200, + "orientation": 180 + } + ], + "baseImagePath": "fw190d9_lw_later_base.png", + "weatherImagePath": "fw190d9_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/he111h16.json b/BoSData/Input/Skins/Templates/he111h16.json new file mode 100644 index 000000000..fec8f5dc8 --- /dev/null +++ b/BoSData/Input/Skins/Templates/he111h16.json @@ -0,0 +1,133 @@ +{ + "templates": { + "lw_bomber_mid": { + "templateName": "LW_BOMBER_MID", + "planeType": "he111h16", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "UNIT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA": null, + "WINTER": null + }, + "defs": [ + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 1967, + "y": 2402, + "orientation": 0, + "fillColor": "1c1c1c" + }, + { + "text": "{0}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 2322, + "y": 2402, + "orientation": 0, + "fillColor": "{3,choice,0#009900|1#e1e1e1|2#a62121|3#ddb63a|4#3e48d5}", + "strokeWidth": 2, + "strokeColor": "1c1c1c" + }, + { + "text": "{2}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 2405, + "y": 2402, + "orientation": 0, + "fillColor": "1c1c1c" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 2261, + "y": 1834, + "orientation": 180, + "fillColor": "1c1c1c" + }, + { + "text": "{0}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 1919, + "y": 1834, + "orientation": 180, + "fillColor": "{3,choice,0#009900|1#e1e1e1|2#a62121|3#ddb63a|4#3e48d5}", + "strokeWidth": 2, + "strokeColor": "1c1c1c" + }, + { + "text": "{2}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 1830, + "y": 1834, + "orientation": 180, + "fillColor": "1c1c1c" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 380, + "x": 908, + "y": 513, + "orientation": 187, + "fillColor": "1c1c1c" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 380, + "x": 3538, + "y": 513, + "orientation": 173, + "fillColor": "1c1c1c" + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 3744, + "y": 2388, + "width": 85, + "height": 114, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 3744, + "y": 1838, + "width": 85, + "height": 114, + "orientation": 180 + } + ], + "baseImagePath": "he111h16_lw{5,choice,0#|1#_winter}_base.png", + "weatherImagePath": "he111h16_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/he111h6.json b/BoSData/Input/Skins/Templates/he111h6.json new file mode 100644 index 000000000..099e275ff --- /dev/null +++ b/BoSData/Input/Skins/Templates/he111h6.json @@ -0,0 +1,133 @@ +{ + "templates": { + "lw_bomber_mid": { + "templateName": "LW_BOMBER_MID", + "planeType": "he111h6", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "UNIT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA": null, + "WINTER": null + }, + "defs": [ + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 1967, + "y": 2402, + "orientation": 0, + "fillColor": "1c1c1c" + }, + { + "text": "{0}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 2322, + "y": 2402, + "orientation": 0, + "fillColor": "{3,choice,0#009900|1#e1e1e1|2#a62121|3#ddb63a|4#3e48d5}", + "strokeWidth": 2, + "strokeColor": "1c1c1c" + }, + { + "text": "{2}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 2405, + "y": 2402, + "orientation": 0, + "fillColor": "1c1c1c" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 2261, + "y": 1834, + "orientation": 180, + "fillColor": "1c1c1c" + }, + { + "text": "{0}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 1919, + "y": 1834, + "orientation": 180, + "fillColor": "{3,choice,0#009900|1#e1e1e1|2#a62121|3#ddb63a|4#3e48d5}", + "strokeWidth": 2, + "strokeColor": "1c1c1c" + }, + { + "text": "{2}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 1830, + "y": 1834, + "orientation": 180, + "fillColor": "1c1c1c" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 380, + "x": 908, + "y": 513, + "orientation": 187, + "fillColor": "1c1c1c" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 380, + "x": 3538, + "y": 513, + "orientation": 173, + "fillColor": "1c1c1c" + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 3744, + "y": 2388, + "width": 85, + "height": 114, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 3744, + "y": 1838, + "width": 85, + "height": 114, + "orientation": 180 + } + ], + "baseImagePath": "he111h6_lw{5,choice,0#|1#_winter}_base.png", + "weatherImagePath": "he111h6_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/hs129b2.json b/BoSData/Input/Skins/Templates/hs129b2.json new file mode 100644 index 000000000..51c5bb554 --- /dev/null +++ b/BoSData/Input/Skins/Templates/hs129b2.json @@ -0,0 +1,71 @@ +{ + "templates": { + "lw_attack_schg1": { + "templateName": "LW_ATTACK_SCHG1", + "planeType": "hs129b2", + "credit": "Based on official 2K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 150, + "x": 504, + "y": 317, + "orientation": 0, + "fillColor": "{2,choice,0#101010|1#d0d0d0|2#941515|3#fcbe0e|4#3b46b1}", + "strokeWidth": 4, + "strokeColor": "{2,choice,0#'{3,choice,0#d0d0d0|1#101010}'|1#101010|2#d0d0d0|3#101010|4#d0d0d0}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 150, + "x": 504, + "y": 684, + "orientation": 180, + "fillColor": "{2,choice,0#101010|1#d0d0d0|2#941515|3#fcbe0e|4#3b46b1}", + "strokeWidth": 4, + "strokeColor": "{2,choice,0#'{3,choice,0#d0d0d0|1#101010}'|1#101010|2#d0d0d0|3#101010|4#d0d0d0}" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 150, + "x": 694, + "y": 317, + "orientation": 0, + "fillColor": "101010", + "strokeWidth": 4, + "strokeColor": "{3,choice,0#d0d0d0|1#101010}" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 150, + "x": 694, + "y": 684, + "orientation": 180, + "fillColor": "101010", + "strokeWidth": 4, + "strokeColor": "{3,choice,0#d0d0d0|1#101010}" + } + ], + "baseImagePath": "hs129b2_lw{3,choice,0#|1#_winter}_base.png", + "weatherImagePath": "hs129b2_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/i16t24.json b/BoSData/Input/Skins/Templates/i16t24.json new file mode 100644 index 000000000..366409181 --- /dev/null +++ b/BoSData/Input/Skins/Templates/i16t24.json @@ -0,0 +1,74 @@ +{ + "templates": { + "vvs_green": { + "templateName": "VVS_GREEN", + "planeType": "i16t24", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers1.otf", + "size": 320, + "x": 2484, + "y": 942, + "orientation": 90, + "fillColor": "{1,choice,0#e7e7e7|1#961818}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers1.otf", + "size": 320, + "x": 2277, + "y": 1088, + "orientation": 270, + "fillColor": "{1,choice,0#e7e7e7|1#961818}" + } + ], + "baseImagePath": "i16t24_vvs_{1,choice,0#green|1#winter}_base.png", + "weatherImagePath": "i16t24_weather.png" + }, + "vvs_green_black": { + "templateName": "VVS_GREEN_BLACK", + "planeType": "i16t24", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers1.otf", + "size": 280, + "x": 2484, + "y": 942, + "orientation": 90, + "fillColor": "{1,choice,0#e7e7e7|1#961818}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers1.otf", + "size": 280, + "x": 2277, + "y": 1088, + "orientation": 270, + "fillColor": "{1,choice,0#e7e7e7|1#961818}" + } + ], + "baseImagePath": "i16t24_vvs_{1,choice,0#green_black|1#winter}_base.png", + "weatherImagePath": "i16t24_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/il2m41.json b/BoSData/Input/Skins/Templates/il2m41.json new file mode 100644 index 000000000..8f2de1b5b --- /dev/null +++ b/BoSData/Input/Skins/Templates/il2m41.json @@ -0,0 +1,74 @@ +{ + "templates": { + "vvs_green": { + "templateName": "VVS_GREEN", + "planeType": "il2m41", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers1.otf", + "size": 250, + "x": 2515, + "y": 2776, + "orientation": 0, + "fillColor": "{1,choice,0#e7e7e7|1#9e151c}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers1.otf", + "size": 250, + "x": 2515, + "y": 2072, + "orientation": 180, + "fillColor": "{1,choice,0#e7e7e7|1#9e151c}" + } + ], + "baseImagePath": "il2m41_vvs_{1,choice,0#green|1#winter}_base.png", + "weatherImagePath": "il2m41_weather.png" + }, + "vvs_green_black": { + "templateName": "VVS_GREEN_BLACK", + "planeType": "il2m41", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers1.otf", + "size": 250, + "x": 2515, + "y": 2776, + "orientation": 0, + "fillColor": "{1,choice,0#e7e7e7|1#9e151c}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers1.otf", + "size": 250, + "x": 2515, + "y": 2072, + "orientation": 180, + "fillColor": "{1,choice,0#e7e7e7|1#9e151c}" + } + ], + "baseImagePath": "il2m41_vvs_{1,choice,0#green_black|1#winter}_base.png", + "weatherImagePath": "il2m41_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/il2m42.json b/BoSData/Input/Skins/Templates/il2m42.json new file mode 100644 index 000000000..b8fc3b5b0 --- /dev/null +++ b/BoSData/Input/Skins/Templates/il2m42.json @@ -0,0 +1,74 @@ +{ + "templates": { + "vvs_green_black": { + "templateName": "VVS_GREEN_BLACK", + "planeType": "il2m42", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers1.otf", + "size": 250, + "x": 2515, + "y": 2889, + "orientation": 0, + "fillColor": "{1,choice,0#e7e7e7|1#9e151c}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers1.otf", + "size": 250, + "x": 2515, + "y": 2117, + "orientation": 180, + "fillColor": "{1,choice,0#e7e7e7|1#9e151c}" + } + ], + "baseImagePath": "il2m42_vvs_green_black{1,choice,0#|1#_winter}_base.png", + "weatherImagePath": "il2m42_weather.png" + }, + "vvs_tricolor": { + "templateName": "VVS_TRICOLOR", + "planeType": "il2m42", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers1.otf", + "size": 250, + "x": 2515, + "y": 2889, + "orientation": 0, + "fillColor": "{1,choice,0#e7e7e7|1#9e151c}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers1.otf", + "size": 250, + "x": 2515, + "y": 2117, + "orientation": 180, + "fillColor": "{1,choice,0#e7e7e7|1#9e151c}" + } + ], + "baseImagePath": "il2m42_vvs_tricolor{1,choice,0#|1#_winter}_base.png", + "weatherImagePath": "il2m42_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/il2m43.json b/BoSData/Input/Skins/Templates/il2m43.json new file mode 100644 index 000000000..023a5a0fc --- /dev/null +++ b/BoSData/Input/Skins/Templates/il2m43.json @@ -0,0 +1,43 @@ +{ + "templates": { + "vvs_tricolor": { + "templateName": "VVS_TRICOLOR", + "planeType": "il2m43", + "credit": "Based on BlackHellHound1's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 250, + "x": 2515, + "y": 2889, + "orientation": 0, + "fillColor": "{1,choice,0#e7e7e7|1#903522}", + "strokeWidth": 5, + "strokeColor": "903522" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 250, + "x": 2515, + "y": 2117, + "orientation": 180, + "fillColor": "{1,choice,0#e7e7e7|1#903522}", + "strokeWidth": 5, + "strokeColor": "903522" + } + ], + "baseImagePath": "il2m43_vvs_tricolor{1,choice,0#|1#_winter}_base.png", + "weatherImagePath": "il2m43_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/ju523mg4e.json b/BoSData/Input/Skins/Templates/ju523mg4e.json new file mode 100644 index 000000000..cbdc8462f --- /dev/null +++ b/BoSData/Input/Skins/Templates/ju523mg4e.json @@ -0,0 +1,133 @@ +{ + "templates": { + "lw_bomber_mid": { + "templateName": "LW_BOMBER_MID", + "planeType": "ju523mg4e", + "credit": "Based on 6./ZG26_5tuka's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "UNIT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA": null, + "WINTER": null + }, + "defs": [ + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 2910, + "y": 979, + "orientation": 0, + "fillColor": "1e1e1e" + }, + { + "text": "{0}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 3225, + "y": 979, + "orientation": 0, + "fillColor": "{3,choice,0#009900|1#e1e1e1|2#a62121|3#ddb63a|4#3e48d5}", + "strokeWidth": 2, + "strokeColor": "1e1e1e" + }, + { + "text": "{2}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 3318, + "y": 979, + "orientation": 0, + "fillColor": "1e1e1e" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 3160, + "y": 289, + "orientation": 180, + "fillColor": "1e1e1e" + }, + { + "text": "{0}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 2840, + "y": 289, + "orientation": 180, + "fillColor": "{3,choice,0#009900|1#e1e1e1|2#a62121|3#ddb63a|4#3e48d5}", + "strokeWidth": 2, + "strokeColor": "1e1e1e" + }, + { + "text": "{2}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 2751, + "y": 289, + "orientation": 180, + "fillColor": "1e1e1e" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 380, + "x": 612, + "y": 3313, + "orientation": 90, + "fillColor": "1e1e1e" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 380, + "x": 1376, + "y": 2451, + "orientation": 90, + "fillColor": "1e1e1e" + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 1252, + "y": 1031, + "width": 64, + "height": 85, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 1252, + "y": 233, + "width": 64, + "height": 85, + "orientation": 180 + } + ], + "baseImagePath": "ju523mg4e_lw{5,choice,0#|1#_winter}_base.png", + "weatherImagePath": "ju523mg4e_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/ju87d3.json b/BoSData/Input/Skins/Templates/ju87d3.json new file mode 100644 index 000000000..a7181af15 --- /dev/null +++ b/BoSData/Input/Skins/Templates/ju87d3.json @@ -0,0 +1,133 @@ +{ + "templates": { + "lw_bomber_mid": { + "templateName": "LW_BOMBER_MID", + "planeType": "ju87d3", + "credit": "Based on 6./ZG26_5tuka's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "UNIT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_CP_FORE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 1986, + "y": 913, + "orientation": 0, + "fillColor": "1e1e1e" + }, + { + "text": "{0}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 2309, + "y": 913, + "orientation": 0, + "fillColor": "{3,choice,0#009900|1#e1e1e1|2#a62121|3#ddb63a|4#3e48d5}", + "strokeWidth": 2, + "strokeColor": "1e1e1e" + }, + { + "text": "{2}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 2390, + "y": 913, + "orientation": 0, + "fillColor": "1e1e1e" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 2255, + "y": 1460, + "orientation": 180, + "fillColor": "1e1e1e" + }, + { + "text": "{0}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 1923, + "y": 1460, + "orientation": 180, + "fillColor": "{3,choice,0#009900|1#e1e1e1|2#a62121|3#ddb63a|4#3e48d5}", + "strokeWidth": 2, + "strokeColor": "1e1e1e" + }, + { + "text": "{2}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 1842, + "y": 1460, + "orientation": 180, + "fillColor": "1e1e1e" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "font": "Blockschrift.otf", + "size": 380, + "x": 851, + "y": 1818, + "orientation": 0, + "fillColor": "1e1e1e" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "font": "Blockschrift.otf", + "size": 380, + "x": 840, + "y": 3054, + "orientation": 0, + "fillColor": "1e1e1e" + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 860, + "y": 814, + "width": 105, + "height": 121, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 860, + "y": 1564, + "width": 105, + "height": 121, + "orientation": 180 + } + ], + "baseImagePath": "ju87d3_lw{5,choice,0#|1#_winter}_base.png", + "weatherImagePath": "ju87d3_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/ju88a4.json b/BoSData/Input/Skins/Templates/ju88a4.json new file mode 100644 index 000000000..3c3e2cc88 --- /dev/null +++ b/BoSData/Input/Skins/Templates/ju88a4.json @@ -0,0 +1,133 @@ +{ + "templates": { + "lw_bomber_mid": { + "templateName": "LW_BOMBER_MID", + "planeType": "ju88a4", + "credit": "Based on III/JG2Gustav05's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "UNIT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA": null, + "WINTER": null + }, + "defs": [ + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 1705, + "y": 944, + "orientation": 0, + "fillColor": "000000" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 1978, + "y": 944, + "orientation": 0, + "fillColor": "{3,choice,0#009900|1#d1d1d1|2#9e1519|3#c7a648|4#3333ff}", + "strokeWidth": 2, + "strokeColor": "000000" + }, + { + "text": "{2}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 2120, + "y": 944, + "orientation": 0, + "fillColor": "000000" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 1978, + "y": 286, + "orientation": 180, + "fillColor": "000000" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 1705, + "y": 286, + "orientation": 180, + "fillColor": "{3,choice,0#009900|1#d1d1d1|2#9e1519|3#c7a648|4#3333ff}", + "strokeWidth": 2, + "strokeColor": "000000" + }, + { + "text": "{2}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 210, + "x": 1563, + "y": 286, + "orientation": 180, + "fillColor": "000000" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "font": "Blockschrift.otf", + "size": 380, + "x": 1290, + "y": 2760, + "orientation": 0, + "fillColor": "000000" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "font": "Blockschrift.otf", + "size": 380, + "x": 2812, + "y": 2760, + "orientation": 0, + "fillColor": "000000" + }, + { + "image": "{4}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 130, + "y": 899, + "width": 97, + "height": 84, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "x": 227, + "y": 333, + "width": 97, + "height": 84, + "orientation": 180 + } + ], + "baseImagePath": "ju88a4_lw{5,choice,0#|1#_winter}_base.png", + "weatherImagePath": "ju88a4_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/la5fns2.json b/BoSData/Input/Skins/Templates/la5fns2.json new file mode 100644 index 000000000..9aebfc4c4 --- /dev/null +++ b/BoSData/Input/Skins/Templates/la5fns2.json @@ -0,0 +1,43 @@ +{ + "templates": { + "vvs_grey": { + "templateName": "VVS_GREY", + "planeType": "la5fns2", + "credit": "Based on Zargos's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 300, + "x": 1930, + "y": 3808, + "orientation": 0, + "fillColor": "{1,choice,0#e7e7e7|1#a21919}", + "strokeWidth": 5, + "strokeColor": "a21919" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 300, + "x": 1930, + "y": 2706, + "orientation": 180, + "fillColor": "{1,choice,0#e7e7e7|1#a21919}", + "strokeWidth": 5, + "strokeColor": "a21919" + } + ], + "baseImagePath": "la5fns2_vvs_{1,choice,0#grey|1#winter}_base.png", + "weatherImagePath": "la5fns2_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/la5s8.json b/BoSData/Input/Skins/Templates/la5s8.json new file mode 100644 index 000000000..bc5c6b6c2 --- /dev/null +++ b/BoSData/Input/Skins/Templates/la5s8.json @@ -0,0 +1,78 @@ +{ + "templates": { + "vvs_green_black": { + "templateName": "VVS_GREEN_BLACK", + "planeType": "la5s8", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers1.otf", + "size": 300, + "x": 1910, + "y": 3808, + "orientation": 0, + "fillColor": "{1,choice,0#e7e7e7|1#a21919}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers1.otf", + "size": 300, + "x": 1910, + "y": 2706, + "orientation": 180, + "fillColor": "{1,choice,0#e7e7e7|1#a21919}" + } + ], + "baseImagePath": "la5s8_vvs_{1,choice,0#green_black|1#winter}_base.png", + "weatherImagePath": "la5s8_weather.png" + }, + "vvs_grey": { + "templateName": "VVS_GREY", + "planeType": "la5s8", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 300, + "x": 1930, + "y": 3808, + "orientation": 0, + "fillColor": "{1,choice,0#e7e7e7|1#a21919}", + "strokeWidth": 5, + "strokeColor": "a21919" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 300, + "x": 1930, + "y": 2706, + "orientation": 180, + "fillColor": "{1,choice,0#e7e7e7|1#a21919}", + "strokeWidth": 5, + "strokeColor": "a21919" + } + ], + "baseImagePath": "la5s8_vvs_{1,choice,0#grey|1#winter}_base.png", + "weatherImagePath": "la5s8_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/lagg3s29.json b/BoSData/Input/Skins/Templates/lagg3s29.json new file mode 100644 index 000000000..6b263b793 --- /dev/null +++ b/BoSData/Input/Skins/Templates/lagg3s29.json @@ -0,0 +1,74 @@ +{ + "templates": { + "vvs_green": { + "templateName": "VVS_GREEN", + "planeType": "lagg3s29", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers1.otf", + "size": 300, + "x": 1970, + "y": 3808, + "orientation": 0, + "fillColor": "{1,choice,0#e7e7e7|1#941717}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers1.otf", + "size": 300, + "x": 1970, + "y": 2726, + "orientation": 180, + "fillColor": "{1,choice,0#e7e7e7|1#941717}" + } + ], + "baseImagePath": "lagg3s29_vvs_{1,choice,0#green|1#winter}_base.png", + "weatherImagePath": "lagg3s29_weather.png" + }, + "vvs_green_black": { + "templateName": "VVS_GREEN_BLACK", + "planeType": "lagg3s29", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers1.otf", + "size": 300, + "x": 1950, + "y": 3808, + "orientation": 0, + "fillColor": "{1,choice,0#e7e7e7|1#941717}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers1.otf", + "size": 300, + "x": 1950, + "y": 2706, + "orientation": 180, + "fillColor": "{1,choice,0#e7e7e7|1#941717}" + } + ], + "baseImagePath": "lagg3s29_vvs_{1,choice,0#green_black|1#winter}_base.png", + "weatherImagePath": "lagg3s29_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/mc202s8.json b/BoSData/Input/Skins/Templates/mc202s8.json new file mode 100644 index 000000000..ebad90132 --- /dev/null +++ b/BoSData/Input/Skins/Templates/mc202s8.json @@ -0,0 +1,61 @@ +{ + "templates": { + "ra_generic": { + "templateName": "RA_GENERIC", + "planeType": "mc202s8", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "UNIT_ID_CODE": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "RAF_WW2_851ATH.otf", + "size": 150, + "x": 1907, + "y": 2390, + "orientation": 0, + "fillColor": "e1e1e1" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "RAF_WW2_851ATH.otf", + "size": 150, + "x": 1907, + "y": 1690, + "orientation": 180, + "fillColor": "e1e1e1" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "RAF_WW2_851ATH.otf", + "size": 150, + "x": 1951, + "y": 2390, + "orientation": 0, + "fillColor": "191919" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "RAF_WW2_851ATH.otf", + "size": 150, + "x": 1951, + "y": 1690, + "orientation": 180, + "fillColor": "191919" + } + ], + "baseImagePath": "mc202s8_ra_base.png", + "weatherImagePath": "mc202s8_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/me262a.json b/BoSData/Input/Skins/Templates/me262a.json new file mode 100644 index 000000000..a49ece498 --- /dev/null +++ b/BoSData/Input/Skins/Templates/me262a.json @@ -0,0 +1,456 @@ +{ + "templates": { + "lw_fighter_later": { + "templateName": "LW_FIGHTER_LATER", + "planeType": "me262a", + "credit": "Based on official 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_NOSE": null, + "INSIGNIA_CP_FORE": null, + "INSIGNIA_CP_MID": null, + "INSIGNIA_TAIL": null, + "ID_BAND_FORE": null, + "ID_BAND_AFT": null, + "ID_BAND_CHECKS": null, + "SERIAL": null, + "ID_ON_NOSE": 0 + }, + "defs": [ + { + "image": "Insignia\\me262_tail_band_fore.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 2383, + "y": 57, + "orientation": 0, + "fillColor": "{7}" + }, + { + "image": "Insignia\\me262_tail_band_aft.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 2579, + "y": 74, + "orientation": 0, + "fillColor": "{8}" + }, + { + "image": "Insignia\\me262_tail_band_checks.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 2383, + "y": 57, + "orientation": 0, + "fillColor": "{9}" + }, + { + "text": "{11,choice,0#|1#{0}}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 200, + "x": 922, + "y": 844, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 4, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{11,choice,0#|1#{0}}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 200, + "x": 922, + "y": 184, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 4, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{11,choice,0#{0}|1#}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 250, + "x": 2099, + "y": 848, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 6, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{11,choice,0#{0}|1#}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 250, + "x": 2099, + "y": 187, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 6, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 250, + "x": 2578, + "y": 848, + "orientation": 0, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 6, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "text": "{1}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 250, + "x": 2578, + "y": 187, + "orientation": 180, + "fillColor": "{2,choice,1#faf7f1|2#262627|3#ffc63d}", + "strokeWidth": 6, + "strokeColor": "{2,choice,1#262627|2#faf7f1|3#262627}" + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 922, + "y": 794, + "width": 82, + "height": 87, + "orientation": 0 + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 922, + "y": 234, + "width": 82, + "height": 87, + "orientation": 180 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 1126, + "y": 740, + "width": 87, + "height": 104, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 1126, + "y": 288, + "width": 87, + "height": 104, + "orientation": 180 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 1422, + "y": 768, + "width": 128, + "height": 138, + "orientation": 0 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 1422, + "y": 260, + "width": 128, + "height": 138, + "orientation": 180 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 2578, + "y": 848, + "width": 144, + "height": 200, + "orientation": 0 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 2578, + "y": 187, + "width": 144, + "height": 200, + "orientation": 180 + }, + { + "text": "{10}", + "horizAlign": "CENTER", + "vertAlign": "BOTTOM", + "font": "Blockschrift.otf", + "size": 70, + "x": 3612, + "y": 1937, + "orientation": 270, + "fillColor": "262627" + }, + { + "text": "{10}", + "horizAlign": "CENTER", + "vertAlign": "BOTTOM", + "font": "Blockschrift.otf", + "size": 70, + "x": 3347, + "y": 1586, + "orientation": 180, + "fillColor": "262627" + } + ], + "baseImagePath": "me262a_lw_later_base.png", + "weatherImagePath": "me262a_weather.png" + }, + "lw_bomber_later": { + "templateName": "LW_BOMBER_LATER", + "planeType": "me262a", + "credit": "Based on official 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SUB_UNIT_ID_CODE": null, + "STAFFEL_COLOR_INDEX": null, + "INSIGNIA_NOSE": null, + "INSIGNIA_CP_FORE": null, + "INSIGNIA_CP_MID": null, + "INSIGNIA_TAIL": null, + "ID_BAND_FORE": null, + "ID_BAND_AFT": null, + "ID_BAND_CHECKS": null, + "SERIAL": null, + "UNIT_ID_CODE": null + }, + "defs": [ + { + "image": "Insignia\\me262_tail_band_fore.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 2383, + "y": 57, + "orientation": 0, + "fillColor": "{7}" + }, + { + "image": "Insignia\\me262_tail_band_aft.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 2579, + "y": 74, + "orientation": 0, + "fillColor": "{8}" + }, + { + "image": "Insignia\\me262_tail_band_checks.png", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 2383, + "y": 57, + "orientation": 0, + "fillColor": "{9}" + }, + { + "text": "{11}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 60, + "x": 2099, + "y": 848, + "orientation": 0, + "fillColor": "262627" + }, + { + "text": "{11}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 60, + "x": 2099, + "y": 187, + "orientation": 180, + "fillColor": "262627" + }, + { + "text": "{0}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 180, + "x": 2457, + "y": 848, + "orientation": 0, + "fillColor": "{2,choice,0#009900|1#e1e1e1|2#a62121|3#ddb63a|4#3e48d5}", + "strokeWidth": 6, + "strokeColor": "262627" + }, + { + "text": "{0}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 180, + "x": 2457, + "y": 187, + "orientation": 180, + "fillColor": "{2,choice,0#009900|1#e1e1e1|2#a62121|3#ddb63a|4#3e48d5}", + "strokeWidth": 6, + "strokeColor": "262627" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 60, + "x": 2528, + "y": 848, + "orientation": 0, + "fillColor": "262627" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Blockschrift.otf", + "size": 60, + "x": 2528, + "y": 187, + "orientation": 180, + "fillColor": "262627" + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 922, + "y": 794, + "width": 82, + "height": 87, + "orientation": 0 + }, + { + "image": "{3}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 922, + "y": 234, + "width": 82, + "height": 87, + "orientation": 180 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 1126, + "y": 740, + "width": 87, + "height": 104, + "orientation": 0 + }, + { + "image": "{4}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 1126, + "y": 288, + "width": 87, + "height": 104, + "orientation": 180 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 1422, + "y": 768, + "width": 128, + "height": 138, + "orientation": 0 + }, + { + "image": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "x": 1422, + "y": 260, + "width": 128, + "height": 138, + "orientation": 180 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 2578, + "y": 848, + "width": 144, + "height": 200, + "orientation": 0 + }, + { + "image": "{6}", + "horizAlign": "CENTER", + "vertAlign": "CENTER", + "x": 2578, + "y": 187, + "width": 144, + "height": 200, + "orientation": 180 + }, + { + "text": "{10}", + "horizAlign": "CENTER", + "vertAlign": "BOTTOM", + "font": "Blockschrift.otf", + "size": 70, + "x": 3612, + "y": 1937, + "orientation": 270, + "fillColor": "262627" + }, + { + "text": "{10}", + "horizAlign": "CENTER", + "vertAlign": "BOTTOM", + "font": "Blockschrift.otf", + "size": 70, + "x": 3347, + "y": 1586, + "orientation": 180, + "fillColor": "262627" + } + ], + "baseImagePath": "me262a_lw_later_base.png", + "weatherImagePath": "me262a_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/mig3s24.json b/BoSData/Input/Skins/Templates/mig3s24.json new file mode 100644 index 000000000..e55643d97 --- /dev/null +++ b/BoSData/Input/Skins/Templates/mig3s24.json @@ -0,0 +1,74 @@ +{ + "templates": { + "vvs_green": { + "templateName": "VVS_GREEN", + "planeType": "mig3s24", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers1.otf", + "size": 280, + "x": 1866, + "y": 3160, + "orientation": 0, + "fillColor": "{1,choice,0#e7e7e7|1#961818}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers1.otf", + "size": 280, + "x": 1866, + "y": 3389, + "orientation": 180, + "fillColor": "{1,choice,0#e7e7e7|1#961818}" + } + ], + "baseImagePath": "mig3s24_vvs_{1,choice,0#green|1#winter}_base.png", + "weatherImagePath": "mig3s24_weather.png" + }, + "vvs_green_black": { + "templateName": "VVS_GREEN_BLACK", + "planeType": "mig3s24", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers1.otf", + "size": 280, + "x": 1866, + "y": 3160, + "orientation": 0, + "fillColor": "{1,choice,0#e7e7e7|1#961818}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers1.otf", + "size": 280, + "x": 1866, + "y": 3389, + "orientation": 180, + "fillColor": "{1,choice,0#e7e7e7|1#961818}" + } + ], + "baseImagePath": "mig3s24_vvs_{1,choice,0#green_black|1#winter}_base.png", + "weatherImagePath": "mig3s24_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/p38j25.json b/BoSData/Input/Skins/Templates/p38j25.json new file mode 100644 index 000000000..14ab57d74 --- /dev/null +++ b/BoSData/Input/Skins/Templates/p38j25.json @@ -0,0 +1,232 @@ +{ + "templates": { + "usaaf_late_bare": { + "templateName": "USAAF_LATE_BARE", + "planeType": "p38j25", + "credit": "Based on official 4K template", + "parameters": { + "UNIT_ID_CODE": null, + "AIRCRAFT_ID_CODE": null, + "SQUADRON_NUM": 0, + "ID_ON_TAIL": 0, + "TAIL_CODE_START": null, + "TAIL_CODE_END": null, + "SERIAL": null, + "STRIPES": null, + "PILOT_NAME_RANK_INIT": null + }, + "defs": [ + { + "image": "{7,choice,0#|1#Insignia\\p38_stripes_usaaf_under_1.png}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 674, + "y": 703, + "fillShine": "3f" + }, + { + "image": "{7,choice,0#|1#Insignia\\p38_stripes_usaaf_under_2.png}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 2724, + "y": 705, + "fillShine": "3f" + }, + { + "image": "{7,choice,0#|1#Insignia\\p38_stripes_usaaf_under_3.png}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 3232, + "y": 2010, + "fillShine": "3f" + }, + { + "image": "{7,choice,0#|1#Insignia\\p38_stripes_usaaf_under_4.png}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 1462, + "y": 1762, + "fillShine": "3f" + }, + { + "image": "{7,choice,0#|1#Insignia\\p38_stripes_usaaf_under_5.png}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 606, + "y": 2214, + "fillShine": "3f" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Airborne.otf", + "size": 150, + "x": 1859, + "y": 3573, + "orientation": 0, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Airborne.otf", + "size": 150, + "x": 1538, + "y": 3593, + "orientation": 0, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Airborne.otf", + "size": 150, + "x": 1859, + "y": 2273, + "orientation": 180, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Airborne.otf", + "size": 150, + "x": 1538, + "y": 2254, + "orientation": 180, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{3,choice,0#|1#{1}}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "font": "Airborne.otf", + "size": 280, + "x": 2974, + "y": 2462, + "orientation": 0, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{3,choice,0#|1#{1}}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "font": "Airborne.otf", + "size": 280, + "x": 2574, + "y": 1841, + "orientation": 0, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{4}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "font": "Airborne.otf", + "size": 80, + "x": 2574, + "y": 2555, + "orientation": 0, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{5}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "font": "Airborne.otf", + "size": 80, + "x": 2605, + "y": 2555, + "orientation": 0, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{5}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "font": "Airborne.otf", + "size": 80, + "x": 2983, + "y": 1934, + "orientation": 0, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{4}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "font": "Airborne.otf", + "size": 80, + "x": 2953, + "y": 1934, + "orientation": 0, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{5}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "font": "Airborne.otf", + "size": 80, + "x": 2386, + "y": 3764, + "orientation": 0, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{5}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "font": "Airborne.otf", + "size": 80, + "x": 2386, + "y": 3173, + "orientation": 180, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{6}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "Arimo-Bold.ttf", + "size": 11.5, + "x": 2932, + "y": 3857, + "orientation": 0, + "fillColor": "3c3c3c", + "fillShine": "3f" + }, + { + "text": "pilot {8}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "font": "AlegreyaSansSC-MediumItalic.ttf", + "size": 15, + "x": 3078, + "y": 3667, + "orientation": 0, + "fillColor": "191919", + "fillShine": "3f" + } + ], + "baseImagePath": "p38j25_usaaf_late_bare{2,choice,0#|0<_{2}}_base.png", + "weatherImagePath": "p38j25_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/p39l1.json b/BoSData/Input/Skins/Templates/p39l1.json new file mode 100644 index 000000000..3323cb8b8 --- /dev/null +++ b/BoSData/Input/Skins/Templates/p39l1.json @@ -0,0 +1,85 @@ +{ + "templates": { + "vvs_green": { + "templateName": "VVS_GREEN", + "planeType": "p39l1", + "credit": "Based on Zargos's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null, + "TAIL_CODE_START": null, + "TAIL_CODE_END": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 300, + "x": 2573, + "y": 3071, + "orientation": 0, + "fillColor": "{1,choice,0#e7e7e7|1#912617}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 300, + "x": 2573, + "y": 2043, + "orientation": 180, + "fillColor": "{1,choice,0#e7e7e7|1#912617}" + }, + { + "text": "{2}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "Airborne.otf", + "size": 100, + "x": 3216, + "y": 2378, + "orientation": 270, + "fillColor": "d9b349" + }, + { + "text": "{3}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "Airborne.otf", + "size": 100, + "x": 3589, + "y": 2279, + "orientation": 270, + "fillColor": "d9b349" + }, + { + "text": "{2}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "Airborne.otf", + "size": 100, + "x": 3761, + "y": 2675, + "orientation": 180, + "fillColor": "d9b349" + }, + { + "text": "{3}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "Airborne.otf", + "size": 100, + "x": 3559, + "y": 3075, + "orientation": 270, + "fillColor": "d9b349" + } + ], + "baseImagePath": "p39l1_vvs_{1,choice,0#green|1#winter}_base.png", + "weatherImagePath": "p39l1_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/p40e1.json b/BoSData/Input/Skins/Templates/p40e1.json new file mode 100644 index 000000000..25fc08b14 --- /dev/null +++ b/BoSData/Input/Skins/Templates/p40e1.json @@ -0,0 +1,88 @@ +{ + "templates": { + "p40e1_raf_desert": { + "templateName": "P40E1_RAF_DESERT", + "planeType": "p40e1", + "credit": "Based on ICDP's 4K template", + "parameters": { + "UNIT_ID_CODE": null, + "AIRCRAFT_ID_CODE": null + }, + "defs": [ + { + "text": "{0}", + "align": "RIGHT", + "font": "RAF_WW2_851ATH.otf", + "size": 230, + "x": 3135, + "y": 2625, + "orientation": 0 + }, + { + "text": "{1}", + "align": "LEFT", + "font": "RAF_WW2_851ATH.otf", + "size": 230, + "x": 3507, + "y": 2625, + "orientation": 0 + }, + { + "text": "{0}", + "align": "LEFT", + "font": "RAF_WW2_851ATH.otf", + "size": 230, + "x": 3135, + "y": 1725, + "orientation": 180 + }, + { + "text": "{1}", + "align": "RIGHT", + "font": "RAF_WW2_851ATH.otf", + "size": 230, + "x": 3507, + "y": 1725, + "orientation": 180 + } + ], + "baseImagePath": "p40e1_raf_shark_base.png", + "weatherImagePath": "p40e1_weather.png" + }, + "vvs_green": { + "templateName": "VVS_GREEN", + "planeType": "p40e1", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 300, + "x": 3247, + "y": 2652, + "orientation": 0, + "fillColor": "{1,choice,0#e7e7e7|1#961818}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 300, + "x": 3247, + "y": 1706, + "orientation": 180, + "fillColor": "{1,choice,0#e7e7e7|1#961818}" + } + ], + "baseImagePath": "p40e1_vvs_{1,choice,0#green|1#winter}_base.png", + "weatherImagePath": "p40e1_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/p47d28.json b/BoSData/Input/Skins/Templates/p47d28.json new file mode 100644 index 000000000..8f361e97d --- /dev/null +++ b/BoSData/Input/Skins/Templates/p47d28.json @@ -0,0 +1,158 @@ +{ + "templates": { + "usaaf_late_bare": { + "templateName": "USAAF_LATE_BARE", + "planeType": "p47d28", + "credit": "Based on ICDP's 4K template", + "parameters": { + "UNIT_ID_CODE": null, + "AIRCRAFT_ID_CODE": null, + "PILOT_NAME_RANK_INIT": null, + "SQUADRON_NUM": 0, + "TAIL_CODE": null, + "SERIAL": null, + "STRIPES": null + }, + "defs": [ + { + "image": "{6,choice,0#|1#Insignia\\p47d_stripes_shackles.png}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 3556, + "y": 0, + "fillShine": "34" + }, + { + "image": "{6,choice,0#|1#Insignia\\p47d_stripes_wings_usaaf_under.png|2#}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 793, + "y": 1094, + "fillShine": "34" + }, + { + "image": "{6,choice,0#|2#Insignia\\p47d_stripes_wings_usaaf_full.png}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 792, + "y": 106, + "fillShine": "34" + }, + { + "image": "{6,choice,0#|1#Insignia\\p47d_stripes_fuselage_usaaf_under.png|2#}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 2143, + "y": 2592, + "fillShine": "34" + }, + { + "image": "{6,choice,0#|2#Insignia\\p47d_stripes_fuselage_usaaf_full.png}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 2143, + "y": 2480, + "fillShine": "34" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "Airborne.otf", + "size": 260, + "x": 2295, + "y": 3644, + "orientation": 0, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "Airborne.otf", + "size": 260, + "x": 2887, + "y": 3644, + "orientation": 0, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "Airborne.otf", + "size": 260, + "x": 2295, + "y": 2755, + "orientation": 180, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "Airborne.otf", + "size": 260, + "x": 2887, + "y": 2755, + "orientation": 180, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "pilot {2}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "AlegreyaSansSC-MediumItalic.ttf", + "size": 18, + "x": 1375, + "y": 3352, + "orientation": 0, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{4}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Airborne.otf", + "size": 75, + "x": 3825, + "y": 3756, + "orientation": 0, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{4}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Airborne.otf", + "size": 75, + "x": 3825, + "y": 2957, + "orientation": 180, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{5}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "Arimo-Bold.ttf", + "size": 7, + "x": 1178, + "y": 3494, + "orientation": 0, + "fillColor": "191919", + "fillShine": "24" + } + ], + "baseImagePath": "p47d28_usaaf_late_bare{3,choice,0#|0<_{3}}_base.png", + "weatherImagePath": "p47d28_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/p51d15.json b/BoSData/Input/Skins/Templates/p51d15.json new file mode 100644 index 000000000..df50b2286 --- /dev/null +++ b/BoSData/Input/Skins/Templates/p51d15.json @@ -0,0 +1,229 @@ +{ + "templates": { + "usaaf_late_bare": { + "templateName": "USAAF_LATE_BARE", + "planeType": "p51d15", + "credit": "Based on official 4K template, using IDCP's invasion stripes", + "parameters": { + "UNIT_ID_CODE": null, + "AIRCRAFT_ID_CODE": null, + "PILOT_NAME_RANK_INIT": null, + "SQUADRON_NUM": 0, + "ID_ON_TAIL": 0, + "TAIL_CODE_START": null, + "TAIL_CODE_END": null, + "SERIAL": null, + "STRIPES": null + }, + "defs": [ + { + "image": "{8,choice,0#|1#Insignia\\p51_stripes_usaaf_under_1.png|2#Insignia\\p51_stripes_usaaf_full_1.png}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 256, + "y": 26, + "fillShine": "3f" + }, + { + "image": "{8,choice,0#|1#Insignia\\p51_stripes_usaaf_under_2.png|2#Insignia\\p51_stripes_usaaf_full_2.png}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 943, + "y": 1277, + "fillShine": "3f" + }, + { + "image": "{8,choice,0#|1#Insignia\\p51_stripes_usaaf_under_3.png|2#Insignia\\p51_stripes_usaaf_full_3.png}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 1613, + "y": 162, + "fillShine": "3f" + }, + { + "image": "{8,choice,0#|1#Insignia\\p51_stripes_usaaf_under_4.png|2#Insignia\\p51_stripes_usaaf_full_4.png}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 3394, + "y": 101, + "fillShine": "3f" + }, + { + "image": "{8,choice,0#|1#Insignia\\p51_stripes_usaaf_under_5.png|2#Insignia\\p51_stripes_usaaf_full_5.png}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 80, + "y": 2068, + "fillShine": "3f" + }, + { + "image": "{8,choice,0#|1#Insignia\\p51_stripes_usaaf_under_6.png|2#Insignia\\p51_stripes_usaaf_full_6.png}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 3107, + "y": 2033, + "fillShine": "3f" + }, + { + "image": "{8,choice,0#|1#Insignia\\p51_stripes_usaaf_under_7.png|2#Insignia\\p51_stripes_usaaf_full_7.png}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 985, + "y": 3254, + "fillShine": "3f" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Airborne.otf", + "size": 260, + "x": 1784, + "y": 1079, + "orientation": 0, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{4,choice,0#{1}|1#}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Airborne.otf", + "size": 260, + "x": 2474, + "y": 1079, + "orientation": 0, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "Airborne.otf", + "size": 260, + "x": 1784, + "y": 472, + "orientation": 180, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{4,choice,0#{1}|1#}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "Airborne.otf", + "size": 260, + "x": 2474, + "y": 472, + "orientation": 180, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{4,choice,0#|1#{1}}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "font": "Airborne.otf", + "size": 240, + "x": 3730, + "y": 850, + "orientation": 0, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{4,choice,0#|1#{1}}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "font": "Airborne.otf", + "size": 240, + "x": 3530, + "y": 628, + "orientation": 180, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{2}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "CormorantSC-SemiBold.ttf", + "size": 40, + "x": 175, + "y": 1697, + "x2": 634, + "y2": 1600, + "cx1": 348, + "cy1": 1677, + "cx2": 500, + "cy2": 1661, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{5}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "font": "Airborne.otf", + "size": 100, + "x": 3737, + "y": 1092, + "orientation": 0, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{6}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "font": "Airborne.otf", + "size": 100, + "x": 2771, + "y": 1430, + "orientation": 270, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{6}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "font": "Airborne.otf", + "size": 100, + "x": 3545, + "y": 382, + "orientation": 180, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{5}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "font": "Airborne.otf", + "size": 100, + "x": 3509, + "y": 1336, + "orientation": 270, + "fillColor": "191919", + "fillShine": "3f" + }, + { + "text": "{7}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "Arimo-Bold.ttf", + "size": 11, + "x": 998, + "y": 1079, + "orientation": 0, + "fillColor": "191919", + "fillShine": "3f" + } + ], + "baseImagePath": "p51d15_usaaf_late_bare{3,choice,0#|0<_{3}}_base.png", + "weatherImagePath": "p51d15_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/pe2s35.json b/BoSData/Input/Skins/Templates/pe2s35.json new file mode 100644 index 000000000..c73b015ee --- /dev/null +++ b/BoSData/Input/Skins/Templates/pe2s35.json @@ -0,0 +1,74 @@ +{ + "templates": { + "vvs_green": { + "templateName": "VVS_GREEN", + "planeType": "pe2s35", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 200, + "x": 2176, + "y": 820, + "orientation": 0, + "fillColor": "{1,choice,0#e7e7e7|1#903d2d}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 200, + "x": 2176, + "y": 114, + "orientation": 180, + "fillColor": "{1,choice,0#e7e7e7|1#903d2d}" + } + ], + "baseImagePath": "pe2s35_vvs_{1,choice,0#green|1#winter}_base.png", + "weatherImagePath": "pe2s35_weather.png" + }, + "vvs_green_black": { + "templateName": "VVS_GREEN_BLACK", + "planeType": "pe2s35", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 200, + "x": 2176, + "y": 820, + "orientation": 0, + "fillColor": "{1,choice,0#e7e7e7|1#903d2d}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 200, + "x": 2176, + "y": 114, + "orientation": 180, + "fillColor": "{1,choice,0#e7e7e7|1#903d2d}" + } + ], + "baseImagePath": "pe2s35_vvs_{1,choice,0#green_black|1#winter}_base.png", + "weatherImagePath": "pe2s35_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/pe2s87.json b/BoSData/Input/Skins/Templates/pe2s87.json new file mode 100644 index 000000000..fd1044cf7 --- /dev/null +++ b/BoSData/Input/Skins/Templates/pe2s87.json @@ -0,0 +1,117 @@ +{ + "templates": { + "vvs_green_black": { + "templateName": "VVS_GREEN_BLACK", + "planeType": "pe2s87", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 200, + "x": 2176, + "y": 820, + "orientation": 0, + "fillColor": "{1,choice,0#e7e7e7|1#903d2d}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 200, + "x": 2176, + "y": 114, + "orientation": 180, + "fillColor": "{1,choice,0#e7e7e7|1#903d2d}" + } + ], + "baseImagePath": "pe2s87_vvs_{1,choice,0#green_black|1#winter}_base.png", + "weatherImagePath": "pe2s87_weather.png" + }, + "vvs_grey": { + "templateName": "VVS_GREY", + "planeType": "pe2s87", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 200, + "x": 2176, + "y": 820, + "orientation": 0, + "fillColor": "{1,choice,0#e7e7e7|1#903d2d}", + "strokeWidth": 4, + "strokeColor": "903d2d" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 200, + "x": 2176, + "y": 114, + "orientation": 180, + "fillColor": "{1,choice,0#e7e7e7|1#903d2d}", + "strokeWidth": 4, + "strokeColor": "903d2d" + } + ], + "baseImagePath": "pe2s87_vvs_{1,choice,0#grey|1#winter}_base.png", + "weatherImagePath": "pe2s87_weather.png" + }, + "vvs_tricolor": { + "templateName": "VVS_TRICOLOR", + "planeType": "pe2s87", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 200, + "x": 2176, + "y": 812, + "orientation": 0, + "fillColor": "{1,choice,0#e7e7e7|1#903d2d}", + "strokeWidth": 4, + "strokeColor": "903d2d" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 200, + "x": 2176, + "y": 114, + "orientation": 180, + "fillColor": "{1,choice,0#e7e7e7|1#903d2d}", + "strokeWidth": 4, + "strokeColor": "903d2d" + } + ], + "baseImagePath": "pe2s87_vvs_{1,choice,0#tricolor|1#winter}_base.png", + "weatherImagePath": "pe2s87_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/spitfiremkixe.json b/BoSData/Input/Skins/Templates/spitfiremkixe.json new file mode 100644 index 000000000..0552123a8 --- /dev/null +++ b/BoSData/Input/Skins/Templates/spitfiremkixe.json @@ -0,0 +1,186 @@ +{ + "templates": { + "vvs_green_grey": { + "templateName": "VVS_GREEN_GREY", + "planeType": "spitfiremkixe", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SERIAL": null + }, + "defs": [ + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "RAF_PW_ATH.otf", + "size": 70, + "x": 2677, + "y": 2730, + "orientation": 0, + "fillColor": "13120e" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "RAF_PW_ATH.otf", + "size": 70, + "x": 2677, + "y": 2116, + "orientation": 180, + "fillColor": "13120e" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 420, + "x": 1933, + "y": 2860, + "orientation": 0, + "fillColor": "e7e7e7" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 420, + "x": 1933, + "y": 1992, + "orientation": 180, + "fillColor": "e7e7e7" + } + ], + "baseImagePath": "spitfiremkixe_vvs_green_grey_base.png", + "weatherImagePath": "spitfiremkixe_weather.png" + }, + "raf_late": { + "templateName": "RAF_LATE", + "planeType": "spitfiremkixe", + "credit": "Based on ICDP's 4K template", + "parameters": { + "UNIT_ID_CODE": null, + "AIRCRAFT_ID_CODE": null, + "RANK_FLAG": null, + "STRIPES": null, + "SERIAL": null, + "FLAG_NUM": "" + }, + "defs": [ + { + "text": "{4}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "RAF_PW_ATH.otf", + "size": 70, + "x": 2677, + "y": 2730, + "orientation": 0, + "fillColor": "13120e" + }, + { + "text": "{4}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "RAF_PW_ATH.otf", + "size": 70, + "x": 2677, + "y": 2116, + "orientation": 180, + "fillColor": "13120e" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "RAF_WW2_851ATH.otf", + "size": 230, + "x": 1800, + "y": 2818, + "orientation": 0, + "fillColor": "c6d1b9" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "RAF_WW2_851ATH.otf", + "size": 230, + "x": 1800, + "y": 2027, + "orientation": 180, + "fillColor": "c6d1b9" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "RAF_WW2_851ATH.otf", + "size": 230, + "x": 2161, + "y": 2818, + "orientation": 0, + "fillColor": "c6d1b9" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "RAF_WW2_851ATH.otf", + "size": 230, + "x": 2161, + "y": 2027, + "orientation": 180, + "fillColor": "c6d1b9" + }, + { + "image": "{2}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 1132, + "y": 2621, + "width": 96, + "height": 56, + "orientation": 0 + }, + { + "image": "{2}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "x": 1132, + "y": 2223, + "width": 96, + "height": 56, + "orientation": 180 + }, + { + "text": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "font": "RAF_PW_ATH.otf", + "size": 10, + "x": 1152, + "y": 2655, + "orientation": 0, + "fillColor": "00247d" + }, + { + "text": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "font": "RAF_PW_ATH.otf", + "size": 10, + "x": 1196, + "y": 2189, + "orientation": 180, + "fillColor": "00247d" + } + ], + "baseImagePath": "spitfiremkixe_raf_late_{3,choice,0#|1#stripes_under_|2#stripes_}base.png", + "weatherImagePath": "spitfiremkixe_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/spitfiremkvb.json b/BoSData/Input/Skins/Templates/spitfiremkvb.json new file mode 100644 index 000000000..1cd6ea1c9 --- /dev/null +++ b/BoSData/Input/Skins/Templates/spitfiremkvb.json @@ -0,0 +1,61 @@ +{ + "templates": { + "vvs_green_grey": { + "templateName": "VVS_GREEN_GREY", + "planeType": "spitfiremkvb", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "SERIAL": null + }, + "defs": [ + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "RAF_PW_ATH.otf", + "size": 70, + "x": 2677, + "y": 2730, + "orientation": 0, + "fillColor": "13120e" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "RAF_PW_ATH.otf", + "size": 70, + "x": 2677, + "y": 2116, + "orientation": 180, + "fillColor": "13120e" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 420, + "x": 1933, + "y": 2860, + "orientation": 0, + "fillColor": "e7e7e7" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 420, + "x": 1933, + "y": 1992, + "orientation": 180, + "fillColor": "e7e7e7" + } + ], + "baseImagePath": "spitfiremkvb_vvs_green_grey_base.png", + "weatherImagePath": "spitfiremkvb_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/tempestmkvs2.json b/BoSData/Input/Skins/Templates/tempestmkvs2.json new file mode 100644 index 000000000..f8fafc453 --- /dev/null +++ b/BoSData/Input/Skins/Templates/tempestmkvs2.json @@ -0,0 +1,129 @@ +{ + "templates": { + "raf_late": { + "templateName": "RAF_LATE", + "planeType": "tempestmkvs2", + "credit": "Based on official 4K template", + "parameters": { + "UNIT_ID_CODE": null, + "AIRCRAFT_ID_CODE": null, + "RANK_FLAG": null, + "STRIPES": null, + "SERIAL": null, + "FLAG_NUM": "" + }, + "defs": [ + { + "text": "{4}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "RAF_PW_ATH.otf", + "size": 80, + "x": 2978, + "y": 3297, + "orientation": 0, + "fillColor": "13120e" + }, + { + "text": "{4}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "RAF_PW_ATH.otf", + "size": 80, + "x": 2978, + "y": 2392, + "orientation": 180, + "fillColor": "13120e" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "RAF_WW2_851ATH.otf", + "size": 280, + "x": 1914, + "y": 3217, + "orientation": 0, + "fillColor": "adb79d" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "RAF_WW2_851ATH.otf", + "size": 280, + "x": 1914, + "y": 2482, + "orientation": 180, + "fillColor": "adb79d" + }, + { + "text": "{1}", + "horizAlign": "LEFT", + "vertAlign": "CENTER", + "font": "RAF_WW2_851ATH.otf", + "size": 280, + "x": 2314, + "y": 3217, + "orientation": 0, + "fillColor": "adb79d" + }, + { + "text": "{1}", + "horizAlign": "RIGHT", + "vertAlign": "CENTER", + "font": "RAF_WW2_851ATH.otf", + "size": 280, + "x": 2314, + "y": 2482, + "orientation": 180, + "fillColor": "adb79d" + }, + { + "image": "{2}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "x": 1156, + "y": 3042, + "width": 120, + "height": 119, + "orientation": 0 + }, + { + "image": "{2}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "x": 1156, + "y": 2646, + "width": 120, + "height": 119, + "orientation": 180 + }, + { + "text": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "font": "RAF_PW_ATH.otf", + "size": 15, + "x": 1186, + "y": 3090, + "orientation": 0, + "fillColor": "00247d" + }, + { + "text": "{5}", + "horizAlign": "CENTER", + "vertAlign": "TOP", + "font": "RAF_PW_ATH.otf", + "size": 15, + "x": 1246, + "y": 2598, + "orientation": 180, + "fillColor": "00247d" + } + ], + "baseImagePath": "tempestmkvs2_raf_late_{3,choice,0#|1#stripes_under_}base.png", + "weatherImagePath": "tempestmkvs2_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/u2vs.json b/BoSData/Input/Skins/Templates/u2vs.json new file mode 100644 index 000000000..aa23eab52 --- /dev/null +++ b/BoSData/Input/Skins/Templates/u2vs.json @@ -0,0 +1,39 @@ +{ + "templates": { + "vvs_green": { + "templateName": "VVS_GREEN", + "planeType": "u2vs", + "credit": "Based on official 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "font": "VVSNumbers1.otf", + "size": 230, + "x": 2462, + "y": 2951, + "orientation": 270, + "fillColor": "{1,choice,0#f3f3f3|1#671a0e}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "font": "VVSNumbers1.otf", + "size": 230, + "x": 3192, + "y": 2951, + "orientation": 90, + "fillColor": "{1,choice,0#f3f3f3|1#671a0e}" + } + ], + "baseImagePath": "u2vs_vvs_{1,choice,0#green|1#winter}_base.png", + "weatherImagePath": "u2vs_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/yak1s127.json b/BoSData/Input/Skins/Templates/yak1s127.json new file mode 100644 index 000000000..9900617ae --- /dev/null +++ b/BoSData/Input/Skins/Templates/yak1s127.json @@ -0,0 +1,78 @@ +{ + "templates": { + "vvs_green_black": { + "templateName": "VVS_GREEN_BLACK", + "planeType": "yak1s127", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "font": "VVSNumbers1.otf", + "size": 300, + "x": 2078, + "y": 1982, + "orientation": 0, + "fillColor": "{1,choice,0#f3f3f3|1#ab3722}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "font": "VVSNumbers1.otf", + "size": 300, + "x": 2078, + "y": 852, + "orientation": 180, + "fillColor": "{1,choice,0#f3f3f3|1#ab3722}" + } + ], + "baseImagePath": "yak1s127_vvs_{1,choice,0#green_black|1#winter}_base.png", + "weatherImagePath": "yak1s127_weather.png" + }, + "vvs_grey": { + "templateName": "VVS_GREY", + "planeType": "yak1s127", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "font": "VVSNumbers2.otf", + "size": 300, + "x": 2078, + "y": 1982, + "orientation": 0, + "fillColor": "{1,choice,0#f3f3f3|1#ab3722}", + "strokeWidth": 5, + "strokeColor": "ab3722" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "font": "VVSNumbers2.otf", + "size": 300, + "x": 2078, + "y": 852, + "orientation": 180, + "fillColor": "{1,choice,0#f3f3f3|1#ab3722}", + "strokeWidth": 5, + "strokeColor": "ab3722" + } + ], + "baseImagePath": "yak1s127_vvs_{1,choice,0#grey|1#winter}_base.png", + "weatherImagePath": "yak1s127_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/yak1s69.json b/BoSData/Input/Skins/Templates/yak1s69.json new file mode 100644 index 000000000..c53e8ddd3 --- /dev/null +++ b/BoSData/Input/Skins/Templates/yak1s69.json @@ -0,0 +1,39 @@ +{ + "templates": { + "vvs_green_black": { + "templateName": "VVS_GREEN_BLACK", + "planeType": "yak1s69", + "credit": "Based on Pluton's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "TOP", + "font": "VVSNumbers1.otf", + "size": 300, + "x": 2060, + "y": 2036, + "orientation": 0, + "fillColor": "{1,choice,0#f3f3f3|1#ab3722}" + }, + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "TOP", + "font": "VVSNumbers1.otf", + "size": 300, + "x": 2060, + "y": 1132, + "orientation": 180, + "fillColor": "{1,choice,0#f3f3f3|1#ab3722}" + } + ], + "baseImagePath": "yak1s69_vvs_{1,choice,0#green_black|1#winter}_base.png", + "weatherImagePath": "yak1s69_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Skins/Templates/yak7bs36.json b/BoSData/Input/Skins/Templates/yak7bs36.json new file mode 100644 index 000000000..6f7beda47 --- /dev/null +++ b/BoSData/Input/Skins/Templates/yak7bs36.json @@ -0,0 +1,78 @@ +{ + "templates": { + "vvs_green_black": { + "templateName": "VVS_GREEN_BLACK", + "planeType": "yak7bs36", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers1.otf", + "size": 300, + "x": 2314, + "y": 2248, + "orientation": 0, + "fillColor": "{1,choice,0#f3f3f3|1#991818}" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers1.otf", + "size": 300, + "x": 2314, + "y": 635, + "orientation": 180, + "fillColor": "{1,choice,0#f3f3f3|1#991818}" + } + ], + "baseImagePath": "yak7bs36_vvs_green_black{1,choice,0#|1#_winter}_base.png", + "weatherImagePath": "yak7bs36_weather.png" + }, + "vvs_grey": { + "templateName": "VVS_GREY", + "planeType": "yak7bs36", + "credit": "Based on ICDP's 4K template", + "parameters": { + "AIRCRAFT_ID_CODE": null, + "WINTER": null + }, + "defs": [ + { + "text": "{0}", + "horizAlign": "LEFT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 300, + "x": 2314, + "y": 2248, + "orientation": 0, + "fillColor": "{1,choice,0#f3f3f3|1#991818}", + "strokeWidth": 5, + "strokeColor": "991818" + }, + { + "text": "{0}", + "horizAlign": "RIGHT", + "vertAlign": "BOTTOM", + "font": "VVSNumbers2.otf", + "size": 300, + "x": 2314, + "y": 635, + "orientation": 180, + "fillColor": "{1,choice,0#f3f3f3|1#991818}", + "strokeWidth": 5, + "strokeColor": "991818" + } + ], + "baseImagePath": "yak7bs36_vvs_grey{1,choice,0#|1#_winter}_base.png", + "weatherImagePath": "yak7bs36_weather.png" + } + } +} \ No newline at end of file diff --git a/BoSData/Input/Squadron/10th Bomber Air Regiment.json b/BoSData/Input/Squadron/10th Bomber Air Regiment.json index 16c6cc30a..c26f2706a 100644 --- a/BoSData/Input/Squadron/10th Bomber Air Regiment.json +++ b/BoSData/Input/Squadron/10th Bomber Air Regiment.json @@ -83,6 +83,39 @@ "country": "Russia", "category": "Squadron", "definedInGame": true + }, + { + "skinName": "VVS_GREEN_10TH", + "archTypes": ["pe2"], + "startDate": "19410801", + "endDate": "19420331", + "squadId": 10131010, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN" + }, + { + "skinName": "VVS_GREEN_BLACK_10TH", + "archTypes": ["pe2"], + "startDate": "19420401", + "endDate": "19430630", + "squadId": 10131010, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN_BLACK" + }, + { + "skinName": "VVS_GREY_10TH", + "archTypes": ["pe2"], + "startDate": "19430701", + "endDate": "19450503", + "squadId": 10131010, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREY" } ], "serviceId": 10101, diff --git a/BoSData/Input/Squadron/11th Fighter Air Regiment.json b/BoSData/Input/Squadron/11th Fighter Air Regiment.json index 872c63569..f59d79a80 100644 --- a/BoSData/Input/Squadron/11th Fighter Air Regiment.json +++ b/BoSData/Input/Squadron/11th Fighter Air Regiment.json @@ -79,7 +79,40 @@ "country": "Russia", "category": "Squadron", "definedInGame": true - } + }, + { + "skinName": "VVS_GREEN_11TH", + "archTypes": ["lagg"], + "startDate": "19410801", + "endDate": "19420331", + "squadId": 10111011, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN" + }, + { + "skinName": "VVS_GREEN_BLACK_11TH", + "archTypes": ["lagg", "yak"], + "startDate": "19420401", + "endDate": "19430630", + "squadId": 10111011, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN_BLACK" + }, + { + "skinName": "VVS_GREY_11TH", + "archTypes": ["yak"], + "startDate": "19430701", + "endDate": "19450503", + "squadId": 10111011, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREY" + } ], "squadHistory": { "squadHistoryEntries": [ diff --git a/BoSData/Input/Squadron/126th Fighter Air Regiment.json b/BoSData/Input/Squadron/126th Fighter Air Regiment.json index d3cd28e2b..7cfb5d935 100644 --- a/BoSData/Input/Squadron/126th Fighter Air Regiment.json +++ b/BoSData/Input/Squadron/126th Fighter Air Regiment.json @@ -99,6 +99,17 @@ "country": "Russia", "category": "Squadron", "definedInGame": true + }, + { + "skinName": "VVS_GREEN_126TH", + "archTypes": ["p40", "p39"], + "startDate": "19410801", + "endDate": "19450503", + "squadId": 10111126, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN" } ], "squadHistory": { @@ -170,4 +181,4 @@ "callsigns": { "19410801": "STORM" } -} \ No newline at end of file +} diff --git a/BoSData/Input/Squadron/132nd Bomber Air Regiment.json b/BoSData/Input/Squadron/132nd Bomber Air Regiment.json index 288d724d9..c03272c32 100644 --- a/BoSData/Input/Squadron/132nd Bomber Air Regiment.json +++ b/BoSData/Input/Squadron/132nd Bomber Air Regiment.json @@ -54,7 +54,41 @@ "19450401": "ef_Arnhem Deelen", "19450501": "ef_Schijndel" }, - "skins": [], + "skins": [ + { + "skinName": "VVS_GREEN_132ND", + "archTypes": ["pe2"], + "startDate": "19410801", + "endDate": "19420331", + "squadId": 10131132, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN" + }, + { + "skinName": "VVS_GREEN_BLACK_132ND", + "archTypes": ["pe2"], + "startDate": "19420401", + "endDate": "19430331", + "squadId": 10131132, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN_BLACK" + }, + { + "skinName": "VVS_TRICOLOR_132ND", + "archTypes": ["pe2"], + "startDate": "19430401", + "endDate": "19450503", + "squadId": 10131132, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_TRICOLOR" + } + ], "squadHistory": { "squadHistoryEntries": [ { diff --git a/BoSData/Input/Squadron/136th Bomber Air Regiment.json b/BoSData/Input/Squadron/136th Bomber Air Regiment.json index 234be3cf3..cbcdeefca 100644 --- a/BoSData/Input/Squadron/136th Bomber Air Regiment.json +++ b/BoSData/Input/Squadron/136th Bomber Air Regiment.json @@ -69,6 +69,17 @@ "country": "Russia", "category": "Squadron", "definedInGame": true + }, + { + "skinName": "VVS_GREEN_136TH", + "archTypes": ["pe2", "a20"], + "startDate": "19410801", + "endDate": "19450503", + "squadId": 10131136, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN" } ], "squadHistory": { @@ -145,4 +156,4 @@ "callsigns": { "19410801": "GANNET" } -} \ No newline at end of file +} diff --git a/BoSData/Input/Squadron/139 Squadron.json b/BoSData/Input/Squadron/139 Squadron.json index bbc2f06db..d6d2d351c 100644 --- a/BoSData/Input/Squadron/139 Squadron.json +++ b/BoSData/Input/Squadron/139 Squadron.json @@ -4,6 +4,7 @@ "name": "139 Squadron", "fileName": "139 Squadron.json", "skill": 70, + "unitIdCode": "XD", "planeAssignments": [ { "archType": "b25", @@ -22,7 +23,19 @@ "19450310": "Woensdrecht", "19450404": "Venlo" }, - "skins": [], + "skins": [ + { + "skinName": "RAF_LATE_OLIVE_139", + "archTypes": ["b25"], + "startDate": "19440801", + "endDate": "19450601", + "squadId": 103002139, + "country": "Britain", + "category": "Squadron", + "definedInGame": false, + "template": "RAF_LATE_OLIVE" + } + ], "squadHistory": { "squadHistoryEntries": [] }, @@ -54,4 +67,4 @@ "callsigns": { "19410801": "ACORN" } -} \ No newline at end of file +} diff --git a/BoSData/Input/Squadron/175th Ground Attack Air Regiment.json b/BoSData/Input/Squadron/175th Ground Attack Air Regiment.json index 50a6484b5..485f87b5f 100644 --- a/BoSData/Input/Squadron/175th Ground Attack Air Regiment.json +++ b/BoSData/Input/Squadron/175th Ground Attack Air Regiment.json @@ -83,6 +83,39 @@ "country": "Russia", "category": "Squadron", "definedInGame": false + }, + { + "skinName": "VVS_GREEN_175TH", + "archTypes": ["il2"], + "startDate": "19410801", + "endDate": "19420331", + "squadId": 10121175, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN" + }, + { + "skinName": "VVS_GREEN_BLACK_175TH", + "archTypes": ["il2"], + "startDate": "19420401", + "endDate": "19430331", + "squadId": 10121175, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN_BLACK" + }, + { + "skinName": "VVS_TRICOLOR_175TH", + "archTypes": ["il2"], + "startDate": "19430401", + "endDate": "19450503", + "squadId": 10121175, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_TRICOLOR" } ], "squadHistory": { @@ -132,4 +165,4 @@ "callsigns": { "19410801": "EAGLE" } -} \ No newline at end of file +} diff --git a/BoSData/Input/Squadron/182 Squadron.json b/BoSData/Input/Squadron/182 Squadron.json index d343f89a0..94f5cac42 100644 --- a/BoSData/Input/Squadron/182 Squadron.json +++ b/BoSData/Input/Squadron/182 Squadron.json @@ -4,6 +4,7 @@ "name": "182 Squadron", "fileName": "182 Squadron.json", "skill": 65, + "unitIdCode": "XM", "planeAssignments": [ { "archType": "tempest", @@ -21,7 +22,19 @@ "19450310": "Heesch", "19450404": "Coesfeld-Lette" }, - "skins": [], + "skins": [ + { + "skinName": "RAF_LATE_182", + "archTypes": ["tempest"], + "startDate": "19440901", + "endDate": "19450601", + "squadId": 103083182, + "country": "Britain", + "category": "Squadron", + "definedInGame": false, + "template": "RAF_LATE" + } + ], "squadHistory": { "squadHistoryEntries": [] }, diff --git a/BoSData/Input/Squadron/184 Squadron.json b/BoSData/Input/Squadron/184 Squadron.json index 0d94dcfcf..4c4d81296 100644 --- a/BoSData/Input/Squadron/184 Squadron.json +++ b/BoSData/Input/Squadron/184 Squadron.json @@ -4,6 +4,7 @@ "name": "184 Squadron", "fileName": "184 Squadron.json", "skill": 70, + "unitIdCode": "BR", "planeAssignments": [ { "archType": "tempest", @@ -22,7 +23,19 @@ "19450310": "Eindhoven", "19450404": "Werl" }, - "skins": [], + "skins": [ + { + "skinName": "RAF_LATE_184", + "archTypes": ["tempest"], + "startDate": "19440901", + "endDate": "19450601", + "squadId": 103083184, + "country": "Britain", + "category": "Squadron", + "definedInGame": false, + "template": "RAF_LATE" + } + ], "squadHistory": { "squadHistoryEntries": [] }, diff --git a/BoSData/Input/Squadron/193 Squadron.json b/BoSData/Input/Squadron/193 Squadron.json index d986fa8a7..c8d531c0e 100644 --- a/BoSData/Input/Squadron/193 Squadron.json +++ b/BoSData/Input/Squadron/193 Squadron.json @@ -4,6 +4,7 @@ "name": "193 Squadron", "fileName": "193 Squadron.json", "skill": 70, + "unitIdCode": "DP", "planeAssignments": [ { "archType": "spitfire", @@ -22,7 +23,19 @@ "19450310": "Schijndel", "19450404": "Essen-Mulheim" }, - "skins": [], + "skins": [ + { + "skinName": "RAF_LATE_193", + "archTypes": ["spitfire"], + "startDate": "19440901", + "endDate": "19450601", + "squadId": 103084193, + "country": "Britain", + "category": "Squadron", + "definedInGame": false, + "template": "RAF_LATE" + } + ], "squadHistory": { "squadHistoryEntries": [] }, diff --git a/BoSData/Input/Squadron/21 Gruppo Caccia.json b/BoSData/Input/Squadron/21 Gruppo Caccia.json index bb04cbaa8..1a3da07cf 100644 --- a/BoSData/Input/Squadron/21 Gruppo Caccia.json +++ b/BoSData/Input/Squadron/21 Gruppo Caccia.json @@ -4,6 +4,7 @@ "name": "22 Gruppo Caccia", "fileName": "21 Gruppo Caccia.json", "skill": 55, + "unitIdCode": "356", "planeAssignments": [ { "archType": "mc200", @@ -30,7 +31,19 @@ "19421223": "Safronov", "19430120": "Safronov" }, - "skins": [], + "skins": [ + { + "skinName": "RA_GENERIC_21", + "archTypes": ["mc200"], + "startDate": "19420801", + "endDate": "19450503", + "squadId": 20115021, + "country": "Italy", + "category": "Squadron", + "definedInGame": false, + "template": "RA_GENERIC" + } + ], "serviceId": 20202, "squadronRoles": { "squadronRolePeriods": [ diff --git a/BoSData/Input/Squadron/225th Ground Attack Air Regiment.json b/BoSData/Input/Squadron/225th Ground Attack Air Regiment.json index f528117fa..592145455 100644 --- a/BoSData/Input/Squadron/225th Ground Attack Air Regiment.json +++ b/BoSData/Input/Squadron/225th Ground Attack Air Regiment.json @@ -73,6 +73,28 @@ "country": "Russia", "category": "Squadron", "definedInGame": false + }, + { + "skinName": "VVS_GREEN_BLACK_225TH", + "archTypes": ["il2"], + "startDate": "19420401", + "endDate": "19430331", + "squadId": 10121225, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN_BLACK" + }, + { + "skinName": "VVS_TRICOLOR_225TH", + "archTypes": ["il2"], + "startDate": "19430401", + "endDate": "19450503", + "squadId": 10121225, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_TRICOLOR" } ], "squadHistory": { @@ -116,4 +138,4 @@ "callsigns": { "19410801": "RAVEN" } -} \ No newline at end of file +} diff --git a/BoSData/Input/Squadron/233rd Fighter Air Regiment.json b/BoSData/Input/Squadron/233rd Fighter Air Regiment.json index cd11907ce..e8beddbec 100644 --- a/BoSData/Input/Squadron/233rd Fighter Air Regiment.json +++ b/BoSData/Input/Squadron/233rd Fighter Air Regiment.json @@ -114,6 +114,39 @@ "country": "Russia", "category": "Squadron", "definedInGame": false + }, + { + "skinName": "VVS_GREEN_233RD", + "archTypes": ["mig3", "lagg"], + "startDate": "19410801", + "endDate": "19420331", + "squadId": 10111233, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN" + }, + { + "skinName": "VVS_GREEN_BLACK_233RD", + "archTypes": ["lagg"], + "startDate": "19420401", + "endDate": "19430630", + "squadId": 10111233, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN_BLACK" + }, + { + "skinName": "VVS_GREY_233RD", + "archTypes": ["lagg", "yak"], + "startDate": "19430701", + "endDate": "19450503", + "squadId": 10111233, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREY" } ], "squadHistory": { diff --git a/BoSData/Input/Squadron/27th Fighter Air Regiment.json b/BoSData/Input/Squadron/27th Fighter Air Regiment.json index d0894d94a..9e5ecc545 100644 --- a/BoSData/Input/Squadron/27th Fighter Air Regiment.json +++ b/BoSData/Input/Squadron/27th Fighter Air Regiment.json @@ -99,6 +99,39 @@ "country": "Russia", "category": "Squadron", "definedInGame": true + }, + { + "skinName": "VVS_GREEN_27TH", + "archTypes": ["mig3"], + "startDate": "19410801", + "endDate": "19420331", + "squadId": 10111027, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN" + }, + { + "skinName": "VVS_GREEN_BLACK_27TH", + "archTypes": ["mig3", "lagg"], + "startDate": "19420401", + "endDate": "19430630", + "squadId": 10111027, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN_BLACK" + }, + { + "skinName": "VVS_GREY_27TH", + "archTypes": ["lagg"], + "startDate": "19430701", + "endDate": "19450503", + "squadId": 10111027, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREY" } ], "squadHistory": { diff --git a/BoSData/Input/Squadron/312th Ground Attack Air Regiment.json b/BoSData/Input/Squadron/312th Ground Attack Air Regiment.json index c4dbc427c..ed44165a1 100644 --- a/BoSData/Input/Squadron/312th Ground Attack Air Regiment.json +++ b/BoSData/Input/Squadron/312th Ground Attack Air Regiment.json @@ -83,6 +83,39 @@ "country": "Russia", "category": "Squadron", "definedInGame": false + }, + { + "skinName": "VVS_GREEN_312TH", + "archTypes": ["il2"], + "startDate": "19410801", + "endDate": "19420331", + "squadId": 10121312, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN" + }, + { + "skinName": "VVS_GREEN_BLACK_312TH", + "archTypes": ["il2"], + "startDate": "19420401", + "endDate": "19430331", + "squadId": 10121312, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN_BLACK" + }, + { + "skinName": "VVS_TRICOLOR_312TH", + "archTypes": ["il2"], + "startDate": "19430401", + "endDate": "19450503", + "squadId": 10121312, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_TRICOLOR" } ], "squadHistory": { @@ -132,4 +165,4 @@ "callsigns": { "19410801": "ROOK" } -} \ No newline at end of file +} diff --git a/BoSData/Input/Squadron/321st Bomber Air Regiment.json b/BoSData/Input/Squadron/321st Bomber Air Regiment.json index daeed825b..c9b6fea7d 100644 --- a/BoSData/Input/Squadron/321st Bomber Air Regiment.json +++ b/BoSData/Input/Squadron/321st Bomber Air Regiment.json @@ -69,6 +69,39 @@ "country": "Russia", "category": "Squadron", "definedInGame": false + }, + { + "skinName": "VVS_GREEN_321ST", + "archTypes": ["pe2"], + "startDate": "19410801", + "endDate": "19420331", + "squadId": 10131321, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN" + }, + { + "skinName": "VVS_GREEN_BLACK_321ST", + "archTypes": ["pe2"], + "startDate": "19420401", + "endDate": "19450503", + "squadId": 10131321, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN_BLACK" + }, + { + "skinName": "VVS_GREEN_321ST_A20", + "archTypes": ["a20"], + "startDate": "19420801", + "endDate": "19450503", + "squadId": 10131321, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN" } ], "squadHistory": { @@ -145,4 +178,4 @@ "callsigns": { "19410801": "SEAGULL" } -} \ No newline at end of file +} diff --git a/BoSData/Input/Squadron/326 Squadron.json b/BoSData/Input/Squadron/326 Squadron.json index 4a3d9b7f2..09d056930 100644 --- a/BoSData/Input/Squadron/326 Squadron.json +++ b/BoSData/Input/Squadron/326 Squadron.json @@ -4,6 +4,7 @@ "name": "326 Squadron", "fileName": "326 Squadron.json", "skill": 65, + "unitIdCode": "9I", "planeAssignments": [ { "archType": "spitfire", @@ -23,7 +24,19 @@ "19450310": "Volkel", "19450404": "Kirchhellen" }, - "skins": [], + "skins": [ + { + "skinName": "RAF_LATE_326", + "archTypes": ["spitfire"], + "startDate": "19440801", + "endDate": "19450601", + "squadId": 103084326, + "country": "Britain", + "category": "Squadron", + "definedInGame": false, + "template": "RAF_LATE" + } + ], "squadHistory": { "squadHistoryEntries": [] }, @@ -63,4 +76,4 @@ "callsigns": { "19410801": "RABBIT" } -} \ No newline at end of file +} diff --git a/BoSData/Input/Squadron/349 Squadron.json b/BoSData/Input/Squadron/349 Squadron.json index 1e9e8c99c..1661b7bb7 100644 --- a/BoSData/Input/Squadron/349 Squadron.json +++ b/BoSData/Input/Squadron/349 Squadron.json @@ -4,6 +4,7 @@ "name": "349 Squadron", "fileName": "349 Squadron.json", "skill": 70, + "unitIdCode": "GE", "planeAssignments": [ { "archType": "spitfire", @@ -21,7 +22,19 @@ "19450310": "GraveKeent", "19450404": "Coesfeld-Lette" }, - "skins": [], + "skins": [ + { + "skinName": "RAF_LATE_349", + "archTypes": ["spitfire"], + "startDate": "19440801", + "endDate": "19450601", + "squadId": 103084349, + "country": "Britain", + "category": "Squadron", + "definedInGame": false, + "template": "RAF_LATE" + } + ], "squadHistory": { "squadHistoryEntries": [] }, @@ -61,4 +74,4 @@ "callsigns": { "19410801": "BAFFIN" } -} \ No newline at end of file +} diff --git a/BoSData/Input/Squadron/34th Fighter Air Regiment.json b/BoSData/Input/Squadron/34th Fighter Air Regiment.json index 2517a9b68..6fe4427a1 100644 --- a/BoSData/Input/Squadron/34th Fighter Air Regiment.json +++ b/BoSData/Input/Squadron/34th Fighter Air Regiment.json @@ -109,6 +109,28 @@ "country": "Russia", "category": "Squadron", "definedInGame": false + }, + { + "skinName": "VVS_GREEN_34TH", + "archTypes": ["i16"], + "startDate": "19410801", + "endDate": "19450503", + "squadId": 10111034, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN" + }, + { + "skinName": "VVS_GREEN_BLACK_34TH", + "archTypes": ["yak"], + "startDate": "19410801", + "endDate": "19450503", + "squadId": 10111034, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN_BLACK" } ], "squadHistory": { diff --git a/BoSData/Input/Squadron/352nd FG.json b/BoSData/Input/Squadron/352nd FG.json index 671f339fd..32e5feac6 100644 --- a/BoSData/Input/Squadron/352nd FG.json +++ b/BoSData/Input/Squadron/352nd FG.json @@ -4,6 +4,7 @@ "name": "352nd Fighter Group", "fileName": "352nd FG.json", "skill": 80, + "unitIdCode": "PZ", "planeAssignments": [ { "archType": "p51", @@ -22,7 +23,23 @@ "19450310": "Asch", "19450404": "Breitscheid" }, - "skins": [], + "skins": [ + { + "skinName": "USAAF_LATE_BARE_352", + "archTypes": ["p51"], + "startDate": "19440801", + "endDate": "19450601", + "squadId": 102352486, + "country": "USA", + "category": "Squadron", + "definedInGame": false, + "template": "USAAF_LATE_BARE", + "overrides": { + "SQUADRON_NUM": 486, + "ID_ON_TAIL": 1 + } + } + ], "squadHistory": { "squadHistoryEntries": [] }, @@ -62,4 +79,4 @@ "callsigns": { "19410801": "BLUE_BIRD" } -} \ No newline at end of file +} diff --git a/BoSData/Input/Squadron/354th FG.json b/BoSData/Input/Squadron/354th FG.json index 4f9e7a120..e7d6f4b83 100644 --- a/BoSData/Input/Squadron/354th FG.json +++ b/BoSData/Input/Squadron/354th FG.json @@ -4,6 +4,7 @@ "name": "354th Fighter Group", "fileName": "354th FG.json", "skill": 80, + "unitIdCode": "AJ", "planeAssignments": [ { "archType": "p51", @@ -32,7 +33,19 @@ "19450310": "PetitBrogel", "19450404": "Eudenbach/Asbach" }, - "skins": [], + "skins": [ + { + "skinName": "USAAF_LATE_BARE_354", + "archTypes": ["p51", "p47"], + "startDate": "19440801", + "endDate": "19450601", + "squadId": 102362377, + "country": "USA", + "category": "Squadron", + "definedInGame": false, + "template": "USAAF_LATE_BARE" + } + ], "squadHistory": { "squadHistoryEntries": [] }, diff --git a/BoSData/Input/Squadron/358th FG.json b/BoSData/Input/Squadron/358th FG.json index 63e402a5c..04a443455 100644 --- a/BoSData/Input/Squadron/358th FG.json +++ b/BoSData/Input/Squadron/358th FG.json @@ -4,6 +4,7 @@ "name": "358th Fighter Group", "fileName": "358th FG.json", "skill": 80, + "unitIdCode": "CH", "planeAssignments": [ { "archType": "p47", @@ -22,7 +23,22 @@ "19450310": "Helmond", "19450404": "Dortmund" }, - "skins": [], + "skins": [ + { + "skinName": "USAAF_LATE_BARE_358", + "archTypes": ["p47"], + "startDate": "19440801", + "endDate": "19450601", + "squadId": 102358365, + "country": "USA", + "category": "Squadron", + "definedInGame": false, + "template": "USAAF_LATE_BARE", + "overrides": { + "SQUADRON_NUM": 365 + } + } + ], "squadHistory": { "squadHistoryEntries": [] }, @@ -62,4 +78,4 @@ "callsigns": { "19410801": "BULLRING" } -} \ No newline at end of file +} diff --git a/BoSData/Input/Squadron/35th Guards Bomber Air Regiment.json b/BoSData/Input/Squadron/35th Guards Bomber Air Regiment.json index 4261768c9..5cf2fd8d1 100644 --- a/BoSData/Input/Squadron/35th Guards Bomber Air Regiment.json +++ b/BoSData/Input/Squadron/35th Guards Bomber Air Regiment.json @@ -83,6 +83,39 @@ "country": "Russia", "category": "Squadron", "definedInGame": true + }, + { + "skinName": "VVS_GREEN_35TH", + "archTypes": ["pe2"], + "startDate": "19410801", + "endDate": "19420331", + "squadId": 10131035, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN" + }, + { + "skinName": "VVS_GREEN_BLACK_35TH", + "archTypes": ["pe2"], + "startDate": "19420401", + "endDate": "19430630", + "squadId": 10131035, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN_BLACK" + }, + { + "skinName": "VVS_GREY_35TH", + "archTypes": ["pe2"], + "startDate": "19430701", + "endDate": "19450503", + "squadId": 10131035, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREY" } ], "serviceId": 10101, diff --git a/BoSData/Input/Squadron/365th FG.json b/BoSData/Input/Squadron/365th FG.json index 4f8ac8ade..84e69e0a9 100644 --- a/BoSData/Input/Squadron/365th FG.json +++ b/BoSData/Input/Squadron/365th FG.json @@ -4,6 +4,7 @@ "name": "365th Fighter Group", "fileName": "365th FG.json", "skill": 70, + "unitIdCode": "D5", "planeAssignments": [ { "archType": "p47", @@ -22,7 +23,19 @@ "19450310": "Kelz", "19450404": "Limburg-Linter" }, - "skins": [], + "skins": [ + { + "skinName": "USAAF_LATE_BARE_365", + "archTypes": ["p47"], + "startDate": "19440801", + "endDate": "19450601", + "squadId": 102365386, + "country": "USA", + "category": "Squadron", + "definedInGame": false, + "template": "USAAF_LATE_BARE" + } + ], "squadHistory": { "squadHistoryEntries": [] }, diff --git a/BoSData/Input/Squadron/366th FG.json b/BoSData/Input/Squadron/366th FG.json index 4c4cacee9..38a5f6215 100644 --- a/BoSData/Input/Squadron/366th FG.json +++ b/BoSData/Input/Squadron/366th FG.json @@ -4,6 +4,7 @@ "name": "366th Fighter Group", "fileName": "366th FG.json", "skill": 80, + "unitIdCode": "A6", "planeAssignments": [ { "archType": "p47", @@ -21,7 +22,19 @@ "19450310": "Rips", "19450404": "Dortmund" }, - "skins": [], + "skins": [ + { + "skinName": "USAAF_LATE_BARE_366", + "archTypes": ["p47"], + "startDate": "19440801", + "endDate": "19450601", + "squadId": 102366389, + "country": "USA", + "category": "Squadron", + "definedInGame": false, + "template": "USAAF_LATE_BARE" + } + ], "squadHistory": { "squadHistoryEntries": [] }, diff --git a/BoSData/Input/Squadron/36th FG.json b/BoSData/Input/Squadron/36th FG.json index f49126bae..8e0c40790 100644 --- a/BoSData/Input/Squadron/36th FG.json +++ b/BoSData/Input/Squadron/36th FG.json @@ -4,6 +4,7 @@ "name": "36th Fighter Group", "fileName": "36th FG.json", "skill": 65, + "unitIdCode": "3T", "planeAssignments": [ { "archType": "p47", @@ -22,7 +23,19 @@ "19450310": "Odendorf", "19450404": "Breitscheid" }, - "skins": [], + "skins": [ + { + "skinName": "USAAF_LATE_BARE_36", + "archTypes": ["p47"], + "startDate": "19440801", + "endDate": "19450601", + "squadId": 102036022, + "country": "USA", + "category": "Squadron", + "definedInGame": false, + "template": "USAAF_LATE_BARE" + } + ], "squadHistory": { "squadHistoryEntries": [] }, diff --git a/BoSData/Input/Squadron/373rd FG.json b/BoSData/Input/Squadron/373rd FG.json index e61fc9f75..c411896b7 100644 --- a/BoSData/Input/Squadron/373rd FG.json +++ b/BoSData/Input/Squadron/373rd FG.json @@ -4,6 +4,7 @@ "name": "373rd Fighter Group", "fileName": "373rd FG.json", "skill": 65, + "unitIdCode": "R3", "planeAssignments": [ { "archType": "p47", @@ -21,7 +22,19 @@ "19450310": "Venlo", "19450404": "Bonn-Hangelar_3960" }, - "skins": [], + "skins": [ + { + "skinName": "USAAF_LATE_BARE_373", + "archTypes": ["p47"], + "startDate": "19440801", + "endDate": "19450601", + "squadId": 102373410, + "country": "USA", + "category": "Squadron", + "definedInGame": false, + "template": "USAAF_LATE_BARE" + } + ], "squadHistory": { "squadHistoryEntries": [] }, diff --git a/BoSData/Input/Squadron/387th BG.json b/BoSData/Input/Squadron/387th BG.json index e6fef330c..d258d19b2 100644 --- a/BoSData/Input/Squadron/387th BG.json +++ b/BoSData/Input/Squadron/387th BG.json @@ -4,6 +4,7 @@ "name": "387th Bomber Group", "fileName": "387th BG.json", "skill": 70, + "unitIdCode": "TQ", "planeAssignments": [ { "archType": "a20", @@ -32,6 +33,17 @@ "country": "USA", "category": "Squadron", "definedInGame": false + }, + { + "skinName": "USAAF_LATE_OLIVE_387", + "archTypes": ["a20"], + "startDate": "19440801", + "endDate": "19450601", + "squadId": 102340486, + "country": "USA", + "category": "Squadron", + "definedInGame": false, + "template": "USAAF_LATE_OLIVE" } ], "squadHistory": { diff --git a/BoSData/Input/Squadron/3rd Guards Fighter Air Regiment.json b/BoSData/Input/Squadron/3rd Guards Fighter Air Regiment.json index 8c2ccb76b..ecd724f21 100644 --- a/BoSData/Input/Squadron/3rd Guards Fighter Air Regiment.json +++ b/BoSData/Input/Squadron/3rd Guards Fighter Air Regiment.json @@ -62,6 +62,28 @@ "country": "Russia", "category": "Squadron", "definedInGame": true + }, + { + "skinName": "VVS_GREEN_BLACK_3RD", + "archTypes": ["lagg"], + "startDate": "19420906", + "endDate": "19430630", + "squadId": 10111003, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN_BLACK" + }, + { + "skinName": "VVS_GREY_3RD", + "archTypes": ["lagg"], + "startDate": "19430701", + "endDate": "19450503", + "squadId": 10111003, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREY" } ], "serviceId": 10101, diff --git a/BoSData/Input/Squadron/410th BG.json b/BoSData/Input/Squadron/410th BG.json index 30c2570b3..c44d86b0d 100644 --- a/BoSData/Input/Squadron/410th BG.json +++ b/BoSData/Input/Squadron/410th BG.json @@ -4,6 +4,7 @@ "name": "410th Bomber Group", "fileName": "410th BG.json", "skill": 70, + "unitIdCode": "8U", "planeAssignments": [ { "archType": "a20", @@ -32,6 +33,20 @@ "country": "USA", "category": "Squadron", "definedInGame": false + }, + { + "skinName": "USAAF_LATE_OLIVE_410", + "archTypes": ["a20"], + "startDate": "19440801", + "endDate": "19450601", + "squadId": 102321445, + "country": "USA", + "category": "Squadron", + "definedInGame": false, + "template": "USAAF_LATE_OLIVE", + "overrides": { + "SQUADRON_NUM": 646 + } } ], "squadHistory": { diff --git a/BoSData/Input/Squadron/46th Bomber Air Regiment.json b/BoSData/Input/Squadron/46th Bomber Air Regiment.json index 193e623b5..99e64d8d3 100644 --- a/BoSData/Input/Squadron/46th Bomber Air Regiment.json +++ b/BoSData/Input/Squadron/46th Bomber Air Regiment.json @@ -54,7 +54,41 @@ "19450401": "ef_Kelz", "19450501": "ef_PetitBrogel" }, - "skins": [], + "skins": [ + { + "skinName": "VVS_GREEN_46TH", + "archTypes": ["pe2"], + "startDate": "19410801", + "endDate": "19420331", + "squadId": 10131046, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN" + }, + { + "skinName": "VVS_GREEN_BLACK_46TH", + "archTypes": ["pe2"], + "startDate": "19420401", + "endDate": "19430331", + "squadId": 10131046, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN_BLACK" + }, + { + "skinName": "VVS_TRICOLOR_46TH", + "archTypes": ["pe2"], + "startDate": "19430401", + "endDate": "19450503", + "squadId": 10131046, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_TRICOLOR" + } + ], "squadHistory": { "squadHistoryEntries": [ { diff --git a/BoSData/Input/Squadron/474th FG.json b/BoSData/Input/Squadron/474th FG.json index 51f23a44c..befbda577 100644 --- a/BoSData/Input/Squadron/474th FG.json +++ b/BoSData/Input/Squadron/474th FG.json @@ -4,6 +4,7 @@ "name": "474th Fighter Group", "fileName": "474th FG.json", "skill": 70, + "unitIdCode": "7Y", "planeAssignments": [ { "archType": "p38", @@ -22,7 +23,19 @@ "19450310": "Kelz", "19450404": "Mainz-Finthen" }, - "skins": [], + "skins": [ + { + "skinName": "USAAF_LATE_BARE_474", + "archTypes": ["p38"], + "startDate": "19440801", + "endDate": "19450601", + "squadId": 102363033, + "country": "USA", + "category": "Squadron", + "definedInGame": false, + "template": "USAAF_LATE_BARE" + } + ], "squadHistory": { "squadHistoryEntries": [] }, diff --git a/BoSData/Input/Squadron/48th FG.json b/BoSData/Input/Squadron/48th FG.json index c80131c69..e43c61e74 100644 --- a/BoSData/Input/Squadron/48th FG.json +++ b/BoSData/Input/Squadron/48th FG.json @@ -4,6 +4,7 @@ "name": "48th Fighter Group", "fileName": "48th FG.json", "skill": 65, + "unitIdCode": "F4", "planeAssignments": [ { "archType": "p47", @@ -22,7 +23,19 @@ "19450310": "Ophoven", "19450404": "Koln-Ostheim" }, - "skins": [], + "skins": [ + { + "skinName": "USAAF_LATE_BARE_48", + "archTypes": ["p47"], + "startDate": "19440801", + "endDate": "19450601", + "squadId": 102048492, + "country": "USA", + "category": "Squadron", + "definedInGame": false, + "template": "USAAF_LATE_BARE" + } + ], "squadHistory": { "squadHistoryEntries": [] }, diff --git a/BoSData/Input/Squadron/495th Fighter Air Regiment.json b/BoSData/Input/Squadron/495th Fighter Air Regiment.json index 67fcbf4d0..fe76b5115 100644 --- a/BoSData/Input/Squadron/495th Fighter Air Regiment.json +++ b/BoSData/Input/Squadron/495th Fighter Air Regiment.json @@ -113,6 +113,39 @@ "country": "Russia", "category": "Squadron", "definedInGame": false + }, + { + "skinName": "VVS_GREEN_495TH", + "archTypes": ["i16", "mig3"], + "startDate": "19410801", + "endDate": "19420331", + "squadId": 10111495, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN" + }, + { + "skinName": "VVS_GREEN_BLACK_495TH", + "archTypes": ["i16", "mig3"], + "startDate": "19420401", + "endDate": "19450503", + "squadId": 10111495, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN_BLACK" + }, + { + "skinName": "VVS_GREEN_495TH_P39", + "archTypes": ["p39"], + "startDate": "19430215", + "endDate": "19450503", + "squadId": 10111495, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN" } ], "squadHistory": { diff --git a/BoSData/Input/Squadron/4_PzSch_G_2.json b/BoSData/Input/Squadron/4_PzSch_G_2.json index b9c16b7de..3344e769b 100644 --- a/BoSData/Input/Squadron/4_PzSch_G_2.json +++ b/BoSData/Input/Squadron/4_PzSch_G_2.json @@ -4,6 +4,7 @@ "name": "4.(Pz)/Sch.G.2", "fileName": "4_PzSch_G_2.json", "skill": 70, + "subUnitIdCode": "\u25b2", "planeAssignments": [ { "archType": "hs129", @@ -37,20 +38,37 @@ "19450401": "ef_Diest", "19450501": "ef_Chievres" }, - "skins": [], + "skins": [ + { + "skinName": "LW_ATTACK_SCHG1_4_SCHG2", + "archTypes": ["hs129"], + "startDate": "19420820", + "endDate": "19450503", + "squadId": 20144002, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_ATTACK_SCHG1", + "overrides": { + "STAFFEL_COLOR_INDEX": 4 + } + } + ], "squadHistory": { "squadHistoryEntries": [ { "date": "19431018", "squadName": "12.(Pz)/SG9", "armedServiceName": "Luftwaffe", - "skill": 70 + "skill": 70, + "subUnitIdCode": "" }, { "date": "19450107", "squadName": "1.(Pz)/SG9", "armedServiceName": "Luftwaffe", - "skill": 70 + "skill": 70, + "subUnitIdCode": "" } ] }, diff --git a/BoSData/Input/Squadron/503rd Ground Attack Air Regiment.json b/BoSData/Input/Squadron/503rd Ground Attack Air Regiment.json index e1e3e56ac..e6678489e 100644 --- a/BoSData/Input/Squadron/503rd Ground Attack Air Regiment.json +++ b/BoSData/Input/Squadron/503rd Ground Attack Air Regiment.json @@ -83,6 +83,39 @@ "country": "Russia", "category": "Squadron", "definedInGame": false + }, + { + "skinName": "VVS_GREEN_503RD", + "archTypes": ["il2"], + "startDate": "19410801", + "endDate": "19420331", + "squadId": 10121503, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN" + }, + { + "skinName": "VVS_GREEN_BLACK_503RD", + "archTypes": ["il2"], + "startDate": "19420401", + "endDate": "19430331", + "squadId": 10121503, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN_BLACK" + }, + { + "skinName": "VVS_TRICOLOR_503RD", + "archTypes": ["il2"], + "startDate": "19430401", + "endDate": "19450503", + "squadId": 10121503, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_TRICOLOR" } ], "squadHistory": { @@ -126,4 +159,4 @@ "callsigns": { "19410801": "REDSHANK" } -} \ No newline at end of file +} diff --git a/BoSData/Input/Squadron/50th FG.json b/BoSData/Input/Squadron/50th FG.json index 8d84b7778..19bbc7134 100644 --- a/BoSData/Input/Squadron/50th FG.json +++ b/BoSData/Input/Squadron/50th FG.json @@ -4,6 +4,7 @@ "name": "50th Fighter Group", "fileName": "50th FG.json", "skill": 65, + "unitIdCode": "T5", "planeAssignments": [ { "archType": "p47", @@ -22,7 +23,19 @@ "19450310": "Venlo", "19450404": "Merzhausen" }, - "skins": [], + "skins": [ + { + "skinName": "USAAF_LATE_BARE_50", + "archTypes": ["p47"], + "startDate": "19440801", + "endDate": "19450601", + "squadId": 102050010, + "country": "USA", + "category": "Squadron", + "definedInGame": false, + "template": "USAAF_LATE_BARE" + } + ], "squadHistory": { "squadHistoryEntries": [] }, diff --git a/BoSData/Input/Squadron/56 Squadron.json b/BoSData/Input/Squadron/56 Squadron.json index 5bb6dfdef..53830afec 100644 --- a/BoSData/Input/Squadron/56 Squadron.json +++ b/BoSData/Input/Squadron/56 Squadron.json @@ -4,6 +4,7 @@ "name": "56 Squadron", "fileName": "56 Squadron.json", "skill": 65, + "unitIdCode": "US", "planeAssignments": [ { "archType": "tempest", @@ -22,7 +23,19 @@ "19450310": "Mill", "19450404": "Kirchhellen" }, - "skins": [], + "skins": [ + { + "skinName": "RAF_LATE_56", + "archTypes": ["tempest"], + "startDate": "19440901", + "endDate": "19450601", + "squadId": 103083056, + "country": "Britain", + "category": "Squadron", + "definedInGame": false, + "template": "RAF_LATE" + } + ], "squadHistory": { "squadHistoryEntries": [] }, diff --git a/BoSData/Input/Squadron/588 Bomber Air Regiment.json b/BoSData/Input/Squadron/588 Bomber Air Regiment.json index 3cdfec4f6..65c7cd996 100644 --- a/BoSData/Input/Squadron/588 Bomber Air Regiment.json +++ b/BoSData/Input/Squadron/588 Bomber Air Regiment.json @@ -43,7 +43,19 @@ "19450401": "ef_Eindhoven", "19450501": "ef_LeCulot East" }, - "skins": [], + "skins": [ + { + "skinName": "VVS_GREEN_588TH", + "archTypes": ["u2"], + "startDate": "19410801", + "endDate": "19450601", + "squadId": 10111588, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN" + } + ], "squadHistory": { "squadHistoryEntries": [ { @@ -85,4 +97,4 @@ "callsigns": { "19410801": "CANARY" } -} \ No newline at end of file +} diff --git a/BoSData/Input/Squadron/618th Ground Attack Air Regiment.json b/BoSData/Input/Squadron/618th Ground Attack Air Regiment.json index cbd34224b..f2a431b49 100644 --- a/BoSData/Input/Squadron/618th Ground Attack Air Regiment.json +++ b/BoSData/Input/Squadron/618th Ground Attack Air Regiment.json @@ -73,6 +73,39 @@ "country": "Russia", "category": "Squadron", "definedInGame": false + }, + { + "skinName": "VVS_GREEN_618TH", + "archTypes": ["il2"], + "startDate": "19410801", + "endDate": "19420331", + "squadId": 10121618, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN" + }, + { + "skinName": "VVS_GREEN_BLACK_618TH", + "archTypes": ["il2"], + "startDate": "19420401", + "endDate": "19430331", + "squadId": 10121618, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN_BLACK" + }, + { + "skinName": "VVS_TRICOLOR_618TH", + "archTypes": ["il2"], + "startDate": "19430401", + "endDate": "19450503", + "squadId": 10121618, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_TRICOLOR" } ], "serviceId": 10101, @@ -106,4 +139,4 @@ "callsigns": { "19410801": "CRANE" } -} \ No newline at end of file +} diff --git a/BoSData/Input/Squadron/629th Fighter Air Regiment.json b/BoSData/Input/Squadron/629th Fighter Air Regiment.json index e277a2c0d..f4a32cc1c 100644 --- a/BoSData/Input/Squadron/629th Fighter Air Regiment.json +++ b/BoSData/Input/Squadron/629th Fighter Air Regiment.json @@ -78,6 +78,28 @@ "country": "Russia", "category": "Squadron", "definedInGame": false + }, + { + "skinName": "VVS_GREEN_BLACK_629TH", + "archTypes": ["i16"], + "startDate": "19420101", + "endDate": "19450503", + "squadId": 10111629, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN_BLACK" + }, + { + "skinName": "VVS_GREEN_GREY_629TH", + "archTypes": ["spitfire"], + "startDate": "19430315", + "endDate": "19450503", + "squadId": 10111629, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN_GREY" } ], "squadHistory": { diff --git a/BoSData/Input/Squadron/62nd Ground Attack Air Regiment.json b/BoSData/Input/Squadron/62nd Ground Attack Air Regiment.json index 05f8b696f..ee6cc39f4 100644 --- a/BoSData/Input/Squadron/62nd Ground Attack Air Regiment.json +++ b/BoSData/Input/Squadron/62nd Ground Attack Air Regiment.json @@ -83,6 +83,39 @@ "country": "Russia", "category": "Squadron", "definedInGame": false + }, + { + "skinName": "VVS_GREEN_62ND", + "archTypes": ["il2"], + "startDate": "19410801", + "endDate": "19420331", + "squadId": 10121062, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN" + }, + { + "skinName": "VVS_GREEN_BLACK_62ND", + "archTypes": ["il2"], + "startDate": "19420401", + "endDate": "19430331", + "squadId": 10121062, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN_BLACK" + }, + { + "skinName": "VVS_TRICOLOR_62ND", + "archTypes": ["il2"], + "startDate": "19430401", + "endDate": "19450503", + "squadId": 10121062, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_TRICOLOR" } ], "squadHistory": { @@ -126,4 +159,4 @@ "callsigns": { "19410801": "HAWK" } -} \ No newline at end of file +} diff --git a/BoSData/Input/Squadron/65th Ground Attack Air Regiment.json b/BoSData/Input/Squadron/65th Ground Attack Air Regiment.json index 9e9b7d5d3..d1c0baa3b 100644 --- a/BoSData/Input/Squadron/65th Ground Attack Air Regiment.json +++ b/BoSData/Input/Squadron/65th Ground Attack Air Regiment.json @@ -84,6 +84,39 @@ "country": "Russia", "category": "Squadron", "definedInGame": false + }, + { + "skinName": "VVS_GREEN_65TH", + "archTypes": ["il2"], + "startDate": "19410801", + "endDate": "19420331", + "squadId": 10121065, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN" + }, + { + "skinName": "VVS_GREEN_BLACK_65TH", + "archTypes": ["il2"], + "startDate": "19420401", + "endDate": "19430331", + "squadId": 10121065, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN_BLACK" + }, + { + "skinName": "VVS_TRICOLOR_65TH", + "archTypes": ["il2"], + "startDate": "19430401", + "endDate": "19450503", + "squadId": 10121065, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_TRICOLOR" } ], "squadHistory": { @@ -127,4 +160,4 @@ "callsigns": { "19410801": "VOLCANO" } -} \ No newline at end of file +} diff --git a/BoSData/Input/Squadron/66 Squadron.json b/BoSData/Input/Squadron/66 Squadron.json index 0c066df68..412566ca7 100644 --- a/BoSData/Input/Squadron/66 Squadron.json +++ b/BoSData/Input/Squadron/66 Squadron.json @@ -4,6 +4,7 @@ "name": "66 Squadron", "fileName": "66 Squadron.json", "skill": 75, + "unitIdCode": "LZ", "planeAssignments": [ { "archType": "spitfire", @@ -23,7 +24,19 @@ "19450310": "Volkel", "19450404": "Kirchhellen" }, - "skins": [], + "skins": [ + { + "skinName": "RAF_LATE_66", + "archTypes": ["spitfire"], + "startDate": "19440901", + "endDate": "19450601", + "squadId": 103084066, + "country": "Britain", + "category": "Squadron", + "definedInGame": false, + "template": "RAF_LATE" + } + ], "squadHistory": { "squadHistoryEntries": [] }, diff --git a/BoSData/Input/Squadron/95th Bomber Air Regiment.json b/BoSData/Input/Squadron/95th Bomber Air Regiment.json index aca731c8c..82611cc43 100644 --- a/BoSData/Input/Squadron/95th Bomber Air Regiment.json +++ b/BoSData/Input/Squadron/95th Bomber Air Regiment.json @@ -54,7 +54,41 @@ "19450401": "ef_Aachen", "19450501": "ef_Stormede" }, - "skins": [], + "skins": [ + { + "skinName": "VVS_GREEN_95TH", + "archTypes": ["pe2"], + "startDate": "19410801", + "endDate": "19420331", + "squadId": 10131095, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN" + }, + { + "skinName": "VVS_GREEN_BLACK_95TH", + "archTypes": ["pe2"], + "startDate": "19420401", + "endDate": "19430331", + "squadId": 10131095, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN_BLACK" + }, + { + "skinName": "VVS_GREY_95TH", + "archTypes": ["pe2"], + "startDate": "19430401", + "endDate": "19450503", + "squadId": 10131095, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREY" + } + ], "squadHistory": { "squadHistoryEntries": [ { diff --git a/BoSData/Input/Squadron/III_KG27.json b/BoSData/Input/Squadron/III_KG27.json index a3de6185b..7f695f87a 100644 --- a/BoSData/Input/Squadron/III_KG27.json +++ b/BoSData/Input/Squadron/III_KG27.json @@ -4,6 +4,8 @@ "name": "III./KG27", "fileName": "III_KG27.json", "skill": 60, + "unitIdCode": "1G", + "subUnitIdCode": "S", "planeAssignments": [ { "archType": "he111", @@ -53,6 +55,20 @@ "country": "Germany", "category": "Squadron", "definedInGame": true + }, + { + "skinName": "LW_BOMBER_MID_III_KG27", + "archTypes": ["he111"], + "startDate": "19410801", + "endDate": "19450503", + "squadId": 20133027, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_BOMBER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 2 + } } ], "squadHistory": { @@ -61,7 +77,9 @@ "date": "19430918", "squadName": "III./KG55", "armedServiceName": "Luftwaffe", - "skill": 50 + "skill": 50, + "unitIdCode": "G1", + "subUnitIdCode": "S" } ] }, diff --git a/BoSData/Input/Squadron/II_JG51.json b/BoSData/Input/Squadron/II_JG51.json index d95c36add..f7fd66817 100644 --- a/BoSData/Input/Squadron/II_JG51.json +++ b/BoSData/Input/Squadron/II_JG51.json @@ -4,6 +4,7 @@ "name": "II./JG51", "fileName": "II_JG51.json", "skill": 90, + "subUnitIdCode": "-", "planeAssignments": [ { "archType": "bf109", @@ -84,6 +85,75 @@ "country": "Germany", "category": "Squadron", "definedInGame": false + }, + { + "skinName": "LW_FIGHTER_MID_II_JG51", + "archTypes": ["bf109", "fw190"], + "startDate": "19411001", + "endDate": "19440831", + "squadId": 20112051, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 3, + "INSIGNIA_NOSE": "Insignia\\JG51.png" + } + }, + { + "skinName": "LW_FIGHTER_MID_II_JG51_WF", + "archTypes": ["bf109", "fw190"], + "startDate": "19440901", + "endDate": "19450601", + "squadId": 20112051, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 1, + "ID_BAND_FORE": "3f853f", + "ID_BAND_AFT": "3f853f", + "ID_BAND_MID": "faf7f1", + "INSIGNIA_NOSE": "Insignia\\JG51.png" + } + }, + { + "skinName": "LW_FIGHTER_LATE_II_JG51", + "archTypes": ["bf109", "fw190"], + "startDate": "19440901", + "endDate": "19450601", + "squadId": 20112051, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_LATE", + "overrides": { + "STAFFEL_COLOR_INDEX": 1, + "ID_BAND_FORE": "3f853f", + "ID_BAND_AFT": "3f853f", + "ID_BAND_MID": "faf7f1", + "INSIGNIA_NOSE": "Insignia\\JG51.png" + } + }, + { + "skinName": "LW_FIGHTER_LATER_II_JG51", + "archTypes": ["bf109", "fw190"], + "startDate": "19450102", + "endDate": "19450601", + "squadId": 20112051, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_LATER", + "overrides": { + "STAFFEL_COLOR_INDEX": 1, + "ID_BAND_FORE": "3f853f", + "ID_BAND_AFT": "3f853f", + "ID_BAND_MID": "faf7f1", + "INSIGNIA_NOSE": "Insignia\\JG51.png" + } } ], "squadHistory": { diff --git a/BoSData/Input/Squadron/II_JG52.json b/BoSData/Input/Squadron/II_JG52.json index 594018fe5..911f8ff37 100644 --- a/BoSData/Input/Squadron/II_JG52.json +++ b/BoSData/Input/Squadron/II_JG52.json @@ -4,6 +4,7 @@ "name": "II./JG52", "fileName": "II_JG52.json", "skill": 90, + "subUnitIdCode": "-", "planeAssignments": [ { "archType": "bf109", @@ -84,6 +85,21 @@ "country": "Germany", "category": "Squadron", "definedInGame": false + }, + { + "skinName": "LW_FIGHTER_MID_II_JG52", + "archTypes": ["bf109", "fw190"], + "startDate": "19411001", + "endDate": "19450503", + "squadId": 20112052, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 1, + "INSIGNIA_CP_FORE": "Insignia\\JG52.png" + } } ], "squadHistory": { diff --git a/BoSData/Input/Squadron/II_KG53.json b/BoSData/Input/Squadron/II_KG53.json index b2d9ec0c3..39dded68f 100644 --- a/BoSData/Input/Squadron/II_KG53.json +++ b/BoSData/Input/Squadron/II_KG53.json @@ -4,6 +4,8 @@ "name": "II./KG53", "fileName": "II_KG53.json", "skill": 50, + "unitIdCode": "A1", + "subUnitIdCode": "M", "planeAssignments": [ { "archType": "he111", @@ -54,20 +56,39 @@ "19450401": "ef_Florennes", "19450501": "ef_Chievres" }, - "skins": [], + "skins": [ + { + "skinName": "LW_BOMBER_MID_II_KG53", + "archTypes": ["he111"], + "startDate": "19410801", + "endDate": "19450503", + "squadId": 20132053, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_BOMBER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 1 + } + } + ], "squadHistory": { "squadHistoryEntries": [ { "date": "19420301", "squadName": "II./KG27", "armedServiceName": "Luftwaffe", - "skill": 50 + "skill": 50, + "unitIdCode": "1G", + "subUnitIdCode": "M" }, { "date": "19430918", "squadName": "II./KG4", "armedServiceName": "Luftwaffe", - "skill": 40 + "skill": 40, + "unitIdCode": "5J", + "subUnitIdCode": "M" } ] }, diff --git a/BoSData/Input/Squadron/II_KG76.json b/BoSData/Input/Squadron/II_KG76.json index 1900b3974..621b6ee00 100644 --- a/BoSData/Input/Squadron/II_KG76.json +++ b/BoSData/Input/Squadron/II_KG76.json @@ -1,115 +1,136 @@ { - "country": "GERMANY", - "squadronId": 20132076, - "name": "II./KG76", - "fileName": "II_KG76.json", - "skill": 55, - "planeAssignments": [ - { - "archType": "ju88", - "squadronIntroduction": "19410801", - "squadronWithdrawal": "19450601" - } - ], - "airfields": { - "19411001": "Novoye Selo", - "19411020": "Dugino", - "19411110": "Sychevka", - "19411120": "Ryabinki", - "19411215": "Sychevka", - "19420110": "Vjazma", - "19420301": "Novo Sergievskiy", - "19420601": "Alibay", - "19420624": "Zaporojskaya", - "19420709": "Slavyanskaya", - "19420721": "Zaporojskaya", - "19420801": "Kamchie", - "19420906": "Zhutovo", - "19421011": "Aksay", - "19421123": "Novo Sergievskiy", - "19421223": "Novo Sergievskiy", - "19430120": "Novo Sergievskiy", - "19430301": "Kerch", - "19430330": "Kerch", - "19430418": "Kerch", - "19430918": "Kerch", - "19430927": "Bagerovo", - "19431004": "Bagerovo", - "19431008": "Marfovka", - "19440901": "Venlo", - "19441001": "Krefeld", - "19441101": "Munster-Handorf", - "19441220": "Essen-Mulheim", - "19441225": "Munster-Handorf", - "19441229": "Munster-Handorf", - "19450207": "Breitscheid", - "19450310": "Munster-Handorf", - "19450404": "Bad Lippspringe", - "19450101": "ef_Chievres", - "19450201": "ef_Chievres", - "19450301": "ef_Chievres", - "19450401": "ef_Chievres", - "19450501": "ef_Chievres" - }, - "skins": [], - "squadHistory": { - "squadHistoryEntries": [ - { - "date": "19430918", - "squadName": "II./KG51", - "armedServiceName": "Luftwaffe", - "skill": 45 - }, - { - "date": "19440901", - "squadName": "II./KG54", - "armedServiceName": "Luftwaffe", - "skill": 45 - } - ] - }, - "serviceId": 20101, - "squadronRoles": { - "squadronRolePeriods": [ - { - "startDate": "19400101", - "endDate": "19450601", - "weightedRoles": [ - { - "role": "ROLE_RECON", - "weight": 10 - }, - { - "role": "ROLE_BOMB", - "weight": 80 - }, - { - "role": "ROLE_DIVE_BOMB", - "weight": 10 - } - ] - } - ] - }, - "squadronSpecializedRoles": { - "squadronSpecializedRolePeriods": [] - }, - "nightMissionOdds": { - "nightMissionPeriods": [ - { - "startDate": "19400101", - "endDate": "19450601", - "nightMissionOdds": 10 - } - ] - }, - "conversionPeriods": [ - { - "conversionStartDate": "19440101", - "conversionCompleteDate": "19440831" - } - ], - "callsigns": { - "19410801": "PHEASANT" - } -} \ No newline at end of file + "country": "GERMANY", + "squadronId": 20132076, + "name": "II./KG76", + "fileName": "II_KG76.json", + "skill": 55, + "unitIdCode": "F1", + "subUnitIdCode": "N", + "planeAssignments": [ + { + "archType": "ju88", + "squadronIntroduction": "19410801", + "squadronWithdrawal": "19450601" + } + ], + "airfields": { + "19411001": "Novoye Selo", + "19411020": "Dugino", + "19411110": "Sychevka", + "19411120": "Ryabinki", + "19411215": "Sychevka", + "19420110": "Vjazma", + "19420301": "Novo Sergievskiy", + "19420601": "Alibay", + "19420624": "Zaporojskaya", + "19420709": "Slavyanskaya", + "19420721": "Zaporojskaya", + "19420801": "Kamchie", + "19420906": "Zhutovo", + "19421011": "Aksay", + "19421123": "Novo Sergievskiy", + "19421223": "Novo Sergievskiy", + "19430120": "Novo Sergievskiy", + "19430301": "Kerch", + "19430330": "Kerch", + "19430418": "Kerch", + "19430918": "Kerch", + "19430927": "Bagerovo", + "19431004": "Bagerovo", + "19431008": "Marfovka", + "19440901": "Venlo", + "19441001": "Krefeld", + "19441101": "Munster-Handorf", + "19441220": "Essen-Mulheim", + "19441225": "Munster-Handorf", + "19441229": "Munster-Handorf", + "19450207": "Breitscheid", + "19450310": "Munster-Handorf", + "19450404": "Bad Lippspringe", + "19450101": "ef_Chievres", + "19450201": "ef_Chievres", + "19450301": "ef_Chievres", + "19450401": "ef_Chievres", + "19450501": "ef_Chievres" + }, + "skins": [ + { + "skinName": "LW_BOMBER_MID_II_KG76", + "archTypes": ["ju88"], + "startDate": "19410801", + "endDate": "19450503", + "squadId": 20132076, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_BOMBER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 2 + } + } + ], + "squadHistory": { + "squadHistoryEntries": [ + { + "date": "19430918", + "squadName": "II./KG51", + "armedServiceName": "Luftwaffe", + "skill": 45, + "unitIdCode": "9K", + "subUnitIdCode": "N" + }, + { + "date": "19440901", + "squadName": "II./KG54", + "armedServiceName": "Luftwaffe", + "skill": 45, + "unitIdCode": "B3", + "subUnitIdCode": "N" + } + ] + }, + "serviceId": 20101, + "squadronRoles": { + "squadronRolePeriods": [ + { + "startDate": "19400101", + "endDate": "19450601", + "weightedRoles": [ + { + "role": "ROLE_RECON", + "weight": 10 + }, + { + "role": "ROLE_BOMB", + "weight": 80 + }, + { + "role": "ROLE_DIVE_BOMB", + "weight": 10 + } + ] + } + ] + }, + "squadronSpecializedRoles": { + "squadronSpecializedRolePeriods": [] + }, + "nightMissionOdds": { + "nightMissionPeriods": [ + { + "startDate": "19400101", + "endDate": "19450601", + "nightMissionOdds": 10 + } + ] + }, + "conversionPeriods": [ + { + "conversionStartDate": "19440101", + "conversionCompleteDate": "19440831" + } + ], + "callsigns": { + "19410801": "PHEASANT" + } +} diff --git a/BoSData/Input/Squadron/II_SG4.json b/BoSData/Input/Squadron/II_SG4.json index 343012564..f7b4c0710 100644 --- a/BoSData/Input/Squadron/II_SG4.json +++ b/BoSData/Input/Squadron/II_SG4.json @@ -4,6 +4,7 @@ "name": "II./SG 4", "fileName": "II_SG4.json", "skill": 60, + "subUnitIdCode": "-", "planeAssignments": [ { "archType": "fw190", @@ -23,6 +24,48 @@ "19450404": "Ettinghausen" }, "skins": [ + { + "skinName": "LW_FIGHTER_MID_II_SG4", + "archTypes": ["bf109", "fw190", "fw190d"], + "startDate": "19410401", + "endDate": "19450503", + "squadId": 20122004, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 2 + } + }, + { + "skinName": "LW_FIGHTER_LATE_II_SG4", + "archTypes": ["bf109", "fw190", "fw190d"], + "startDate": "19440901", + "endDate": "19450503", + "squadId": 20122004, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_LATE", + "overrides": { + "STAFFEL_COLOR_INDEX": 2 + } + }, + { + "skinName": "LW_FIGHTER_LATER_II_SG4", + "archTypes": ["bf109", "fw190", "fw190d"], + "startDate": "19450102", + "endDate": "19450503", + "squadId": 20122004, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_LATER", + "overrides": { + "STAFFEL_COLOR_INDEX": 2 + } + } ], "squadHistory": { "squadHistoryEntries": [ @@ -57,4 +100,4 @@ "callsigns": { "19410801": "CRANE" } -} \ No newline at end of file +} diff --git a/BoSData/Input/Squadron/II_Sch_G_1.json b/BoSData/Input/Squadron/II_Sch_G_1.json index b808ca199..f45e6236a 100644 --- a/BoSData/Input/Squadron/II_Sch_G_1.json +++ b/BoSData/Input/Squadron/II_Sch_G_1.json @@ -4,6 +4,7 @@ "name": "II./Sch.G.1", "fileName": "II_Sch_G_1.json", "skill": 60, + "subUnitIdCode": "\u25b2", "planeAssignments": [ { "archType": "bf109e", @@ -69,6 +70,62 @@ "country": "GERMANY", "category": "Squadron", "definedInGame": false + }, + { + "skinName": "LW_ATTACK_II_SCHG1", + "archTypes": ["bf109e", "fw190"], + "startDate": "19411001", + "endDate": "19430930", + "squadId": 20142001, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_ATTACK_SCHG1", + "overrides": { + "STAFFEL_COLOR_INDEX": 2 + } + }, + { + "skinName": "LW_FIGHTER_MID_I_SG4", + "archTypes": ["bf109", "fw190", "fw190d"], + "startDate": "19431018", + "endDate": "19450503", + "squadId": 20122001, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 3 + } + }, + { + "skinName": "LW_FIGHTER_LATE_I_SG4", + "archTypes": ["bf109", "fw190", "fw190d"], + "startDate": "19440901", + "endDate": "19450503", + "squadId": 20122001, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_LATE", + "overrides": { + "STAFFEL_COLOR_INDEX": 3 + } + }, + { + "skinName": "LW_FIGHTER_LATER_I_SG4", + "archTypes": ["bf109", "fw190", "fw190d"], + "startDate": "19450102", + "endDate": "19450503", + "squadId": 20122004, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_LATER", + "overrides": { + "STAFFEL_COLOR_INDEX": 3 + } } ], "squadHistory": { @@ -77,7 +134,8 @@ "date": "19431018", "squadName": "I./SG4", "armedServiceName": "Luftwaffe", - "skill": 55 + "skill": 55, + "subUnitIdCode": "" } ] }, diff --git a/BoSData/Input/Squadron/II_St_G_2.json b/BoSData/Input/Squadron/II_St_G_2.json index a0ac951da..cf25d62ac 100644 --- a/BoSData/Input/Squadron/II_St_G_2.json +++ b/BoSData/Input/Squadron/II_St_G_2.json @@ -4,6 +4,8 @@ "name": "II./St.G.2", "fileName": "II_St_G_2.json", "skill": 60, + "unitIdCode": "T6", + "subUnitIdCode": "M", "planeAssignments": [ { "archType": "ju87", @@ -64,6 +66,49 @@ "country": "Germany", "category": "Squadron", "definedInGame": true + }, + { + "skinName": "LW_BOMBER_MID_II_STG2", + "planeType": "ju87d3", + "startDate": "19410801", + "endDate": "19440131", + "squadId": 20122002, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_BOMBER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 1, + "INSIGNIA_CP_FORE": "Insignia\\4_StG2.png" + } + }, + { + "skinName": "LW_BOMBER_MID_10_PZ_SG3", + "planeType": "ju87d3", + "startDate": "19440202", + "endDate": "19450106", + "squadId": 20122002, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_BOMBER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 1 + } + }, + { + "skinName": "LW_BOMBER_MID_3_PZ_SG9", + "planeType": "ju87d3", + "startDate": "19450107", + "endDate": "19450601", + "squadId": 20122002, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_BOMBER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 3 + } } ], "squadHistory": { @@ -72,13 +117,17 @@ "date": "19440201", "squadName": "10.(Pz)/SG3", "armedServiceName": "Luftwaffe", - "skill": 55 + "skill": 55, + "unitIdCode": "S7", + "subUnitIdCode": "U" }, { "date": "19450107", "squadName": "3.(Pz)/SG9", "armedServiceName": "Luftwaffe", - "skill": 45 + "skill": 45, + "unitIdCode": "P8", + "subUnitIdCode": "L" } ] }, diff --git a/BoSData/Input/Squadron/II_St_G_77.json b/BoSData/Input/Squadron/II_St_G_77.json index c0c3434d7..028ce26d4 100644 --- a/BoSData/Input/Squadron/II_St_G_77.json +++ b/BoSData/Input/Squadron/II_St_G_77.json @@ -4,6 +4,8 @@ "name": "II./St.G.77", "fileName": "II_St_G_77.json", "skill": 60, + "unitIdCode": "S2", + "subUnitIdCode": "N", "planeAssignments": [ { "archType": "ju87", @@ -69,6 +71,34 @@ "country": "Germany", "category": "Squadron", "definedInGame": true + }, + { + "skinName": "LW_BOMBER_MID_II_STG77", + "planeType": "ju87d3", + "startDate": "19410801", + "endDate": "19431018", + "squadId": 20122077, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_BOMBER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 2 + } + }, + { + "skinName": "LW_FIGHTER_MID_III_SG10", + "archTypes": ["fw190"], + "startDate": "19431018", + "endDate": "19450503", + "squadId": 20122077, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 2 + } } ], "squadHistory": { @@ -77,7 +107,8 @@ "date": "19431018", "squadName": "III./SG10", "armedServiceName": "Luftwaffe", - "skill": 55 + "skill": 55, + "subUnitIdCode": "|" } ] }, diff --git a/BoSData/Input/Squadron/II_TG1.json b/BoSData/Input/Squadron/II_TG1.json index 5006463df..b473aae6d 100644 --- a/BoSData/Input/Squadron/II_TG1.json +++ b/BoSData/Input/Squadron/II_TG1.json @@ -4,6 +4,8 @@ "name": "II./TG1", "fileName": "II_TG1.json", "skill": 50, + "unitIdCode": "1Z", + "subUnitIdCode": "P", "planeAssignments": [ { "archType": "ju52", @@ -22,7 +24,22 @@ "19450310": "Werl", "19450404": "Quackenbruck" }, - "skins": [], + "skins": [ + { + "skinName": "LW_BOMBER_MID_II_TG1", + "planeType": "ju523mg4e", + "startDate": "19400101", + "endDate": "19450601", + "squadId": 20142003, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_BOMBER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 2 + } + } + ], "squadHistory": { "squadHistoryEntries": [ ] @@ -55,4 +72,4 @@ "callsigns": { "19410801": "PELICAN" } -} \ No newline at end of file +} diff --git a/BoSData/Input/Squadron/II_ZG26.json b/BoSData/Input/Squadron/II_ZG26.json index f693b500d..6e8772808 100644 --- a/BoSData/Input/Squadron/II_ZG26.json +++ b/BoSData/Input/Squadron/II_ZG26.json @@ -1,89 +1,105 @@ { - "country": "GERMANY", - "squadronId": 20102026, - "name": "II./ZG 26", - "fileName": "II_ZG26.json", - "skill": 70, - "planeAssignments": [ - { - "archType": "bf110", - "squadronIntroduction": "19410101", - "squadronWithdrawal": "19450601" - } - ], - "airfields": { - "19440901": "Woensdrecht", - "19441001": "Bonninghardt-Sud", - "19441101": "Koln-Butzweilerhof", - "19441220": "Koln-Ostheim", - "19441225": "Kirchhellen", - "19441229": "Essen-Mulheim", - "19450207": "Bonn-Hangelar_3960", - "19450310": "Limburg-Linter", - "19450404": "Gross-Ostheim" - }, - "skins": [ - { - "skinName": "I_ZG_26", - "planeType": "bf110e2", - "startDate": "19410101", - "endDate": "19450601", - "squadId": 20101026, - "country": "Germany", - "category": "Squadron", - "definedInGame": false - } - ], - "squadHistory": { - "squadHistoryEntries": [] - }, - "serviceId": 20101, - "squadronRoles": { - "squadronRolePeriods": [ - { - "startDate": "19400101", - "endDate": "19450601", - "weightedRoles": [ - { - "role": "ROLE_STRATEGIC_INTERCEPT", - "weight": 30 - }, - { - "role": "ROLE_FIGHTER", - "weight": 30 - }, - { - "role": "ROLE_ATTACK", - "weight": 30 - }, - { - "role": "ROLE_RECON", - "weight": 10 - } - ] - } - ] - }, - "squadronSpecializedRoles": { - "squadronSpecializedRolePeriods": [ - { - "startDate": "19440901", - "endDate": "19450601", - "specializedRole": "SPECIALIZED_ROLE_INTERCEPTOR" - } - ] - }, - "nightMissionOdds": { - "nightMissionPeriods": [ - { - "startDate": "19400101", - "endDate": "19450601", - "nightMissionOdds": 10 - } - ] - }, - "conversionPeriods": [], - "callsigns": { - "19410801": "DUCK" - } -} \ No newline at end of file + "country": "GERMANY", + "squadronId": 20102026, + "name": "II./ZG 26", + "fileName": "II_ZG26.json", + "skill": 70, + "unitIdCode": "3U", + "subUnitIdCode": "S", + "planeAssignments": [ + { + "archType": "bf110", + "squadronIntroduction": "19410101", + "squadronWithdrawal": "19450601" + } + ], + "airfields": { + "19440901": "Woensdrecht", + "19441001": "Bonninghardt-Sud", + "19441101": "Koln-Butzweilerhof", + "19441220": "Koln-Ostheim", + "19441225": "Kirchhellen", + "19441229": "Essen-Mulheim", + "19450207": "Bonn-Hangelar_3960", + "19450310": "Limburg-Linter", + "19450404": "Gross-Ostheim" + }, + "skins": [ + { + "skinName": "I_ZG_26", + "planeType": "bf110e2", + "startDate": "19410101", + "endDate": "19450601", + "squadId": 20101026, + "country": "Germany", + "category": "Squadron", + "definedInGame": false + }, + { + "skinName": "LW_BOMBER_MID_II_ZG26", + "archTypes": ["bf110"], + "startDate": "19400101", + "endDate": "19450601", + "squadId": 20102026, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_BOMBER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 4 + } + } + ], + "squadHistory": { + "squadHistoryEntries": [] + }, + "serviceId": 20101, + "squadronRoles": { + "squadronRolePeriods": [ + { + "startDate": "19400101", + "endDate": "19450601", + "weightedRoles": [ + { + "role": "ROLE_STRATEGIC_INTERCEPT", + "weight": 30 + }, + { + "role": "ROLE_FIGHTER", + "weight": 30 + }, + { + "role": "ROLE_ATTACK", + "weight": 30 + }, + { + "role": "ROLE_RECON", + "weight": 10 + } + ] + } + ] + }, + "squadronSpecializedRoles": { + "squadronSpecializedRolePeriods": [ + { + "startDate": "19440901", + "endDate": "19450601", + "specializedRole": "SPECIALIZED_ROLE_INTERCEPTOR" + } + ] + }, + "nightMissionOdds": { + "nightMissionPeriods": [ + { + "startDate": "19400101", + "endDate": "19450601", + "nightMissionOdds": 10 + } + ] + }, + "conversionPeriods": [], + "callsigns": { + "19410801": "DUCK" + } +} diff --git a/BoSData/Input/Squadron/I_JG1.json b/BoSData/Input/Squadron/I_JG1.json index 05b3da0d6..6d5bd04c1 100644 --- a/BoSData/Input/Squadron/I_JG1.json +++ b/BoSData/Input/Squadron/I_JG1.json @@ -4,6 +4,7 @@ "name": "I./JG1", "fileName": "I_JG1.json", "skill": 85, + "subUnitIdCode": "", "planeAssignments": [ { "archType": "fw190", @@ -32,7 +33,55 @@ "country": "Germany", "category": "Squadron", "definedInGame": true - } + }, + { + "skinName": "LW_FIGHTER_MID_I_JG1", + "archTypes": ["bf109", "fw190", "fw190d"], + "startDate": "19440901", + "endDate": "19450503", + "squadId": 20111001, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 3, + "ID_BAND_FORE": "a62121", + "ID_BAND_AFT": "a62121" + } + }, + { + "skinName": "LW_FIGHTER_LATE_I_JG1", + "archTypes": ["bf109", "fw190", "fw190d"], + "startDate": "19440901", + "endDate": "19450503", + "squadId": 20111001, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_LATE", + "overrides": { + "STAFFEL_COLOR_INDEX": 3, + "ID_BAND_FORE": "a62121", + "ID_BAND_AFT": "a62121" + } + }, + { + "skinName": "LW_FIGHTER_LATER_I_JG1", + "archTypes": ["bf109", "fw190", "fw190d"], + "startDate": "19450102", + "endDate": "19450503", + "squadId": 20111001, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_LATER", + "overrides": { + "STAFFEL_COLOR_INDEX": 3, + "ID_BAND_FORE": "a62121", + "ID_BAND_AFT": "a62121" + } + } ], "squadHistory": { @@ -73,4 +122,4 @@ "callsigns": { "19410801": "SWIFT" } -} \ No newline at end of file +} diff --git a/BoSData/Input/Squadron/I_JG2.json b/BoSData/Input/Squadron/I_JG2.json index 64d4ec5fd..7f7c9a9f3 100644 --- a/BoSData/Input/Squadron/I_JG2.json +++ b/BoSData/Input/Squadron/I_JG2.json @@ -1,77 +1,131 @@ { - "country": "GERMANY", - "squadronId": 20112002, - "name": "I./JG2", - "fileName": "I_JG2.json", - "skill": 90, - "planeAssignments": [ - { - "archType": "fw190", - "squadronIntroduction": "19440901", - "squadronWithdrawal": "19441201" - }, - { - "archType": "fw190d", - "squadronIntroduction": "19441101", - "squadronWithdrawal": "19450601" - } - ], - "airfields": { - "19440901": "PetitBrogel", - "19441001": "Dusseldorf-Lohausen", - "19441101": "Koln-Butzweilerhof", - "19441220": "Dusseldorf-Lohausen", - "19441225": "Soesterberg", - "19441229": "Dusseldorf-Lohausen", - "19450207": "Dusseldorf-Lohausen", - "19450310": "Breitscheid", - "19450404": "Nidda" - }, - "skins": [], - "squadHistory": { - "squadHistoryEntries": [ - { - "date": "19440901", - "squadName": "I./JG2", - "armedServiceName": "Luftwaffe", - "skill": 70 - } - ] - }, - "serviceId": 20101, - "squadronRoles": { - "squadronRolePeriods": [ - { - "startDate": "19440901", - "endDate": "19450601", - "weightedRoles": [ - { - "role": "ROLE_STRATEGIC_INTERCEPT", - "weight": 20 - }, - { - "role": "ROLE_FIGHTER", - "weight": 80 - }, - { - "role": "ROLE_ATTACK", - "weight": 20 - } - ] - } - ] - }, - "nightMissionOdds": { - "nightMissionPeriods": [ - { - "startDate": "19400101", - "endDate": "19450601", - "nightMissionOdds": 5 - } - ] - }, - "conversionPeriods": [], - "callsigns": { - "19410801": "FINCH" - } -} \ No newline at end of file + "country": "GERMANY", + "squadronId": 20112002, + "name": "I./JG2", + "fileName": "I_JG2.json", + "skill": 90, + "subUnitIdCode": "-", + "planeAssignments": [ + { + "archType": "fw190", + "squadronIntroduction": "19440901", + "squadronWithdrawal": "19441201" + }, + { + "archType": "fw190d", + "squadronIntroduction": "19441101", + "squadronWithdrawal": "19450601" + } + ], + "airfields": { + "19440901": "PetitBrogel", + "19441001": "Dusseldorf-Lohausen", + "19441101": "Koln-Butzweilerhof", + "19441220": "Dusseldorf-Lohausen", + "19441225": "Soesterberg", + "19441229": "Dusseldorf-Lohausen", + "19450207": "Dusseldorf-Lohausen", + "19450310": "Breitscheid", + "19450404": "Nidda" + }, + "skins": [ + { + "skinName": "LW_FIGHTER_MID_I_JG2", + "archTypes": ["bf109", "fw190", "fw190d"], + "startDate": "19410401", + "endDate": "19450601", + "squadId": 20112002, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 1, + "ID_BAND_FORE": "ffd443", + "ID_BAND_AFT": "ffd443", + "ID_BAND_MID": "ffffff" + } + }, + { + "skinName": "LW_FIGHTER_LATE_I_JG2", + "archTypes": ["bf109", "fw190", "fw190d"], + "startDate": "19440901", + "endDate": "19450601", + "squadId": 20112002, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_LATE", + "overrides": { + "STAFFEL_COLOR_INDEX": 1, + "ID_BAND_FORE": "ffd443", + "ID_BAND_AFT": "ffd443", + "ID_BAND_MID": "ffffff" + } + }, + { + "skinName": "LW_FIGHTER_LATER_I_JG2", + "archTypes": ["bf109", "fw190", "fw190d"], + "startDate": "19450102", + "endDate": "19450601", + "squadId": 20112002, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_LATER", + "overrides": { + "STAFFEL_COLOR_INDEX": 1, + "ID_BAND_FORE": "ffd443", + "ID_BAND_AFT": "ffd443", + "ID_BAND_MID": "ffffff" + } + } + ], + "squadHistory": { + "squadHistoryEntries": [ + { + "date": "19440901", + "squadName": "I./JG2", + "armedServiceName": "Luftwaffe", + "skill": 70, + "subUnitIdCode": "" + } + ] + }, + "serviceId": 20101, + "squadronRoles": { + "squadronRolePeriods": [ + { + "startDate": "19440901", + "endDate": "19450601", + "weightedRoles": [ + { + "role": "ROLE_STRATEGIC_INTERCEPT", + "weight": 20 + }, + { + "role": "ROLE_FIGHTER", + "weight": 80 + }, + { + "role": "ROLE_ATTACK", + "weight": 20 + } + ] + } + ] + }, + "nightMissionOdds": { + "nightMissionPeriods": [ + { + "startDate": "19400101", + "endDate": "19450601", + "nightMissionOdds": 5 + } + ] + }, + "conversionPeriods": [], + "callsigns": { + "19410801": "FINCH" + } +} diff --git a/BoSData/Input/Squadron/I_JG26.json b/BoSData/Input/Squadron/I_JG26.json index d6bd63017..5a5ebf92e 100644 --- a/BoSData/Input/Squadron/I_JG26.json +++ b/BoSData/Input/Squadron/I_JG26.json @@ -1,90 +1,139 @@ { - "country": "GERMANY", - "squadronId": 20111026, - "name": "I./JG26", - "fileName": "I_JG26.json", - "skill": 90, - "planeAssignments": [ - { - "archType": "fw190", - "squadronIntroduction": "19440901", - "squadronWithdrawal": "19441101" - }, - { - "archType": "fw190d", - "squadronIntroduction": "19441101", - "squadronWithdrawal": "19450601" - } - ], - "airfields": { - "19440901": "Gilze-Rijen", - "19441001": "Bonninghardt-Sud", - "19441101": "Kirchhellen", - "19441220": "Strassfeld", - "19441225": "Dusseldorf-Lohausen", - "19441229": "Essen-Mulheim", - "19450207": "Krefeld", - "19450310": "Kirchhellen", - "19450404": "Gelnhausen" - }, - "skins": [ - { - "skinName": "FW190A3_SKIN_14", - "planeType": "p40e1", - "startDate": "19411101", - "endDate": "19450601", - "squadId": 20111026, - "country": "Germany", - "category": "Squadron", - "definedInGame": true - } - ], - "squadHistory": { - "squadHistoryEntries": [] - }, - "serviceId": 20101, - "squadronRoles": { - "squadronRolePeriods": [ - { - "startDate": "19410801", - "endDate": "19450601", - "weightedRoles": [ - { - "role": "ROLE_STRATEGIC_INTERCEPT", - "weight": 20 - }, - { - "role": "ROLE_FIGHTER", - "weight": 90 - }, - { - "role": "ROLE_ATTACK", - "weight": 10 - } - ] - } - ] - }, - "nightMissionOdds": { - "nightMissionPeriods": [ - { - "startDate": "19440901", - "endDate": "19450601", - "nightMissionOdds": 5 - } - ] - }, - "conversionPeriods": [ - { - "conversionStartDate": "19420514", - "conversionCompleteDate": "19420529" - }, - { - "conversionStartDate": "19440101", - "conversionCompleteDate": "19440831" - } - ], - "callsigns": { - "19410801": "THRUSH" - } -} \ No newline at end of file + "country": "GERMANY", + "squadronId": 20111026, + "name": "I./JG26", + "fileName": "I_JG26.json", + "skill": 90, + "subUnitIdCode": "", + "planeAssignments": [ + { + "archType": "fw190", + "squadronIntroduction": "19440901", + "squadronWithdrawal": "19441101" + }, + { + "archType": "fw190d", + "squadronIntroduction": "19441101", + "squadronWithdrawal": "19450601" + } + ], + "airfields": { + "19440901": "Gilze-Rijen", + "19441001": "Bonninghardt-Sud", + "19441101": "Kirchhellen", + "19441220": "Strassfeld", + "19441225": "Dusseldorf-Lohausen", + "19441229": "Essen-Mulheim", + "19450207": "Krefeld", + "19450310": "Kirchhellen", + "19450404": "Gelnhausen" + }, + "skins": [ + { + "skinName": "FW190A3_SKIN_14", + "planeType": "p40e1", + "startDate": "19411101", + "endDate": "19450601", + "squadId": 20111026, + "country": "Germany", + "category": "Squadron", + "definedInGame": true + }, + { + "skinName": "LW_FIGHTER_MID_I_JG26", + "archTypes": ["bf109", "fw190", "fw190d"], + "startDate": "19410401", + "endDate": "19450601", + "squadId": 20111026, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 1, + "ID_BAND_FORE": "262627", + "ID_BAND_AFT": "faf7f1" + } + }, + { + "skinName": "LW_FIGHTER_LATE_I_JG26", + "archTypes": ["bf109", "fw190", "fw190d"], + "startDate": "19440901", + "endDate": "19450601", + "squadId": 20111026, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_LATE", + "overrides": { + "STAFFEL_COLOR_INDEX": 1, + "ID_BAND_FORE": "262627", + "ID_BAND_AFT": "faf7f1" + } + }, + { + "skinName": "LW_FIGHTER_LATER_I_JG26", + "archTypes": ["bf109", "fw190", "fw190d"], + "startDate": "19450102", + "endDate": "19450601", + "squadId": 20112002, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_LATER", + "overrides": { + "STAFFEL_COLOR_INDEX": 1, + "ID_BAND_FORE": "262627", + "ID_BAND_AFT": "faf7f1" + } + } + ], + "squadHistory": { + "squadHistoryEntries": [] + }, + "serviceId": 20101, + "squadronRoles": { + "squadronRolePeriods": [ + { + "startDate": "19410801", + "endDate": "19450601", + "weightedRoles": [ + { + "role": "ROLE_STRATEGIC_INTERCEPT", + "weight": 20 + }, + { + "role": "ROLE_FIGHTER", + "weight": 90 + }, + { + "role": "ROLE_ATTACK", + "weight": 10 + } + ] + } + ] + }, + "nightMissionOdds": { + "nightMissionPeriods": [ + { + "startDate": "19440901", + "endDate": "19450601", + "nightMissionOdds": 5 + } + ] + }, + "conversionPeriods": [ + { + "conversionStartDate": "19420514", + "conversionCompleteDate": "19420529" + }, + { + "conversionStartDate": "19440101", + "conversionCompleteDate": "19440831" + } + ], + "callsigns": { + "19410801": "THRUSH" + } +} diff --git a/BoSData/Input/Squadron/I_JG27.json b/BoSData/Input/Squadron/I_JG27.json index e7c46cd67..0842f0c9e 100644 --- a/BoSData/Input/Squadron/I_JG27.json +++ b/BoSData/Input/Squadron/I_JG27.json @@ -1,74 +1,124 @@ { - "country": "GERMANY", - "squadronId": 20111027, - "name": "I./JG27", - "fileName": "I_JG27.json", - "skill": 85, - "planeAssignments": [ - { - "archType": "fw190", - "squadronIntroduction": "19440901", - "squadronWithdrawal": "19441001" - }, - { - "archType": "fw190d", - "squadronIntroduction": "19441001", - "squadronWithdrawal": "19450601" - } - ], - "airfields": { - "19440901": "Eindhoven", - "19441001": "Kluis", - "19441101": "Essen-Mulheim", - "19441220": "Bonn-Hangelar_3960", - "19441225": "Strassfeld", - "19441229": "Bonn-Hangelar_3960", - "19450207": "Krefeld-Linn", - "19450310": "Breitscheid", - "19450404": "Stormede" - }, - "skins": [], - "squadHistory": { - "squadHistoryEntries": [] - }, - "serviceId": 20101, - "squadronRoles": { - "squadronRolePeriods": [ - { - "startDate": "19440901", - "endDate": "19450601", - "weightedRoles": [ - { - "role": "ROLE_STRATEGIC_INTERCEPT", - "weight": 20 - }, - { - "role": "ROLE_RECON", - "weight": 3 - }, - { - "role": "ROLE_FIGHTER", - "weight": 80 - }, - { - "role": "ROLE_ATTACK", - "weight": 20 - } - ] - } - ] - }, - "nightMissionOdds": { - "nightMissionPeriods": [ - { - "startDate": "19440901", - "endDate": "19450601", - "nightMissionOdds": 3 - } - ] - }, - "conversionPeriods": [], - "callsigns": { - "19411001": "ROOK" - } -} \ No newline at end of file + "country": "GERMANY", + "squadronId": 20111027, + "name": "I./JG27", + "fileName": "I_JG27.json", + "skill": 85, + "subUnitIdCode": "", + "planeAssignments": [ + { + "archType": "fw190", + "squadronIntroduction": "19440901", + "squadronWithdrawal": "19441001" + }, + { + "archType": "fw190d", + "squadronIntroduction": "19441001", + "squadronWithdrawal": "19450601" + } + ], + "airfields": { + "19440901": "Eindhoven", + "19441001": "Kluis", + "19441101": "Essen-Mulheim", + "19441220": "Bonn-Hangelar_3960", + "19441225": "Strassfeld", + "19441229": "Bonn-Hangelar_3960", + "19450207": "Krefeld-Linn", + "19450310": "Breitscheid", + "19450404": "Stormede" + }, + "skins": [ + { + "skinName": "LW_FIGHTER_MID_I_JG27", + "archTypes": ["bf109", "fw190", "fw190d"], + "startDate": "19410401", + "endDate": "19450503", + "squadId": 20111027, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 2, + "ID_BAND_FORE": "3f853f", + "ID_BAND_AFT": "3f853f" + } + }, + { + "skinName": "LW_FIGHTER_LATE_I_JG27", + "archTypes": ["bf109", "fw190", "fw190d"], + "startDate": "19440901", + "endDate": "19450503", + "squadId": 20111027, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_LATE", + "overrides": { + "STAFFEL_COLOR_INDEX": 2, + "ID_BAND_FORE": "3f853f", + "ID_BAND_AFT": "3f853f" + } + }, + { + "skinName": "LW_FIGHTER_LATER_I_JG27", + "archTypes": ["bf109", "fw190", "fw190d"], + "startDate": "19450102", + "endDate": "19450503", + "squadId": 20111027, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_LATER", + "overrides": { + "STAFFEL_COLOR_INDEX": 2, + "ID_BAND_FORE": "3f853f", + "ID_BAND_AFT": "3f853f" + } + } + ], + "squadHistory": { + "squadHistoryEntries": [] + }, + "serviceId": 20101, + "squadronRoles": { + "squadronRolePeriods": [ + { + "startDate": "19440901", + "endDate": "19450601", + "weightedRoles": [ + { + "role": "ROLE_STRATEGIC_INTERCEPT", + "weight": 20 + }, + { + "role": "ROLE_RECON", + "weight": 3 + }, + { + "role": "ROLE_FIGHTER", + "weight": 80 + }, + { + "role": "ROLE_ATTACK", + "weight": 20 + } + ] + } + ] + }, + "nightMissionOdds": { + "nightMissionPeriods": [ + { + "startDate": "19440901", + "endDate": "19450601", + "nightMissionOdds": 3 + } + ] + }, + "conversionPeriods": [], + "callsigns": { + "19411001": "ROOK" + } +} diff --git a/BoSData/Input/Squadron/I_JG3.json b/BoSData/Input/Squadron/I_JG3.json index bfea8b66f..2126a2afd 100644 --- a/BoSData/Input/Squadron/I_JG3.json +++ b/BoSData/Input/Squadron/I_JG3.json @@ -4,6 +4,7 @@ "name": "I./JG3", "fileName": "I_JG3.json", "skill": 85, + "subUnitIdCode": "", "planeAssignments": [ { "archType": "bf109", @@ -73,7 +74,21 @@ "country": "Germany", "category": "Squadron", "definedInGame": false - } + }, + { + "skinName": "LW_FIGHTER_MID_I_JG3", + "archTypes": ["bf109", "fw190", "fw190d"], + "startDate": "19411001", + "endDate": "19450601", + "squadId": 20111003, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 3 + } + } ], "squadHistory": { "squadHistoryEntries": [] diff --git a/BoSData/Input/Squadron/I_JG51.json b/BoSData/Input/Squadron/I_JG51.json index baac67fa7..4936ceebf 100644 --- a/BoSData/Input/Squadron/I_JG51.json +++ b/BoSData/Input/Squadron/I_JG51.json @@ -4,6 +4,7 @@ "name": "I./JG51", "fileName": "I_JG51.json", "skill": 90, + "subUnitIdCode": "", "planeAssignments": [ { "archType": "bf109", @@ -109,6 +110,21 @@ "country": "Germany", "category": "Squadron", "definedInGame": false + }, + { + "skinName": "LW_FIGHTER_MID_I_JG51", + "archTypes": ["bf109", "fw190"], + "startDate": "19410801", + "endDate": "19450503", + "squadId": 20111051, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 1, + "INSIGNIA_NOSE": "Insignia\\JG51.png" + } } ], "squadHistory": { diff --git a/BoSData/Input/Squadron/I_JG52.json b/BoSData/Input/Squadron/I_JG52.json index 90f4413e9..46ddae1b1 100644 --- a/BoSData/Input/Squadron/I_JG52.json +++ b/BoSData/Input/Squadron/I_JG52.json @@ -4,6 +4,7 @@ "name": "I./JG52", "fileName": "I_JG52.json", "skill": 85, + "subUnitIdCode": "", "planeAssignments": [ { "archType": "bf109", @@ -74,6 +75,22 @@ "country": "Germany", "category": "Squadron", "definedInGame": false + }, + { + "skinName": "LW_FIGHTER_MID_I_JG52", + "archTypes": ["bf109", "fw190"], + "startDate": "19411001", + "endDate": "19450503", + "squadId": 20111052, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 2, + "INSIGNIA_CP_FORE": "Insignia\\JG52.png", + "INSIGNIA_TAIL": "Insignia\\I_JG52.png" + } } ], "squadHistory": { diff --git a/BoSData/Input/Squadron/I_JG6.json b/BoSData/Input/Squadron/I_JG6.json index 7b6d23be9..88e3f4b9a 100644 --- a/BoSData/Input/Squadron/I_JG6.json +++ b/BoSData/Input/Squadron/I_JG6.json @@ -1,65 +1,118 @@ { - "country": "GERMANY", - "squadronId": 20111006, - "name": "I./JG6", - "fileName": "I_JG6.json", - "skill": 70, - "planeAssignments": [ - { - "archType": "fw190", - "squadronIntroduction": "19440901", - "squadronWithdrawal": "19450601" - } - ], - "airfields": { - "19440901": "Woensdrecht", - "19441001": "GraveKeent", - "19441101": "Koln-Butzweilerhof", - "19441220": "Koln-Ostheim", - "19441225": "Kirchhellen", - "19441229": "Kirchhellen", - "19450207": "Bonn-Hangelar_3960", - "19450310": "Limburg-Linter", - "19450404": "Kirtorf" - }, - "skins": [], - "squadHistory": { - "squadHistoryEntries": [] - }, - "serviceId": 20101, - "squadronRoles": { - "squadronRolePeriods": [ - { - "startDate": "19440901", - "endDate": "19450601", - "weightedRoles": [ - { - "role": "ROLE_STRATEGIC_INTERCEPT", - "weight": 20 - }, - { - "role": "ROLE_FIGHTER", - "weight": 80 - }, - { - "role": "ROLE_ATTACK", - "weight": 20 - } - ] - } - ] - }, - "nightMissionOdds": { - "nightMissionPeriods": [ - { - "startDate": "19440901", - "endDate": "19450601", - "nightMissionOdds": 5 - } - ] - }, - "conversionPeriods": [], - "callsigns": { - "19410801": "DUCK" - } -} \ No newline at end of file + "country": "GERMANY", + "squadronId": 20111006, + "name": "I./JG6", + "fileName": "I_JG6.json", + "skill": 70, + "subUnitIdCode": "", + "planeAssignments": [ + { + "archType": "fw190", + "squadronIntroduction": "19440901", + "squadronWithdrawal": "19450601" + } + ], + "airfields": { + "19440901": "Woensdrecht", + "19441001": "GraveKeent", + "19441101": "Koln-Butzweilerhof", + "19441220": "Koln-Ostheim", + "19441225": "Kirchhellen", + "19441229": "Kirchhellen", + "19450207": "Bonn-Hangelar_3960", + "19450310": "Limburg-Linter", + "19450404": "Kirtorf" + }, + "skins": [ + { + "skinName": "LW_FIGHTER_MID_I_JG6", + "archTypes": ["bf109", "fw190", "fw190d"], + "startDate": "19410401", + "endDate": "19450601", + "squadId": 20111006, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 1, + "ID_BAND_FORE": "a62121", + "ID_BAND_AFT": "a62121", + "ID_BAND_MID": "faf7f1" + } + }, + { + "skinName": "LW_FIGHTER_LATE_I_JG6", + "archTypes": ["bf109", "fw190", "fw190d"], + "startDate": "19440901", + "endDate": "19450601", + "squadId": 20111006, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_LATE", + "overrides": { + "STAFFEL_COLOR_INDEX": 1, + "ID_BAND_FORE": "a62121", + "ID_BAND_AFT": "a62121", + "ID_BAND_MID": "faf7f1" + } + }, + { + "skinName": "LW_FIGHTER_LATER_I_JG6", + "archTypes": ["bf109", "fw190", "fw190d"], + "startDate": "19450102", + "endDate": "19450601", + "squadId": 20111006, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_LATER", + "overrides": { + "STAFFEL_COLOR_INDEX": 1, + "ID_BAND_FORE": "a62121", + "ID_BAND_AFT": "a62121", + "ID_BAND_MID": "faf7f1" + } + } + ], + "squadHistory": { + "squadHistoryEntries": [] + }, + "serviceId": 20101, + "squadronRoles": { + "squadronRolePeriods": [ + { + "startDate": "19440901", + "endDate": "19450601", + "weightedRoles": [ + { + "role": "ROLE_STRATEGIC_INTERCEPT", + "weight": 20 + }, + { + "role": "ROLE_FIGHTER", + "weight": 80 + }, + { + "role": "ROLE_ATTACK", + "weight": 20 + } + ] + } + ] + }, + "nightMissionOdds": { + "nightMissionPeriods": [ + { + "startDate": "19440901", + "endDate": "19450601", + "nightMissionOdds": 5 + } + ] + }, + "conversionPeriods": [], + "callsigns": { + "19410801": "DUCK" + } +} diff --git a/BoSData/Input/Squadron/I_JG77.json b/BoSData/Input/Squadron/I_JG77.json index 1fa8ff01c..ffd9b29a8 100644 --- a/BoSData/Input/Squadron/I_JG77.json +++ b/BoSData/Input/Squadron/I_JG77.json @@ -1,83 +1,133 @@ { - "country": "GERMANY", - "squadronId": 20111077, - "name": "I./JG77", - "fileName": "I_JG77.json", - "skill": 70, - "planeAssignments": [ - { - "archType": "bf109", - "squadronIntroduction": "19411001", - "squadronWithdrawal": "19450601" - } - ], - "airfields": { - "19440901": "Ophoven", - "19441001": "Koln-Butzweilerhof", - "19441101": "Dusseldorf-Lohausen", - "19441220": "Krefeld-Linn", - "19441225": "Essen-Mulheim", - "19441229": "Soesterberg", - "19450207": "Koln-Ostheim", - "19450310": "Wiesbaden-Erbenheim", - "19450404": "Gross-Ostheim" - }, - "skins": [], - "squadHistory": { - "squadHistoryEntries": [] - }, - "serviceId": 20101, - "squadronRoles": { - "squadronRolePeriods": [ - { - "startDate": "19400101", - "endDate": "19440901", - "weightedRoles": [ - { - "role": "ROLE_STRATEGIC_INTERCEPT", - "weight": 5 - }, - { - "role": "ROLE_FIGHTER", - "weight": 80 - }, - { - "role": "ROLE_ATTACK", - "weight": 10 - } - ] - }, - { - "startDate": "19440901", - "endDate": "19450601", - "weightedRoles": [ - { - "role": "ROLE_STRATEGIC_INTERCEPT", - "weight": 20 - }, - { - "role": "ROLE_FIGHTER", - "weight": 80 - }, - { - "role": "ROLE_ATTACK", - "weight": 10 - } - ] - } - ] - }, - "nightMissionOdds": { - "nightMissionPeriods": [ - { - "startDate": "19400101", - "endDate": "19450601", - "nightMissionOdds": 3 - } - ] - }, - "conversionPeriods": [], - "callsigns": { - "19410801": "ORIOLE" - } -} \ No newline at end of file + "country": "GERMANY", + "squadronId": 20111077, + "name": "I./JG77", + "fileName": "I_JG77.json", + "skill": 70, + "subUnitIdCode": "", + "planeAssignments": [ + { + "archType": "bf109", + "squadronIntroduction": "19411001", + "squadronWithdrawal": "19450601" + } + ], + "airfields": { + "19440901": "Ophoven", + "19441001": "Koln-Butzweilerhof", + "19441101": "Dusseldorf-Lohausen", + "19441220": "Krefeld-Linn", + "19441225": "Essen-Mulheim", + "19441229": "Soesterberg", + "19450207": "Koln-Ostheim", + "19450310": "Wiesbaden-Erbenheim", + "19450404": "Gross-Ostheim" + }, + "skins": [ + { + "skinName": "LW_FIGHTER_MID_I_JG77", + "archTypes": ["bf109", "fw190"], + "startDate": "19410401", + "endDate": "19450503", + "squadId": 20111077, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 3, + "ID_BAND_FORE": "faf7f1", + "ID_BAND_AFT": "3f853f" + } + }, + { + "skinName": "LW_FIGHTER_LATE_I_JG77", + "archTypes": ["bf109", "fw190"], + "startDate": "19440901", + "endDate": "19450503", + "squadId": 20111077, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_LATE", + "overrides": { + "STAFFEL_COLOR_INDEX": 3, + "ID_BAND_FORE": "faf7f1", + "ID_BAND_AFT": "3f853f" + } + }, + { + "skinName": "LW_FIGHTER_LATER_I_JG77", + "archTypes": ["bf109", "fw190"], + "startDate": "19450102", + "endDate": "19450503", + "squadId": 20111077, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_LATER", + "overrides": { + "STAFFEL_COLOR_INDEX": 3, + "ID_BAND_FORE": "faf7f1", + "ID_BAND_AFT": "3f853f" + } + } + ], + "squadHistory": { + "squadHistoryEntries": [] + }, + "serviceId": 20101, + "squadronRoles": { + "squadronRolePeriods": [ + { + "startDate": "19400101", + "endDate": "19440901", + "weightedRoles": [ + { + "role": "ROLE_STRATEGIC_INTERCEPT", + "weight": 5 + }, + { + "role": "ROLE_FIGHTER", + "weight": 80 + }, + { + "role": "ROLE_ATTACK", + "weight": 10 + } + ] + }, + { + "startDate": "19440901", + "endDate": "19450601", + "weightedRoles": [ + { + "role": "ROLE_STRATEGIC_INTERCEPT", + "weight": 20 + }, + { + "role": "ROLE_FIGHTER", + "weight": 80 + }, + { + "role": "ROLE_ATTACK", + "weight": 10 + } + ] + } + ] + }, + "nightMissionOdds": { + "nightMissionPeriods": [ + { + "startDate": "19400101", + "endDate": "19450601", + "nightMissionOdds": 3 + } + ] + }, + "conversionPeriods": [], + "callsigns": { + "19410801": "ORIOLE" + } +} diff --git a/BoSData/Input/Squadron/I_KG51.json b/BoSData/Input/Squadron/I_KG51.json index 99cdb5893..f391ef86b 100644 --- a/BoSData/Input/Squadron/I_KG51.json +++ b/BoSData/Input/Squadron/I_KG51.json @@ -4,6 +4,8 @@ "name": "I./KG51", "fileName": "I_KG51.json", "skill": 60, + "unitIdCode": "9K", + "subUnitIdCode": "K", "planeAssignments": [ { "archType": "me262", @@ -23,6 +25,20 @@ "19450404": "Achmer" }, "skins": [ + { + "skinName": "LW_BOMBER_LATER_I_KG51", + "archTypes": ["me262"], + "startDate": "19440901", + "endDate": "19450601", + "squadId": 20131051, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_BOMBER_LATER", + "overrides": { + "STAFFEL_COLOR_INDEX": 2 + } + } ], "squadHistory": { "squadHistoryEntries": [ @@ -57,4 +73,4 @@ "callsigns": { "19410801": "SEAGULL" } -} \ No newline at end of file +} diff --git a/BoSData/Input/Squadron/I_KG53.json b/BoSData/Input/Squadron/I_KG53.json index 1e537cecc..e649ddb09 100644 --- a/BoSData/Input/Squadron/I_KG53.json +++ b/BoSData/Input/Squadron/I_KG53.json @@ -4,6 +4,8 @@ "name": "I./KG53", "fileName": "I_KG53.json", "skill": 50, + "unitIdCode": "A1", + "subUnitIdCode": "L", "planeAssignments": [ { "archType": "he111", @@ -84,6 +86,20 @@ "country": "Germany", "category": "Squadron", "definedInGame": false + }, + { + "skinName": "LW_BOMBER_MID_I_KG53", + "archTypes": ["he111"], + "startDate": "19410801", + "endDate": "19450503", + "squadId": 20131053, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_BOMBER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 3 + } } ], "squadHistory": { @@ -92,13 +108,17 @@ "date": "19420301", "squadName": "I./KG27", "armedServiceName": "Luftwaffe", - "skill": 50 + "skill": 50, + "unitIdCode": "1G", + "subUnitIdCode": "L" }, { "date": "19430918", "squadName": "I./KG4", "armedServiceName": "Luftwaffe", - "skill": 40 + "skill": 40, + "unitIdCode": "5J", + "subUnitIdCode": "L" } ] }, @@ -133,4 +153,4 @@ "callsigns": { "19410801": "SEAGULL" } -} \ No newline at end of file +} diff --git a/BoSData/Input/Squadron/I_KG54.json b/BoSData/Input/Squadron/I_KG54.json index 0f285889c..cb91c3eb5 100644 --- a/BoSData/Input/Squadron/I_KG54.json +++ b/BoSData/Input/Squadron/I_KG54.json @@ -4,6 +4,8 @@ "name": "I./KG54", "fileName": "I_KG54.json", "skill": 50, + "unitIdCode": "B3", + "subUnitIdCode": "L", "planeAssignments": [ { "archType": "ju88", @@ -22,7 +24,22 @@ "19450310": "Altenstadt", "19450404": "Vorden" }, - "skins": [], + "skins": [ + { + "skinName": "LW_BOMBER_MID_I_KG54", + "archTypes": ["ju88"], + "startDate": "19410801", + "endDate": "19450503", + "squadId": 20131054, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_BOMBER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 3 + } + } + ], "squadHistory": { "squadHistoryEntries": [ ] @@ -64,4 +81,4 @@ "callsigns": { "19410801": "GANNET" } -} \ No newline at end of file +} diff --git a/BoSData/Input/Squadron/I_KG76.json b/BoSData/Input/Squadron/I_KG76.json index 070814307..0fbb4990d 100644 --- a/BoSData/Input/Squadron/I_KG76.json +++ b/BoSData/Input/Squadron/I_KG76.json @@ -4,6 +4,8 @@ "name": "I./KG76", "fileName": "I_KG76.json", "skill": 50, + "unitIdCode": "F1", + "subUnitIdCode": "L", "planeAssignments": [ { "archType": "ju88", @@ -54,14 +56,46 @@ "19450401": "ef_Nivelles", "19450501": "ef_Chievres" }, - "skins": [], + "skins": [ + { + "skinName": "LW_BOMBER_MID_I_KG76", + "archTypes": ["ju88"], + "startDate": "19410801", + "endDate": "19430917", + "squadId": 20131076, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_BOMBER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 3, + "INSIGNIA": "Insignia\\3_KG76.png" + } + }, + { + "skinName": "LW_BOMBER_MID_I_KG51", + "archTypes": ["ju88"], + "startDate": "19430918", + "endDate": "19450503", + "squadId": 20131076, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_BOMBER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 3 + } + } + ], "squadHistory": { "squadHistoryEntries": [ { "date": "19430918", "squadName": "I./KG51", "armedServiceName": "Luftwaffe", - "skill": 40 + "skill": 40, + "unitIdCode": "9K", + "subUnitIdCode": "L" } ] }, @@ -104,4 +138,4 @@ "callsigns": { "19410801": "GANNET" } -} \ No newline at end of file +} diff --git a/BoSData/Input/Squadron/I_St_G_2.json b/BoSData/Input/Squadron/I_St_G_2.json index b411a7cce..9c1fe9a0f 100644 --- a/BoSData/Input/Squadron/I_St_G_2.json +++ b/BoSData/Input/Squadron/I_St_G_2.json @@ -4,6 +4,8 @@ "name": "I./St.G.2", "fileName": "I_St_G_2.json", "skill": 60, + "unitIdCode": "T6", + "subUnitIdCode": "K", "planeAssignments": [ { "archType": "ju87", @@ -84,6 +86,35 @@ "country": "Germany", "category": "Squadron", "definedInGame": false + }, + { + "skinName": "LW_BOMBER_MID_I_STG2", + "planeType": "ju87d3", + "startDate": "19410801", + "endDate": "19431017", + "squadId": 20121002, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_BOMBER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 2, + "INSIGNIA_CP_FORE": "Insignia\\2_StG2.png" + } + }, + { + "skinName": "LW_BOMBER_MID_I_SG2", + "planeType": "ju87d3", + "startDate": "19431018", + "endDate": "19450503", + "squadId": 20121002, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_BOMBER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 2 + } } ], "squadHistory": { @@ -92,7 +123,9 @@ "date": "19431018", "squadName": "I./SG2", "armedServiceName": "Luftwaffe", - "skill": 55 + "skill": 55, + "unitIdCode": "T6", + "subUnitIdCode": "K" } ] }, diff --git a/BoSData/Input/Squadron/I_St_G_77.json b/BoSData/Input/Squadron/I_St_G_77.json index c89df0da7..f5ede8247 100644 --- a/BoSData/Input/Squadron/I_St_G_77.json +++ b/BoSData/Input/Squadron/I_St_G_77.json @@ -4,6 +4,8 @@ "name": "I./St.G.77", "fileName": "I_St_G_77.json", "skill": 65, + "unitIdCode": "S2", + "subUnitIdCode": "H", "planeAssignments": [ { "archType": "ju87", @@ -84,6 +86,20 @@ "country": "Germany", "category": "Squadron", "definedInGame": false + }, + { + "skinName": "LW_BOMBER_MID_I_STG77", + "planeType": "ju87d3", + "startDate": "19410801", + "endDate": "19450503", + "squadId": 20121077, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_BOMBER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 1 + } } ], "squadHistory": { @@ -92,7 +108,9 @@ "date": "19431018", "squadName": "I./SG77", "armedServiceName": "Luftwaffe", - "skill": 60 + "skill": 60, + "unitIdCode": "S2", + "subUnitIdCode": "H" } ] }, diff --git a/BoSData/Input/Squadron/I_ZG26.json b/BoSData/Input/Squadron/I_ZG26.json index 17abdc303..70f7c00ad 100644 --- a/BoSData/Input/Squadron/I_ZG26.json +++ b/BoSData/Input/Squadron/I_ZG26.json @@ -4,6 +4,8 @@ "name": "I./ZG 26", "fileName": "I_ZG26.json", "skill": 70, + "unitIdCode": "3U", + "subUnitIdCode": "L", "planeAssignments": [ { "archType": "bf110", @@ -64,6 +66,20 @@ "country": "Germany", "category": "Squadron", "definedInGame": false + }, + { + "skinName": "LW_BOMBER_MID_I_ZG26", + "archTypes": ["bf110"], + "startDate": "19410101", + "endDate": "19450503", + "squadId": 20101026, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_BOMBER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 3 + } } ], "squadHistory": { diff --git a/BoSData/Input/Squadron/JV44.json b/BoSData/Input/Squadron/JV44.json index 226b6dde3..cc256a1a7 100644 --- a/BoSData/Input/Squadron/JV44.json +++ b/BoSData/Input/Squadron/JV44.json @@ -1,69 +1,85 @@ { - "country": "GERMANY", - "squadronId": 20111044, - "name": "JV44", - "fileName": "JV44.json", - "skill": 95, - "planeAssignments": [ - { - "archType": "me262", - "squadronIntroduction": "19450201", - "squadronWithdrawal": "19450601" - } - ], - "airfields": { - "19441229": "Eudenbach/Asbach", - "19450207": "Kirchhellen", - "19450310": "Frankfurt/Rhein-Main", - "19450404": "Hopsten" - }, - "skins": [], - "squadHistory": { - "squadHistoryEntries": [] - }, - "serviceId": 20101, - "squadronRoles": { - "squadronRolePeriods": [ - { - "startDate": "19450201", - "endDate": "19450601", - "weightedRoles": [ - { - "role": "ROLE_STRATEGIC_INTERCEPT", - "weight": 60 - }, - { - "role": "ROLE_FIGHTER", - "weight": 30 - }, - { - "role": "ROLE_ATTACK", - "weight": 10 - } - ] - } - ] - }, - "squadronSpecializedRoles": { - "squadronSpecializedRolePeriods": [ - { - "startDate": "19440901", - "endDate": "19450601", - "specializedRole": "SPECIALIZED_ROLE_INTERCEPTOR" - } - ] - }, - "nightMissionOdds": { - "nightMissionPeriods": [ - { - "startDate": "19440901", - "endDate": "19450601", - "nightMissionOdds": 0 - } - ] - }, - "conversionPeriods": [], - "callsigns": { - "19410801": "SWAN" - } + "country": "GERMANY", + "squadronId": 20111044, + "name": "JV44", + "fileName": "JV44.json", + "skill": 95, + "subUnitIdCode": "", + "planeAssignments": [ + { + "archType": "me262", + "squadronIntroduction": "19450201", + "squadronWithdrawal": "19450601" + } + ], + "airfields": { + "19441229": "Eudenbach/Asbach", + "19450207": "Kirchhellen", + "19450310": "Frankfurt/Rhein-Main", + "19450404": "Hopsten" + }, + "skins": [ + { + "skinName": "LW_FIGHTER_LATER_JV44", + "archTypes": ["me262"], + "startDate": "19450101", + "endDate": "19450601", + "squadId": 20111044, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_FIGHTER_LATER", + "overrides": { + "STAFFEL_COLOR_INDEX": 1 + } + } + ], + "squadHistory": { + "squadHistoryEntries": [] + }, + "serviceId": 20101, + "squadronRoles": { + "squadronRolePeriods": [ + { + "startDate": "19450201", + "endDate": "19450601", + "weightedRoles": [ + { + "role": "ROLE_STRATEGIC_INTERCEPT", + "weight": 60 + }, + { + "role": "ROLE_FIGHTER", + "weight": 30 + }, + { + "role": "ROLE_ATTACK", + "weight": 10 + } + ] + } + ] + }, + "squadronSpecializedRoles": { + "squadronSpecializedRolePeriods": [ + { + "startDate": "19440901", + "endDate": "19450601", + "specializedRole": "SPECIALIZED_ROLE_INTERCEPTOR" + } + ] + }, + "nightMissionOdds": { + "nightMissionPeriods": [ + { + "startDate": "19440901", + "endDate": "19450601", + "nightMissionOdds": 0 + } + ] + }, + "conversionPeriods": [], + "callsigns": { + "19410801": "SWAN" + } } diff --git a/BoSData/Input/Squadron/KGrzbV800.json b/BoSData/Input/Squadron/KGrzbV800.json index 5ceee9919..7108756d7 100644 --- a/BoSData/Input/Squadron/KGrzbV800.json +++ b/BoSData/Input/Squadron/KGrzbV800.json @@ -4,6 +4,8 @@ "name": "KGrzbV800", "fileName": "KGrzbV800.json", "skill": 50, + "unitIdCode": "3T", + "subUnitIdCode": "M", "planeAssignments": [ { "archType": "ju52", @@ -54,14 +56,31 @@ "19450401": "ef_Grimbergen", "19450501": "ef_Chievres" }, - "skins": [], + "skins": [ + { + "skinName": "LW_BOMBER_MID_II_TG2", + "planeType": "ju523mg4e", + "startDate": "19400101", + "endDate": "19450601", + "squadId": 20142002, + "country": "Germany", + "category": "Squadron", + "definedInGame": false, + "template": "LW_BOMBER_MID", + "overrides": { + "STAFFEL_COLOR_INDEX": 4 + } + } + ], "squadHistory": { "squadHistoryEntries": [ { "date": "19430501", "squadName": "II./TG2", "armedServiceName": "Luftwaffe", - "skill": 50 + "skill": 50, + "unitIdCode": "8T", + "subUnitIdCode": "S" } ] }, diff --git a/BoSData/Input/Squadron/Normandie-Niemen.json b/BoSData/Input/Squadron/Normandie-Niemen.json index 534652a02..c1b5c569f 100644 --- a/BoSData/Input/Squadron/Normandie-Niemen.json +++ b/BoSData/Input/Squadron/Normandie-Niemen.json @@ -43,7 +43,30 @@ "19450401": "ef_Mill", "19450501": "ef_Gilze-Rijen" }, - "skins": [], + "skins": [ + { + "skinName": "VVS_GREEN_BLACK_NN", + "archTypes": ["yak"], + "startDate": "19420401", + "endDate": "19430630", + "squadId": 10111999, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREEN_BLACK" + }, + { + "skinName": "VVS_GREY_NN", + "archTypes": ["yak"], + "startDate": "19430701", + "endDate": "19450503", + "squadId": 10111999, + "country": "Russia", + "category": "Squadron", + "definedInGame": false, + "template": "VVS_GREY" + } + ], "squadHistory": { "squadHistoryEntries": [] }, diff --git a/LICENSE.libsquish b/LICENSE.libsquish new file mode 100644 index 000000000..e491e3622 --- /dev/null +++ b/LICENSE.libsquish @@ -0,0 +1,20 @@ +Copyright (c) 2006 Simon Brown si@sjbrown.co.uk + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/squish32.dll b/squish32.dll new file mode 100644 index 000000000..fd872da66 Binary files /dev/null and b/squish32.dll differ diff --git a/squish64.dll b/squish64.dll new file mode 100644 index 000000000..6a4a7ec48 Binary files /dev/null and b/squish64.dll differ diff --git a/src/main/java/pwcg/aar/TemplatedSkinCleaner.java b/src/main/java/pwcg/aar/TemplatedSkinCleaner.java new file mode 100644 index 000000000..e32696eae --- /dev/null +++ b/src/main/java/pwcg/aar/TemplatedSkinCleaner.java @@ -0,0 +1,77 @@ +package pwcg.aar; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import pwcg.campaign.context.PWCGContext; +import pwcg.core.exception.PWCGException; +import pwcg.core.utils.DirectoryReader; +import pwcg.core.utils.FileUtils; +import pwcg.core.utils.PWCGLogger; + +public abstract class TemplatedSkinCleaner +{ + public static int cleanSkinFiles() throws PWCGException + { + List filesToDelete = getSkinFilesToDelete(); + FileUtils.deleteFilesByFileName(filesToDelete); + + return filesToDelete.size(); + } + + private static List getSkinFilesToDelete() throws PWCGException + { + Set usedSkins = new TreeSet<>(); + Set allGeneratedSkins = new TreeSet<>(); + Pattern pattern = Pattern.compile(" Skin = \"([^\"]+pwcg_[^\"]+.dds)\";", Pattern.CASE_INSENSITIVE); + + for (String dir : new String[] {"Missions\\", "Multiplayer\\Cooperative\\"}) + { + String missionDir = PWCGContext.getInstance().getDirectoryManager().getSimulatorDataDir() + dir; + DirectoryReader directoryReader = new DirectoryReader(); + directoryReader.sortilesInDir(missionDir); + for (String filename : directoryReader.getFiles()) + { + if (filename.endsWith(".mission")) + { + try (BufferedReader reader = new BufferedReader(new FileReader(missionDir + "\\" + filename))) + { + for (String line : reader.lines().filter(pattern.asPredicate()).collect(Collectors.toList())) { + Matcher m = pattern.matcher(line); + if (m.matches()) + usedSkins.add(m.group(1).toLowerCase()); + } + } catch (IOException e) { + PWCGLogger.logException(e); + } + } + } + } + File skinDir = new File(PWCGContext.getInstance().getDirectoryManager().getSimulatorDataDir() + "graphics\\skins\\"); + if (skinDir.isDirectory()) + { + for (File plane : skinDir.listFiles()) + { + if (plane.isDirectory()) + { + for (File skin : plane.listFiles()) + { + if (skin.getName().toLowerCase().startsWith("pwcg_")) + allGeneratedSkins.add(plane.getName().toLowerCase() + "/" + skin.getName().toLowerCase()); + } + } + } + } + Set skinsToDelete = new TreeSet<>(allGeneratedSkins); + skinsToDelete.removeAll(usedSkins); + return skinsToDelete.stream().map(skin -> skinDir.getPath() + "\\" + skin.replace("/", "\\")).collect(Collectors.toList()); + } +} + diff --git a/src/main/java/pwcg/aar/campaign/update/EquipmentUpdater.java b/src/main/java/pwcg/aar/campaign/update/EquipmentUpdater.java index cb69aa37b..c3798b857 100644 --- a/src/main/java/pwcg/aar/campaign/update/EquipmentUpdater.java +++ b/src/main/java/pwcg/aar/campaign/update/EquipmentUpdater.java @@ -2,11 +2,13 @@ import pwcg.aar.data.AARContext; import pwcg.campaign.Campaign; +import pwcg.campaign.context.PWCGContext; import pwcg.campaign.plane.Equipment; import pwcg.campaign.plane.EquippedPlane; import pwcg.campaign.plane.PlaneStatus; import pwcg.campaign.resupply.equipment.EquipmentResupplyRecord; import pwcg.core.exception.PWCGException; +import pwcg.core.utils.PWCGLogger; public class EquipmentUpdater { @@ -43,6 +45,13 @@ private void equipmentAdditions() EquippedPlane replacementPlane = equipmentResupplyRecord.getEquippedPlane(); replacementPlane.setSquadronId(equipmentResupplyRecord.getTransferTo()); replacementPlane.setPlaneStatus(PlaneStatus.STATUS_DEPLOYED); + try { + PWCGContext.getInstance().getPlaneMarkingManager().allocatePlaneIdCode(campaign, equipmentResupplyRecord.getTransferTo(), equipment, replacementPlane); + } + catch (PWCGException e) + { + PWCGLogger.logException(e); + } equipment.addEquippedPlane(replacementPlane); } } diff --git a/src/main/java/pwcg/aar/ui/events/model/PlaneStatusEvent.java b/src/main/java/pwcg/aar/ui/events/model/PlaneStatusEvent.java index 4b7187534..4ea91649d 100644 --- a/src/main/java/pwcg/aar/ui/events/model/PlaneStatusEvent.java +++ b/src/main/java/pwcg/aar/ui/events/model/PlaneStatusEvent.java @@ -17,6 +17,7 @@ public class PlaneStatusEvent extends AARPilotEvent private int planeSerialNumber; private String squadronName; private int planeStatus; + private String displaySerial; public PlaneStatusEvent(Campaign campaign, LogPlane lostPlane, int planeStatus, boolean isNewsWorthy) { @@ -32,6 +33,10 @@ public PlaneStatusEvent(Campaign campaign, LogPlane lostPlane, int planeStatus, { this.squadronName = squadron.determineDisplayName(campaign.getDate()); } + + CampaignEquipmentManager campaignEquipmentManager = campaign.getEquipmentManager(); + EquippedPlane shotDownPlane = campaignEquipmentManager.destroyPlane(planeSerialNumber, campaign.getDate()); + this.displaySerial = shotDownPlane.getDisplaySerial(); } catch (Exception e) { @@ -51,7 +56,7 @@ public String getPlaneLostText(Campaign campaign) throws PWCGException String prettyDate = DateUtils.getDateStringPretty(campaign.getDate()); String planeEventText = "A " + shotDownPlane.getDisplayName() + - ", serial number " + planeSerialNumber + + ", serial number " + shotDownPlane.getDisplaySerial() + ", flown by " + shotDownPilot.getNameAndRank() + " has been lost in combat on " + prettyDate + ".\n"; ; @@ -66,7 +71,7 @@ public String getPlaneAddedToDepotText(Campaign campaign) throws PWCGException String prettyDate = DateUtils.getDateStringPretty(campaign.getDate()); String planeEventText = "A " + shotDownPlane.getDisplayName() + - ", serial number " + planeSerialNumber + + ", serial number " + shotDownPlane.getDisplaySerial() + " has been provided to the depot for distribution to front line units on " + prettyDate + ".\n"; return planeEventText; @@ -80,7 +85,7 @@ public String getPlaneWithdrawnFromServiceText(Campaign campaign) throws PWCGExc String prettyDate = DateUtils.getDateStringPretty(campaign.getDate()); String planeEventText = "A " + shotDownPlane.getDisplayName() + - ", serial number " + planeSerialNumber + + ", serial number " + shotDownPlane.getDisplaySerial() + " has been withdrawn from service on " + prettyDate + ".\n"; return planeEventText; @@ -100,4 +105,9 @@ public String getSquadronName() { return squadronName; } + + public String getDisplaySerial() + { + return displaySerial; + } } diff --git a/src/main/java/pwcg/campaign/SquadHistoryEntry.java b/src/main/java/pwcg/campaign/SquadHistoryEntry.java index e8add3ad7..bdf490ad2 100644 --- a/src/main/java/pwcg/campaign/SquadHistoryEntry.java +++ b/src/main/java/pwcg/campaign/SquadHistoryEntry.java @@ -7,6 +7,8 @@ public class SquadHistoryEntry private String squadName = ""; private String armedServiceName = ""; private int skill = NO_SQUADRON_SKILL_CHANGE; + private String unitIdCode; + private String subUnitIdCode; public String getDate() { @@ -47,4 +49,20 @@ public void setSkill(int skill) { this.skill = skill; } + + public String getUnitIdCode() { + return unitIdCode; + } + + public void setUnitIdCode(String unitIdCode) { + this.unitIdCode = unitIdCode; + } + + public String getSubUnitIdCode() { + return subUnitIdCode; + } + + public void setSubUnitIdCode(String subUnitIdCode) { + this.subUnitIdCode = subUnitIdCode; + } } diff --git a/src/main/java/pwcg/campaign/context/BoSContext.java b/src/main/java/pwcg/campaign/context/BoSContext.java index 6894d5bb2..0a7a902a3 100644 --- a/src/main/java/pwcg/campaign/context/BoSContext.java +++ b/src/main/java/pwcg/campaign/context/BoSContext.java @@ -1,7 +1,9 @@ package pwcg.campaign.context; import pwcg.campaign.context.PWCGMap.FrontMapIdentifier; +import pwcg.campaign.plane.IPlaneMarkingManager; import pwcg.campaign.plane.payload.IPayloadFactory; +import pwcg.product.bos.plane.BoSPlaneMarkingManager; import pwcg.product.bos.plane.payload.BoSPayloadFactory; import pwcg.core.exception.PWCGException; @@ -92,4 +94,9 @@ public PWCGDirectoryManager getDirectoryManager() { return new PWCGDirectoryManager(PWCGProduct.BOS); } + + @Override + public IPlaneMarkingManager getPlaneMarkingManager() { + return new BoSPlaneMarkingManager(); + } } diff --git a/src/main/java/pwcg/campaign/context/FCContext.java b/src/main/java/pwcg/campaign/context/FCContext.java index eb3fa6cf3..a3f3afdec 100644 --- a/src/main/java/pwcg/campaign/context/FCContext.java +++ b/src/main/java/pwcg/campaign/context/FCContext.java @@ -1,6 +1,12 @@ package pwcg.campaign.context; +import java.util.Date; + +import pwcg.campaign.Campaign; import pwcg.campaign.context.PWCGMap.FrontMapIdentifier; +import pwcg.campaign.plane.Equipment; +import pwcg.campaign.plane.EquippedPlane; +import pwcg.campaign.plane.IPlaneMarkingManager; import pwcg.campaign.plane.payload.IPayloadFactory; import pwcg.core.exception.PWCGException; import pwcg.product.fc.plane.payload.FCPayloadFactory; @@ -53,4 +59,26 @@ public PWCGDirectoryManager getDirectoryManager() { return new PWCGDirectoryManager(PWCGProduct.FC); } + + @Override + public IPlaneMarkingManager getPlaneMarkingManager() { + return new IPlaneMarkingManager() { + @Override + public void allocatePlaneIdCode(Campaign campaign, int squadronId, Equipment equipment, EquippedPlane equippedPlane) throws PWCGException { + } + + @Override + public String determineDisplayMarkings(Campaign campaign, EquippedPlane equippedPlane) throws PWCGException { + return equippedPlane.getDisplaySerial(); + } + + @Override + public void generatePlaneSerial(Date date, EquippedPlane plane, int service) throws PWCGException { + } + + @Override + public void generatePlaneSerialHistoric(Campaign campaign, EquippedPlane plane, int service) throws PWCGException { + } + }; + } } diff --git a/src/main/java/pwcg/campaign/context/IPWCGContextManager.java b/src/main/java/pwcg/campaign/context/IPWCGContextManager.java index 7e276f633..a28014f11 100644 --- a/src/main/java/pwcg/campaign/context/IPWCGContextManager.java +++ b/src/main/java/pwcg/campaign/context/IPWCGContextManager.java @@ -8,6 +8,7 @@ import pwcg.campaign.api.IAirfield; import pwcg.campaign.context.PWCGMap.FrontMapIdentifier; import pwcg.campaign.group.airfield.staticobject.StaticObjectDefinitionManager; +import pwcg.campaign.plane.IPlaneMarkingManager; import pwcg.campaign.plane.PlaneTypeFactory; import pwcg.campaign.plane.payload.IPayloadFactory; import pwcg.campaign.skin.SkinManager; @@ -65,4 +66,6 @@ public interface IPWCGContextManager void setMapForCampaign(Campaign campaign) throws PWCGException; void resetForMovingFront() throws PWCGException; -} \ No newline at end of file + + IPlaneMarkingManager getPlaneMarkingManager(); +} diff --git a/src/main/java/pwcg/campaign/context/PWCGDirectoryManager.java b/src/main/java/pwcg/campaign/context/PWCGDirectoryManager.java index 27587e457..32e52de62 100644 --- a/src/main/java/pwcg/campaign/context/PWCGDirectoryManager.java +++ b/src/main/java/pwcg/campaign/context/PWCGDirectoryManager.java @@ -159,6 +159,16 @@ public String getPwcgAcesDir() return getPwcgInputDir() + "Aces\\"; } + public String getPwcgFontsDir() + { + return pwcgDataDir + "Fonts\\"; + } + + public String getPwcgSkinTemplatesDir() + { + return pwcgRootDir + "SkinTemplates\\"; + } + public String getSimulatorRootDir() { return simulatorRootDir; diff --git a/src/main/java/pwcg/campaign/io/json/CampaignEquipmentOJson.java b/src/main/java/pwcg/campaign/io/json/CampaignEquipmentOJson.java index e6fd24b36..7aa0130c7 100644 --- a/src/main/java/pwcg/campaign/io/json/CampaignEquipmentOJson.java +++ b/src/main/java/pwcg/campaign/io/json/CampaignEquipmentOJson.java @@ -6,7 +6,10 @@ import pwcg.campaign.Campaign; import pwcg.campaign.context.PWCGContext; import pwcg.campaign.plane.Equipment; +import pwcg.campaign.plane.EquippedPlane; +import pwcg.campaign.plane.PlaneType; import pwcg.campaign.resupply.depot.EquipmentDepot; +import pwcg.campaign.squadron.Squadron; import pwcg.core.exception.PWCGException; import pwcg.core.utils.FileUtils; @@ -66,6 +69,23 @@ private static void readSquadrons(Campaign campaign) throws PWCGException Equipment squadronEquipment = jsoReader.readJsonFile(campaignEquipmentDir, jsonFile.getName()); int squadronId = Integer.valueOf(FileUtils.stripFileExtension(jsonFile.getName())); campaign.getEquipmentManager().addEquipmentForSquadron(squadronId, squadronEquipment); + for (EquippedPlane equippedPlane : squadronEquipment.getActiveEquippedPlanes().values()) + { + // Propagate any updates to the aircraft definitions into plane instances + PlaneType basePlane = PWCGContext.getInstance().getPlaneTypeFactory().getPlaneById(equippedPlane.getType()); + basePlane.copyTemplate(equippedPlane); + + // Allocate ID codes in case none were present + // Can be removed after the next campaign compatibility break + if (equippedPlane.getServiceSerial() == null) + { + Squadron squadron = PWCGContext.getInstance().getSquadronManager().getSquadron(squadronId); + + PWCGContext.getInstance().getPlaneMarkingManager().generatePlaneSerialHistoric(campaign, equippedPlane, squadron.getService()); + } + if (equippedPlane.getAircraftIdCode() == null) + PWCGContext.getInstance().getPlaneMarkingManager().allocatePlaneIdCode(campaign, squadronId, squadronEquipment, equippedPlane); + } } } @@ -79,6 +99,16 @@ private static void readReplacements(Campaign campaign) throws PWCGException EquipmentDepot replacementEquipemnt = jsoReader.readJsonFile(campaignEquipmentReplacementDir, jsonFile.getName()); int serviceId = Integer.valueOf(FileUtils.stripFileExtension(jsonFile.getName())); campaign.getEquipmentManager().addEquipmentDepotForService(serviceId, replacementEquipemnt); + for (EquippedPlane equippedPlane : replacementEquipemnt.getAllPlanesInDepot()) + { + // Propagate any updates to the aircraft definitions into plane instances + PlaneType basePlane = PWCGContext.getInstance().getPlaneTypeFactory().getPlaneById(equippedPlane.getType()); + basePlane.copyTemplate(equippedPlane); + // Allocate ID codes in case none were present + // Can be removed after the next campaign compatibility break + if (equippedPlane.getServiceSerial() == null) + PWCGContext.getInstance().getPlaneMarkingManager().generatePlaneSerialHistoric(campaign, equippedPlane, serviceId); + } } } } diff --git a/src/main/java/pwcg/campaign/io/json/SkinIOJson.java b/src/main/java/pwcg/campaign/io/json/SkinIOJson.java index 925bd96a1..7390cf80b 100644 --- a/src/main/java/pwcg/campaign/io/json/SkinIOJson.java +++ b/src/main/java/pwcg/campaign/io/json/SkinIOJson.java @@ -7,6 +7,7 @@ import pwcg.campaign.context.PWCGContext; import pwcg.campaign.skin.SkinSet; +import pwcg.campaign.skin.SkinTemplateSet; import pwcg.campaign.skin.SkinsForPlane; import pwcg.core.exception.PWCGException; import pwcg.core.utils.FileUtils; @@ -47,4 +48,22 @@ public static Map readSkinSet(String skinSetName) throws PWCGEx return skinSets; } + + public static Map readSkinTemplateSet() throws PWCGException + { + Map skinTemplateSets = new HashMap<>(); + + String skinDir = PWCGContext.getInstance().getDirectoryManager().getPwcgSkinsDir() + "Templates\\"; + List jsonFiles = FileUtils.getFilesWithFilter(skinDir, ".json"); + for (File jsonFile : jsonFiles) + { + JsonObjectReader jsonReader = new JsonObjectReader<>(SkinTemplateSet.class); + SkinTemplateSet skinTemplateSet = jsonReader.readJsonFile(skinDir, jsonFile.getName()); + + String planeType = FileUtils.stripFileExtension(jsonFile.getName()); + skinTemplateSets.put(planeType, skinTemplateSet); + } + + return skinTemplateSets; + } } diff --git a/src/main/java/pwcg/campaign/plane/Equipment.java b/src/main/java/pwcg/campaign/plane/Equipment.java index 76e9387ee..c418acadb 100644 --- a/src/main/java/pwcg/campaign/plane/Equipment.java +++ b/src/main/java/pwcg/campaign/plane/Equipment.java @@ -73,11 +73,6 @@ public boolean isSquadronEquipmentViable() } } - public void setEquippedPlanes(Map equippedPlanes) - { - this.equippedPlanes = equippedPlanes; - } - public void addEquippedPlane(EquippedPlane equippedPlane) { equippedPlanes.put(equippedPlane.getSerialNumber(), equippedPlane); diff --git a/src/main/java/pwcg/campaign/plane/EquippedPlane.java b/src/main/java/pwcg/campaign/plane/EquippedPlane.java index 221903ad2..da6fd46ef 100644 --- a/src/main/java/pwcg/campaign/plane/EquippedPlane.java +++ b/src/main/java/pwcg/campaign/plane/EquippedPlane.java @@ -2,7 +2,13 @@ import java.util.Date; +import pwcg.campaign.Campaign; +import pwcg.campaign.context.Country; +import pwcg.campaign.context.PWCGContext; import pwcg.campaign.squadmember.SerialNumber; +import pwcg.core.config.ConfigItemKeys; +import pwcg.core.config.ConfigManagerGlobal; +import pwcg.core.exception.PWCGException; public class EquippedPlane extends PlaneType { @@ -10,6 +16,8 @@ public class EquippedPlane extends PlaneType protected int planeStatus = PlaneStatus.NO_STATUS; protected int squadronId; protected Date dateRemovedFromService; + protected String aircraftIdCode; + protected String serviceSerial; public EquippedPlane() { @@ -32,6 +40,8 @@ public void copyTemplate(EquippedPlane equippedPlane) equippedPlane.squadronId = this.squadronId; equippedPlane.dateRemovedFromService = this.dateRemovedFromService; equippedPlane.planeStatus = this.planeStatus; + equippedPlane.aircraftIdCode = this.aircraftIdCode; + equippedPlane.serviceSerial = this.serviceSerial; } public int getSerialNumber() @@ -73,4 +83,46 @@ public void setSquadronId(int squadronId) { this.squadronId = squadronId; } + + public String getAircraftIdCode() { + return aircraftIdCode; + } + + public void setAircraftIdCode(String aircraftIdCode) { + this.aircraftIdCode = aircraftIdCode; + } + + public String getServiceSerial() { + return serviceSerial; + } + + public void setServiceSerial(String displaySerial) { + this.serviceSerial = displaySerial; + } + + public String getDisplaySerial() { + String serialToShow = getServiceSerial(); + if (serialToShow == null) + { + serialToShow = Integer.toString(getSerialNumber()); + } + else if (primaryUsedBy.indexOf(Country.GERMANY) == 0) + { + serialToShow = "W.Nr. " + serialToShow; + } + return serialToShow; + } + + public String getDisplayMarkings() throws PWCGException { + int generateSkins = ConfigManagerGlobal.getInstance().getIntConfigParam(ConfigItemKeys.GenerateSkinsKey); + if (generateSkins > 0) + { + Campaign campaign = PWCGContext.getInstance().getCampaign(); + return PWCGContext.getInstance().getPlaneMarkingManager().determineDisplayMarkings(campaign, this); + } + else + { + return getDisplaySerial(); + } + } } diff --git a/src/main/java/pwcg/campaign/plane/IPlaneMarkingManager.java b/src/main/java/pwcg/campaign/plane/IPlaneMarkingManager.java new file mode 100644 index 000000000..5d14b6e47 --- /dev/null +++ b/src/main/java/pwcg/campaign/plane/IPlaneMarkingManager.java @@ -0,0 +1,16 @@ +package pwcg.campaign.plane; + +import java.util.Date; + +import pwcg.campaign.Campaign; +import pwcg.core.exception.PWCGException; + +public interface IPlaneMarkingManager { + public void allocatePlaneIdCode(Campaign campaign, int squadronId, Equipment equipment, EquippedPlane equippedPlane) throws PWCGException; + + public String determineDisplayMarkings(Campaign campaign, EquippedPlane equippedPlane) throws PWCGException; + + void generatePlaneSerial(Date date, EquippedPlane plane, int service) throws PWCGException; + + void generatePlaneSerialHistoric(Campaign campaign, EquippedPlane equippedPlane, int service) throws PWCGException; +} diff --git a/src/main/java/pwcg/campaign/plane/PlaneEquipmentFactory.java b/src/main/java/pwcg/campaign/plane/PlaneEquipmentFactory.java index 6291ba95f..63b466f18 100644 --- a/src/main/java/pwcg/campaign/plane/PlaneEquipmentFactory.java +++ b/src/main/java/pwcg/campaign/plane/PlaneEquipmentFactory.java @@ -18,20 +18,21 @@ public PlaneEquipmentFactory(Campaign campaign) this.campaign = campaign; } - public EquippedPlane makePlaneForSquadron (String planteTypeName, int squadronId) throws PWCGException + public EquippedPlane makePlaneForSquadron (String planeTypeName, int squadronId) throws PWCGException { PlaneTypeFactory planeTypeFactory = PWCGContext.getInstance().getPlaneTypeFactory(); - PlaneType planeType = planeTypeFactory.createPlaneTypeByType(planteTypeName); + PlaneType planeType = planeTypeFactory.createPlaneTypeByType(planeTypeName); EquippedPlane equippedPlane = new EquippedPlane(planeType, campaign.getSerialNumber().getNextPlaneSerialNumber(), squadronId, PlaneStatus.STATUS_DEPLOYED); return equippedPlane; } - public EquippedPlane makePlaneForDepot (String planteTypeName) throws PWCGException + public EquippedPlane makePlaneForDepot (String planeTypeName, int service) throws PWCGException { PlaneTypeFactory planeTypeFactory = PWCGContext.getInstance().getPlaneTypeFactory(); - PlaneType planeType = planeTypeFactory.createPlaneTypeByType(planteTypeName); + PlaneType planeType = planeTypeFactory.createPlaneTypeByType(planeTypeName); EquippedPlane equippedPlane = new EquippedPlane(planeType, campaign.getSerialNumber().getNextPlaneSerialNumber(), -1, PlaneStatus.STATUS_DEPOT); + PWCGContext.getInstance().getPlaneMarkingManager().generatePlaneSerial(campaign.getDate(), equippedPlane, service); return equippedPlane; } diff --git a/src/main/java/pwcg/campaign/plane/PlaneType.java b/src/main/java/pwcg/campaign/plane/PlaneType.java index febd3a777..e8298558a 100644 --- a/src/main/java/pwcg/campaign/plane/PlaneType.java +++ b/src/main/java/pwcg/campaign/plane/PlaneType.java @@ -78,8 +78,10 @@ public void copyTemplate(PlaneType planeType) planeType.introduction = this.introduction; planeType.withdrawal = this.withdrawal; + planeType.endProduction = this.endProduction; planeType.side = this.side; + planeType.primaryUsedBy = new ArrayList<>(this.primaryUsedBy); } public int getCruisingSpeed() diff --git a/src/main/java/pwcg/campaign/resupply/InitialSquadronEquipper.java b/src/main/java/pwcg/campaign/resupply/InitialSquadronEquipper.java index 85ade5ac5..94a55540d 100644 --- a/src/main/java/pwcg/campaign/resupply/InitialSquadronEquipper.java +++ b/src/main/java/pwcg/campaign/resupply/InitialSquadronEquipper.java @@ -7,6 +7,7 @@ import pwcg.campaign.context.PWCGContext; import pwcg.campaign.plane.Equipment; import pwcg.campaign.plane.EquippedPlane; +import pwcg.campaign.plane.IPlaneMarkingManager; import pwcg.campaign.plane.PlaneArchType; import pwcg.campaign.plane.PlaneEquipmentFactory; import pwcg.campaign.plane.PlaneType; @@ -57,10 +58,12 @@ private void generatePlanesForSquadron() throws PWCGException { String planeTypeName = equipmentWeightCalculator.getPlaneTypeFromWeight(); + IPlaneMarkingManager planeMarkingManager = PWCGContext.getInstance().getPlaneMarkingManager(); PlaneEquipmentFactory equipmentFactory = new PlaneEquipmentFactory(campaign); EquippedPlane equippedPlane = equipmentFactory.makePlaneForSquadron(planeTypeName, squadron.getSquadronId()); + planeMarkingManager.generatePlaneSerialHistoric(campaign, equippedPlane, squadron.getService()); + planeMarkingManager.allocatePlaneIdCode(campaign, squadron.getSquadronId(), equipment, equippedPlane); equipment.addEquippedPlane(equippedPlane); } } - } diff --git a/src/main/java/pwcg/campaign/resupply/depot/EquipmentArchTypeChangeHandler.java b/src/main/java/pwcg/campaign/resupply/depot/EquipmentArchTypeChangeHandler.java index 2fbda485f..9b4f4e5dd 100644 --- a/src/main/java/pwcg/campaign/resupply/depot/EquipmentArchTypeChangeHandler.java +++ b/src/main/java/pwcg/campaign/resupply/depot/EquipmentArchTypeChangeHandler.java @@ -74,6 +74,7 @@ private void addNewArchTypes() throws PWCGException { PlaneEquipmentFactory equipmentFactory = new PlaneEquipmentFactory(campaign); EquippedPlane replacementPlane = equipmentFactory.makePlaneForSquadron(bestPlaneType.getType(), squadron.getSquadronId()); + PWCGContext.getInstance().getPlaneMarkingManager().generatePlaneSerial(campaign.getDate(), replacementPlane, squadron.getService()); squadronEquipment.addEquippedPlane(replacementPlane); } } diff --git a/src/main/java/pwcg/campaign/resupply/depot/EquipmentDepotInitializer.java b/src/main/java/pwcg/campaign/resupply/depot/EquipmentDepotInitializer.java index 300aeb5f2..1febdb2c1 100644 --- a/src/main/java/pwcg/campaign/resupply/depot/EquipmentDepotInitializer.java +++ b/src/main/java/pwcg/campaign/resupply/depot/EquipmentDepotInitializer.java @@ -56,7 +56,7 @@ private void makeReplacementPlanesForSquadron(EquipmentWeightCalculator equipmen for (int i = 0; i < numPlanes; ++i) { String planeTypeName = equipmentWeightCalculator.getPlaneTypeFromWeight(); - EquippedPlane equippedPlane = equipmentFactory.makePlaneForDepot(planeTypeName); + EquippedPlane equippedPlane = equipmentFactory.makePlaneForDepot(planeTypeName, service.getServiceId()); equipment.addEquippedPlane(equippedPlane); } } diff --git a/src/main/java/pwcg/campaign/resupply/depot/EquipmentDepotReplenisher.java b/src/main/java/pwcg/campaign/resupply/depot/EquipmentDepotReplenisher.java index fbc703bca..bc3468ff3 100644 --- a/src/main/java/pwcg/campaign/resupply/depot/EquipmentDepotReplenisher.java +++ b/src/main/java/pwcg/campaign/resupply/depot/EquipmentDepotReplenisher.java @@ -58,7 +58,7 @@ private void addReplacementPlanesForService( PlaneEquipmentFactory equipmentFactory, EquipmentDepot depot) throws PWCGException { - replacePlanesInDepot(squadronsForService, equipmentFactory, depot); + replacePlanesInDepot(service, squadronsForService, equipmentFactory, depot); updatePlaneReplacementPoints(service, depot); } @@ -70,7 +70,7 @@ private void updatePlaneReplacementPoints(ArmedService service, EquipmentDepot d depot.setEquipmentPoints(updatedEquipmentPoints); } - private void replacePlanesInDepot(List squadronsForService, PlaneEquipmentFactory equipmentFactory, EquipmentDepot equipmentDepot) throws PWCGException + private void replacePlanesInDepot(ArmedService service, List squadronsForService, PlaneEquipmentFactory equipmentFactory, EquipmentDepot equipmentDepot) throws PWCGException { EquipmentReplacementCalculator equipmentReplacementCalculator = new EquipmentReplacementCalculator(campaign); equipmentReplacementCalculator.createArchTypeForReplacementPlane(squadronsForService); @@ -79,14 +79,14 @@ private void replacePlanesInDepot(List squadronsForService, PlaneEquip for (int i = 0; i < numPlanes; ++i) { PlaneArchType planeArchType = getArchTypeForReplacement(equipmentReplacementCalculator); - replacePlaneByArchType(equipmentFactory, equipmentDepot, planeArchType); + replacePlaneByArchType(service, equipmentFactory, equipmentDepot, planeArchType); } } - private void replacePlaneByArchType(PlaneEquipmentFactory equipmentFactory, EquipmentDepot equipmentDepot, PlaneArchType planeArchType) throws PWCGException + private void replacePlaneByArchType(ArmedService service, PlaneEquipmentFactory equipmentFactory, EquipmentDepot equipmentDepot, PlaneArchType planeArchType) throws PWCGException { String planeTypeName = EquipmentReplacementUtils.getTypeForReplacement(campaign.getDate(), planeArchType); - EquippedPlane equippedPlane = equipmentFactory.makePlaneForDepot(planeTypeName); + EquippedPlane equippedPlane = equipmentFactory.makePlaneForDepot(planeTypeName, service.getServiceId()); equipmentDepot.addPlaneToDepot(equippedPlane); equipmentDepot.setLastReplacementDate(campaign.getDate()); } diff --git a/src/main/java/pwcg/campaign/resupply/equipment/EquipmentUpgradeHandler.java b/src/main/java/pwcg/campaign/resupply/equipment/EquipmentUpgradeHandler.java index 8de023485..f42db797f 100644 --- a/src/main/java/pwcg/campaign/resupply/equipment/EquipmentUpgradeHandler.java +++ b/src/main/java/pwcg/campaign/resupply/equipment/EquipmentUpgradeHandler.java @@ -11,6 +11,7 @@ import pwcg.campaign.context.SquadronManager; import pwcg.campaign.plane.Equipment; import pwcg.campaign.plane.EquippedPlane; +import pwcg.campaign.plane.IPlaneMarkingManager; import pwcg.campaign.plane.PlaneSorter; import pwcg.campaign.resupply.depot.EquipmentDepot; import pwcg.campaign.resupply.depot.EquipmentUpgradeRecord; @@ -62,6 +63,7 @@ private void upgradeEquipment(Squadron squadron) throws PWCGException { Equipment equipmentForSquadron = campaign.getEquipmentManager().getEquipmentForSquadron(squadron.getSquadronId()); EquipmentDepot equipmentDepot = campaign.getEquipmentManager().getEquipmentDepotForService(squadron.getService()); + IPlaneMarkingManager planeMarkingManager = PWCGContext.getInstance().getPlaneMarkingManager(); List sortedPlanes = getPlanesForSquadronWorstToBest(equipmentForSquadron); for (EquippedPlane equippedPlane : sortedPlanes) @@ -70,6 +72,7 @@ private void upgradeEquipment(Squadron squadron) throws PWCGException if (equipmentUpgrade != null) { EquippedPlane replacementPlane = equipmentDepot.removeEquippedPlaneFromDepot(equipmentUpgrade.getUpgrade().getSerialNumber()); + planeMarkingManager.allocatePlaneIdCode(campaign, squadron.getSquadronId(), equipmentForSquadron, equippedPlane); equipmentForSquadron.addEquippedPlane(replacementPlane); EquippedPlane replacedPlane = equipmentForSquadron.removeEquippedPlane(equipmentUpgrade.getReplacedPlane().getSerialNumber()); diff --git a/src/main/java/pwcg/campaign/resupply/equipment/WithdrawnEquipmentReplacer.java b/src/main/java/pwcg/campaign/resupply/equipment/WithdrawnEquipmentReplacer.java index 8a83917bb..065b610f0 100644 --- a/src/main/java/pwcg/campaign/resupply/equipment/WithdrawnEquipmentReplacer.java +++ b/src/main/java/pwcg/campaign/resupply/equipment/WithdrawnEquipmentReplacer.java @@ -7,6 +7,7 @@ import pwcg.campaign.context.PWCGContext; import pwcg.campaign.plane.Equipment; import pwcg.campaign.plane.EquippedPlane; +import pwcg.campaign.plane.IPlaneMarkingManager; import pwcg.campaign.plane.PlaneArchType; import pwcg.campaign.plane.PlaneEquipmentFactory; import pwcg.campaign.resupply.depot.EquipmentReplacementUtils; @@ -126,8 +127,11 @@ private List determineAvailableArchTypes() throws PWCGException private void addPlaneToSquadron(String planeTypeName) throws PWCGException { + IPlaneMarkingManager planeMarkingManager = PWCGContext.getInstance().getPlaneMarkingManager(); PlaneEquipmentFactory equipmentFactory = new PlaneEquipmentFactory(campaign); EquippedPlane equippedPlane = equipmentFactory.makePlaneForSquadron(planeTypeName, squadron.getSquadronId()); + planeMarkingManager.generatePlaneSerial(campaign.getDate(), equippedPlane, squadron.getService()); + planeMarkingManager.allocatePlaneIdCode(campaign, squadron.getSquadronId(), equipment, equippedPlane); equipment.addEquippedPlane(equippedPlane); } } diff --git a/src/main/java/pwcg/campaign/skin/ConfiguredSkinReader.java b/src/main/java/pwcg/campaign/skin/ConfiguredSkinReader.java index 02ed37ad9..ad3e073f4 100644 --- a/src/main/java/pwcg/campaign/skin/ConfiguredSkinReader.java +++ b/src/main/java/pwcg/campaign/skin/ConfiguredSkinReader.java @@ -18,6 +18,7 @@ public void readConfiguredSkinsFromPlaneSkinFiles() throws PWCGException { Map configuredSkinSets = SkinIOJson.readSkinSet(SkinSetType.SKIN_CONFIGURED.getSkinSetName()); Map doNotUseSkinSets = SkinIOJson.readSkinSet(SkinSetType.SKIN_DO_NOT_USE.getSkinSetName()); + Map skinTemplateSets = SkinIOJson.readSkinTemplateSet(); for (String planeType : skinsForPlanes.keySet()) { @@ -32,6 +33,11 @@ public void readConfiguredSkinsFromPlaneSkinFiles() throws PWCGException SkinSet doNotUseSkins = doNotUseSkinSets.get(planeType); skinsForPlane.setDoNotUse(doNotUseSkins); } + if (skinTemplateSets.containsKey(planeType)) + { + SkinTemplateSet skinTemplates = skinTemplateSets.get(planeType); + skinsForPlane.setTemplates(skinTemplates); + } } } diff --git a/src/main/java/pwcg/campaign/skin/Skin.java b/src/main/java/pwcg/campaign/skin/Skin.java index 78f181d3d..2b79a7583 100644 --- a/src/main/java/pwcg/campaign/skin/Skin.java +++ b/src/main/java/pwcg/campaign/skin/Skin.java @@ -2,6 +2,8 @@ import java.io.File; import java.util.Date; +import java.util.HashMap; +import java.util.Map; import pwcg.campaign.context.PWCGContext; import pwcg.core.exception.PWCGException; @@ -26,6 +28,8 @@ public class Skin implements Cloneable private String country = ""; private String category = ""; private boolean definedInGame = false; + private String template; + private Map overrides = new HashMap<>(); public static int FACTORY_GENERIC = -2; public static int PERSONAL_SKIN = -1; @@ -51,6 +55,8 @@ public Skin copy () skin.country = this.country; skin.category = this.category; skin.definedInGame = this.definedInGame; + skin.template = this.template; + skin.overrides = new HashMap<>(this.overrides); } catch (Exception e) { @@ -66,26 +72,29 @@ public Skin copy () */ public boolean skinExists(String directory) { - boolean exists = false; - - String skinNameForLookup = skinName; - if (!skinNameForLookup.contains(".dds")) - { - skinNameForLookup = skinNameForLookup + ".dds"; - } - - String filename = directory + planeType + "\\" + skinNameForLookup; - File file = new File(filename); - if (file.exists()) + if (template != null) { - exists = true; + SkinsForPlane skinsForPlane = PWCGContext.getInstance().getSkinManager().getSkinsForPlane(planeType); + if (skinsForPlane.getTemplate(template) != null) + return true; + return false; } else { - exists = false; - } + if (definedInGame) + return true; + + String skinNameForLookup = skinName; + if (!skinNameForLookup.contains(".dds")) + { + skinNameForLookup = skinNameForLookup + ".dds"; + } - return exists; + String filename = directory + planeType + "\\" + skinNameForLookup; + File file = new File(filename); + return file.exists(); + + } } @@ -174,4 +183,20 @@ public void setCategory(String category) { this.category = category; } + + public String getTemplate() { + return template; + } + + public void setTemplate(String template) { + this.template = template; + } + + public Map getOverrides() { + return overrides; + } + + public void setOverrides(Map overrides) { + this.overrides = overrides; + } } diff --git a/src/main/java/pwcg/campaign/skin/SkinSet.java b/src/main/java/pwcg/campaign/skin/SkinSet.java index 79187cb92..f612e84c6 100644 --- a/src/main/java/pwcg/campaign/skin/SkinSet.java +++ b/src/main/java/pwcg/campaign/skin/SkinSet.java @@ -1,12 +1,12 @@ package pwcg.campaign.skin; +import java.util.LinkedHashMap; import java.util.Map; -import java.util.TreeMap; public class SkinSet { private SkinSetType skinSetType; - private Map skins = new TreeMap<>(); + private Map skins = new LinkedHashMap<>(); public SkinSet(SkinSetType skinSetType) { diff --git a/src/main/java/pwcg/campaign/skin/SkinTemplate.java b/src/main/java/pwcg/campaign/skin/SkinTemplate.java new file mode 100644 index 000000000..46adc13e9 --- /dev/null +++ b/src/main/java/pwcg/campaign/skin/SkinTemplate.java @@ -0,0 +1,346 @@ +package pwcg.campaign.skin; + +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics2D; +import java.awt.Rectangle; +import java.awt.RenderingHints; +import java.awt.Shape; +import java.awt.Transparency; +import java.awt.font.GlyphVector; +import java.awt.geom.AffineTransform; +import java.awt.geom.Area; +import java.awt.geom.CubicCurve2D; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; +import java.awt.image.BufferedImageOp; +import java.awt.image.ColorModel; +import java.awt.image.ComponentColorModel; +import java.awt.image.DataBuffer; +import java.awt.image.IndexColorModel; +import java.awt.image.RescaleOp; +import java.awt.image.WritableRaster; +import java.io.File; +import java.text.MessageFormat; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.Map; + +import pwcg.campaign.context.PWCGContext; +import pwcg.core.exception.PWCGException; +import pwcg.core.exception.PWCGIOException; +import pwcg.core.location.PWCGLocation; +import pwcg.core.utils.DDSWriter; +import pwcg.core.utils.FileUtils; +import pwcg.core.utils.PointsAlongCurve; +import pwcg.gui.dialogs.FontCache; +import pwcg.gui.dialogs.ImageCache; + +public class SkinTemplate { + enum HorizAlign { + LEFT, + CENTER, + RIGHT + } + + enum VertAlign { + TOP, + CENTER, + BOTTOM + } + + public static class ElementDef + { + public String text; + public String image; + public HorizAlign horizAlign = HorizAlign.LEFT; + public VertAlign vertAlign = VertAlign.BOTTOM; + public String font; + public float size; + public int x; + public int y; + public int width; + public int height; + public float orientation = 0; + public boolean horizFlip = false; + public String fillColor; + public int strokeWidth = 0; + public String strokeColor; + public String fillShine; + public String strokeShine; + public Integer x2; + public Integer y2; + public Integer cx1; + public Integer cy1; + public Integer cx2; + public Integer cy2; + } + + private String templateName; + private String planeType; + @SuppressWarnings("unused") // credit isn't used in PWCG, but is stored in the templates + private String credit; + private LinkedHashMap parameters; + private String baseImagePath; + private String weatherImagePath; + private ElementDef[] defs; + + public class SkinTemplateInstance + { + private Object[] values; + private BufferedImage skinImage; + + public SkinTemplateInstance(Map overrides) + { + values = new Object[parameters.size()]; + int index = 0; + + for (String param : parameters.keySet()) + { + if (overrides != null && overrides.containsKey(param)) + values[index] = overrides.get(param); + else + values[index] = parameters.get(param); + index++; + } + + } + + public void generate() throws PWCGException { + render(); + write(); + // Clear reference to image to avoid using too much heap while generating + skinImage = null; + } + + public void write() throws PWCGIOException { + String fileName = getFilename(); + String skinDir = Skin.PRODUCT_SKIN_DIR + "\\" + planeType; + FileUtils.createDirIfNeeded(skinDir); + + DDSWriter.writeImage(skinImage, new File(skinDir + "\\" + fileName)); + } + + public void render() throws PWCGException { + ImageCache imageCache = ImageCache.getInstance(); + FontCache fontCache = FontCache.getInstance(); + String skinTemplatesDir = PWCGContext.getInstance().getDirectoryManager().getPwcgSkinTemplatesDir(); + String imagesDir = PWCGContext.getInstance().getDirectoryManager().getPwcgImagesDir(); + String fontsDir = PWCGContext.getInstance().getDirectoryManager().getPwcgFontsDir(); + + skinImage = imageCache.getBufferedImage(skinTemplatesDir + MessageFormat.format(baseImagePath, values)); + skinImage = new BufferedImage(skinImage.getColorModel(), skinImage.copyData(skinImage.getRaster().createCompatibleWritableRaster()), false, null); + + BufferedImage skin = getColorImage(); + BufferedImage shineMap = getShineImage(); + + Graphics2D graphics = skin.createGraphics(); + graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); + + Graphics2D shineGraphics = shineMap.createGraphics(); + shineGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + shineGraphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); + + AffineTransform origTransform = graphics.getTransform(); + + for (ElementDef def : defs) { + Rectangle2D bounds; + + if (def.text != null) + { + String text = MessageFormat.format(def.text, values); + if (text.equals("")) + continue; + + Font font = fontCache.getFont(fontsDir + def.font, def.size); + + // Java seems to get weird values for a font's ascent/descent metrics, so measure the letter "M" instead + Rectangle2D mBounds = font.createGlyphVector(graphics.getFontRenderContext(), "M").getVisualBounds(); + + GlyphVector glyphVector = font.layoutGlyphVector(graphics.getFontRenderContext(), text.toCharArray(), 0, text.length(), Font.LAYOUT_LEFT_TO_RIGHT); + bounds = glyphVector.getVisualBounds(); + Shape outline; + if (def.x2 != null && def.y2 != null && def.cx1 != null && def.cy1 != null && def.cx2 != null && def.cy2 != null) { + Area stringArea = new Area(); + PointsAlongCurve pac = new PointsAlongCurve(new CubicCurve2D.Float(def.x, def.y, def.cx1, def.cy1, def.cx2, def.cy2, def.x2, def.y2)); + + for (int i = 0; i < glyphVector.getNumGlyphs(); i++) + { + Rectangle2D glyphBounds = glyphVector.getGlyphVisualBounds(i).getBounds2D(); + double glyphX; + if (def.horizAlign == HorizAlign.RIGHT) + glyphX = glyphBounds.getMaxX() - bounds.getWidth() + pac.getLength(); + else if (def.horizAlign == HorizAlign.CENTER) + glyphX = glyphBounds.getCenterX() - bounds.getWidth() / 2.0 + pac.getLength() / 2.0; + else + glyphX = glyphBounds.getX(); + PWCGLocation glyphPosOrient = pac.getPoint(glyphX); + + glyphBounds = new Rectangle2D.Double(glyphBounds.getX(), mBounds.getY(), glyphBounds.getWidth(), mBounds.getHeight()); + Area glyph = new Area(glyphVector.getGlyphOutline(i)); + glyph.transform(getTransform(glyphBounds, def.horizAlign, def.vertAlign, glyphPosOrient.getPosition().getXPos(), glyphPosOrient.getPosition().getYPos(), glyphPosOrient.getOrientation().getyOri(), def.horizFlip, 1)); + stringArea.add(glyph); + } + + outline = stringArea; + } else { + outline = glyphVector.getOutline(); + bounds = new Rectangle2D.Double(bounds.getX(), mBounds.getY(), bounds.getWidth(), mBounds.getHeight()); + + graphics.setTransform(getTransform(bounds, def.horizAlign, def.vertAlign, def.x, def.y, def.orientation, def.horizFlip, 1)); + shineGraphics.setTransform(graphics.getTransform()); + } + + Color fillColor = Color.decode("0x" + MessageFormat.format(def.fillColor, values)); + graphics.setColor(fillColor); + graphics.fill(outline); + + if (def.fillShine != null) { + Color fillShine = Color.decode("0x" + MessageFormat.format(def.fillShine + def.fillShine + def.fillShine, values)); + shineGraphics.setColor(fillShine); + shineGraphics.fill(outline); + } + + if (def.strokeWidth > 0) { + Color strokeColor = Color.decode("0x" + MessageFormat.format(def.strokeColor, values)); + graphics.setColor(strokeColor); + graphics.setStroke(new BasicStroke(def.strokeWidth)); + graphics.draw(outline); + + if (def.strokeShine != null) { + Color strokeShine = Color.decode("0x" + MessageFormat.format(def.strokeShine + def.strokeShine + def.strokeShine, values)); + shineGraphics.setColor(strokeShine); + shineGraphics.setStroke(new BasicStroke(def.strokeWidth)); + shineGraphics.draw(outline); + } + } + } else { + String imagePath = MessageFormat.format(def.image, values); + if (imagePath == null || imagePath.equals("") || imagePath.equals("null")) + continue; + BufferedImage image = imageCache.getBufferedImage(imagesDir + imagePath); + if (image == null) + continue; + bounds = new Rectangle(0, -image.getHeight(), image.getWidth(), image.getHeight()); + double width = (def.width != 0) ? def.width : image.getWidth(); + double height = (def.height != 0) ? def.height : image.getHeight(); + double scalingFactor = Math.min((double) width / image.getWidth(), (double) height / image.getHeight()); + + BufferedImageOp op = null; + + if (def.fillColor != null) { + String colorString = MessageFormat.format(def.fillColor, values); + if (colorString == null || colorString.equals("") || colorString.equals("null")) + continue; + Color fillColor = Color.decode("0x" + colorString); + + op = new RescaleOp(new float[] {fillColor.getRed() / 255f, fillColor.getGreen() / 255f, fillColor.getBlue() / 255f, 1f}, new float[] {0f, 0f, 0f, 0f}, null); + } + + graphics.setTransform(getTransform(bounds, def.horizAlign, def.vertAlign, def.x, def.y, def.orientation, def.horizFlip, scalingFactor)); + shineGraphics.setTransform(graphics.getTransform()); + + graphics.drawImage(image, op, 0, -image.getHeight()); + + if (def.fillShine != null) { + int shineVal = Integer.parseUnsignedInt(MessageFormat.format(def.fillShine, values), 16); + + op = new RescaleOp(new float[] {0, 0, 0, 1}, new float[] {shineVal, shineVal, shineVal, 0}, null); + shineGraphics.drawImage(image, op, 0, -image.getHeight()); + } + } + + graphics.setTransform(origTransform); + } + + BufferedImage weatherImage = imageCache.getBufferedImage(skinTemplatesDir + MessageFormat.format(weatherImagePath, values)); + graphics.drawImage(weatherImage, 0, 0, null); + + graphics.dispose(); + } + + public BufferedImage getShineImage() { + WritableRaster alphaRaster = skinImage.getAlphaRaster(); + // Create our own 1:1 lookup table for the shininess map, as otherwise Java does weird gamma correction + byte[] lut = new byte[256]; + for (int i = 0; i < 256; i++) + lut[i] = (byte) i; + ColorModel shineColorModel = new IndexColorModel(8, 256, lut, lut, lut); + BufferedImage shineMap = new BufferedImage(shineColorModel, alphaRaster, false, null); + return shineMap; + } + + public BufferedImage getColorImage() { + if (skinImage != null) { + // Alpha channel of the base image contains the shininess map, which should + // be unchanged. Create a new image backed by the same data arrays, but only + // using the color components. + int[] bandList = {0, 1, 2}; + WritableRaster colorOnlyRaster = skinImage.getRaster().createWritableChild( + 0, 0, + skinImage.getWidth(), skinImage.getHeight(), + 0, 0, + bandList); + + ColorModel colorModel = new ComponentColorModel(skinImage.getColorModel().getColorSpace(), false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); + BufferedImage skin = new BufferedImage(colorModel, colorOnlyRaster, false, null); + return skin; + } else + return null; + } + + private AffineTransform getTransform(Rectangle2D bounds, HorizAlign hAlign, VertAlign vAlign, double x, double y, double orientation, boolean horizFlip, double scalingFactor) { + int xOffset = 0; + int yOffset = 0; + + if (hAlign == HorizAlign.RIGHT) { + xOffset = (int) -(bounds.getWidth() + bounds.getX()); + } else if (hAlign == HorizAlign.CENTER) { + xOffset = (int) -(bounds.getWidth() / 2 + bounds.getX()); + } else if (hAlign == HorizAlign.LEFT) { + xOffset = (int) -bounds.getX(); + } + + if (vAlign == VertAlign.TOP) { + yOffset = (int) -bounds.getY(); + } else if (vAlign == VertAlign.CENTER) { + yOffset = (int) -(bounds.getHeight() / 2 + bounds.getY()); + } else if (vAlign == VertAlign.BOTTOM) { + yOffset = (int) -(bounds.getHeight() + bounds.getY()); + } + + AffineTransform transform = new AffineTransform(); + transform.translate(x, y); + transform.rotate(Math.toRadians(orientation)); + transform.scale(scalingFactor, scalingFactor); + if (horizFlip) + transform.scale(-1, 1); + transform.translate(xOffset, yOffset); + + return transform; + } + + public String getFilename() + { + return "PWCG_" + templateName + "_" + Integer.toHexString(Arrays.deepHashCode(values)) + ".dds"; + } + + public boolean skinExists() + { + File file = new File(Skin.PRODUCT_SKIN_DIR + "\\" + planeType + "\\" + getFilename()); + return file.exists(); + } + } + + public SkinTemplateInstance instantiate(Map overrides) + { + return new SkinTemplateInstance(overrides); + } + + public String[] getParameters() { + return parameters.keySet().toArray(new String[] {}); + } + +} diff --git a/src/main/java/pwcg/campaign/skin/SkinTemplateSet.java b/src/main/java/pwcg/campaign/skin/SkinTemplateSet.java new file mode 100644 index 000000000..1f24f73f3 --- /dev/null +++ b/src/main/java/pwcg/campaign/skin/SkinTemplateSet.java @@ -0,0 +1,12 @@ +package pwcg.campaign.skin; + +import java.util.Map; +import java.util.TreeMap; + +public class SkinTemplateSet { + private Map templates = new TreeMap(); + + public Map getTemplates() { + return templates; + } +} diff --git a/src/main/java/pwcg/campaign/skin/SkinsForPlane.java b/src/main/java/pwcg/campaign/skin/SkinsForPlane.java index 34d753608..5f1b0f70a 100644 --- a/src/main/java/pwcg/campaign/skin/SkinsForPlane.java +++ b/src/main/java/pwcg/campaign/skin/SkinsForPlane.java @@ -13,6 +13,7 @@ public class SkinsForPlane private SkinSet aceSkins = new SkinSet(SkinSetType.SKIN_ACE); private SkinSet looseSkins = new SkinSet(SkinSetType.SKIN_LOOSE); private SkinSet squadronSkins = new SkinSet(SkinSetType.SKIN_SQUADRON); + private SkinTemplateSet skinTemplates = new SkinTemplateSet(); public SkinsForPlane() @@ -171,5 +172,14 @@ public void setDoNotUse(SkinSet doNotUse) this.doNotUse = doNotUse; } + public void setTemplates(SkinTemplateSet skinTemplates) + { + this.skinTemplates = skinTemplates; + } + + public SkinTemplate getTemplate(String skinName) + { + return skinTemplates.getTemplates().get(skinName.toLowerCase()); + } } diff --git a/src/main/java/pwcg/campaign/squadron/Squadron.java b/src/main/java/pwcg/campaign/squadron/Squadron.java index 4e19831a4..a0fd7bb77 100644 --- a/src/main/java/pwcg/campaign/squadron/Squadron.java +++ b/src/main/java/pwcg/campaign/squadron/Squadron.java @@ -58,6 +58,8 @@ public class Squadron private String name = ""; private String fileName = ""; private int skill = 50; + private String unitIdCode; + private String subUnitIdCode; private List planeAssignments = new ArrayList<>(); private Map airfields = new TreeMap<>(); private List skins = new ArrayList(); @@ -831,4 +833,34 @@ public SpecializedRole getActiveSpecializedRole(Date date) throws PWCGException { return squadronSpecializedRoles.selectSpecializedRoleForMission(date); } + + public String determineUnitIdCode(Date date) throws PWCGException { + String code = unitIdCode; + + if (date != null) + { + SquadHistoryEntry squadHistoryEntry = getSquadronHistoryEntryForDate(date); + if (squadHistoryEntry != null) + { + code = squadHistoryEntry.getUnitIdCode(); + } + } + + return code; + } + + public String determineSubUnitIdCode(Date date) throws PWCGException { + String code = subUnitIdCode; + + if (date != null) + { + SquadHistoryEntry squadHistoryEntry = getSquadronHistoryEntryForDate(date); + if (squadHistoryEntry != null) + { + code = squadHistoryEntry.getSubUnitIdCode(); + } + } + + return code; + } } diff --git a/src/main/java/pwcg/core/config/ConfigItemKeys.java b/src/main/java/pwcg/core/config/ConfigItemKeys.java index 6f072bcc8..654091255 100644 --- a/src/main/java/pwcg/core/config/ConfigItemKeys.java +++ b/src/main/java/pwcg/core/config/ConfigItemKeys.java @@ -11,6 +11,8 @@ public class ConfigItemKeys public static final String SoundVolumeKey = "SoundVolume"; public static final String MusicVolumeKey = "MusicVolume"; public static final String UseGenericUIKey = "UseGenericUI"; + public static final String GenerateSkinsKey = "GenerateSkins"; + public static final String GenerateSkinLimitKey = "GenerateSkinsLimit"; public static final String PilotInjuryKey = "PilotInjury"; public static final String DetailedVictoryDescriptionKey = "DetailedVictoryDescription"; diff --git a/src/main/java/pwcg/core/config/ConfigSetUserPref.java b/src/main/java/pwcg/core/config/ConfigSetUserPref.java index b3787c35b..9129615b9 100644 --- a/src/main/java/pwcg/core/config/ConfigSetUserPref.java +++ b/src/main/java/pwcg/core/config/ConfigSetUserPref.java @@ -15,6 +15,8 @@ public static ConfigSet initialize() configSet.addConfigItem(ConfigItemKeys.PlayMusicKey, new ConfigItem("1")); configSet.addConfigItem(ConfigItemKeys.SoundVolumeKey, new ConfigItem("10")); configSet.addConfigItem(ConfigItemKeys.MusicVolumeKey, new ConfigItem("10")); + configSet.addConfigItem(ConfigItemKeys.GenerateSkinsKey, new ConfigItem("0")); + configSet.addConfigItem(ConfigItemKeys.GenerateSkinLimitKey, new ConfigItem("20")); return configSet; } } diff --git a/src/main/java/pwcg/core/utils/DDSWriter.java b/src/main/java/pwcg/core/utils/DDSWriter.java new file mode 100644 index 000000000..10d9e2d1e --- /dev/null +++ b/src/main/java/pwcg/core/utils/DDSWriter.java @@ -0,0 +1,96 @@ +package pwcg.core.utils; + +import java.awt.image.BufferedImage; +import java.awt.image.DataBufferByte; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import pwcg.core.exception.PWCGIOException; + + +public class DDSWriter { + private static final int DDS_MAGIC = 0x20534444; + private static final int HEADER_SIZE = 124; + private static final int HEADER_FLAGS_VALUE = 0x81007; + private static final int CAPS_VALUE = 0x1000; + + private static final int PIXELFORMAT_SIZE = 32; + private static final int PIXELFORMAT_FLAGS_VALUE = 0x4; + private static final int DXT5_FOURCC = 0x35545844; + + private static final int SQUISH_FLAG_DXT1 = 1 << 0; + private static final int SQUISH_FLAG_DXT3 = 1 << 1; + private static final int SQUISH_FLAG_DXT5 = 1 << 2; + private static final int SQUISH_FLAG_BC4 = 1 << 3; + private static final int SQUISH_FLAG_BC5 = 1 << 4; + private static final int SQUISH_FLAG_CLUSTERFIT = 1 << 5; + private static final int SQUISH_FLAG_RANGEFIT = 1 << 6; + private static final int SQUISH_FLAG_WEIGHTCOLOURBYALPHA = 1 << 7; + private static final int SQUISH_FLAG_ITERATIVECLUSTERFIT = 1 << 8; + private static final int SQUISH_FLAG_BGRA = 1 << 9; + private static final int SQUISH_FLAG_ABGR = 1 << 10; + + public static void writeImage(BufferedImage image, File file) throws PWCGIOException + { + try { + DataBufferByte dataBuffer = (DataBufferByte) image.getRaster().getDataBuffer(); + byte[] compressed = new byte[GetStorageRequirements(image.getWidth(), image.getHeight(), 4)]; + int flags = SQUISH_FLAG_ABGR | SQUISH_FLAG_DXT5 | SQUISH_FLAG_RANGEFIT; + CompressImage(dataBuffer.getData(), image.getWidth(), image.getHeight(), image.getWidth()*4, compressed, flags, (float[])null); + + FileOutputStream output = new FileOutputStream(file); + + writeInt(output, DDS_MAGIC); + writeInt(output, HEADER_SIZE); + writeInt(output, HEADER_FLAGS_VALUE); + writeInt(output, image.getHeight()); + writeInt(output, image.getWidth()); + writeInt(output, GetStorageRequirements(image.getWidth(), image.getHeight(), 4)); + writeInt(output, 0); // Volume texture depth + writeInt(output, 0); // Number of mipmap levels + for (int i = 0; i < 11; i++) + writeInt(output, 0); // Reserved + + // Pixel format + writeInt(output, PIXELFORMAT_SIZE); + writeInt(output, PIXELFORMAT_FLAGS_VALUE); + writeInt(output, DXT5_FOURCC); + writeInt(output, 0); // RGB bit count + writeInt(output, 0); // R bitmask + writeInt(output, 0); // B bitmask + writeInt(output, 0); // G bitmask + writeInt(output, 0); // A bitmask + + writeInt(output, CAPS_VALUE); + writeInt(output, 0); // Caps 2 + writeInt(output, 0); // Caps 3 + writeInt(output, 0); // Caps 4 + writeInt(output, 0); // Reserved + + output.write(compressed); + + output.close(); + } + catch (IOException e) + { + PWCGLogger.logException(e); + throw new PWCGIOException(e.getMessage()); + } + } + + private static native int GetStorageRequirements(int width, int height, int flags); + private static native void CompressImage(byte[] rgba, int width, int height, int pitch, byte[] blocks, int flags, float[] metric); + + static { + System.loadLibrary("squish" + System.getProperty("sun.arch.data.model")); + } + + private static void writeInt(FileOutputStream output, int value) throws IOException + { + output.write(value & 0xff); + output.write((value >> 8) & 0xff); + output.write((value >> 16) & 0xff); + output.write((value >> 24) & 0xff); + } +} diff --git a/src/main/java/pwcg/core/utils/PointsAlongCurve.java b/src/main/java/pwcg/core/utils/PointsAlongCurve.java new file mode 100644 index 000000000..db61523f7 --- /dev/null +++ b/src/main/java/pwcg/core/utils/PointsAlongCurve.java @@ -0,0 +1,90 @@ +package pwcg.core.utils; + +import java.awt.geom.CubicCurve2D; +import java.awt.geom.FlatteningPathIterator; +import java.awt.geom.PathIterator; +import java.awt.geom.Point2D; + +import pwcg.core.exception.PWCGException; +import pwcg.core.location.PWCGLocation; + + +public class PointsAlongCurve +{ + CubicCurve2D curve; + FlatteningPathIterator fpi; + double length; + double curLength; + Point2D curSrcPoint; + Point2D curDstPoint; + double segLength; + + public PointsAlongCurve(CubicCurve2D curve) + { + this.curve = (CubicCurve2D) curve.clone(); + reset(); + iterate(Double.POSITIVE_INFINITY); + length = curLength; + reset(); + } + + private void reset() { + fpi = new FlatteningPathIterator(curve.getPathIterator(null), 0.5); + curLength = 0; + float[] coords = new float[6]; + int type = fpi.currentSegment(coords); + assert(type == PathIterator.SEG_MOVETO); + curSrcPoint = new Point2D.Float(coords[0], coords[1]); + fpi.next(); + type = fpi.currentSegment(coords); + assert(type == PathIterator.SEG_LINETO); + curDstPoint = new Point2D.Float(coords[0], coords[1]); + segLength = curSrcPoint.distance(curDstPoint); + } + + private void iterate(double val) + { + if (val < curLength) + reset(); + + while (curLength + segLength < val) + { + fpi.next(); + if (fpi.isDone()) + return; + + curSrcPoint = curDstPoint; + curLength += segLength; + float[] coords = new float[6]; + int type = fpi.currentSegment(coords); + assert(type == PathIterator.SEG_LINETO); + curDstPoint = new Point2D.Float(coords[0], coords[1]); + segLength = curDstPoint.distance(curSrcPoint); + } + + } + + public PWCGLocation getPoint(double val) throws PWCGException + { + iterate(val); + if (fpi.isDone()) + throw new IllegalArgumentException(); + double t = (val - curLength) / segLength; + assert(t >= 0 && t < 1); + Point2D point = new Point2D.Double((1 - t) * curSrcPoint.getX() + t * curDstPoint.getX(), + (1 - t) * curSrcPoint.getY() + t * curDstPoint.getY()); + double orientation = Math.toDegrees(Math.atan2(curDstPoint.getY() - curSrcPoint.getY(), curDstPoint.getX() - curSrcPoint.getX())); + + PWCGLocation loc = new PWCGLocation(); + loc.getPosition().setXPos(point.getX()); + loc.getPosition().setYPos(point.getY()); + loc.getOrientation().setyOri(orientation); + + return loc; + } + + public double getLength() + { + return length; + } +} \ No newline at end of file diff --git a/src/main/java/pwcg/core/utils/SkinAnalyzer.java b/src/main/java/pwcg/core/utils/SkinAnalyzer.java index 116fcb79b..92ffab704 100644 --- a/src/main/java/pwcg/core/utils/SkinAnalyzer.java +++ b/src/main/java/pwcg/core/utils/SkinAnalyzer.java @@ -77,7 +77,7 @@ private void findMissingAceSkins() throws PWCGException for (Skin skin : skinsForPlane.getAceSkins().getSkins().values()) { - if (!skin.skinExists(Skin.PRODUCT_SKIN_DIR)) + if (skin.getTemplate() == null && !skin.skinExists(Skin.PRODUCT_SKIN_DIR)) { addMissingSkin(plane, skin.getSkinName(), "Ace"); } diff --git a/src/main/java/pwcg/dev/deploy/DeployBase.java b/src/main/java/pwcg/dev/deploy/DeployBase.java index abf744dee..4c68e37a8 100644 --- a/src/main/java/pwcg/dev/deploy/DeployBase.java +++ b/src/main/java/pwcg/dev/deploy/DeployBase.java @@ -169,11 +169,13 @@ protected HashMap loadDirectoriesToCopyPWCG() directoriesToCopy.put("PWCGCampaign", null); // From Data + directoriesToCopy.put("Fonts", null); directoriesToCopy.put("Images", null); directoriesToCopy.put("Input", null); directoriesToCopy.put("Names", null); // From Images + directoriesToCopy.put("Insignia", null); directoriesToCopy.put("Maps", null); directoriesToCopy.put("Medals", null); directoriesToCopy.put("Menus", null); @@ -219,6 +221,7 @@ protected HashMap loadDirectoriesToCopyPWCG() // From Input/Skins directoriesToCopy.put("Configured", null); + directoriesToCopy.put("Templates", null); return directoriesToCopy; } diff --git a/src/main/java/pwcg/dev/utils/SkinTemplateTester.java b/src/main/java/pwcg/dev/utils/SkinTemplateTester.java new file mode 100644 index 000000000..e3015f4a6 --- /dev/null +++ b/src/main/java/pwcg/dev/utils/SkinTemplateTester.java @@ -0,0 +1,250 @@ +package pwcg.dev.utils; + +import java.awt.Graphics; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.text.NumberFormat; +import java.text.ParsePosition; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.TreeSet; + +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.table.DefaultTableModel; + +import pwcg.campaign.io.json.SkinIOJson; +import pwcg.campaign.skin.SkinTemplate; +import pwcg.campaign.skin.SkinTemplate.SkinTemplateInstance; +import pwcg.campaign.skin.SkinTemplateSet; +import pwcg.core.exception.PWCGException; +import pwcg.core.exception.PWCGIOException; + +public class SkinTemplateTester implements ActionListener { + + public static void main(String[] args) { + SkinTemplateTester instance = new SkinTemplateTester(); + instance.initialize(); + } + + private Map templateSets; + private JComboBox planeSelector; + private JComboBox templateSelector; + private JTable parameterTable; + private SkinTemplateInstance renderedTemplate; + private SkinTemplate selectedTemplate; + private JPanel previewPanel; + + public void initialize() { + JFrame frame = new JFrame(); + + GridBagConstraints c; + + JPanel buttonPanel = new JPanel(new GridBagLayout()); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.add(buttonPanel); + + JButton loadButton = new JButton(); + loadButton.setText("Load skin templates"); + loadButton.setActionCommand("load"); + loadButton.addActionListener(this); + c = new GridBagConstraints(); + c.gridwidth = 2; + c.gridx = 0; + c.gridy = 0; + buttonPanel.add(loadButton, c); + + planeSelector = new JComboBox<>(); + planeSelector.setActionCommand("plane_select"); + planeSelector.addActionListener(this); + c = new GridBagConstraints(); + c.gridwidth = 1; + c.gridx = 0; + c.gridy = 1; + buttonPanel.add(planeSelector, c); + + templateSelector = new JComboBox<>(); + templateSelector.setActionCommand("skin_select"); + templateSelector.addActionListener(this); + c = new GridBagConstraints(); + c.gridwidth = 1; + c.gridx = 1; + c.gridy = 1; + buttonPanel.add(templateSelector, c); + + DefaultTableModel model = new DefaultTableModel() { + private static final long serialVersionUID = 1L; + + @Override + public boolean isCellEditable(int row, int column) { + return column == 1; + } + }; + model.addColumn("Parameter"); + model.addColumn("Value"); + parameterTable = new JTable(model); + + JScrollPane parameterScrollPane = new JScrollPane(parameterTable); + c = new GridBagConstraints(); + c.gridwidth = 2; + c.gridx = 0; + c.gridy = 2; + c.weighty = 1; + c.fill = GridBagConstraints.BOTH; + buttonPanel.add(parameterScrollPane, c); + + JButton renderButton = new JButton("Render"); + renderButton.setActionCommand("render"); + renderButton.addActionListener(this); + c = new GridBagConstraints(); + c.gridwidth = 1; + c.gridx = 0; + c.gridy = 3; + buttonPanel.add(renderButton, c); + + JButton writeButton = new JButton("Write"); + writeButton.setActionCommand("write"); + writeButton.addActionListener(this); + c = new GridBagConstraints(); + c.gridwidth = 1; + c.gridx = 1; + c.gridy = 3; + buttonPanel.add(writeButton, c); + + previewPanel = new JPanel() { + private static final long serialVersionUID = 1L; + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + + if (renderedTemplate != null) { + int size = Math.min(getWidth(), getHeight()); + + g.drawImage(renderedTemplate.getColorImage(), (getWidth() - size) / 2, (getHeight() - size) / 2, size, size, null); + } + } + }; + c = new GridBagConstraints(); + c.gridwidth = 1; + c.gridheight = GridBagConstraints.REMAINDER; + c.gridx = 2; + c.gridy = 0; + c.weightx = 1; + c.weighty = 1; + c.fill = GridBagConstraints.BOTH; + buttonPanel.add(previewPanel, c); + + frame.pack(); + frame.setVisible(true); + loadButton.doClick(); + } + + @Override + public void actionPerformed(ActionEvent arg0) { + switch(arg0.getActionCommand()) + { + case "load": + try { + templateSets = SkinIOJson.readSkinTemplateSet(); + + String oldPlane = (String) planeSelector.getSelectedItem(); + planeSelector.removeAllItems(); + for (String plane : new TreeSet<>(templateSets.keySet())) { + planeSelector.addItem(plane); + } + planeSelector.setSelectedItem(oldPlane); + } catch (PWCGException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + break; + + case "plane_select": + templateSelector.removeAllItems(); + SkinTemplateSet templateSet = templateSets.get(planeSelector.getSelectedItem()); + if (templateSet != null) { + for (String template : templateSet.getTemplates().keySet()) { + templateSelector.addItem(template); + } + } + break; + + case "skin_select": + selectedTemplate = null; + renderedTemplate = null; + Map old_values = getParamValues(); + DefaultTableModel model = (DefaultTableModel)parameterTable.getModel(); + model.setRowCount(0); + + templateSet = templateSets.get(planeSelector.getSelectedItem()); + if (templateSet != null) { + selectedTemplate = templateSet.getTemplates().get(templateSelector.getSelectedItem()); + if (selectedTemplate != null) { + for (String param : selectedTemplate.getParameters()) { + String value = ""; + if (old_values.containsKey(param)) { + value = (String)old_values.get(param); + } + model.addRow(new String[] {param, value}); + } + } + } + break; + + case "render": + if (selectedTemplate != null) + { + Map params = getParamValues(); + + renderedTemplate = selectedTemplate.instantiate(params); + try { + renderedTemplate.render(); + previewPanel.repaint(); + } catch (PWCGException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + break; + + case "write": + if (renderedTemplate != null) + { + try { + renderedTemplate.write(); + } catch (PWCGIOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + break; + } + + } + + private Map getParamValues() + { + Map res = new LinkedHashMap<>(); + for (int i = 0; i < parameterTable.getRowCount(); ++i) { + String key = (String)parameterTable.getValueAt(i, 0); + Object value = parameterTable.getValueAt(i, 1); + if (value != null) { + ParsePosition pos = new ParsePosition(0); + Object parsedNum = NumberFormat.getInstance().parseObject((String)value, pos); + if (parsedNum != null && pos.getIndex() == ((String)value).length()) { + value = parsedNum; + } + } + res.put(key, value); + } + return res; + } + +} diff --git a/src/main/java/pwcg/gui/campaign/depot/CampaignEquipmentDepotPanel.java b/src/main/java/pwcg/gui/campaign/depot/CampaignEquipmentDepotPanel.java index 4be86400b..7c9c1a773 100644 --- a/src/main/java/pwcg/gui/campaign/depot/CampaignEquipmentDepotPanel.java +++ b/src/main/java/pwcg/gui/campaign/depot/CampaignEquipmentDepotPanel.java @@ -136,7 +136,7 @@ private String formAircraftInventory(List aircraftForRole, Role r depoStatusBuffer.append("\n " + role.getRoleDescription() + "\n"); for (EquippedPlane plane : aircraftForRole) { - depoStatusBuffer.append(" " + plane.getDisplayName() + " (" + plane.getSerialNumber() + ")"); + depoStatusBuffer.append(" " + plane.getDisplayName() + " (" + plane.getDisplaySerial() + ")"); depoStatusBuffer.append(".\n"); } diff --git a/src/main/java/pwcg/gui/campaign/home/CampaignEquipmentChalkBoard.java b/src/main/java/pwcg/gui/campaign/home/CampaignEquipmentChalkBoard.java index f64d8a43f..b7617e9c8 100644 --- a/src/main/java/pwcg/gui/campaign/home/CampaignEquipmentChalkBoard.java +++ b/src/main/java/pwcg/gui/campaign/home/CampaignEquipmentChalkBoard.java @@ -14,9 +14,13 @@ import javax.swing.JPanel; import pwcg.campaign.Campaign; +import pwcg.campaign.context.PWCGContext; import pwcg.campaign.plane.EquippedPlane; +import pwcg.campaign.plane.IPlaneMarkingManager; import pwcg.campaign.plane.PlaneSorter; import pwcg.campaign.squadmember.SquadronMember; +import pwcg.core.config.ConfigItemKeys; +import pwcg.core.config.ConfigManagerGlobal; import pwcg.core.exception.PWCGException; import pwcg.core.utils.PWCGLogger; import pwcg.gui.colors.ColorMap; @@ -41,7 +45,7 @@ public void makeEquipmentPanel(Campaign campaign) { this.setLayout(new BorderLayout()); SquadronMember referencePlayer = campaign.findReferencePlayer(); - JPanel squadronPanel = createEquipmentListPanel(campaign.getEquipmentManager().getEquipmentForSquadron(referencePlayer.getSquadronId()).getActiveEquippedPlanes()); + JPanel squadronPanel = createEquipmentListPanel(campaign, campaign.getEquipmentManager().getEquipmentForSquadron(referencePlayer.getSquadronId()).getActiveEquippedPlanes()); this.add(squadronPanel, BorderLayout.CENTER); } catch (Exception e) @@ -51,9 +55,12 @@ public void makeEquipmentPanel(Campaign campaign) } } - private JPanel createEquipmentListPanel(Map planesForSquadron) throws PWCGException + private JPanel createEquipmentListPanel(Campaign campaign, Map planesForSquadron) throws PWCGException { List sortedAircraftOnInventory = PlaneSorter.sortEquippedPlanesByGoodness(new ArrayList(planesForSquadron.values())); + IPlaneMarkingManager planeMarkingManager = PWCGContext.getInstance().getPlaneMarkingManager(); + int generateSkins = ConfigManagerGlobal.getInstance().getIntConfigParam(ConfigItemKeys.GenerateSkinsKey); + boolean useMarkings = (generateSkins > 0); Color buttonBG = ColorMap.CHALK_BACKGROUND; Color buttonFG = ColorMap.CHALK_FOREGROUND; @@ -101,7 +108,7 @@ private JPanel createEquipmentListPanel(Map planesForSqu constraints.gridy = 0; squadronPanel.add(lMissionHeader, constraints); - JLabel lVictoryHeader = new JLabel(" ", JLabel.RIGHT); + JLabel lVictoryHeader = new JLabel(useMarkings ? "ID Code" : " ", JLabel.RIGHT); lVictoryHeader.setOpaque(false); lVictoryHeader.setForeground(buttonFG); lVictoryHeader.setFont(font); @@ -140,7 +147,7 @@ private JPanel createEquipmentListPanel(Map planesForSqu constraints.gridy = i; squadronPanel.add(pilotButton, constraints); - JLabel lMissions = new JLabel("" + plane.getSerialNumber(), JLabel.RIGHT); + JLabel lMissions = new JLabel(plane.getDisplaySerial(), JLabel.RIGHT); lMissions.setOpaque(false); lMissions.setForeground(buttonFG); lMissions.setFont(font); @@ -149,14 +156,13 @@ private JPanel createEquipmentListPanel(Map planesForSqu constraints.gridy = i; squadronPanel.add(lMissions, constraints); - - lDummy = new JLabel(" "); - lDummy.setOpaque(false); - lDummy.setForeground(buttonFG); - lDummy.setFont(font); constraints.weightx = 0.15; - constraints.gridx = 4; + JLabel lIdCode = new JLabel(useMarkings ? planeMarkingManager.determineDisplayMarkings(campaign, plane) : " ", JLabel.RIGHT); + lIdCode.setOpaque(false); + lIdCode.setForeground(buttonFG); + lIdCode.setFont(font); constraints.weightx = 0.15; + constraints.gridx = 3; constraints.gridy = i; - squadronPanel.add(lDummy, constraints); + squadronPanel.add(lIdCode, constraints); lDummy = new JLabel(" "); lDummy.setOpaque(false); diff --git a/src/main/java/pwcg/gui/campaign/intel/CampaignIntelligenceBase.java b/src/main/java/pwcg/gui/campaign/intel/CampaignIntelligenceBase.java index 6fee5e6b6..e84ac9a74 100644 --- a/src/main/java/pwcg/gui/campaign/intel/CampaignIntelligenceBase.java +++ b/src/main/java/pwcg/gui/campaign/intel/CampaignIntelligenceBase.java @@ -220,7 +220,7 @@ private void formAircraftInventory(Squadron squadron, StringBuffer intelBuffer) for (int i = 0; i < sortedAircraftOnInventory.size(); ++i) { EquippedPlane plane = sortedAircraftOnInventory.get(i); - intelBuffer.append(" " + plane.getDisplayName() + " (" + plane.getSerialNumber() + ")"); + intelBuffer.append(" " + plane.getDisplayName() + " (" + plane.getDisplayMarkings() + ")"); intelBuffer.append(".\n"); } } diff --git a/src/main/java/pwcg/gui/dialogs/FontCache.java b/src/main/java/pwcg/gui/dialogs/FontCache.java new file mode 100644 index 000000000..5c8fd8530 --- /dev/null +++ b/src/main/java/pwcg/gui/dialogs/FontCache.java @@ -0,0 +1,68 @@ +package pwcg.gui.dialogs; + +import java.awt.Font; +import java.awt.FontFormatException; +import java.awt.font.TextAttribute; +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import pwcg.core.exception.PWCGIOException; +import pwcg.core.utils.PWCGLogger; +import pwcg.core.utils.PWCGLogger.LogLevel; + +public class FontCache +{ + private static FontCache instance = null; + private static HashMap fontCache = new HashMap<>(); + + private FontCache () + { + } + + public static FontCache getInstance() + { + if (instance == null) + { + instance = new FontCache(); + } + + return instance; + } + + public Font getFont(String fontPath, float size) throws PWCGIOException + { + try + { + Font font = fontCache.get(fontPath); + if (font == null) + { + File file = new File(fontPath); + if (file.exists()) + { + font = Font.createFont(Font.TRUETYPE_FONT, file); + Map attributes = new HashMap<>(); + attributes.put(TextAttribute.LIGATURES, TextAttribute.LIGATURES_ON); + attributes.put(TextAttribute.KERNING, TextAttribute.KERNING_ON); + font = font.deriveFont(attributes); + fontCache.put(fontPath, font); + } + else + { + PWCGLogger.log(LogLevel.ERROR, "Font not found: " + fontPath); + } + } + + if (font == null) + return null; + else + return font.deriveFont(size); + } + catch (IOException | FontFormatException e) + { + PWCGLogger.logException(e); + throw new PWCGIOException(e.getMessage()); + } + } +} diff --git a/src/main/java/pwcg/gui/display/model/CombatReportBuilder.java b/src/main/java/pwcg/gui/display/model/CombatReportBuilder.java index a6259cbbe..95fa282e2 100644 --- a/src/main/java/pwcg/gui/display/model/CombatReportBuilder.java +++ b/src/main/java/pwcg/gui/display/model/CombatReportBuilder.java @@ -166,7 +166,7 @@ private String createEquipmentLostReport() throws PWCGException for (PlaneStatusEvent planeLostEvent :squadronPlanesLostInMission.values()) { EquippedPlane lostPlane = campaign.getEquipmentManager().getPlaneFromAnySquadron(planeLostEvent.getPlaneSerialNumber()); - planesLostAppend += " " + lostPlane.getDisplayName() + ": " + lostPlane.getSerialNumber() + "\n"; + planesLostAppend += " " + lostPlane.getDisplayName() + ": " + lostPlane.getDisplayMarkings() + "\n"; } if (planesLostAppend.length() > 0) diff --git a/src/main/java/pwcg/gui/rofmap/brief/BriefingPilotPanelSet.java b/src/main/java/pwcg/gui/rofmap/brief/BriefingPilotPanelSet.java index 911c04386..5b0487348 100644 --- a/src/main/java/pwcg/gui/rofmap/brief/BriefingPilotPanelSet.java +++ b/src/main/java/pwcg/gui/rofmap/brief/BriefingPilotPanelSet.java @@ -254,7 +254,7 @@ private void addPilotColumn(JPanel assignedPilotPanel, CrewPlanePayloadPairing c private void addPlaneColumn(JPanel assignedPilotPanel, CrewPlanePayloadPairing crewPlane) throws PWCGException { - String planeName = crewPlane.getPlane().getDisplayName() + " (" + crewPlane.getPlane().getSerialNumber() + ")"; + String planeName = crewPlane.getPlane().getDisplayName() + " (" + crewPlane.getPlane().getDisplayMarkings() + ")"; JButton planeButton = PWCGButtonFactory.makeBriefingChalkBoardButton(planeName, "Change Plane:" + crewPlane.getPilot().getSerialNumber(), this); planeButton.setVerticalAlignment(SwingConstants.TOP); planeButton.setHorizontalAlignment(SwingConstants.LEFT); @@ -327,7 +327,7 @@ private JPanel createUnassignedPilots() throws PWCGException if (sortedUnassignedPlanes.size() > i) { EquippedPlane unassignedPlane = sortedUnassignedPlanes.get(i); - String planeNameText = unassignedPlane.getDisplayName() + " (" + unassignedPlane.getSerialNumber() + ")"; + String planeNameText = unassignedPlane.getDisplayName() + " (" + unassignedPlane.getDisplayMarkings() + ")"; JLabel planeLabel = PWCGButtonFactory.makeBriefingChalkBoardLabel(planeNameText); unassignedPilotPanel.add(planeLabel); } @@ -430,14 +430,9 @@ private void changePlaneForPilot(String action) throws PWCGException Integer pilotSerialNumber = getPilotSerialNumberFromAction(action); BriefingPlanePicker briefingPlanePicker = new BriefingPlanePicker(briefingMissionHandler, this); - String newPlaneChoice = briefingPlanePicker.pickPlane(pilotSerialNumber); - if (newPlaneChoice != null) + Integer planeSerialNumber = briefingPlanePicker.pickPlane(pilotSerialNumber); + if (planeSerialNumber != null) { - int index = newPlaneChoice.indexOf(":"); - index += 2; - String planeSerialNumberString = newPlaneChoice.substring(index); - Integer planeSerialNumber = Integer.valueOf(planeSerialNumberString); - briefingMissionHandler.changePlane(pilotSerialNumber, planeSerialNumber); } diff --git a/src/main/java/pwcg/gui/rofmap/brief/BriefingPlanePicker.java b/src/main/java/pwcg/gui/rofmap/brief/BriefingPlanePicker.java index 72d4b054a..d6f70b6f7 100644 --- a/src/main/java/pwcg/gui/rofmap/brief/BriefingPlanePicker.java +++ b/src/main/java/pwcg/gui/rofmap/brief/BriefingPlanePicker.java @@ -20,26 +20,42 @@ public BriefingPlanePicker(BriefingMissionFlight missionEditHandler, JComponent this.parent = parent; } - public String pickPlane(Integer pilotSerialNumber) throws PWCGException + public Integer pickPlane(Integer pilotSerialNumber) throws PWCGException { List squadronPlanes = missionEditHandler.getSortedUnassignedPlanes(); Object[] possibilities = new Object[squadronPlanes.size()]; for (int i = 0; i < squadronPlanes.size(); ++i) { EquippedPlane plane = squadronPlanes.get(i); - String planeSelectionString = plane.getDisplayName() + " : " + plane.getSerialNumber(); - possibilities[i] = (Object)planeSelectionString; + PickerEntry entry = new PickerEntry(); + entry.description = plane.getDisplayName() + " (" + plane.getDisplayMarkings() + ")"; + entry.plane = plane; + possibilities[i] = entry; } - String pickedPlane = (String)JOptionPane.showInputDialog( + PickerEntry pickedPlane = (PickerEntry)JOptionPane.showInputDialog( parent, "Select Plane", "Select Plane", JOptionPane.PLAIN_MESSAGE, null, possibilities, - ""); + null); - return pickedPlane; + if (pickedPlane != null) + return pickedPlane.plane.getSerialNumber(); + + return null; } + + private static class PickerEntry + { + public String description; + public EquippedPlane plane; + + public String toString() + { + return description; + } + } } diff --git a/src/main/java/pwcg/gui/rofmap/debrief/DebriefMapGUI.java b/src/main/java/pwcg/gui/rofmap/debrief/DebriefMapGUI.java index bcb2caa40..25194afa1 100644 --- a/src/main/java/pwcg/gui/rofmap/debrief/DebriefMapGUI.java +++ b/src/main/java/pwcg/gui/rofmap/debrief/DebriefMapGUI.java @@ -19,6 +19,7 @@ import pwcg.aar.AARCoordinator; import pwcg.aar.MissionFileCleaner; import pwcg.aar.MissionResultLogFileCleaner; +import pwcg.aar.TemplatedSkinCleaner; import pwcg.aar.inmission.phase2.logeval.missionresultentity.LogBase; import pwcg.aar.inmission.phase2.logeval.missionresultentity.LogDamage; import pwcg.aar.inmission.phase2.logeval.missionresultentity.LogVictory; @@ -236,6 +237,8 @@ private void finishDebrief() throws PWCGException MissionFileCleaner missionFileCleaner = new MissionFileCleaner(); missionFileCleaner.cleanMissionFiles(); + TemplatedSkinCleaner.cleanSkinFiles(); + showMissionEvents(); } diff --git a/src/main/java/pwcg/gui/rofmap/event/AAREquipmentChangePanel.java b/src/main/java/pwcg/gui/rofmap/event/AAREquipmentChangePanel.java index 9cde82555..afe62f64e 100644 --- a/src/main/java/pwcg/gui/rofmap/event/AAREquipmentChangePanel.java +++ b/src/main/java/pwcg/gui/rofmap/event/AAREquipmentChangePanel.java @@ -83,7 +83,7 @@ private HashMap createEquipmentLostSub if (planeStatusEvent.getSquadronId() == referencePlayer.getSquadronId()) { CampaignReportEquipmentStatusGUI equipmentChangeGui = new CampaignReportEquipmentStatusGUI(campaign, planeStatusEvent); - String tabName = "Plane Lost: " + planeStatusEvent.getPlaneSerialNumber(); + String tabName = "Plane Lost: " + planeStatusEvent.getDisplaySerial(); equipmentLostGuiList.put(tabName, equipmentChangeGui); } } diff --git a/src/main/java/pwcg/mission/Mission.java b/src/main/java/pwcg/mission/Mission.java index a9bcdaa6f..f5aa9cdca 100644 --- a/src/main/java/pwcg/mission/Mission.java +++ b/src/main/java/pwcg/mission/Mission.java @@ -11,6 +11,7 @@ import pwcg.campaign.context.PWCGContext; import pwcg.campaign.context.PWCGProduct; import pwcg.campaign.io.json.CampaignMissionIOJson; +import pwcg.campaign.skin.SkinTemplate.SkinTemplateInstance; import pwcg.core.exception.PWCGException; import pwcg.core.location.Coordinate; import pwcg.core.location.CoordinateBox; @@ -56,6 +57,7 @@ public class Mission private MissionProfile missionProfile = MissionProfile.DAY_TACTICAL_MISSION; private MissionOptions missionOptions; private List stopSequenceForMission = new ArrayList<>(); + private List skinsToGenerate; public Mission(Campaign campaign, MissionProfile missionProfile, MissionHumanParticipants participatingPlayers, CoordinateBox missionBorders) throws PWCGException @@ -424,4 +426,13 @@ public List getStopSequenceForMission() { return stopSequenceForMission; } + + public void setSkinsToGenerate(List skinsToGenerate) + { + this.skinsToGenerate = skinsToGenerate; + } + + public List getSkinsToGenerate() { + return skinsToGenerate; + } } diff --git a/src/main/java/pwcg/mission/MissionFlightFinalizer.java b/src/main/java/pwcg/mission/MissionFlightFinalizer.java index a85f89b9d..1375f489f 100644 --- a/src/main/java/pwcg/mission/MissionFlightFinalizer.java +++ b/src/main/java/pwcg/mission/MissionFlightFinalizer.java @@ -37,6 +37,8 @@ public void finalizeMissionFlights() throws PWCGException setFlightAttackMcuForBalloons(); setCzTriggers(); + + mission.setSkinsToGenerate(MissionSkinTemplateGenerator.instantiateTemplates(campaign, mission.getMissionFlightBuilder().getAllAerialFlights())); } private void convertForCoop() throws PWCGException, PWCGException diff --git a/src/main/java/pwcg/mission/MissionSkinGenerator.java b/src/main/java/pwcg/mission/MissionSkinGenerator.java index b1f881ce0..c00be4779 100644 --- a/src/main/java/pwcg/mission/MissionSkinGenerator.java +++ b/src/main/java/pwcg/mission/MissionSkinGenerator.java @@ -8,6 +8,8 @@ import pwcg.campaign.skin.Skin; import pwcg.campaign.squadmember.SquadronMember; import pwcg.campaign.squadron.Squadron; +import pwcg.core.config.ConfigItemKeys; +import pwcg.core.config.ConfigManagerGlobal; import pwcg.core.constants.AiSkillLevel; import pwcg.core.exception.PWCGException; import pwcg.core.utils.PWCGLogger; @@ -38,17 +40,17 @@ public void assignSkinsForFlight(IFlight flight) throws PWCGException } } - private void setSkinForPlayerSquadron(SquadronMember pilot, Squadron squad, PlaneMcu plane, Date date) + private void setSkinForPlayerSquadron(SquadronMember pilot, Squadron squad, PlaneMcu plane, Date date) throws PWCGException { plane.setPlaneSkin(null); - setSquadronSkin(squad, plane, date); + setSquadronSkin(squad, plane, date, true); setUserAssignedPilotSkin(pilot, plane); } private void setAISkin(Squadron squad, PlaneMcu plane, Date date) throws PWCGException { // Start with setting the squadron livery - setSquadronSkin(squad, plane, date); + setSquadronSkin(squad, plane, date, true); if (plane.getAiLevel() != AiSkillLevel.NOVICE) { @@ -159,8 +161,9 @@ private Skin pickSkin(String planeName, List skinSet) } - private void setSquadronSkin(Squadron squadron, PlaneMcu plane, Date date) + private void setSquadronSkin(Squadron squadron, PlaneMcu plane, Date date, boolean isPlayerFlight) throws PWCGException { + int generateSkins = ConfigManagerGlobal.getInstance().getIntConfigParam(ConfigItemKeys.GenerateSkinsKey); Skin selectedSkin = null; // Start by setting to squadron livery @@ -188,7 +191,17 @@ private void setSquadronSkin(Squadron squadron, PlaneMcu plane, Date date) { continue; } - + + if (!squadSkin.skinExists(Skin.PRODUCT_SKIN_DIR)) + { + continue; + } + + if (squadSkin.getTemplate() != null && (generateSkins == 0 || (generateSkins == 1 && !isPlayerFlight))) + { + continue; + } + selectedSkin = squadSkin; } diff --git a/src/main/java/pwcg/mission/MissionSkinTemplateGenerator.java b/src/main/java/pwcg/mission/MissionSkinTemplateGenerator.java new file mode 100644 index 000000000..b0c0b8374 --- /dev/null +++ b/src/main/java/pwcg/mission/MissionSkinTemplateGenerator.java @@ -0,0 +1,126 @@ +package pwcg.mission; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import pwcg.campaign.Campaign; +import pwcg.campaign.context.PWCGContext; +import pwcg.campaign.context.PWCGMap; +import pwcg.campaign.context.PWCGMap.FrontMapIdentifier; +import pwcg.campaign.factory.RankFactory; +import pwcg.campaign.skin.Skin; +import pwcg.campaign.skin.SkinTemplate; +import pwcg.campaign.skin.SkinsForPlane; +import pwcg.campaign.squadmember.SquadronMember; +import pwcg.campaign.skin.SkinTemplate.SkinTemplateInstance; +import pwcg.campaign.squadron.Squadron; +import pwcg.core.config.ConfigItemKeys; +import pwcg.core.config.ConfigManagerGlobal; +import pwcg.core.exception.PWCGException; +import pwcg.core.utils.AsyncJobRunner; +import pwcg.core.utils.DateUtils; +import pwcg.mission.flight.IFlight; +import pwcg.mission.flight.plane.PlaneMcu; + +import pwcg.mission.options.MapSeasonalParameters.Season; + +public class MissionSkinTemplateGenerator +{ + public static List instantiateTemplates(Campaign campaign, List list) throws PWCGException + { + List skinsToGenerate = new ArrayList<>(); + int generateSkinLimit = ConfigManagerGlobal.getInstance().getIntConfigParam(ConfigItemKeys.GenerateSkinLimitKey); + + for (IFlight flight : list) + { + for (PlaneMcu plane : flight.getFlightPlanes().getPlanes()) + { + SkinsForPlane skinsForPlane = PWCGContext.getInstance().getSkinManager().getSkinsForPlane(plane.getType()); + Skin skin = plane.getPlaneSkin(); + if (skin != null && skin.getTemplate() != null && (generateSkinLimit == 0 || skinsToGenerate.size() < generateSkinLimit)) + { + SkinTemplate template = skinsForPlane.getTemplate(plane.getPlaneSkin().getTemplate()); + if (template == null) + continue; + + Map params = new HashMap<>(); + Squadron squadron = PWCGContext.getInstance().getSquadronManager().getSquadron(plane.getSquadronId()); + Date date = campaign.getDate(); + params.put("UNIT_ID_CODE", squadron.determineUnitIdCode(date)); + params.put("SUB_UNIT_ID_CODE", squadron.determineSubUnitIdCode(date)); + params.put("AIRCRAFT_ID_CODE", plane.getAircraftIdCode()); + + String serial = plane.getServiceSerial(); + params.put("SERIAL", serial); + if (serial != null && serial.contains("-")) + { + String tailcode = serial.replaceAll("-", "").substring(1); + params.put("TAIL_CODE", tailcode); + params.put("TAIL_CODE_START", tailcode.substring(0, tailcode.length() - 3)); + params.put("TAIL_CODE_END", tailcode.substring(tailcode.length() - 3)); + } + + PWCGMap currentMap = PWCGContext.getInstance().getCurrentMap(); + params.put("WINTER", (currentMap.getMapWeather().getSeason(date) == Season.WINTER) ? 1 : 0); + params.put("WESTERN_FRONT", (currentMap.getMapIdentifier() == FrontMapIdentifier.BODENPLATTE_MAP) ? 1 : 0); + + SquadronMember pilot = plane.getPilot(); + int rank_pos = RankFactory.createRankHelper().getRankPosByService(pilot.getRank(), pilot.determineService(date)); + params.put("PILOT_RANK", rank_pos); + switch (rank_pos) + { + case 0: params.put("RANK_FLAG", "Insignia\\raf_sqn_ldr.png"); + params.put("FLAG_NUM", squadron.determineDisplayName(date).split(" ")[0]); + break; + } + params.put("PILOT_NAME_RANK", pilot.getNameAndRank()); + params.put("PILOT_NAME_RANK_UC", pilot.getNameAndRank().toUpperCase()); + String[] name_words = pilot.getName().split(" "); + String name_init = pilot.determineRankAbbrev() + " "; + for (int i = 0; i < name_words.length - 1; i++) + { + name_init += name_words[i].charAt(0) + ". "; + } + name_init += name_words[name_words.length - 1]; + params.put("PILOT_NAME_RANK_INIT", name_init); + params.put("PILOT_NAME_RANK_INIT_UC", name_init.toUpperCase()); + + int stripes = date.before(DateUtils.getDateYYYYMMDD("19440606")) ? 0 : + date.before(DateUtils.getDateYYYYMMDD("19440706")) ? 2 : + date.before(DateUtils.getDateYYYYMMDD("19450101")) ? 1 : + 0; + params.put("STRIPES", stripes); + + params.putAll(skin.getOverrides()); + SkinTemplateInstance instance = template.instantiate(params); + if (!instance.skinExists()) { + skinsToGenerate.add(instance); + } + + Skin renderedSkin = new Skin(); + renderedSkin.setSkinName(instance.getFilename()); + plane.setPlaneSkin(renderedSkin); + } + } + } + return skinsToGenerate; + } + + public static void generateSkins(List skinsToGenerate, AsyncJobRunner runner) + { + if (!skinsToGenerate.isEmpty()) + { + List jobs = new ArrayList<>(); + + for (SkinTemplateInstance instance : skinsToGenerate) + { + jobs.add(() -> instance.generate()); + } + + runner.add("Generating skins...", jobs); + } + } +} diff --git a/src/main/java/pwcg/mission/io/MissionFileWriter.java b/src/main/java/pwcg/mission/io/MissionFileWriter.java index eb2325cb8..3147246ea 100644 --- a/src/main/java/pwcg/mission/io/MissionFileWriter.java +++ b/src/main/java/pwcg/mission/io/MissionFileWriter.java @@ -33,6 +33,7 @@ import pwcg.mission.MissionBlockCountry; import pwcg.mission.MissionBlockDamage; import pwcg.mission.MissionBlockSmoke; +import pwcg.mission.MissionSkinTemplateGenerator; import pwcg.mission.ambient.AmbientGroundUnitBuilder; import pwcg.mission.flight.IFlight; import pwcg.mission.ground.vehicle.IVehicle; @@ -105,6 +106,7 @@ private void runAsyncTasks() throws PWCGException { AsyncJobRunner runner = new AsyncJobRunner("Generating mission"); buildMissionBinaryFile(runner); + MissionSkinTemplateGenerator.generateSkins(mission.getSkinsToGenerate(), runner); runner.finish(); } else diff --git a/src/main/java/pwcg/product/bos/plane/BoSPlaneMarkingManager.java b/src/main/java/pwcg/product/bos/plane/BoSPlaneMarkingManager.java new file mode 100644 index 000000000..5e076e18e --- /dev/null +++ b/src/main/java/pwcg/product/bos/plane/BoSPlaneMarkingManager.java @@ -0,0 +1,246 @@ +package pwcg.product.bos.plane; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import pwcg.campaign.Campaign; +import pwcg.campaign.context.Country; +import pwcg.campaign.context.PWCGContext; +import pwcg.campaign.plane.Equipment; +import pwcg.campaign.plane.EquippedPlane; +import pwcg.campaign.plane.IPlaneMarkingManager; +import pwcg.campaign.squadron.Squadron; +import pwcg.core.exception.PWCGException; +import pwcg.core.utils.DateUtils; +import pwcg.core.utils.PWCGLogger; +import pwcg.core.utils.RandomNumberGenerator; +import pwcg.product.bos.country.BoSServiceManager; + +public class BoSPlaneMarkingManager implements IPlaneMarkingManager { + private static String RAF_OLD_SERIAL_LETTERS = "KLMNPRTVWXZ"; + private static String RAF_NEW_SERIAL_LETTERS = "ABDEFGHJKLMNPRSTVWXZ"; + + private static Map USAAF_ORDERS_BY_YEAR = new HashMap<>(); + static { + USAAF_ORDERS_BY_YEAR.put(1940, 3162); + USAAF_ORDERS_BY_YEAR.put(1941, 39600); + USAAF_ORDERS_BY_YEAR.put(1942, 100000); // Actual value is 110188, but limit to avoid 7-digit tail codes + USAAF_ORDERS_BY_YEAR.put(1943, 52437); + USAAF_ORDERS_BY_YEAR.put(1944, 92098); + } + + @Override + public void allocatePlaneIdCode(Campaign campaign, int squadronId, Equipment equipment, EquippedPlane equippedPlane) throws PWCGException + { + Squadron squadron = PWCGContext.getInstance().getSquadronManager().getSquadron(squadronId); + + Set allocatedCodes = new HashSet<>(); + for (EquippedPlane plane : equipment.getActiveEquippedPlanes().values()) + { + allocatedCodes.add(plane.getAircraftIdCode()); + } + + if (squadron.getService() == BoSServiceManager.LUFTWAFFE) + { + if (squadron.determineDisplayName(campaign.getDate()).contains("JG") || + (squadron.determineDisplayName(campaign.getDate()).contains("SG") && + squadron.determineUnitIdCode(campaign.getDate()) == null)) + { + // Allocate numbers 1-N + int code = 1; + while (allocatedCodes.contains(Integer.toString(code))) + code++; + + equippedPlane.setAircraftIdCode(Integer.toString(code)); + } else { + // Allocate letters from A + // Do this randomly rather than in sequence? + char code = 'A'; + while (allocatedCodes.contains(Character.toString(code))) + code++; + if (code > 'Z') + throw new PWCGException("Unable to allocate plane ID code for squadron " + squadron.getSquadronId()); + + equippedPlane.setAircraftIdCode(Character.toString(code)); + } + } + else if (squadron.getService() == BoSServiceManager.VVS || + squadron.getService() == BoSServiceManager.NORMANDIE) + { + // Random numbers 1-99 + int code = RandomNumberGenerator.getRandom(99); + while (allocatedCodes.contains(Integer.toString(code + 1))) + code = (code + 1) % 99; + + equippedPlane.setAircraftIdCode(Integer.toString(code + 1)); + } + else if (squadron.getService() == BoSServiceManager.REGIA_AERONAUTICA) + { + // Allocate numbers 1-N + int code = 1; + while (allocatedCodes.contains(Integer.toString(code))) + code++; + + equippedPlane.setAircraftIdCode(Integer.toString(code)); + } + else if (squadron.getService() == BoSServiceManager.USAAF || + squadron.getService() == BoSServiceManager.RAF || + squadron.getService() == BoSServiceManager.FREE_FRENCH) + { + // Allocate letters from A + // Do this randomly rather than in sequence? + char code = 'A'; + while (allocatedCodes.contains(Character.toString(code))) + code++; + if (code > 'Z') + throw new PWCGException("Unable to allocate plane ID code for squadron " + squadron.getSquadronId()); + + equippedPlane.setAircraftIdCode(Character.toString(code)); + } + } + + @Override + public String determineDisplayMarkings(Campaign campaign, EquippedPlane equippedPlane) throws PWCGException { + Squadron squadron = PWCGContext.getInstance().getSquadronManager().getSquadron(equippedPlane.getSquadronId()); + + if (squadron.getService() == BoSServiceManager.LUFTWAFFE) + { + if (squadron.determineDisplayName(campaign.getDate()).contains("JG") || + squadron.determineDisplayName(campaign.getDate()).contains("Sch.G") || + (squadron.determineDisplayName(campaign.getDate()).contains("SG") && + squadron.determineUnitIdCode(campaign.getDate()) == null)) + { + return equippedPlane.getAircraftIdCode() + "+" + squadron.determineSubUnitIdCode(campaign.getDate()); + } else { + return squadron.determineUnitIdCode(campaign.getDate()) + + "+" + + equippedPlane.getAircraftIdCode() + + squadron.determineSubUnitIdCode(campaign.getDate()); + } + } + else if (squadron.getService() == BoSServiceManager.VVS || + squadron.getService() == BoSServiceManager.NORMANDIE) + { + return equippedPlane.getAircraftIdCode(); + } + else if (squadron.getService() == BoSServiceManager.REGIA_AERONAUTICA || + squadron.getService() == BoSServiceManager.USAAF || + squadron.getService() == BoSServiceManager.RAF || + squadron.getService() == BoSServiceManager.FREE_FRENCH) + { + return squadron.determineUnitIdCode(campaign.getDate()) + + "-" + + equippedPlane.getAircraftIdCode(); + } + + return equippedPlane.getDisplaySerial(); + } + + @Override + public void generatePlaneSerial(Date date, EquippedPlane plane, int service) throws PWCGException + { + if (service == BoSServiceManager.RAF || service == BoSServiceManager.FREE_FRENCH || (service == BoSServiceManager.VVS && plane.getPrimaryUsedBy().indexOf(Country.BRITAIN) == 0)) + { + double days = DateUtils.daysDifference(DateUtils.getDateYYYYMMDD("19000101"), date); + + // Assume 14-90 days delivery time + days -= 14; + days -= RandomNumberGenerator.getRandom((90-14) * 100) / 100.0; + + // Formula derived by plotting Spitfire production in Excel + int id = (int) (-3.83559265e-5*days*days*days + 1.806797f*days*days - 28157.9091*days + 145354255); + + if (id < RAF_OLD_SERIAL_LETTERS.length() * 9000) + { + plane.setServiceSerial(String.format("%c%04d", + RAF_OLD_SERIAL_LETTERS.charAt(id / 9000), + (id % 9000) + 1000)); + } else { + int sub_id = id - RAF_OLD_SERIAL_LETTERS.length() * 9000; + int id_low = (sub_id % 900) + 100; + int id_mid = (sub_id / 900) % RAF_NEW_SERIAL_LETTERS.length(); + int id_high = sub_id / (900 * RAF_NEW_SERIAL_LETTERS.length()); + + plane.setServiceSerial(String.format("%c%c%03d", + RAF_NEW_SERIAL_LETTERS.charAt(id_high), + RAF_NEW_SERIAL_LETTERS.charAt(id_mid), + id_low)); + } + } + else if (service == BoSServiceManager.USAAF || (service == BoSServiceManager.VVS && plane.getPrimaryUsedBy().indexOf(Country.USA) == 0)) + { + // Assume 6-12 months from order to delivery + Date orderDate = DateUtils.advanceTimeDays(date, -182 - RandomNumberGenerator.getRandom(183)); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(orderDate); + float dayOffset = calendar.get(Calendar.DAY_OF_YEAR); + dayOffset += RandomNumberGenerator.getRandom(1000) / 1000f; + int sequence = (int) (dayOffset / 365f * USAAF_ORDERS_BY_YEAR.get(calendar.get(Calendar.YEAR))); + + plane.setServiceSerial(String.format("%02d-%03d", + calendar.get(Calendar.YEAR) % 100, + sequence)); + } + else if (service == BoSServiceManager.VVS || plane.getPrimaryUsedBy().indexOf(Country.RUSSIA) == 0) + { + try { + // Generate a fake Zavod number - assume each arch type was made in one factory + MessageDigest md = MessageDigest.getInstance("SHA-1"); + md.update(plane.getArchType().getBytes()); + int zavod = ((256 + (int)md.digest()[0]) % 256) + 1; + + double days = DateUtils.daysDifference(DateUtils.getDateYYYYMMDD("19390101"), date); + + // Assume 14-90 days delivery time + days -= 14; + days -= RandomNumberGenerator.getRandom((90-14) * 100) / 100.0; + + int serial = (int)(days * 40); + + plane.setServiceSerial(String.format("%d%05d", zavod, serial)); + } catch (NoSuchAlgorithmException e) { + PWCGLogger.logException(e); + } + + } + else if (service == BoSServiceManager.LUFTWAFFE || plane.getPrimaryUsedBy().indexOf(Country.GERMANY) == 0) + { + try { + double days = DateUtils.daysDifference(DateUtils.getDateYYYYMMDD("19390601"), date); + + // Assume 14-90 days delivery time + days -= 14; + days -= RandomNumberGenerator.getRandom((90-14) * 100) / 100.0; + + // Assume werknummern are allocated in blocks of 230 + int serial = (int) (days * 8); + serial = ((serial / 230) * 230 * 47) + (serial % 230); + + MessageDigest md = MessageDigest.getInstance("SHA-1"); + md.update(plane.getType().getBytes()); + serial += ((256 + (int)md.digest()[0]) % 47) * 230; + + plane.setServiceSerial(Integer.toString(serial)); + } catch (NoSuchAlgorithmException e) { + PWCGLogger.logException(e); + } + } + } + + @Override + public void generatePlaneSerialHistoric(Campaign campaign, EquippedPlane equippedPlane, int service) throws PWCGException { + // Randomize a deployment date for the plane + Date deployDate = DateUtils.advanceTimeDays(campaign.getDate(), -RandomNumberGenerator.getRandom(270)); + if (deployDate.before(equippedPlane.getIntroduction())) + deployDate = equippedPlane.getIntroduction(); + generatePlaneSerial(deployDate, equippedPlane, service); + } + +}