diff --git a/README.md b/README.md index 36608ca8..ebb02baa 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,33 @@ -[DCS World](https://www.digitalcombatsimulator.com/en/products/world/) single-player liberation dynamic campaign. +![Logo](https://i.imgur.com/c2k18E1.png) -[Installation instructions/Manual](https://github.com/shdwp/dcs_liberation/wiki) - -Inspired by *ARMA Liberation* mission. +[DCS World](https://www.digitalcombatsimulator.com/en/products/world/) single-player dynamic campaign. Uses [pydcs](http://github.com/pydcs/dcs) for mission generation. +## Installation +1. Download and install **Python 3.6.0** package from https://www.python.org/downloads/release/python-360/ (look at the bottom under *Files*; any option will do if it matches your architecture) with default set of options (you need to have *Install launcher for all users (recommended)* checked) +1. Download archived release (https://github.com/shdwp/dcs_liberation/releases; **not source code zip**, file should be named **dcs_liberation_xx.zip**) +1. Unzip the archive somewhere. Path does not matter. **Application will not work** if you start it without extracting +1. Run **start.bat** +1. If **"Windows protected your PC"** popup appears on your computer (windows blocks any application unknown to it), you can click on **"More info"** and **"Run anyway"** + +## Tutorials +* [Manual](https://github.com/shdwp/dcs_liberation/wiki/Manual) + +You should start with the manual, it covers everything you need to know before playing the campaign. + +* [Strike objectives reference images](https://imgur.com/a/vCSHa9f) + +If you can't find the strike objective you can see here how it's supposed to look. + +* [Troubleshooting](https://github.com/shdwp/dcs_liberation/wiki/Troubleshooting) + +You could also briefly check the troubleshooting page to get familiar with the known issues that you could probably fix by yourself. + +* [Modding tutorial](https://github.com/shdwp/dcs_liberation/wiki/Modding-tutorial) + +Modding tutorial will cover how to change default loadouts, configure which planes are present in the campaign (or add new altogether) and more. Check this out if you find that something is not going for your liking, there could be a tutorial for changing that. Although be aware that it would require changing source files and could easily result in non functioning application. + +* [Development guide](https://github.com/shdwp/dcs_liberation/wiki/Development-guide) + +If you want to contribute to the project, this will give you a brief overview and on how to actually run it from source files. diff --git a/game/db.py b/game/db.py index ecfbea3f..f61ee379 100644 --- a/game/db.py +++ b/game/db.py @@ -85,15 +85,14 @@ PRICES = { C_130: 8, # armor - Armor.MBT_T_55: 4, - Armor.MBT_T_80U: 8, - Armor.MBT_T_90: 10, + Armor.APC_BTR_80: 12, + Armor.MBT_T_55: 14, + Armor.MBT_T_80U: 18, + Armor.MBT_T_90: 20, - Armor.MBT_M60A3_Patton: 6, - Armor.MBT_M1A2_Abrams: 9, - - Armor.ATGM_M1134_Stryker: 6, - Armor.APC_BTR_80: 6, + Armor.ATGM_M1134_Stryker: 12, + Armor.MBT_M60A3_Patton: 14, + Armor.MBT_M1A2_Abrams: 18, Unarmed.Transport_UAZ_469: 3, Unarmed.Transport_Ural_375: 3, @@ -181,7 +180,24 @@ UNIT_BY_TASK = { AWACS: [E_3A, A_50, ], - PinpointStrike: [Armor.MBT_T_90, Armor.MBT_T_80U, Armor.MBT_T_55, Armor.MBT_M1A2_Abrams, Armor.MBT_M60A3_Patton, Armor.ATGM_M1134_Stryker, Armor.APC_BTR_80, ], + PinpointStrike: [ + Armor.APC_BTR_80, + Armor.APC_BTR_80, + Armor.APC_BTR_80, + Armor.MBT_T_55, + Armor.MBT_T_55, + Armor.MBT_T_55, + Armor.MBT_T_80U, + Armor.MBT_T_80U, + Armor.MBT_T_90, + + Armor.ATGM_M1134_Stryker, + Armor.ATGM_M1134_Stryker, + Armor.MBT_M60A3_Patton, + Armor.MBT_M60A3_Patton, + Armor.MBT_M60A3_Patton, + Armor.MBT_M1A2_Abrams, + ], AirDefence: [ # those are listed multiple times here to balance prioritization more into lower tier AAs AirDefence.AAA_Vulcan_M163, diff --git a/gen/armor.py b/gen/armor.py index de547111..070da766 100644 --- a/gen/armor.py +++ b/gen/armor.py @@ -20,7 +20,7 @@ FRONTLINE_CAS_FIGHTS_COUNT = 4, 8 FRONTLINE_CAS_GROUP_MIN = 1, 2 FRONTLINE_CAS_PADDING = 12000 -FIGHT_DISTANCE = 1500 +FIGHT_DISTANCE = 3500 class ArmorConflictGenerator: diff --git a/gen/groundobjectsgen.py b/gen/groundobjectsgen.py index dfb27b7f..9ec1cb3f 100644 --- a/gen/groundobjectsgen.py +++ b/gen/groundobjectsgen.py @@ -27,9 +27,10 @@ class GroundObjectsGenerator: center, heading = self.conflict.frontline_position(self.conflict.theater, self.conflict.from_cp, self.conflict.to_cp) heading -= 90 - position = self.conflict.find_ground_position(center.point_from_heading(heading, FARP_FRONTLINE_DISTANCE), heading) + initial_position = center.point_from_heading(heading, FARP_FRONTLINE_DISTANCE) + position = self.conflict.find_ground_position(initial_position, heading) if not position: - return + position = initial_position for i, _ in enumerate(range(0, number_of_units, self.FARP_CAPACITY)): position = position.point_from_heading(0, i * 275) diff --git a/gen/triggergen.py b/gen/triggergen.py index d22b0fa1..1c4ecc9b 100644 --- a/gen/triggergen.py +++ b/gen/triggergen.py @@ -81,9 +81,6 @@ class TriggersGenerator: if group.task == AWACS.name or group.task == Refueling.name: continue - if player_cp.position.distance_to_point(group.position) > PUSH_TRIGGER_SIZE * 3: - continue - push_by_trigger.append(group) if not group.units[0].is_human(): diff --git a/theater/caucasus.py b/theater/caucasus.py index 51922926..b6506b0b 100644 --- a/theater/caucasus.py +++ b/theater/caucasus.py @@ -64,10 +64,9 @@ class CaucasusTheater(ConflictTheater): self.add_controlpoint(self.gudauta, connected_to=[self.sochi, self.sukhumi]) self.add_controlpoint(self.sochi, connected_to=[self.gudauta, self.gelendzhik]) - self.add_controlpoint(self.gelendzhik, connected_to=[self.sochi, self.novorossiysk]) - self.add_controlpoint(self.novorossiysk, connected_to=[self.gelendzhik, self.anapa]) - self.add_controlpoint(self.krymsk, connected_to=[self.novorossiysk, self.anapa, self.krasnodar]) - self.add_controlpoint(self.anapa, connected_to=[self.novorossiysk, self.krymsk]) + self.add_controlpoint(self.gelendzhik, connected_to=[self.sochi, ]) + self.add_controlpoint(self.krymsk, connected_to=[self.anapa, self.krasnodar]) + self.add_controlpoint(self.anapa, connected_to=[self.krymsk]) self.add_controlpoint(self.krasnodar, connected_to=[self.krymsk, self.maykop]) self.add_controlpoint(self.carrier_1) diff --git a/userdata/debriefing.py b/userdata/debriefing.py index f4f6251f..dc43cf47 100644 --- a/userdata/debriefing.py +++ b/userdata/debriefing.py @@ -42,6 +42,10 @@ def parse_mutliplayer_debriefing(contents: str): key = "initiator" if element is None: element = {} + elif line.startswith("initiatorMissionID\t"): + key = "initiatorMissionID" + if element is None: + element = {} elif line.startswith("type\t"): key = "type" if element is None: