new options, landmaps, mission settings generation update & frontlike smokes generation

This commit is contained in:
Vasyl Horbachenko
2018-06-16 21:04:01 +03:00
parent 92e5514e8d
commit e54e548bdd
25 changed files with 344 additions and 41 deletions

View File

@@ -1,13 +1,14 @@
import typing
import random
from datetime import datetime, timedelta
from datetime import datetime, timedelta, time
from dcs.mission import Mission
from dcs.triggers import *
from dcs.condition import *
from dcs.action import *
from dcs.task import *
from dcs.unit import Skill
from game import db
from theater.weatherforecast import WeatherForecast
from theater.conflicttheater import Conflict
@@ -23,35 +24,27 @@ RANDOM_TIME = {
RANDOM_WEATHER = {
0: 5, # thunderstorm
1: 20, # heavy rain
2: 30, # rain
1: 10, # heavy rain
2: 20, # rain
3: 100, # random dynamic
}
class EnvironmentSettingsGenerator:
class SettingsGenerator:
def __init__(self, mission: Mission, conflict: Conflict, game):
self.mission = mission
self.conflict = conflict
self.game = game
def _gen_random_time(self):
start_time = datetime.today()
daytime_map = {
"day": timedelta(hours=random.randrange(9, 18)),
"night": timedelta(hours=random.randrange(-3, 6)),
"dusk": timedelta(hours=random.randrange(18, 21)),
"dawn": timedelta(hours=random.randrange(6, 9)),
}
time_period = None
start_time = datetime.combine(datetime.today(), time())
time_range = None
for k, v in RANDOM_TIME.items():
if random.randint(0, 100) <= v:
time_period = k
time_range = self.game.theater.daytime_map[k]
break
print("generated {}".format(time_period))
start_time += daytime_map[time_period]
start_time += timedelta(hours=random.randint(*time_range))
self.mission.start_time = start_time
def _gen_random_weather(self):
@@ -102,6 +95,16 @@ class EnvironmentSettingsGenerator:
continue
self.mission.terrain.airport_by_id(cp.at.id).set_coalition(cp.captured and player_coalition or enemy_coalition)
def _set_skill(self, player_coalition: str, enemy_coalition: str):
for coalition_name, coalition in self.mission.coalition.items():
skill_level = player_coalition == coalition_name and self.game.player_skill or self.game.enemy_skill
for country in coalition.countries.values():
for plane_group in country.plane_group:
plane_group.set_skill(Skill(skill_level))
for vehicle_group in country.vehicle_group:
vehicle_group.set_skill(Skill(skill_level))
def generate(self, is_quick: bool):
player_coalition = self.game.player == "USA" and "blue" or "red"
enemy_coalition = player_coalition == "blue" and "red" or "blue"
@@ -111,6 +114,7 @@ class EnvironmentSettingsGenerator:
self._gen_random_time()
self._gen_random_weather()
self._set_skill(player_coalition, enemy_coalition)
self._set_allegiances(player_coalition, enemy_coalition)
if not is_quick:

126
gen/visualgen.py Normal file
View File

@@ -0,0 +1,126 @@
import typing
import random
from datetime import datetime, timedelta
from dcs.mission import Mission
from dcs.statics import *
from dcs.unit import Static
from theater.conflicttheater import Conflict
#from game.game import Game
class Smoke(unittype.StaticType):
id = "big_smoke"
category = "Effects"
name = "big_smoke"
shape_name = 2
rate = 100
class BigSmoke(unittype.StaticType):
id = "big_smoke"
category = "Effects"
name = "big_smoke"
shape_name = 3
rate = 100
class MassiveSmoke(unittype.StaticType):
id = "big_smoke"
category = "Effects"
name = "big_smoke"
shape_name = 4
rate = 100
def __monkey_static_dict(self: Static):
global __original_static_dict
d = __original_static_dict(self)
if self.type == "big_smoke":
d["effectPreset"] = self.shape_name
return d
__original_static_dict = Static.dict
Static.dict = __monkey_static_dict
FRONT_SMOKE_MIN_DISTANCE = 10000
FRONT_SMOKE_DISTANCE_FACTOR = 0.75
FRONT_SMOKE_LENGTH = 80000
FRONT_SMOKE_SPACING = 600
FRONT_SMOKE_RANDOM_SPREAD = 1200
FRONT_SMOKE_TYPE_CHANCES = {
5: MassiveSmoke,
40: BigSmoke,
100: Smoke,
}
DESTINATION_SMOKE_AMOUNT_FACTOR = 0.03
DESTINATION_SMOKE_DISTANCE_FACTOR = 1
DESTINATION_SMOKE_TYPE_CHANCES = {
5: BigSmoke,
100: Smoke,
}
def turn_heading(heading, fac):
heading += fac
if heading > 359:
heading = heading - 359
if heading < 0:
heading = 359 + heading
return heading
class VisualGenerator:
game = None # type: Game
def __init__(self, mission: Mission, conflict: Conflict, game):
self.mission = mission
self.conflict = conflict
self.game = game
def _generate_frontline_smokes(self):
for from_cp, to_cp in self.game.theater.conflicts():
distance = max(from_cp.position.distance_to_point(to_cp.position) * FRONT_SMOKE_DISTANCE_FACTOR * to_cp.base.strength, FRONT_SMOKE_MIN_DISTANCE)
heading = to_cp.position.heading_between_point(from_cp.position)
point = to_cp.position.point_from_heading(heading, distance)
plane_start = point.point_from_heading(turn_heading(heading, 90), FRONT_SMOKE_LENGTH / 2)
for offset in range(0, FRONT_SMOKE_LENGTH, FRONT_SMOKE_SPACING):
position = plane_start.point_from_heading(turn_heading(heading, - 90), offset)
for k, v in FRONT_SMOKE_TYPE_CHANCES.items():
if random.randint(0, 100) <= k:
pos = position.random_point_within(FRONT_SMOKE_RANDOM_SPREAD, FRONT_SMOKE_RANDOM_SPREAD)
if not self.game.theater.is_on_land(pos):
break
self.mission.static_group(
self.mission.country(self.game.enemy),
"",
_type=v,
position=pos)
break
def generate_target_smokes(self, target):
spread = target.size * DESTINATION_SMOKE_DISTANCE_FACTOR
for _ in range(0, int(target.size * DESTINATION_SMOKE_AMOUNT_FACTOR * (1.1 - target.base.strength))):
for k, v in DESTINATION_SMOKE_TYPE_CHANCES.items():
if random.randint(0, 100) <= k:
position = target.position.random_point_within(0, spread)
if not self.game.theater.is_on_land(position):
break
self.mission.static_group(
self.mission.country(self.game.enemy),
"",
_type=v,
position=position)
break
def generate(self):
self._generate_frontline_smokes()