mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
number of fixes
This commit is contained in:
14
game/db.py
14
game/db.py
@@ -15,7 +15,7 @@ PRICES = {
|
||||
A_10A: 18,
|
||||
A_10C: 20,
|
||||
|
||||
F_A_18C: 18,
|
||||
FA_18C_hornet: 18,
|
||||
AV8BNA: 15,
|
||||
|
||||
Su_27: 30,
|
||||
@@ -23,13 +23,15 @@ PRICES = {
|
||||
F_15C: 30,
|
||||
M_2000C: 11,
|
||||
|
||||
MiG_15bis: 6,
|
||||
MiG_21Bis: 13,
|
||||
MiG_29A: 23,
|
||||
|
||||
IL_76MD: 13,
|
||||
S_3B_Tanker: 13,
|
||||
|
||||
A_50: 8,
|
||||
E_3A: 8,
|
||||
|
||||
# armor
|
||||
|
||||
Armor.MBT_T_55: 4,
|
||||
@@ -47,12 +49,13 @@ PRICES = {
|
||||
}
|
||||
|
||||
UNIT_BY_TASK = {
|
||||
FighterSweep: [Su_27, Su_33, Su_25, F_15C, MiG_15bis, MiG_21Bis, MiG_29A, F_A_18C, AV8BNA],
|
||||
FighterSweep: [Su_27, Su_33, FA_18C_hornet, F_15C, MiG_21Bis, MiG_29A, F_A_18C, AV8BNA],
|
||||
CAS: [Su_25T, A_10A, A_10C, ],
|
||||
CAP: [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, ],
|
||||
AirDefence: [AirDefence.AAA_ZU_23_on_Ural_375, AirDefence.SAM_Avenger_M1097 ],
|
||||
Transport: [IL_76MD, S_3B_Tanker, ],
|
||||
Carriage: [CVN_74_John_C__Stennis, CV_1143_5_Admiral_Kuznetsov, ],
|
||||
AWACS: [E_3A, A_50, ],
|
||||
}
|
||||
|
||||
UNIT_BY_COUNTRY = {
|
||||
@@ -61,9 +64,9 @@ UNIT_BY_COUNTRY = {
|
||||
Su_27,
|
||||
Su_33,
|
||||
Su_25,
|
||||
MiG_15bis,
|
||||
MiG_21Bis,
|
||||
MiG_29A,
|
||||
A_50,
|
||||
AirDefence.AAA_ZU_23_on_Ural_375,
|
||||
Armor.APC_BTR_80,
|
||||
Armor.MBT_T_90,
|
||||
@@ -74,8 +77,9 @@ UNIT_BY_COUNTRY = {
|
||||
|
||||
"USA": [F_15C,
|
||||
A_10C,
|
||||
F_A_18C,
|
||||
FA_18C_hornet,
|
||||
AV8BNA,
|
||||
E_3A,
|
||||
Armor.MBT_M1A2_Abrams,
|
||||
Armor.MBT_M60A3_Patton,
|
||||
Armor.ATGM_M1134_Stryker,
|
||||
|
||||
@@ -10,12 +10,12 @@ class Event:
|
||||
difficulty = 1 # type: int
|
||||
BONUS_BASE = 0
|
||||
|
||||
def __init__(self, attacker_name: str, defender_name: str, from_cp: ControlPoint, to_cp: ControlPoint, theater: ConflictTheater):
|
||||
def __init__(self, attacker_name: str, defender_name: str, from_cp: ControlPoint, to_cp: ControlPoint, game):
|
||||
self.attacker_name = attacker_name
|
||||
self.defender_name = defender_name
|
||||
self.to_cp = to_cp
|
||||
self.from_cp = from_cp
|
||||
self.theater = theater
|
||||
self.game = game
|
||||
|
||||
def bonus(self) -> int:
|
||||
return math.ceil(math.log(self.difficulty, DIFFICULTY_LOG_BASE) * self.BONUS_BASE)
|
||||
@@ -28,6 +28,7 @@ class Event:
|
||||
self.operation.generate()
|
||||
self.operation.mission.save("build/nextturn.miz")
|
||||
|
||||
def generate_quick(self):
|
||||
self.operation.prepare(is_quick=True)
|
||||
self.operation.generate()
|
||||
self.operation.mission.save('build/nextturn_quick.miz')
|
||||
@@ -91,7 +92,7 @@ class GroundInterceptEvent(Event):
|
||||
typecount = max(math.floor(self.difficulty * self.TARGET_AMOUNT_FACTOR), 1)
|
||||
self.targets = {unittype: typecount for unittype in unittypes}
|
||||
|
||||
op = GroundInterceptOperation(theater=self.theater,
|
||||
op = GroundInterceptOperation(game=self.game,
|
||||
attacker_name=self.attacker_name,
|
||||
defender_name=self.defender_name,
|
||||
attacker_clients=clients,
|
||||
@@ -128,7 +129,7 @@ class InterceptEvent(Event):
|
||||
|
||||
if self.is_successfull(debriefing):
|
||||
if self.from_cp.is_global:
|
||||
for cp in self.theater.enemy_points():
|
||||
for cp in self.game.theater.enemy_points():
|
||||
cp.base.affect_strength(-self.GLOBAL_STRENGTH_INFLUENCE)
|
||||
else:
|
||||
self.to_cp.base.affect_strength(self.STRENGTH_INFLUENCE * float(self.from_cp.captured and -1 or 1))
|
||||
@@ -146,7 +147,7 @@ class InterceptEvent(Event):
|
||||
|
||||
airdefense_unit = db.find_unittype(AirDefence, self.defender_name)[0]
|
||||
|
||||
op = InterceptOperation(theater=self.theater,
|
||||
op = InterceptOperation(game=self.game,
|
||||
attacker_name=self.attacker_name,
|
||||
defender_name=self.defender_name,
|
||||
attacker_clients=clients,
|
||||
@@ -166,7 +167,7 @@ class InterceptEvent(Event):
|
||||
self.transport_unit = random.choice(db.find_unittype(Transport, self.defender_name))
|
||||
assert self.transport_unit is not None
|
||||
|
||||
op = InterceptOperation(theater=self.theater,
|
||||
op = InterceptOperation(game=self.game,
|
||||
attacker_name=self.attacker_name,
|
||||
defender_name=self.defender_name,
|
||||
attacker_clients={},
|
||||
@@ -191,7 +192,9 @@ class CaptureEvent(Event):
|
||||
return "Attack from {} to {}".format(self.from_cp, self.to_cp)
|
||||
|
||||
def is_successfull(self, debriefing: Debriefing):
|
||||
attackers_success = len(debriefing.destroyed_units[self.defender_name]) > len(debriefing.destroyed_units[self.attacker_name])
|
||||
alive_attackers = sum(debriefing.alive_units[self.attacker_name].values())
|
||||
alive_defenders = sum(debriefing.alive_units[self.defender_name].values())
|
||||
attackers_success = alive_attackers > alive_defenders
|
||||
if self.from_cp.captured:
|
||||
return attackers_success
|
||||
else:
|
||||
@@ -219,7 +222,7 @@ class CaptureEvent(Event):
|
||||
escort = self.from_cp.base.scramble_sweep(self.to_cp)
|
||||
attackers = self.from_cp.base.assemble_cap(self.to_cp)
|
||||
|
||||
op = CaptureOperation(theater=self.theater,
|
||||
op = CaptureOperation(game=self.game,
|
||||
attacker_name=self.attacker_name,
|
||||
defender_name=self.defender_name,
|
||||
attacker_clients={},
|
||||
@@ -239,7 +242,7 @@ class CaptureEvent(Event):
|
||||
def player_attacking(self, cas: db.PlaneDict, escort: db.PlaneDict, armor: db.ArmorDict, clients: db.PlaneDict):
|
||||
interceptors = self.to_cp.base.scramble_sweep(for_target=self.to_cp)
|
||||
|
||||
op = CaptureOperation(theater=self.theater,
|
||||
op = CaptureOperation(game=self.game,
|
||||
attacker_name=self.attacker_name,
|
||||
defender_name=self.defender_name,
|
||||
attacker_clients=clients,
|
||||
@@ -261,12 +264,12 @@ class UnitsDeliveryEvent(Event):
|
||||
informational = True
|
||||
units = None # type: typing.Dict[UnitType, int]
|
||||
|
||||
def __init__(self, attacker_name: str, defender_name: str, from_cp: ControlPoint, to_cp: ControlPoint, theater: ConflictTheater):
|
||||
def __init__(self, attacker_name: str, defender_name: str, from_cp: ControlPoint, to_cp: ControlPoint, game):
|
||||
super(UnitsDeliveryEvent, self).__init__(attacker_name=attacker_name,
|
||||
defender_name=defender_name,
|
||||
from_cp=from_cp,
|
||||
to_cp=to_cp,
|
||||
theater=theater)
|
||||
game=game)
|
||||
|
||||
self.units = {}
|
||||
|
||||
|
||||
23
game/game.py
23
game/game.py
@@ -27,7 +27,7 @@ PLAYER_GROUNDINTERCEPT_PROBABILITY_BASE = 30
|
||||
PLAYER_INTERCEPT_GLOBAL_PROBABILITY_BASE = 50
|
||||
PLAYER_INTERCEPT_GLOBAL_PROBABILITY_LOG = 2
|
||||
|
||||
PLAYER_BUDGET_INITIAL = 60
|
||||
PLAYER_BUDGET_INITIAL = 90
|
||||
PLAYER_BUDGET_BASE = 20
|
||||
PLAYER_BUDGET_IMPORTANCE_LOG = 2
|
||||
|
||||
@@ -53,7 +53,7 @@ class Game:
|
||||
defender_name=self.enemy,
|
||||
from_cp=from_cp,
|
||||
to_cp=to_cp,
|
||||
theater=self.theater))
|
||||
game=self))
|
||||
|
||||
def _generate_enemy_caps(self):
|
||||
for from_cp, to_cp in self.theater.conflicts(False):
|
||||
@@ -65,7 +65,7 @@ class Game:
|
||||
defender_name=self.player,
|
||||
from_cp=from_cp,
|
||||
to_cp=to_cp,
|
||||
theater=self.theater))
|
||||
game=self))
|
||||
break
|
||||
|
||||
def _generate_interceptions(self):
|
||||
@@ -79,7 +79,7 @@ class Game:
|
||||
defender_name=self.player,
|
||||
from_cp=from_cp,
|
||||
to_cp=to_cp,
|
||||
theater=self.theater))
|
||||
game=self))
|
||||
enemy_interception = True
|
||||
break
|
||||
|
||||
@@ -87,6 +87,9 @@ class Game:
|
||||
if enemy_interception:
|
||||
break
|
||||
|
||||
if to_cp.is_global:
|
||||
continue
|
||||
|
||||
if to_cp in self.theater.conflicts(False):
|
||||
continue
|
||||
|
||||
@@ -97,7 +100,7 @@ class Game:
|
||||
defender_name=self.player,
|
||||
from_cp=from_cp,
|
||||
to_cp=to_cp,
|
||||
theater=self.theater))
|
||||
game=self))
|
||||
enemy_interception = True
|
||||
break
|
||||
|
||||
@@ -107,7 +110,7 @@ class Game:
|
||||
defender_name=self.enemy,
|
||||
from_cp=from_cp,
|
||||
to_cp=to_cp,
|
||||
theater=self.theater))
|
||||
game=self))
|
||||
break
|
||||
|
||||
def _generate_groundinterceptions(self):
|
||||
@@ -117,7 +120,7 @@ class Game:
|
||||
defender_name=self.enemy,
|
||||
from_cp=from_cp,
|
||||
to_cp=to_cp,
|
||||
theater=self.theater))
|
||||
game=self))
|
||||
break
|
||||
|
||||
def _generate_globalinterceptions(self):
|
||||
@@ -129,7 +132,7 @@ class Game:
|
||||
defender_name=self.enemy,
|
||||
from_cp=from_cp,
|
||||
to_cp=to_cp,
|
||||
theater=self.theater))
|
||||
game=self))
|
||||
break
|
||||
|
||||
def _commision_units(self, cp: ControlPoint):
|
||||
@@ -160,7 +163,7 @@ class Game:
|
||||
defender_name=self.player,
|
||||
from_cp=to_cp,
|
||||
to_cp=to_cp,
|
||||
theater=self.theater)
|
||||
game=self)
|
||||
self.events.append(event)
|
||||
return event
|
||||
|
||||
@@ -170,7 +173,9 @@ class Game:
|
||||
|
||||
def initiate_event(self, event: Event):
|
||||
assert event in self.events
|
||||
|
||||
event.generate()
|
||||
event.generate_quick()
|
||||
|
||||
def finish_event(self, event: Event, debriefing: Debriefing):
|
||||
event.commit(debriefing)
|
||||
|
||||
@@ -11,7 +11,8 @@ from gen.envsettingsgen import *
|
||||
|
||||
|
||||
class Operation:
|
||||
starting_position = None # type: db.StartingPosition
|
||||
attackers_starting_position = None # type: db.StartingPosition
|
||||
defenders_starting_position = None # type: db.StartingPosition
|
||||
mission = None # type: dcs.Mission
|
||||
conflict = None # type: Conflict
|
||||
armorgen = None # type: ArmorConflictGenerator
|
||||
@@ -22,14 +23,14 @@ class Operation:
|
||||
envgen = None # type: EnvironmentSettingsGenerator
|
||||
|
||||
def __init__(self,
|
||||
theater: ConflictTheater,
|
||||
game,
|
||||
attacker_name: str,
|
||||
defender_name: str,
|
||||
attacker_clients: db.PlaneDict,
|
||||
defender_clients: db.PlaneDict,
|
||||
from_cp: ControlPoint,
|
||||
to_cp: ControlPoint = None):
|
||||
self.theater = theater
|
||||
self.game = game
|
||||
self.attacker_name = attacker_name
|
||||
self.defender_name = defender_name
|
||||
self.attacker_clients = attacker_clients
|
||||
@@ -45,14 +46,19 @@ class Operation:
|
||||
self.airgen = AircraftConflictGenerator(mission, conflict)
|
||||
self.aagen = AAConflictGenerator(mission, conflict)
|
||||
self.shipgen = ShipGenerator(mission, conflict)
|
||||
self.envgen = EnvironmentSettingsGenerator(mission)
|
||||
self.envgen = EnvironmentSettingsGenerator(mission, self.game)
|
||||
|
||||
player_name = self.from_cp.captured and self.attacker_name or self.defender_name
|
||||
enemy_name = self.from_cp.captured and self.defender_name or self.attacker_name
|
||||
self.extra_aagen = ExtraAAConflictGenerator(mission, conflict, self.theater, player_name, enemy_name)
|
||||
self.extra_aagen = ExtraAAConflictGenerator(mission, conflict, self.game, player_name, enemy_name)
|
||||
|
||||
def prepare(self, is_quick: bool):
|
||||
self.starting_position = is_quick and self.from_cp.at or None
|
||||
if is_quick:
|
||||
self.attackers_starting_position = None
|
||||
self.defenders_starting_position = None
|
||||
else:
|
||||
self.attackers_starting_position = self.from_cp.at
|
||||
self.defenders_starting_position = self.to_cp and self.to_cp.at or None
|
||||
|
||||
def generate(self):
|
||||
self.extra_aagen.generate()
|
||||
@@ -97,13 +103,14 @@ class CaptureOperation(Operation):
|
||||
mission.country(self.defender_name)))
|
||||
|
||||
def generate(self):
|
||||
super(CaptureOperation, self).generate()
|
||||
self.envgen.generate()
|
||||
self.armorgen.generate(self.attack, self.defense)
|
||||
self.aagen.generate(self.aa)
|
||||
self.airgen.generate_defense(self.intercept, clients=self.defender_clients)
|
||||
|
||||
self.airgen.generate_cas(self.cas, clients=self.attacker_clients, at=self.starting_position)
|
||||
self.airgen.generate_cas_escort(self.escort, clients=self.attacker_clients, at=self.starting_position)
|
||||
self.airgen.generate_defense(self.intercept, clients=self.defender_clients, at=self.defenders_starting_position)
|
||||
|
||||
self.airgen.generate_cas(self.cas, clients=self.attacker_clients, at=self.attackers_starting_position)
|
||||
self.airgen.generate_cas_escort(self.escort, clients=self.attacker_clients, at=self.attackers_starting_position)
|
||||
|
||||
|
||||
class InterceptOperation(Operation):
|
||||
@@ -126,15 +133,11 @@ class InterceptOperation(Operation):
|
||||
super(InterceptOperation, self).prepare(is_quick)
|
||||
mission = dcs.Mission()
|
||||
|
||||
heading = self.from_cp.position.heading_between_point(self.to_cp.position)
|
||||
distance = self.from_cp.position.distance_to_point(self.to_cp.position)
|
||||
position = self.from_cp.position.point_from_heading(heading, distance/2)
|
||||
conflict = Conflict.intercept_conflict(
|
||||
attacker=mission.country(self.attacker_name),
|
||||
defender=mission.country(self.defender_name),
|
||||
position=position,
|
||||
heading=randint(0, 360),
|
||||
radials=ALL_RADIALS
|
||||
from_cp=self.from_cp,
|
||||
to_cp=self.to_cp
|
||||
)
|
||||
|
||||
self.initialize(mission=mission,
|
||||
@@ -144,14 +147,13 @@ class InterceptOperation(Operation):
|
||||
super(InterceptOperation, self).generate()
|
||||
self.airgen.generate_transport(self.transport, self.to_cp.at)
|
||||
self.airgen.generate_transport_escort(self.escort, clients=self.defender_clients)
|
||||
self.aagen.generate(self.airdefense)
|
||||
|
||||
if self.from_cp.is_global:
|
||||
ship = self.shipgen.generate(type=db.find_unittype(Carriage, self.attacker_name)[0],
|
||||
at=self.from_cp.at)
|
||||
self.airgen.generate_interception(self.interceptors, clients=self.attacker_clients, at=ship)
|
||||
else:
|
||||
self.airgen.generate_interception(self.interceptors, clients=self.attacker_clients, at=self.starting_position)
|
||||
self.airgen.generate_interception(self.interceptors, clients=self.attacker_clients, at=self.attackers_starting_position)
|
||||
|
||||
|
||||
class GroundInterceptOperation(Operation):
|
||||
@@ -167,7 +169,7 @@ class GroundInterceptOperation(Operation):
|
||||
super(GroundInterceptOperation, self).prepare(is_quick)
|
||||
mission = dcs.Mission()
|
||||
conflict = Conflict.ground_intercept_conflict(
|
||||
attacker=mission.country(self.defender_name),
|
||||
attacker=mission.country(self.attacker_name),
|
||||
defender=mission.country(self.defender_name),
|
||||
position=self.position,
|
||||
heading=randint(0, 360),
|
||||
@@ -179,5 +181,5 @@ class GroundInterceptOperation(Operation):
|
||||
|
||||
def generate(self):
|
||||
super(GroundInterceptOperation, self).generate()
|
||||
self.airgen.generate_cas(self.strikegroup, clients=self.attacker_clients, at=self.starting_position)
|
||||
self.airgen.generate_cas(self.strikegroup, clients=self.attacker_clients, at=self.attackers_starting_position)
|
||||
self.armorgen.generate({}, self.target)
|
||||
|
||||
Reference in New Issue
Block a user