persistent time and weather between regular and quick missions; defense AA for frontline CAS

This commit is contained in:
Vasyl Horbachenko 2018-06-29 00:20:56 +03:00
parent f8c1956614
commit 2ace05c565
12 changed files with 41 additions and 24 deletions

View File

@ -18,9 +18,6 @@ class CaptureEvent(Event):
def __str__(self):
return "Attack from {} to {}".format(self.from_cp, self.to_cp)
def bonus(self):
return
@property
def threat_description(self):
descr = "{} aircraft + CAS, {} vehicles".format(

View File

@ -5,6 +5,7 @@ from theater import *
from gen.environmentgen import EnvironmentSettings
from userdata.debriefing import Debriefing
from userdata import persistency
DIFFICULTY_LOG_BASE = 1.1
@ -52,7 +53,7 @@ class Event:
self.operation.prepare(self.game.theater.terrain, is_quick=False)
self.operation.generate()
self.operation.mission.save("build/nextturn.miz")
self.operation.mission.save(persistency.mission_path_for("liberation_nextturn.miz"))
self.environment_settings = self.operation.environment_settings
def generate_quick(self):
@ -61,7 +62,7 @@ class Event:
self.operation.prepare(self.game.theater.terrain, is_quick=True)
self.operation.generate()
self.operation.mission.save('build/nextturn_quick.miz')
self.operation.mission.save(persistency.mission_path_for("liberation_nextturn_quick.miz"))
def commit(self, debriefing: Debriefing):
for country, losses in debriefing.destroyed_units.items():

View File

@ -157,7 +157,7 @@ class Game:
awarded_points = COMMISION_AMOUNTS_FACTORS[for_task] * math.pow(cp.importance, COMMISION_AMOUNTS_SCALE) * self.settings.multiplier
points_to_spend = cp.base.append_commision_points(for_task, awarded_points)
if points_to_spend > 0:
unittypes = self._commision_unit_types(cp, for_task)
unittypes = self.commision_unit_types(cp, for_task)
d = {random.choice(unittypes): points_to_spend}
print("Commision {}: {}".format(cp, d))
cp.base.commision_units(d)

View File

@ -45,6 +45,7 @@ class InfantryTransportOperation(Operation):
self.visualgen.generate_transportation_marker(self.conflict.ground_attackers_location)
self.visualgen.generate_transportation_destination(self.conflict.position)
# TODO: horrible, horrible hack
# this will disable vehicle activation triggers,
# which aren't needed on this type of missions
self.is_quick = True

View File

@ -10,7 +10,7 @@ from dcs.task import *
from dcs.terrain.terrain import NoParkingSlotError
SPREAD_DISTANCE_FACTOR = 1, 2
ESCORT_MAX_DIST = 30000
ESCORT_MAX_DIST = 80000
WORKAROUND_WAYP_DIST = 1000
WARM_START_ALTITUDE = 4600
@ -20,7 +20,7 @@ RTB_ALTITUDE = 4600
TRANSPORT_LANDING_ALT = 4600
HELI_ALT = 900
WARM_START_AIRSPEED = 540
WARM_START_AIRSPEED = 550
INTERCEPTION_AIRSPEED = 1000
INTERCEPT_MAX_DISTANCE = 80000
@ -117,7 +117,7 @@ class AircraftConflictGenerator:
airport=None,
position=pos,
altitude=alt,
speed=WARM_START_AIRSPEED + random.randint(500, 3000),
speed=WARM_START_AIRSPEED,
maintask=None,
start_type=StartType.Warm,
group_size=count)

View File

@ -87,8 +87,11 @@ class Conflict:
@classmethod
def _find_ground_location(cls, initial: Point, max_distance: int, heading: int, theater: ConflictTheater) -> Point:
for _ in range(0, int(max_distance), 800):
if theater.is_on_land(initial):
return initial
for _ in range(3):
if theater.is_on_land(initial):
return initial
initial = initial.random_point_within(1000, 1000)
initial = initial.point_from_heading(heading, 800)

View File

@ -28,8 +28,8 @@ RANDOM_TIME = {
RANDOM_WEATHER = {
1: 5, # heavy rain
2: 20, # rain
3: 30, # dynamic
2: 30, # rain
3: 40, # dynamic
4: 50, # clear
5: 100, # random
}

View File

@ -52,6 +52,7 @@ class TriggersGenerator:
activation_trigger_zone = self.mission.triggers.add_triggerzone(self.conflict.position, zone_size, name="Activation zone")
activation_trigger = TriggerOnce(Event.NoEvent, "Activation trigger")
activation_trigger.add_condition(PartOfCoalitionInZone(player_coalition, activation_trigger_zone.id))
activation_trigger.add_condition(FlagIsTrue())
for group in activate_by_trigger:
activation_trigger.add_action(ActivateGroup(group.id))
@ -94,6 +95,7 @@ class TriggersGenerator:
push_trigger.add_action(AITaskPush(group.id, 1))
message_string = self.mission.string("Task force is in the air, proceed with the objective.")
push_trigger.add_action(MessageToAll(message_string, clearview=True))
push_trigger.add_action(SetFlagValue())
self.mission.triggerrules.triggers.append(push_trigger)

View File

@ -132,7 +132,8 @@ class EventMenu(Menu):
def client_one(self, unit_type: UnitType) -> typing.Callable:
def action():
entry = self.aircraft_client_entries[unit_type] # type: Entry
amount = int(entry.get())
value = entry.get()
amount = int(value and value or "0")
entry.delete(0, END)
entry.insert(0, str(amount+1))
return action

View File

@ -35,7 +35,8 @@ class EventResultsMenu(Menu):
Button(self.frame, text="full losses, fail", command=self.simulate_result(1, 0)).grid(row=3, column=1)
"""
Label(self.frame, text="Play the mission and save debriefing to {}".format(debriefing_directory_location())).grid(row=0, column=0)
Label(self.frame, text="Play the mission and save debriefing to").grid(row=0, column=0)
Label(self.frame, text=debriefing_directory_location()).grid(row=1, column=0)
else:
row = 0
if self.event.is_successfull(self.debriefing):

View File

@ -90,8 +90,9 @@ class Debriefing:
enemy.name: self.alive_units.get(enemy.id, {}),
}
def debriefing_directory_location() -> str:
return "build/debriefing"
return os.path.expanduser("~\Saved Games\DCS")
def _logfiles_snapshot() -> typing.Dict[str, float]:
@ -108,11 +109,19 @@ def _poll_new_debriefing_log(snapshot: typing.Dict[str, float], callback: typing
while should_run:
for file, timestamp in _logfiles_snapshot().items():
if file not in snapshot or timestamp != snapshot[file]:
callback(Debriefing.parse(os.path.join(debriefing_directory_location(), file)))
for _ in range(0, 3):
# some solid programming going on in here
try:
debriefing = Debriefing.parse(os.path.join(debriefing_directory_location(), file))
break
except:
time.sleep(3)
callback(debriefing)
should_run = False
break
time.sleep(1)
time.sleep(3)
def wait_for_debriefing(callback: typing.Callable):

View File

@ -3,22 +3,24 @@ import pickle
import os
import shutil
from game.game import Game
def _save_file() -> str:
return "build/save"
return os.path.expanduser("~\Saved Games\DCS\liberation_save")
def _temporary_save_file() -> str:
return "build/save_tmp"
return os.path.expanduser("~\Saved Games\DCS\liberation_save_tmp")
def _save_file_exists() -> bool:
return os.path.exists(_save_file())
def restore_game() -> typing.Optional[Game]:
def mission_path_for(name: str) -> str:
return os.path.expanduser("~\Saved Games\DCS\Missions\{}".format(name))
def restore_game():
if not _save_file_exists():
return None
@ -30,7 +32,7 @@ def restore_game() -> typing.Optional[Game]:
return None
def save_game(game: Game) -> bool:
def save_game(game) -> bool:
try:
with open(_temporary_save_file(), "wb") as f:
pickle.dump(game, f)