Track S_EVENT_KILL and S_EVENT_UNIT_LOST as well.

Catch a few more death signals. Still not perfect but a bit better.

Fixes https://github.com/dcs-liberation/dcs_liberation/issues/2765.
This commit is contained in:
zhexu14 2023-04-19 16:16:41 +10:00 committed by GitHub
parent 0ba602d3aa
commit 0d257a2c3b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 57 additions and 18 deletions

View File

@ -109,16 +109,41 @@ class StateData:
base_capture_events: List[str] base_capture_events: List[str]
@classmethod @classmethod
def from_json(cls, data: Dict[str, Any]) -> StateData: def from_json(cls, data: Dict[str, Any], unit_map: UnitMap) -> StateData:
def clean_unit_list(unit_list: List[Any]) -> List[str]:
# Cleans list of units in state.json by
# - Removing duplicates. Airfields emit a new "dead" event every time a bomb
# is dropped on them when they've already dead.
# - Normalise dead map objects (which are ints) to strings. The unit map
# only stores strings
units = set()
for unit in unit_list:
units.add(str(unit))
return list(units)
killed_aircraft = []
killed_ground_units = []
# Process killed units from S_EVENT_UNIT_LOST, S_EVENT_CRASH, S_EVENT_DEAD & S_EVENT_KILL
# Try to process every event that could indicate a unit was killed, even if it is
# inefficient and results in duplication as the logic DCS uses to trigger the various
# event types is not clear and may change over time.
killed_units = clean_unit_list(
data["unit_lost_events"]
+ data["kill_events"]
+ data["crash_events"]
+ data["dead_events"]
)
for unit in killed_units: # organize killed units into aircraft vs ground
if unit_map.flight(unit) is not None:
killed_aircraft.append(unit)
else:
killed_ground_units.append(unit)
return cls( return cls(
mission_ended=data["mission_ended"], mission_ended=data["mission_ended"],
killed_aircraft=data["killed_aircrafts"], killed_aircraft=killed_aircraft,
# Airfields emit a new "dead" event every time a bomb is dropped on killed_ground_units=killed_ground_units,
# them when they've already dead. Dedup.
#
# Also normalize dead map objects (which are ints) to strings. The unit map
# only stores strings.
killed_ground_units=list({str(u) for u in data["killed_ground_units"]}),
destroyed_statics=data["destroyed_objects_positions"], destroyed_statics=data["destroyed_objects_positions"],
base_capture_events=data["base_capture_events"], base_capture_events=data["base_capture_events"],
) )
@ -128,7 +153,7 @@ class Debriefing:
def __init__( def __init__(
self, state_data: Dict[str, Any], game: Game, unit_map: UnitMap self, state_data: Dict[str, Any], game: Game, unit_map: UnitMap
) -> None: ) -> None:
self.state_data = StateData.from_json(state_data) self.state_data = StateData.from_json(state_data, unit_map)
self.game = game self.game = game
self.unit_map = unit_map self.unit_map = unit_map

View File

@ -4,8 +4,10 @@ local WRITESTATE_SCHEDULE_IN_SECONDS = 60
logger = mist.Logger:new("DCSLiberation", "info") logger = mist.Logger:new("DCSLiberation", "info")
logger:info("Check that json.lua is loaded : json = "..tostring(json)) logger:info("Check that json.lua is loaded : json = "..tostring(json))
killed_aircrafts = {} -- killed aircraft will be added via S_EVENT_CRASH event crash_events = {} -- killed aircraft will be added via S_EVENT_CRASH event
killed_ground_units = {} -- killed units will be added via S_EVENT_DEAD event dead_events = {} -- killed units will be added via S_EVENT_DEAD event
unit_lost_events = {} -- killed units will be added via S_EVENT_UNIT_LOST
kill_events = {} -- killed units will be added via S_EVENT_KILL
base_capture_events = {} base_capture_events = {}
destroyed_objects_positions = {} -- will be added via S_EVENT_DEAD event destroyed_objects_positions = {} -- will be added via S_EVENT_DEAD event
mission_ended = false mission_ended = false
@ -30,9 +32,11 @@ function write_state()
local fp = io.open(_debriefing_file_location, 'w') local fp = io.open(_debriefing_file_location, 'w')
local game_state = { local game_state = {
["killed_aircrafts"] = killed_aircrafts, ["crash_events"] = crash_events,
["killed_ground_units"] = killed_ground_units, ["dead_events"] = dead_events,
["base_capture_events"] = base_capture_events, ["base_capture_events"] = base_capture_events,
["unit_lost_events"] = unit_lost_events,
["kill_events"] = kill_events,
["mission_ended"] = mission_ended, ["mission_ended"] = mission_ended,
["destroyed_objects_positions"] = destroyed_objects_positions, ["destroyed_objects_positions"] = destroyed_objects_positions,
} }
@ -142,13 +146,23 @@ end
activeWeapons = {} activeWeapons = {}
local function onEvent(event) local function onEvent(event)
if event.id == world.event.S_EVENT_CRASH and event.initiator then if event.id == world.event.S_EVENT_CRASH and event.initiator then
killed_aircrafts[#killed_aircrafts + 1] = event.initiator.getName(event.initiator) crash_events[#crash_events + 1] = event.initiator.getName(event.initiator)
write_state() write_state()
end end
if event.id == world.event.S_EVENT_UNIT_LOST and event.initiator then
unit_lost_events[#unit_lost_events + 1] = event.initiator.getName(event.initiator)
write_state()
end
if event.id == world.event.S_EVENT_KILL and event.target then
kill_events[#kill_events + 1] = event.target.getName(event.target)
write_state()
end
if event.id == world.event.S_EVENT_DEAD and event.initiator then if event.id == world.event.S_EVENT_DEAD and event.initiator then
killed_ground_units[#killed_ground_units + 1] = event.initiator.getName(event.initiator) dead_events[#dead_events + 1] = event.initiator.getName(event.initiator)
local position = event.initiator.getPosition(event.initiator) local position = event.initiator.getPosition(event.initiator)
local destruction = {} local destruction = {}
destruction.x = position.p.x destruction.x = position.p.x