diff --git a/game/db.py b/game/db.py index 5200d401..4640471b 100644 --- a/game/db.py +++ b/game/db.py @@ -101,8 +101,8 @@ PRICES = { AirDefence.AAA_ZU_23_on_Ural_375: 5, AirDefence.SAM_SA_18_Igla_S_MANPADS: 8, - AirDefence.SAM_SA_19_Tunguska_2S6: 10, - AirDefence.SAM_SA_8_Osa_9A33: 15, + AirDefence.SAM_SA_19_Tunguska_2S6: 15, + AirDefence.SAM_SA_8_Osa_9A33: 13, # ship CV_1143_5_Admiral_Kuznetsov: 100, @@ -174,13 +174,15 @@ UNIT_BY_TASK = { AirDefence.AAA_Vulcan_M163, AirDefence.SAM_Avenger_M1097, AirDefence.SAM_Avenger_M1097, + AirDefence.SAM_Avenger_M1097, AirDefence.SAM_Patriot_ICC, AirDefence.AAA_ZU_23_on_Ural_375, AirDefence.AAA_ZU_23_on_Ural_375, - AirDefence.SAM_SA_19_Tunguska_2S6, - AirDefence.SAM_SA_19_Tunguska_2S6, + AirDefence.AAA_ZU_23_on_Ural_375, AirDefence.SAM_SA_8_Osa_9A33, + AirDefence.SAM_SA_8_Osa_9A33, + AirDefence.SAM_SA_19_Tunguska_2S6, ], Reconnaissance: [Unarmed.Transport_M818, Unarmed.Transport_Ural_375, Unarmed.Transport_UAZ_469], @@ -240,7 +242,6 @@ UNIT_BY_COUNTRY = { MiG_29A, MiG_29S, M_2000C, - AV8BNA, Su_25T, Su_34, @@ -258,8 +259,8 @@ UNIT_BY_COUNTRY = { AirDefence.AAA_ZU_23_on_Ural_375, AirDefence.SAM_SA_18_Igla_S_MANPADS, - AirDefence.SAM_SA_19_Tunguska_2S6, AirDefence.SAM_SA_8_Osa_9A33, + AirDefence.SAM_SA_19_Tunguska_2S6, Armor.APC_BTR_80, Armor.MBT_T_90, @@ -415,7 +416,7 @@ def choose_units(for_task: Task, factor: float, count: int, country: str) -> typ index_start = min(idx, len(suitable_unittypes) - variety) index_end = min(idx + variety, len(suitable_unittypes)) - return suitable_unittypes[index_start:index_end] + return set(suitable_unittypes[index_start:index_end]) def _validate_db(): diff --git a/game/event/groundattack.py b/game/event/groundattack.py index 023d331d..ad55d4d5 100644 --- a/game/event/groundattack.py +++ b/game/event/groundattack.py @@ -13,6 +13,10 @@ class GroundAttackEvent(GroundInterceptEvent): def __str__(self): return "Destroy insurgents at {}".format(self.to_cp) + @property + def threat_description(self): + return "" + def player_defending(self, strikegroup: db.PlaneDict, clients: db.PlaneDict): suitable_unittypes = db.find_unittype(Reconnaissance, self.attacker_name) random.shuffle(suitable_unittypes) diff --git a/game/game.py b/game/game.py index dbd5e690..b0e51337 100644 --- a/game/game.py +++ b/game/game.py @@ -18,7 +18,7 @@ COMMISION_LIMITS_FACTORS = { PinpointStrike: 10, CAS: 5, CAP: 8, - AirDefence: 2, + AirDefence: 1, } COMMISION_AMOUNTS_SCALE = 1.5 @@ -46,18 +46,21 @@ Events: * InfantryTransportEvent - helicopter infantry transport """ EVENT_PROBABILITIES = { - CaptureEvent: [100, 8], - InterceptEvent: [25, 12], - GroundInterceptEvent: [25, 12], - GroundAttackEvent: [0, 12], - NavalInterceptEvent: [25, 12], - AntiAAStrikeEvent: [25, 12], + CaptureEvent: [100, 10], + InterceptEvent: [25, 10], + GroundInterceptEvent: [25, 10], + GroundAttackEvent: [0, 10], + NavalInterceptEvent: [25, 10], + AntiAAStrikeEvent: [25, 10], InfantryTransportEvent: [25, 0], } -# amount of strength captures bases recover for the turn +# amount of strength player bases recover for the turn PLAYER_BASE_STRENGTH_RECOVERY = 0.2 +# amount of strength enemy bases recover for the turn +ENEMY_BASE_STRENGTH_RECOVERY = 0.05 + # cost of AWACS for single operation AWACS_BUDGET_COST = 4 @@ -110,11 +113,10 @@ class Game: for event_class, (player_probability, enemy_probability) in EVENT_PROBABILITIES.items(): if self._roll(player_probability, player_cp.base.strength): - if event_class == NavalInterceptEvent: - if enemy_cp.radials == LAND: - continue - - self.events.append(event_class(self.player, self.enemy, player_cp, enemy_cp, self)) + if event_class == NavalInterceptEvent and enemy_cp.radials == LAND: + pass + else: + self.events.append(event_class(self.player, self.enemy, player_cp, enemy_cp, self)) elif self._roll(enemy_probability, enemy_cp.base.strength): if event_class in enemy_generated_types: continue @@ -214,8 +216,10 @@ class Game: if not no_action: self._budget_player() + for cp in self.theater.enemy_points(): self._commision_units(cp) + for cp in self.theater.player_points(): cp.base.affect_strength(+PLAYER_BASE_STRENGTH_RECOVERY) diff --git a/theater/caucasus.py b/theater/caucasus.py index f0f6c692..7d075f13 100644 --- a/theater/caucasus.py +++ b/theater/caucasus.py @@ -24,23 +24,23 @@ class CaucasusTheater(ConflictTheater): soganlug = ControlPoint.from_airport(caucasus.Soganlug, LAND, SIZE_SMALL, IMPORTANCE_LOW) kutaisi = ControlPoint.from_airport(caucasus.Kutaisi, LAND, SIZE_SMALL, IMPORTANCE_LOW) senaki = ControlPoint.from_airport(caucasus.Senaki_Kolkhi, LAND, SIZE_REGULAR, IMPORTANCE_LOW) - kobuleti = ControlPoint.from_airport(caucasus.Kobuleti, COAST_A_E, SIZE_SMALL, IMPORTANCE_MEDIUM) - batumi = ControlPoint.from_airport(caucasus.Batumi, COAST_DL_E, SIZE_SMALL, IMPORTANCE_MEDIUM) - sukhumi = ControlPoint.from_airport(caucasus.Sukhumi_Babushara, COAST_DR_E, SIZE_REGULAR, IMPORTANCE_MEDIUM) - gudauta = ControlPoint.from_airport(caucasus.Gudauta, COAST_DR_E, SIZE_REGULAR, IMPORTANCE_MEDIUM) + kobuleti = ControlPoint.from_airport(caucasus.Kobuleti, COAST_A_E, SIZE_SMALL, 1.1) + batumi = ControlPoint.from_airport(caucasus.Batumi, COAST_DL_E, SIZE_SMALL, 1.3) + sukhumi = ControlPoint.from_airport(caucasus.Sukhumi_Babushara, COAST_DR_E, SIZE_REGULAR, 1.2) + gudauta = ControlPoint.from_airport(caucasus.Gudauta, COAST_DR_E, SIZE_REGULAR, 1.2) sochi = ControlPoint.from_airport(caucasus.Sochi_Adler, COAST_DR_E, SIZE_BIG, IMPORTANCE_HIGH) - gelendzhik = ControlPoint.from_airport(caucasus.Gelendzhik, COAST_DR_E, SIZE_BIG, IMPORTANCE_MEDIUM) + gelendzhik = ControlPoint.from_airport(caucasus.Gelendzhik, COAST_DR_E, SIZE_BIG, 1.1) maykop = ControlPoint.from_airport(caucasus.Maykop_Khanskaya, LAND, SIZE_LARGE, IMPORTANCE_HIGH) krasnodar = ControlPoint.from_airport(caucasus.Krasnodar_Center, LAND, SIZE_LARGE, IMPORTANCE_HIGH) - novorossiysk = ControlPoint.from_airport(caucasus.Novorossiysk, COAST_DR_E, SIZE_BIG, IMPORTANCE_MEDIUM) - krymsk = ControlPoint.from_airport(caucasus.Krymsk, LAND, SIZE_LARGE, IMPORTANCE_HIGH) + novorossiysk = ControlPoint.from_airport(caucasus.Novorossiysk, COAST_DR_E, SIZE_BIG, 1.2) + krymsk = ControlPoint.from_airport(caucasus.Krymsk, LAND, SIZE_LARGE, 1.2) anapa = ControlPoint.from_airport(caucasus.Anapa_Vityazevo, LAND, SIZE_LARGE, IMPORTANCE_HIGH) beslan = ControlPoint.from_airport(caucasus.Beslan, LAND, SIZE_REGULAR, IMPORTANCE_LOW) - nalchik = ControlPoint.from_airport(caucasus.Nalchik, LAND, SIZE_REGULAR, IMPORTANCE_LOW) - mineralnye = ControlPoint.from_airport(caucasus.Mineralnye_Vody, LAND, SIZE_BIG, IMPORTANCE_MEDIUM) - mozdok = ControlPoint.from_airport(caucasus.Mozdok, LAND, SIZE_BIG, IMPORTANCE_MEDIUM) + nalchik = ControlPoint.from_airport(caucasus.Nalchik, LAND, SIZE_REGULAR, 1.1) + mineralnye = ControlPoint.from_airport(caucasus.Mineralnye_Vody, LAND, SIZE_BIG, 1.3) + mozdok = ControlPoint.from_airport(caucasus.Mozdok, LAND, SIZE_BIG, 1.1) carrier_1 = ControlPoint.carrier("Carrier", mapping.Point(-305810.6875, 406399.1875)) diff --git a/theater/nevada.py b/theater/nevada.py index 3854e74a..4be8862b 100644 --- a/theater/nevada.py +++ b/theater/nevada.py @@ -20,16 +20,16 @@ class NevadaTheater(ConflictTheater): mina = ControlPoint.from_airport(nevada.Mina_Airport_3Q0, LAND, SIZE_SMALL, IMPORTANCE_LOW) tonopah = ControlPoint.from_airport(nevada.Tonopah_Airport, LAND, SIZE_SMALL, IMPORTANCE_LOW) tonopah_test_range = ControlPoint.from_airport(nevada.Tonopah_Test_Range_Airfield, LAND, SIZE_SMALL, IMPORTANCE_LOW) - lincoln_conty = ControlPoint.from_airport(nevada.Lincoln_County, LAND, SIZE_SMALL, IMPORTANCE_MEDIUM) + lincoln_conty = ControlPoint.from_airport(nevada.Lincoln_County, LAND, SIZE_SMALL, 1.2) - pahute_mesa = ControlPoint.from_airport(nevada.Pahute_Mesa_Airstrip, LAND, SIZE_SMALL, IMPORTANCE_MEDIUM) - groom_lake = ControlPoint.from_airport(nevada.Groom_Lake_AFB, LAND, SIZE_REGULAR, IMPORTANCE_MEDIUM) - mesquite = ControlPoint.from_airport(nevada.Mesquite, LAND, SIZE_REGULAR, IMPORTANCE_MEDIUM) - beatty = ControlPoint.from_airport(nevada.Beatty_Airport, LAND, SIZE_REGULAR, IMPORTANCE_MEDIUM) + pahute_mesa = ControlPoint.from_airport(nevada.Pahute_Mesa_Airstrip, LAND, SIZE_SMALL, 1.1) + groom_lake = ControlPoint.from_airport(nevada.Groom_Lake_AFB, LAND, SIZE_REGULAR, IMPORTANCE_HIGH) + mesquite = ControlPoint.from_airport(nevada.Mesquite, LAND, SIZE_REGULAR, 1.3) + beatty = ControlPoint.from_airport(nevada.Beatty_Airport, LAND, SIZE_REGULAR, 1.1) creech = ControlPoint.from_airport(nevada.Creech_AFB, LAND, SIZE_BIG, IMPORTANCE_HIGH) las_vegas = ControlPoint.from_airport(nevada.North_Las_Vegas, LAND, SIZE_LARGE, IMPORTANCE_HIGH) - jean = ControlPoint.from_airport(nevada.Jean_Airport, LAND, SIZE_REGULAR, IMPORTANCE_HIGH) + jean = ControlPoint.from_airport(nevada.Jean_Airport, LAND, SIZE_REGULAR, 1.2) laughlin = ControlPoint.from_airport(nevada.Laughlin_Airport, LAND, SIZE_LARGE, IMPORTANCE_HIGH) def __init__(self): diff --git a/theater/persiangulf.py b/theater/persiangulf.py index e029dae9..ee8fb98e 100644 --- a/theater/persiangulf.py +++ b/theater/persiangulf.py @@ -22,20 +22,20 @@ class PersianGulfTheater(ConflictTheater): al_dhafra = ControlPoint.from_airport(persiangulf.Al_Dhafra_AB, LAND, SIZE_BIG, IMPORTANCE_LOW) al_maktoum = ControlPoint.from_airport(persiangulf.Al_Maktoum_Intl, LAND, SIZE_BIG, IMPORTANCE_LOW) al_minhad = ControlPoint.from_airport(persiangulf.Al_Minhad_AB, LAND, SIZE_REGULAR, IMPORTANCE_LOW) - sir_abu_nuayr = ControlPoint.from_airport(persiangulf.Sir_Abu_Nuayr, [0, 330], SIZE_SMALL, IMPORTANCE_MEDIUM) + sir_abu_nuayr = ControlPoint.from_airport(persiangulf.Sir_Abu_Nuayr, [0, 330], SIZE_SMALL, 1.1) - dubai = ControlPoint.from_airport(persiangulf.Dubai_Intl, COAST_DL_E, SIZE_LARGE, IMPORTANCE_MEDIUM) - sharjah = ControlPoint.from_airport(persiangulf.Sharjah_Intl, LAND, SIZE_BIG, IMPORTANCE_MEDIUM) - fujairah = ControlPoint.from_airport(persiangulf.Fujairah_Intl, COAST_V_W, SIZE_REGULAR, IMPORTANCE_MEDIUM) - khasab = ControlPoint.from_airport(persiangulf.Khasab, LAND, SIZE_SMALL, IMPORTANCE_MEDIUM) + dubai = ControlPoint.from_airport(persiangulf.Dubai_Intl, COAST_DL_E, SIZE_LARGE, 1.3) + sharjah = ControlPoint.from_airport(persiangulf.Sharjah_Intl, LAND, SIZE_BIG, 1.2) + fujairah = ControlPoint.from_airport(persiangulf.Fujairah_Intl, COAST_V_W, SIZE_REGULAR, 1.3) + khasab = ControlPoint.from_airport(persiangulf.Khasab, LAND, SIZE_SMALL, 1.3) - sirri = ControlPoint.from_airport(persiangulf.Sirri_Island, COAST_DL_W, SIZE_REGULAR, IMPORTANCE_MEDIUM) - abu_musa = ControlPoint.from_airport(persiangulf.Abu_Musa_Island_Airport, LAND, SIZE_SMALL, IMPORTANCE_MEDIUM) - tunb_island = ControlPoint.from_airport(persiangulf.Tunb_Island_AFB, [0, 270, 330], SIZE_REGULAR, IMPORTANCE_HIGH) + sirri = ControlPoint.from_airport(persiangulf.Sirri_Island, COAST_DL_W, SIZE_REGULAR, 1.2) + abu_musa = ControlPoint.from_airport(persiangulf.Abu_Musa_Island_Airport, LAND, SIZE_SMALL, 1.0) + tunb_island = ControlPoint.from_airport(persiangulf.Tunb_Island_AFB, [0, 270, 330], SIZE_REGULAR, 1.1) tunb_kochak = ControlPoint.from_airport(persiangulf.Tunb_Kochak, [135, 180], SIZE_SMALL, IMPORTANCE_HIGH) bandar_lengeh = ControlPoint.from_airport(persiangulf.Bandar_Lengeh, [270, 315, 0, 45], SIZE_SMALL, IMPORTANCE_HIGH) - qeshm = ControlPoint.from_airport(persiangulf.Qeshm_Island, [270, 315, 0, 45, 90, 135, 180], SIZE_SMALL, IMPORTANCE_HIGH) + qeshm = ControlPoint.from_airport(persiangulf.Qeshm_Island, [270, 315, 0, 45, 90, 135, 180], SIZE_SMALL, 1.1) havadarya = ControlPoint.from_airport(persiangulf.Havadarya, COAST_DL_W, SIZE_REGULAR, IMPORTANCE_HIGH) bandar_abbas = ControlPoint.from_airport(persiangulf.Bandar_Abbas_Intl, LAND, SIZE_BIG, IMPORTANCE_HIGH) diff --git a/theater/start_generator.py b/theater/start_generator.py index 596a6b69..f07bf06d 100644 --- a/theater/start_generator.py +++ b/theater/start_generator.py @@ -11,7 +11,7 @@ COUNT_BY_TASK = { PinpointStrike: 12, CAP: 8, CAS: 4, - AirDefence: 2, + AirDefence: 1, }