Skip to content

Commit

Permalink
Added support for a_out_picture action
Browse files Browse the repository at this point in the history
* supports sending picture to all, coalition, country,
  group and unit.
  DCS UI issue allows picture to be sent to unit
  without picture resource, so a dedicated test
  covers that.
  • Loading branch information
332fg-raven committed Dec 21, 2023
1 parent 2003c99 commit 2b57385
Show file tree
Hide file tree
Showing 3 changed files with 272 additions and 1 deletion.
157 changes: 156 additions & 1 deletion dcs/action.py
Original file line number Diff line number Diff line change
Expand Up @@ -1787,6 +1787,156 @@ def dict(self):
return d


class PictureAction(Action):
def __init__(self, predicate: str, file_res_key: ResourceKey, seconds: int,
clearview: bool, start_delay: int,
horz_alignment: str, vert_alignment: str,
size: int, size_units: str) -> None:
super().__init__(predicate)
self.file_res_key = file_res_key
self.seconds = seconds
self.clearview = clearview
self.start_delay = start_delay
self.horz_alignment = horz_alignment
self.vert_alignment = vert_alignment
self.size_units = size_units
self.size = size

def dict(self) -> Dict[Any, Any]:
d = super().dict()
d["file"] = self.file_res_key.key
d["seconds"] = self.seconds
d["clearview"] = self.clearview
d["start_delay"] = self.start_delay
d["horzAlignment"] = self.horz_alignment
d["vertAlignment"] = self.vert_alignment
d["size_units"] = self.size_units
d["size"] = self.size
return d


class PictureToAll(PictureAction):
predicate = "a_out_picture"

def __init__(self, file_res_key: ResourceKey, seconds: int,
clearview: bool, start_delay: int,
horz_alignment: str, vert_alignment: str,
size: int, size_units: str):
super().__init__(predicate=self.predicate, file_res_key=file_res_key,
seconds=seconds, clearview=clearview,
start_delay=start_delay, horz_alignment=horz_alignment,
vert_alignment=horz_alignment, size=size, size_units=size_units)
self.params = [self.file_res_key, seconds, clearview, start_delay, horz_alignment, vert_alignment, size, size_units]

@classmethod
def create_from_dict(cls, d, mission):
return cls(ResourceKey(d["file"]), d["seconds"], d["clearview"], d["start_delay"],
d["horzAlignment"], d["vertAlignment"], d["size"], d["size_units"])

def dict(self):
return super().dict()


class PictureToCoalition(PictureAction):
predicate = "a_out_picture_s"

def __init__(self, coalition: str, file_res_key: ResourceKey, seconds: int,
clearview: bool, start_delay: int,
horz_alignment: str, vert_alignment: str,
size: int, size_units: str):
super().__init__(predicate=self.predicate, file_res_key=file_res_key,
seconds=seconds, clearview=clearview,
start_delay=start_delay, horz_alignment=horz_alignment,
vert_alignment=horz_alignment, size=size, size_units=size_units)
self.coalition = coalition
self.params = [self.coalition, self.file_res_key, seconds, clearview, start_delay, horz_alignment, vert_alignment, size, size_units]

@classmethod
def create_from_dict(cls, d, mission):
return cls(d["coalitionlist"], ResourceKey(d["file"]), d["seconds"], d["clearview"], d["start_delay"],
d["horzAlignment"], d["vertAlignment"], d["size"], d["size_units"])

def dict(self):
d = super().dict()
d["coalitionlist"] = self.coalition
return d


class PictureToCountry(PictureAction):
predicate = "a_out_picture_c"

def __init__(self, country: int, file_res_key: ResourceKey, seconds: int,
clearview: bool, start_delay: int,
horz_alignment: str, vert_alignment: str,
size: int, size_units: str):
super().__init__(predicate=self.predicate, file_res_key=file_res_key,
seconds=seconds, clearview=clearview,
start_delay=start_delay, horz_alignment=horz_alignment,
vert_alignment=horz_alignment, size=size, size_units=size_units)
self.country = country
self.params = [self.country, self.file_res_key, seconds, clearview, start_delay, horz_alignment, vert_alignment, size, size_units]

@classmethod
def create_from_dict(cls, d, mission):
return cls(d["countrylist"], ResourceKey(d["file"]), d["seconds"], d["clearview"], d["start_delay"],
d["horzAlignment"], d["vertAlignment"], d["size"], d["size_units"])

def dict(self):
d = super().dict()
d["countrylist"] = self.country
return d


class PictureToGroup(PictureAction):
predicate = "a_out_picture_g"

def __init__(self, group: int, file_res_key: ResourceKey, seconds: int,
clearview: bool, start_delay: int,
horz_alignment: str, vert_alignment: str,
size: int, size_units: str):
super().__init__(predicate=self.predicate, file_res_key=file_res_key,
seconds=seconds, clearview=clearview,
start_delay=start_delay, horz_alignment=horz_alignment,
vert_alignment=horz_alignment, size=size, size_units=size_units)
self.group = group
self.params = [self.group, self.file_res_key, seconds, clearview, start_delay, horz_alignment, vert_alignment, size, size_units]

@classmethod
def create_from_dict(cls, d, mission):
return cls(d["group"], ResourceKey(d["file"]), d["seconds"], d["clearview"], d["start_delay"],
d["horzAlignment"], d["vertAlignment"], d["size"], d["size_units"])

def dict(self):
d = super().dict()
d["group"] = self.group
return d


class PictureToUnit(PictureAction):
predicate = "a_out_picture_u"

def __init__(self, unit: int, file_res_key: ResourceKey, seconds: int,
clearview: bool, start_delay: int,
horz_alignment: str, vert_alignment: str,
size: int, size_units: str):
super().__init__(predicate=self.predicate, file_res_key=file_res_key,
seconds=seconds, clearview=clearview,
start_delay=start_delay, horz_alignment=horz_alignment,
vert_alignment=horz_alignment, size=size, size_units=size_units)
self.unit = unit
self.params = [self.unit, self.file_res_key, seconds, clearview, start_delay, horz_alignment, vert_alignment, size, size_units]

@classmethod
def create_from_dict(cls, d, mission):
return cls(d["unit"], ResourceKey(d["file"]), d["seconds"], d["clearview"], d["start_delay"],
d["horzAlignment"], d["vertAlignment"], d["size"], d["size_units"])

def dict(self):
d = super().dict()
d["unit"] = self.unit
return d


actions_map: Dict[str, Type[Action]] = {
"a_activate_group": ActivateGroup,
"a_add_radio_item": AddRadioItem,
Expand Down Expand Up @@ -1865,5 +2015,10 @@ def dict(self):
"a_set_ai_task": AITaskSet,
"a_remove_scene_objects": RemoveSceneObjects,
"a_scenery_destruction_zone": SceneryDestructionZone,
"a_zone_increment_resize": ZoneIncrementResize
"a_zone_increment_resize": ZoneIncrementResize,
"a_out_picture": PictureToAll,
"a_out_picture_s": PictureToCoalition,
"a_out_picture_c": PictureToCountry,
"a_out_picture_g": PictureToGroup,
"a_out_picture_u": PictureToUnit
}
Binary file added tests/missions/a_out_picture.miz
Binary file not shown.
116 changes: 116 additions & 0 deletions tests/test_mission.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from dcs.status_message import MessageSeverity, MessageType
from dcs.flyingunit import FlyingUnit
from dcs.unit import Ship
from dcs.action import PictureToAll, PictureToCoalition, PictureToCountry, PictureToGroup, PictureToUnit


class BasicTests(unittest.TestCase):
Expand Down Expand Up @@ -884,3 +885,118 @@ def test_smoke_required_modules(self) -> None:
m2 = dcs.mission.Mission()
m2.load_file(saved_miz)
self.assertEqual(m.required_modules, m2.required_modules)

def test_action_a_out_picture(self) -> None:
mizname = "tests/missions/a_out_picture.miz"
m = dcs.mission.Mission()
m.load_file(mizname)

assert isinstance(m.triggerrules.triggers[0].actions[0], PictureToAll)
m_action = m.triggerrules.triggers[0].actions[0]

self.assertEqual(m_action.seconds, 10)
self.assertFalse(m_action.clearview)
self.assertEqual(m_action.start_delay, 3)
self.assertEqual(m_action.horz_alignment, "0")
self.assertEqual(m_action.vert_alignment, "0")
self.assertEqual(m_action.size, 100)
self.assertEqual(m_action.size_units, "0")

m2_name = "missions/saved_a_out_picture.miz"
m.save(m2_name)

m2 = dcs.mission.Mission()
m2.load_file(m2_name)

self.assertEqual(m_action, m2.triggerrules.triggers[0].actions[0])

def test_action_a_out_picture_s(self) -> None:
mizname = "tests/missions/a_out_picture.miz"
m = dcs.mission.Mission()
m.load_file(mizname)

assert isinstance(m.triggerrules.triggers[0].actions[1], PictureToCoalition)
m_action = m.triggerrules.triggers[0].actions[1]

self.assertEqual(m_action.coalition, "blue")

m2_name = "missions/saved_a_out_picture.miz"
m.save(m2_name)

m2 = dcs.mission.Mission()
m2.load_file(m2_name)

self.assertEqual(m_action, m2.triggerrules.triggers[0].actions[1])

def test_action_a_out_picture_c(self) -> None:
mizname = "tests/missions/a_out_picture.miz"
m = dcs.mission.Mission()
m.load_file(mizname)

assert isinstance(m.triggerrules.triggers[0].actions[2], PictureToCountry)
m_action = m.triggerrules.triggers[0].actions[2]

self.assertEqual(m_action.country, 1)

m2_name = "missions/saved_a_out_picture.miz"
m.save(m2_name)

m2 = dcs.mission.Mission()
m2.load_file(m2_name)

self.assertEqual(m_action, m2.triggerrules.triggers[0].actions[2])

def test_action_a_out_picture_g(self) -> None:
mizname = "tests/missions/a_out_picture.miz"
m = dcs.mission.Mission()
m.load_file(mizname)

assert isinstance(m.triggerrules.triggers[0].actions[3], PictureToGroup)
m_action = m.triggerrules.triggers[0].actions[3]

self.assertEqual(m_action.group, 1)

m2_name = "missions/saved_a_out_picture.miz"
m.save(m2_name)

m2 = dcs.mission.Mission()
m2.load_file(m2_name)

self.assertEqual(m_action, m2.triggerrules.triggers[0].actions[3])

def test_action_a_out_picture_u_no_file(self) -> None:
mizname = "tests/missions/a_out_picture.miz"
m = dcs.mission.Mission()
m.load_file(mizname)

assert isinstance(m.triggerrules.triggers[0].actions[4], PictureToUnit)
m_action = m.triggerrules.triggers[0].actions[4]

self.assertEqual(m_action.unit, 1)
self.assertEqual(m_action.file_res_key.key, "")

m2_name = "missions/saved_a_out_picture.miz"
m.save(m2_name)

m2 = dcs.mission.Mission()
m2.load_file(m2_name)

self.assertEqual(m_action, m2.triggerrules.triggers[0].actions[4])

def test_action_a_out_picture_u(self) -> None:
mizname = "tests/missions/a_out_picture.miz"
m = dcs.mission.Mission()
m.load_file(mizname)

assert isinstance(m.triggerrules.triggers[0].actions[5], PictureToUnit)
m_action = m.triggerrules.triggers[0].actions[5]

self.assertEqual(m_action.unit, 1)

m2_name = "missions/saved_a_out_picture.miz"
m.save(m2_name)

m2 = dcs.mission.Mission()
m2.load_file(m2_name)

self.assertEqual(m_action, m2.triggerrules.triggers[0].actions[5])

0 comments on commit 2b57385

Please sign in to comment.