IL2HorusTeam/il2fb-game-log-parser

View on GitHub
il2fb/parsers/game_log/events.py

Summary

Maintainability
F
2 mos
Test Coverage
# coding: utf-8
"""
Data structures for events.

"""

import inspect
import sys

from il2fb.commons.events import ParsableEvent
from il2fb.commons.regex import (
    WHITESPACE, NON_WHITESPACES, NUMBER, END_OF_STRING,
    make_matcher, named_group,
)
from il2fb.commons.transformers import (
    get_int_transformer, transform_belligerent, transform_2d_pos,
)

from .constants import TARGET_STATES
from .l10n import translations
from .regex import (
    DATE_TIME_GROUP_PREFIX, TIME_GROUP_PREFIX, BELLIGERENT_GROUP,
    TARGET_STATE_GROUP, TOGGLE_VALUE_GROUP, POS_GROUP_SUFFIX,
    CALLSIGN, HIMSELF, HUMAN_ACTOR_GROUP, HUMAN_AIRCRAFT_ACTOR_GROUP,
    HUMAN_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP, HUMAN_AIRCRAFT_ATTACKER_GROUP,
    HUMAN_AIRCRAFT_ASSISTANT_GROUP,
    STATIONARY_UNIT_ACTOR_GROUP, STATIONARY_UNIT_ATTACKER_GROUP,
    MOVING_UNIT_ACTOR_GROUP, MOVING_UNIT_ATTACKER_GROUP,
    MOVING_UNIT_MEMBER_ACTOR_GROUP, MOVING_UNIT_MEMBER_ATTACKER_GROUP,
    AI_AIRCRAFT_ACTOR_GROUP, AI_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
    AI_AIRCRAFT_ATTACKER_GROUP, AI_AIRCRAFT_ASSISTANT_GROUP,
    BUILDING_ACTOR_GROUP, BRIDGE_ACTOR_GROUP, TREE,
)
from .transformers import (
    transform_date, transform_time,
    transform_human_as_actor,
    transform_human_aircraft_as_actor,
    transform_human_aircraft_as_attacker,
    transform_human_aircraft_as_assistant,
    transform_human_aircraft_crew_member_as_actor,
    transform_ai_aircraft_as_actor,
    transform_ai_aircraft_as_attacker,
    transform_ai_aircraft_as_assistant,
    transform_ai_aircraft_crew_member_as_seat,
    transform_ai_aircraft_crew_member_as_actor,
    transform_moving_unit_as_actor,
    transform_moving_unit_as_attacker,
    transform_moving_unit_member_as_actor,
    transform_moving_unit_member_as_attacker,
    transform_stationary_unit_as_actor,
    transform_stationary_unit_as_attacker,
    transform_building_as_actor,
    transform_bridge_as_actor,
)


_ = translations.ugettext_lazy


def get_all_events():
    module = sys.modules[__name__]
    members = inspect.getmembers(module, inspect.isclass)
    return [
        cls for name, cls in members
        if issubclass(cls, ParsableEvent) and cls is not ParsableEvent
    ]


class MissionIsPlaying(ParsableEvent):
    """
    Example:

        "[Sep 15, 2013 8:33:05 PM] Mission: PH.mis is Playing"

    """
    __slots__ = ['date', 'time', 'mission', ]

    verbose_name = _("Mission is playing")
    matcher = make_matcher(
        "{datetime}Mission:{s}{mission}{s}is{s}Playing{end}"
        .format(
            datetime=DATE_TIME_GROUP_PREFIX,
            mission=named_group('mission', ".+\.mis"),
            s=WHITESPACE,
            end=END_OF_STRING,
        )
    )
    transformers = (
        transform_date,
        transform_time,
    )


class MissionHasBegun(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] Mission BEGIN"

    """
    __slots__ = ['time', ]

    verbose_name = _("Mission has begun")
    matcher = make_matcher(
        "{time}Mission{s}BEGIN{end}"
        .format(
            time=TIME_GROUP_PREFIX,
            s=WHITESPACE,
            end=END_OF_STRING,
        )
    )
    transformers = (
        transform_time,
    )


class MissionHasEnded(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] Mission END"

    """
    __slots__ = ['time', ]

    verbose_name = _("Mission has ended")
    matcher = make_matcher(
        "{time}Mission{s}END{end}"
        .format(
            time=TIME_GROUP_PREFIX,
            s=WHITESPACE,
            end=END_OF_STRING,
        )
    )
    transformers = (
        transform_time,
    )


class MissionWasWon(ParsableEvent):
    """
    Example:

        "[Sep 15, 2013 8:33:05 PM] Mission: RED WON"

    """
    __slots__ = ['date', 'time', 'belligerent', ]

    verbose_name = _("Mission was won")
    matcher = make_matcher(
        "{datetime}Mission:{s}{belligerent}{s}WON{end}"
        .format(
            datetime=DATE_TIME_GROUP_PREFIX,
            belligerent=BELLIGERENT_GROUP,
            s=WHITESPACE,
            end=END_OF_STRING,
        )
    )
    transformers = (
        transform_date,
        transform_time,
        transform_belligerent,
    )


class TargetStateWasChanged(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] Target 3 Complete"

    """
    __slots__ = ['time', 'index', 'state', ]

    verbose_name = _("Target state was changed")
    STATES = TARGET_STATES
    matcher = make_matcher(
        "{time}Target{s}{index}{s}{state}{end}"
        .format(
            time=TIME_GROUP_PREFIX,
            index=named_group('index', NUMBER),
            state=TARGET_STATE_GROUP,
            s=WHITESPACE,
            end=END_OF_STRING,
        )
    )
    transformers = (
        transform_time,
        get_int_transformer('index'),
    )


class HumanHasConnected(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0 has connected"

    """
    __slots__ = ['time', 'actor', ]

    verbose_name = _("Human has connected")
    matcher = make_matcher(
        "{time}{actor}{s}has{s}connected{end}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_ACTOR_GROUP,
            s=WHITESPACE,
            end=END_OF_STRING,
        )
    )
    transformers = (
        transform_time,
        transform_human_as_actor,
    )


class HumanHasDisconnected(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0 has disconnected"

    """
    __slots__ = ['time', 'actor', ]

    verbose_name = _("Human has disconnected")
    matcher = make_matcher(
        "{time}{actor}{s}has{s}disconnected{end}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_ACTOR_GROUP,
            s=WHITESPACE,
            end=END_OF_STRING,
        )
    )
    transformers = (
        transform_time,
        transform_human_as_actor,
    )


class HumanHasSelectedAirfield(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0 selected army Red at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'belligerent', 'pos', ]

    verbose_name = _("Human has selected airfield")
    matcher = make_matcher(
        "{time}{actor}{s}selected{s}army{s}{belligerent}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_ACTOR_GROUP,
            belligerent=BELLIGERENT_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_as_actor,
        transform_belligerent,
        transform_2d_pos,
    )


class HumanAircraftHasSpawned(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8 loaded weapons '40fab100' fuel 40%"

    """
    __slots__ = ['time', 'actor', 'weapons', 'fuel', ]

    verbose_name = _("Human aircraft has spawned")
    matcher = make_matcher(
        "{time}{actor}{s}loaded{s}weapons{s}\'{weapons}\'{s}fuel{s}{fuel}%{end}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_ACTOR_GROUP,
            weapons=named_group('weapons', NON_WHITESPACES),
            fuel=named_group('fuel', "\d{2,3}"),
            s=WHITESPACE,
            end=END_OF_STRING,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_as_actor,
        get_int_transformer('fuel'),
    )


class HumanHasWentToBriefing(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0 entered refly menu"

    """
    __slots__ = ['time', 'actor', ]

    verbose_name = _("Human has went to briefing")
    matcher = make_matcher(
        "{time}{actor}{s}entered{s}refly{s}menu{end}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_ACTOR_GROUP,
            s=WHITESPACE,
            end=END_OF_STRING,
        )
    )
    transformers = (
        transform_time,
        transform_human_as_actor,
    )


class HumanHasToggledLandingLights(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8 turned landing lights off at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'value', 'pos', ]

    verbose_name = _("Human has toggled landing lights")
    matcher = make_matcher(
        "{time}{actor}{s}turned{s}landing{s}lights{s}{value}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_ACTOR_GROUP,
            value=TOGGLE_VALUE_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_as_actor,
        transform_2d_pos,
    )


class HumanHasToggledWingtipSmokes(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8 turned wingtip smokes off at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'value', 'pos', ]

    verbose_name = _("Human has toggled wingtip smokes")
    matcher = make_matcher(
        "{time}{actor}{s}turned{s}wingtip{s}smokes{s}{value}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_ACTOR_GROUP,
            value=TOGGLE_VALUE_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_as_actor,
        transform_2d_pos,
    )


class HumanHasChangedSeat(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8(0) seat occupied by User0 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("Human has changed seat")
    matcher = make_matcher(
        "{time}{actor}{s}seat{s}occupied{s}by{s}{callsign}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            callsign=CALLSIGN,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_crew_member_as_actor,
        transform_2d_pos,
    )


class HumanIsTryingToTakeSeat(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0 is trying to occupy seat USN_VF_51A020(0)"

    """
    __slots__ = ['time', 'actor', 'seat', ]

    verbose_name = _("Human is trying to take seat")
    matcher = make_matcher(
        "{time}{actor}{s}is{s}trying{s}to{s}occupy{s}seat{s}{seat}{end}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_ACTOR_GROUP,
            seat=AI_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            s=WHITESPACE,
            end=END_OF_STRING,
        )
    )
    transformers = (
        transform_time,
        transform_human_as_actor,
        transform_ai_aircraft_crew_member_as_seat,
    )


class HumanAircraftHasTookOff(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8 in flight at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("Human aircraft has took off")
    matcher = make_matcher(
        "{time}{actor}{s}in{s}flight{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_ACTOR_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_as_actor,
        transform_2d_pos,
    )


class HumanAircraftHasLanded(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8 landed at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("Human aircraft has landed")
    matcher = make_matcher(
        "{time}{actor}{s}landed{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_ACTOR_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_as_actor,
        transform_2d_pos,
    )


class HumanAircraftHasCrashed(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8 crashed at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("Human aircraft has crashed")
    matcher = make_matcher(
        "{time}{actor}{s}crashed{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_ACTOR_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_as_actor,
        transform_2d_pos,
    )


class HumanHasDestroyedOwnAircraft(ParsableEvent):
    """
    Examples:

        "[8:33:05 PM] User0:Pe-8 shot down by landscape at 100.0 200.99"
        "[8:33:05 PM] User0:Pe-8 shot down by NONAME at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("Human has destroyed own aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}shot{s}down{s}by{s}{himself}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_ACTOR_GROUP,
            himself=HIMSELF,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_as_actor,
        transform_2d_pos,
    )


class HumanHasDamagedOwnAircraft(ParsableEvent):
    """
    Examples:

        "[8:33:05 PM] User0:Pe-8 damaged by landscape at 100.0 200.99"
        "[8:33:05 PM] User0:Pe-8 damaged by NONAME at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("Human has damaged own aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}damaged{s}by{s}{himself}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_ACTOR_GROUP,
            himself=HIMSELF,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_as_actor,
        transform_2d_pos,
    )


class HumanAircraftWasDamagedOnGround(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8 damaged on the ground at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("Human aircraft was damaged on the ground")
    matcher = make_matcher(
        "{time}{actor}{s}damaged{s}on{s}the{s}ground{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_ACTOR_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_as_actor,
        transform_2d_pos,
    )


class HumanAircraftWasDamagedByHumanAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8 damaged by User1:Bf-109G-6_Late at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft was damaged by human aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}damaged{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_ACTOR_GROUP,
            attacker=HUMAN_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_as_actor,
        transform_human_aircraft_as_attacker,
        transform_2d_pos,
    )


class HumanAircraftWasDamagedByStationaryUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8 damaged by 0_Static at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft was damaged by stationary unit")
    matcher = make_matcher(
        "{time}{actor}{s}damaged{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_ACTOR_GROUP,
            attacker=STATIONARY_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_as_actor,
        transform_stationary_unit_as_attacker,
        transform_2d_pos,
    )


class HumanAircraftWasDamagedByMovingUnitMember(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8 damaged by 0_Chief0 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft was damaged by moving unit member")
    matcher = make_matcher(
        "{time}{actor}{s}damaged{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_ACTOR_GROUP,
            attacker=MOVING_UNIT_MEMBER_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_as_actor,
        transform_moving_unit_member_as_attacker,
        transform_2d_pos,
    )


class HumanAircraftWasDamagedByMovingUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8 damaged by 0_Chief at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft was damaged by moving unit")
    matcher = make_matcher(
        "{time}{actor}{s}damaged{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_ACTOR_GROUP,
            attacker=MOVING_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_as_actor,
        transform_moving_unit_as_attacker,
        transform_2d_pos,
    )


class HumanAircraftWasDamagedByAIAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8 damaged by r01000 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft was damaged by AI aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}damaged{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_ACTOR_GROUP,
            attacker=AI_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_as_actor,
        transform_ai_aircraft_as_attacker,
        transform_2d_pos,
    )


class HumanAircraftWasShotDownByHumanAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8 shot down by User1:Bf-109G-6_Late at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft was shot down by human aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}shot{s}down{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_ACTOR_GROUP,
            attacker=HUMAN_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_as_actor,
        transform_human_aircraft_as_attacker,
        transform_2d_pos,
    )


class HumanAircraftWasShotDownByStationaryUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8 shot down by 0_Static at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft was shot down by stationary unit")
    matcher = make_matcher(
        "{time}{actor}{s}shot{s}down{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_ACTOR_GROUP,
            attacker=STATIONARY_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_as_actor,
        transform_stationary_unit_as_attacker,
        transform_2d_pos,
    )


class HumanAircraftWasShotDownByMovingUnitMember(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8 shot down by 0_Chief0 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft was shot down by moving unit member")
    matcher = make_matcher(
        "{time}{actor}{s}shot{s}down{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_ACTOR_GROUP,
            attacker=MOVING_UNIT_MEMBER_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_as_actor,
        transform_moving_unit_member_as_attacker,
        transform_2d_pos,
    )


class HumanAircraftWasShotDownByMovingUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8 shot down by 0_Chief at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft was shot down by moving unit")
    matcher = make_matcher(
        "{time}{actor}{s}shot{s}down{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_ACTOR_GROUP,
            attacker=MOVING_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_as_actor,
        transform_moving_unit_as_attacker,
        transform_2d_pos,
    )


class HumanAircraftWasShotDownByAIAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8 shot down by r01000 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft was shot down by AI aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}shot{s}down{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_ACTOR_GROUP,
            attacker=AI_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_as_actor,
        transform_ai_aircraft_as_attacker,
        transform_2d_pos,
    )


class HumanAircraftWasShotDownByHumanAircraftAndHumanAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8 shot down by User1:Bf-109G-2 and User2:Bf-109G-2 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'assistant', 'pos', ]

    verbose_name = _("Human aircraft was shot down by human aircraft and human aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}shot{s}down{s}by{s}{attacker}{s}and{s}{assistant}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_ACTOR_GROUP,
            attacker=HUMAN_AIRCRAFT_ATTACKER_GROUP,
            assistant=HUMAN_AIRCRAFT_ASSISTANT_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_as_actor,
        transform_human_aircraft_as_attacker,
        transform_human_aircraft_as_assistant,
        transform_2d_pos,
    )


class HumanAircraftWasShotDownByHumanAircraftAndAIAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8 shot down by User1:Bf-109G-2 and r01000 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'assistant', 'pos', ]

    verbose_name = _("Human aircraft was shot down by human aircraft and AI aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}shot{s}down{s}by{s}{attacker}{s}and{s}{assistant}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_ACTOR_GROUP,
            attacker=HUMAN_AIRCRAFT_ATTACKER_GROUP,
            assistant=AI_AIRCRAFT_ASSISTANT_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_as_actor,
        transform_human_aircraft_as_attacker,
        transform_ai_aircraft_as_assistant,
        transform_2d_pos,
    )


class HumanAircraftWasShotDownByAIAircraftAndHumanAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8 shot down by r01000 and User1:Bf-109G-2 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'assistant', 'pos', ]

    verbose_name = _("Human aircraft was shot down by AI aircraft and human aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}shot{s}down{s}by{s}{attacker}{s}and{s}{assistant}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_ACTOR_GROUP,
            attacker=AI_AIRCRAFT_ATTACKER_GROUP,
            assistant=HUMAN_AIRCRAFT_ASSISTANT_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_as_actor,
        transform_ai_aircraft_as_attacker,
        transform_human_aircraft_as_assistant,
        transform_2d_pos,
    )


class HumanAircraftWasShotDownByAIAircraftAndAIAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8 shot down by r01000 and r01001 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'assistant', 'pos', ]

    verbose_name = _("Human aircraft was shot down by AI aircraft and AI aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}shot{s}down{s}by{s}{attacker}{s}and{s}{assistant}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_ACTOR_GROUP,
            attacker=AI_AIRCRAFT_ATTACKER_GROUP,
            assistant=AI_AIRCRAFT_ASSISTANT_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_as_actor,
        transform_ai_aircraft_as_attacker,
        transform_ai_aircraft_as_assistant,
        transform_2d_pos,
    )


class HumanAircraftCrewMemberHasBailedOut(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8(0) bailed out at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("Human aircraft crew member has bailed out")
    matcher = make_matcher(
        "{time}{actor}{s}bailed{s}out{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_crew_member_as_actor,
        transform_2d_pos,
    )


class HumanAircraftCrewMemberHasLanded(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8(0) successfully bailed out at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("Human aircraft crew member has landed")
    matcher = make_matcher(
        "{time}{actor}{s}successfully{s}bailed{s}out{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_crew_member_as_actor,
        transform_2d_pos,
    )


class HumanAircraftCrewMemberWasCaptured(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8(0) was captured at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("Human aircraft crew member was captured")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}captured{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_crew_member_as_actor,
        transform_2d_pos,
    )


class HumanAircraftCrewMemberWasWounded(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8(0) was wounded at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("Human aircraft crew member was wounded")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}wounded{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_crew_member_as_actor,
        transform_2d_pos,
    )


class HumanAircraftCrewMemberWasHeavilyWounded(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8(0) was heavily wounded at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("Human aircraft crew member was heavily wounded")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}heavily{s}wounded{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_crew_member_as_actor,
        transform_2d_pos,
    )


class HumanAircraftCrewMemberWasKilled(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8(0) was killed at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("Human aircraft crew member was killed")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}killed{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_crew_member_as_actor,
        transform_2d_pos,
    )


class HumanAircraftCrewMemberWasKilledByHumanAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8(0) was killed by User1:Bf-109G-6_Late at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft crew member was killed by human aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}killed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=HUMAN_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_crew_member_as_actor,
        transform_human_aircraft_as_attacker,
        transform_2d_pos,
    )


class HumanAircraftCrewMemberWasKilledByStationaryUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8(0) was killed by 0_Static at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft crew member was killed by stationary unit")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}killed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=STATIONARY_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_crew_member_as_actor,
        transform_stationary_unit_as_attacker,
        transform_2d_pos,
    )


class HumanAircraftCrewMemberWasKilledByMovingUnitMember(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8(0) was killed by 0_Chief0 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft crew member was killed by moving unit member")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}killed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=MOVING_UNIT_MEMBER_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_crew_member_as_actor,
        transform_moving_unit_member_as_attacker,
        transform_2d_pos,
    )


class HumanAircraftCrewMemberWasKilledByMovingUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8(0) was killed by 0_Chief at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft crew member was killed by moving unit")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}killed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=MOVING_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_crew_member_as_actor,
        transform_moving_unit_as_attacker,
        transform_2d_pos,
    )


class HumanAircraftCrewMemberWasKilledByAIAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8(0) was killed by r01000 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft crew member was killed by AI aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}killed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=AI_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_crew_member_as_actor,
        transform_ai_aircraft_as_attacker,
        transform_2d_pos,
    )


class HumanAircraftCrewMemberWasKilledInParachuteByStationaryUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8(0) was killed in his chute by 0_Static at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft crew member was killed in parachute by stationary unit")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}killed{s}in{s}his{s}chute{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=STATIONARY_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_crew_member_as_actor,
        transform_stationary_unit_as_attacker,
        transform_2d_pos,
    )


class HumanAircraftCrewMemberWasKilledInParachuteByMovingUnitMember(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8(0) was killed in his chute by 0_Chief0 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft crew member was killed in parachute by moving unit member")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}killed{s}in{s}his{s}chute{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=MOVING_UNIT_MEMBER_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_crew_member_as_actor,
        transform_moving_unit_member_as_attacker,
        transform_2d_pos,
    )


class HumanAircraftCrewMemberWasKilledInParachuteByMovingUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8(0) was killed in his chute by 0_Chief at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft crew member was killed in parachute by moving unit")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}killed{s}in{s}his{s}chute{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=MOVING_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_crew_member_as_actor,
        transform_moving_unit_as_attacker,
        transform_2d_pos,
    )


class HumanAircraftCrewMemberWasKilledInParachuteByHumanAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8(0) was killed in his chute by User1:Bf-109G-2 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft crew member was killed in parachute by human aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}killed{s}in{s}his{s}chute{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=HUMAN_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_crew_member_as_actor,
        transform_human_aircraft_as_attacker,
        transform_2d_pos,
    )


class HumanAircraftCrewMemberWasKilledInParachuteByAIAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8(0) was killed in his chute by r01000 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft crew member was killed in parachute by AI aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}killed{s}in{s}his{s}chute{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=AI_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_crew_member_as_actor,
        transform_ai_aircraft_as_attacker,
        transform_2d_pos,
    )


class HumanAircraftCrewMemberParachuteWasDestroyedByStationaryUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8(0) has chute destroyed by 0_Static at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft crew member's parachute was destroyed by stationary unit")
    matcher = make_matcher(
        "{time}{actor}{s}has{s}chute{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=STATIONARY_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_crew_member_as_actor,
        transform_stationary_unit_as_attacker,
        transform_2d_pos,
    )


class HumanAircraftCrewMemberParachuteWasDestroyedByMovingUnitMember(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8(0) has chute destroyed by 0_Chief0 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft crew member's parachute was destroyed by moving unit member")
    matcher = make_matcher(
        "{time}{actor}{s}has{s}chute{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=MOVING_UNIT_MEMBER_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_crew_member_as_actor,
        transform_moving_unit_member_as_attacker,
        transform_2d_pos,
    )


class HumanAircraftCrewMemberParachuteWasDestroyedByMovingUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8(0) has chute destroyed by 0_Chief at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft crew member's parachute was destroyed by moving unit")
    matcher = make_matcher(
        "{time}{actor}{s}has{s}chute{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=MOVING_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_crew_member_as_actor,
        transform_moving_unit_as_attacker,
        transform_2d_pos,
    )


class HumanAircraftCrewMemberParachuteWasDestroyedByHumanAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8(0) has chute destroyed by User1:Bf-109G-2 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft crew member's parachute was destroyed by human aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}has{s}chute{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=HUMAN_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_crew_member_as_actor,
        transform_human_aircraft_as_attacker,
        transform_2d_pos,
    )


class HumanAircraftCrewMemberParachuteWasDestroyedByAIAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] User0:Pe-8(0) has chute destroyed by r01000 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Human aircraft crew member's parachute was destroyed by AI aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}has{s}chute{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=HUMAN_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=AI_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_crew_member_as_actor,
        transform_ai_aircraft_as_attacker,
        transform_2d_pos,
    )


class BuildingWasDestroyedByHumanAircraft(ParsableEvent):
    """
    Examples:

        "[8:33:05 PM] 3do/Buildings/Finland/CenterHouse1_w/live.sim destroyed by User0:Pe-8 at 100.0 200.99"
        "[8:33:05 PM] 3do/Buildings/Russia/Piter/House3_W/mono.sim destroyed by User1:Pe-8 at 300.0 400.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Building was destroyed by human aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=BUILDING_ACTOR_GROUP,
            attacker=HUMAN_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_building_as_actor,
        transform_human_aircraft_as_attacker,
        transform_2d_pos,
    )


class BuildingWasDestroyedByStationaryUnit(ParsableEvent):
    """
    Examples:

        "[8:33:05 PM] 3do/Buildings/Finland/CenterHouse1_w/live.sim destroyed by 0_Static at 100.0 200.99"
        "[8:33:05 PM] 3do/Buildings/Russia/Piter/House3_W/mono.sim destroyed by 1_Static at 300.0 400.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Building was destroyed by stationary unit")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=BUILDING_ACTOR_GROUP,
            attacker=STATIONARY_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_building_as_actor,
        transform_stationary_unit_as_attacker,
        transform_2d_pos,
    )


class BuildingWasDestroyedByMovingUnitMember(ParsableEvent):
    """
    Examples:

        "[8:33:05 PM] 3do/Buildings/Finland/CenterHouse1_w/live.sim destroyed by 0_Chief0 at 100.0 200.99"
        "[8:33:05 PM] 3do/Buildings/Russia/Piter/House3_W/mono.sim destroyed by 1_Chief0 at 300.0 400.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Building was destroyed by moving unit member")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=BUILDING_ACTOR_GROUP,
            attacker=MOVING_UNIT_MEMBER_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_building_as_actor,
        transform_moving_unit_member_as_attacker,
        transform_2d_pos,
    )


class BuildingWasDestroyedByMovingUnit(ParsableEvent):
    """
    Examples:

        "[8:33:05 PM] 3do/Buildings/Finland/CenterHouse1_w/live.sim destroyed by 0_Chief at 100.0 200.99"
        "[8:33:05 PM] 3do/Buildings/Russia/Piter/House3_W/mono.sim destroyed by 1_Chief at 300.0 400.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Building was destroyed by moving unit")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=BUILDING_ACTOR_GROUP,
            attacker=MOVING_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_building_as_actor,
        transform_moving_unit_as_attacker,
        transform_2d_pos,
    )


class BuildingWasDestroyedByAIAircraft(ParsableEvent):
    """
    Examples:

        "[8:33:05 PM] 3do/Buildings/Finland/CenterHouse1_w/live.sim destroyed by r01000 at 100.0 200.99"
        "[8:33:05 PM] 3do/Buildings/Russia/Piter/House3_W/mono.sim destroyed by r01001 at 300.0 400.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Building was destroyed by AI aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=BUILDING_ACTOR_GROUP,
            attacker=AI_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_building_as_actor,
        transform_ai_aircraft_as_attacker,
        transform_2d_pos,
    )


class TreeWasDestroyedByHumanAircraft(ParsableEvent):
    """
    Examples:

        "[8:33:05 PM] 3do/Tree/Line_W/live.sim destroyed by User0:Pe-8 at 100.0 200.99"
        "[8:33:05 PM] 3do/Tree/Line_W/mono.sim destroyed by User0:Pe-8 at 100.0 200.99"
        "[8:33:05 PM] 3do/Tree/Line/live.sim destroyed by User0:Pe-8 at 100.0 200.99"

    """
    __slots__ = ['time', 'attacker', 'pos', ]

    verbose_name = _("Tree was destroyed by human aircraft")
    matcher = make_matcher(
        "{time}{tree}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            tree=TREE,
            attacker=HUMAN_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_human_aircraft_as_attacker,
        transform_2d_pos,
    )


class TreeWasDestroyedByStationaryUnit(ParsableEvent):
    """
    Examples:

        "[8:33:05 PM] 3do/Tree/Line_W/live.sim destroyed by 0_Static at 100.0 200.99"
        "[8:33:05 PM] 3do/Tree/Line_W/mono.sim destroyed by 0_Static at 100.0 200.99"
        "[8:33:05 PM] 3do/Tree/Line/live.sim destroyed by 0_Static at 100.0 200.99"

    """
    __slots__ = ['time', 'attacker', 'pos', ]

    verbose_name = _("Tree was destroyed by stationary unit")
    matcher = make_matcher(
        "{time}{tree}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            tree=TREE,
            attacker=STATIONARY_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_stationary_unit_as_attacker,
        transform_2d_pos,
    )


class TreeWasDestroyedByAIAircraft(ParsableEvent):
    """
    Examples:

        "[8:33:05 PM] 3do/Tree/Line_W/live.sim destroyed by r01000 at 100.0 200.99"
        "[8:33:05 PM] 3do/Tree/Line_W/mono.sim destroyed by r01001 at 100.0 200.99"
        "[8:33:05 PM] 3do/Tree/Line/live.sim destroyed by r01001 at 100.0 200.99"

    """
    __slots__ = ['time', 'attacker', 'pos', ]

    verbose_name = _("Tree was destroyed by AI aircraft")
    matcher = make_matcher(
        "{time}{tree}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            tree=TREE,
            attacker=AI_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_as_attacker,
        transform_2d_pos,
    )


class TreeWasDestroyedByMovingUnitMember(ParsableEvent):
    """
    Examples:

        "[8:33:05 PM] 3do/Tree/Line_W/live.sim destroyed by 0_Chief0 at 100.0 200.99"
        "[8:33:05 PM] 3do/Tree/Line_W/mono.sim destroyed by 0_Chief1 at 100.0 200.99"
        "[8:33:05 PM] 3do/Tree/Line/live.sim destroyed by 0_Chief1 at 100.0 200.99"

    """
    __slots__ = ['time', 'attacker', 'pos', ]

    verbose_name = _("Tree was destroyed by moving unit member")
    matcher = make_matcher(
        "{time}{tree}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            tree=TREE,
            attacker=MOVING_UNIT_MEMBER_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_moving_unit_member_as_attacker,
        transform_2d_pos,
    )


class TreeWasDestroyedByMovingUnit(ParsableEvent):
    """
    Examples:

        "[8:33:05 PM] 3do/Tree/Line_W/live.sim destroyed by 0_Chief at 100.0 200.99"
        "[8:33:05 PM] 3do/Tree/Line_W/mono.sim destroyed by 1_Chief at 100.0 200.99"
        "[8:33:05 PM] 3do/Tree/Line/live.sim destroyed by 2_Chief at 100.0 200.99"

    """
    __slots__ = ['time', 'attacker', 'pos', ]

    verbose_name = _("Tree was destroyed by moving unit")
    matcher = make_matcher(
        "{time}{tree}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            tree=TREE,
            attacker=MOVING_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_moving_unit_as_attacker,
        transform_2d_pos,
    )


class TreeWasDestroyed(ParsableEvent):
    """
    Examples:

        "[8:33:05 PM] 3do/Tree/Line_W/live.sim destroyed by at 100.0 200.99"
        "[8:33:05 PM] 3do/Tree/Line_W/mono.sim destroyed by at 100.0 200.99"
        "[8:33:05 PM] 3do/Tree/Line/live.sim destroyed by at 100.0 200.99"

    """
    __slots__ = ['time', 'pos', ]

    verbose_name = _("Tree was destroyed")
    matcher = make_matcher(
        "{time}{tree}{s}destroyed{s}by{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            tree=TREE,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_2d_pos,
    )


class StationaryUnitWasDestroyed(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] 0_Static crashed at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("Stationary unit was destroyed")
    matcher = make_matcher(
        "{time}{actor}{s}crashed{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=STATIONARY_UNIT_ACTOR_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_stationary_unit_as_actor,
        transform_2d_pos,
    )


class StationaryUnitWasDestroyedByStationaryUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] 0_Static destroyed by 1_Static at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Stationary unit was destroyed by stationary unit")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=STATIONARY_UNIT_ACTOR_GROUP,
            attacker=STATIONARY_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_stationary_unit_as_actor,
        transform_stationary_unit_as_attacker,
        transform_2d_pos,
    )


class StationaryUnitWasDestroyedByMovingUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] 0_Static destroyed by 0_Chief at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Stationary unit was destroyed by moving unit")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=STATIONARY_UNIT_ACTOR_GROUP,
            attacker=MOVING_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_stationary_unit_as_actor,
        transform_moving_unit_as_attacker,
        transform_2d_pos,
    )


class StationaryUnitWasDestroyedByMovingUnitMember(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] 0_Static destroyed by 0_Chief0 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Stationary unit was destroyed by moving unit member")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=STATIONARY_UNIT_ACTOR_GROUP,
            attacker=MOVING_UNIT_MEMBER_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_stationary_unit_as_actor,
        transform_moving_unit_member_as_attacker,
        transform_2d_pos,
    )


class StationaryUnitWasDestroyedByHumanAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] 0_Static destroyed by User0:Pe-8 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Stationary unit was destroyed by human aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=STATIONARY_UNIT_ACTOR_GROUP,
            attacker=HUMAN_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_stationary_unit_as_actor,
        transform_human_aircraft_as_attacker,
        transform_2d_pos,
    )


class StationaryUnitWasDestroyedByAIAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] 0_Static destroyed by r01000 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Stationary unit was destroyed by AI aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=STATIONARY_UNIT_ACTOR_GROUP,
            attacker=AI_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_stationary_unit_as_actor,
        transform_ai_aircraft_as_attacker,
        transform_2d_pos,
    )


class BridgeWasDestroyedByHumanAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM]  Bridge0 destroyed by User0:Pe-8 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Bridge was destroyed by human aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=BRIDGE_ACTOR_GROUP,
            attacker=HUMAN_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_bridge_as_actor,
        transform_human_aircraft_as_attacker,
        transform_2d_pos,
    )


class BridgeWasDestroyedByStationaryUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM]  Bridge0 destroyed by 0_Static at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Bridge was destroyed by stationary unit")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=BRIDGE_ACTOR_GROUP,
            attacker=STATIONARY_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_bridge_as_actor,
        transform_stationary_unit_as_attacker,
        transform_2d_pos,
    )


class BridgeWasDestroyedByMovingUnitMember(ParsableEvent):
    """
    Example:

        "[8:33:05 PM]  Bridge0 destroyed by 0_Chief0 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Bridge was destroyed by moving unit member")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=BRIDGE_ACTOR_GROUP,
            attacker=MOVING_UNIT_MEMBER_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_bridge_as_actor,
        transform_moving_unit_member_as_attacker,
        transform_2d_pos,
    )


class BridgeWasDestroyedByMovingUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM]  Bridge0 destroyed by 0_Chief at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Bridge was destroyed by moving unit")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=BRIDGE_ACTOR_GROUP,
            attacker=MOVING_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_bridge_as_actor,
        transform_moving_unit_as_attacker,
        transform_2d_pos,
    )


class BridgeWasDestroyedByAIAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM]  Bridge0 destroyed by r01000 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Bridge was destroyed by AI aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=BRIDGE_ACTOR_GROUP,
            attacker=AI_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_bridge_as_actor,
        transform_ai_aircraft_as_attacker,
        transform_2d_pos,
    )


class MovingUnitWasDestroyedByMovingUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] 0_Chief destroyed by 1_Chief at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Moving unit was destroyed by moving unit")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=MOVING_UNIT_ACTOR_GROUP,
            attacker=MOVING_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_moving_unit_as_actor,
        transform_moving_unit_as_attacker,
        transform_2d_pos,
    )


class MovingUnitWasDestroyedByMovingUnitMember(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] 0_Chief destroyed by 1_Chief0 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Moving unit was destroyed by moving unit member")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=MOVING_UNIT_ACTOR_GROUP,
            attacker=MOVING_UNIT_MEMBER_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_moving_unit_as_actor,
        transform_moving_unit_member_as_attacker,
        transform_2d_pos,
    )


class MovingUnitWasDestroyedByStationaryUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] 0_Chief destroyed by 0_Static at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Moving unit was destroyed by stationary unit")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=MOVING_UNIT_ACTOR_GROUP,
            attacker=STATIONARY_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_moving_unit_as_actor,
        transform_stationary_unit_as_attacker,
        transform_2d_pos,
    )


class MovingUnitWasDestroyedByHumanAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] 0_Chief destroyed by User0:Pe-8 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Moving unit was destroyed by human aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=MOVING_UNIT_ACTOR_GROUP,
            attacker=HUMAN_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_moving_unit_as_actor,
        transform_human_aircraft_as_attacker,
        transform_2d_pos,
    )


class MovingUnitWasDestroyedByAIAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] 0_Chief destroyed by r01000 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Moving unit was destroyed by AI aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=MOVING_UNIT_ACTOR_GROUP,
            attacker=AI_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_moving_unit_as_actor,
        transform_ai_aircraft_as_attacker,
        transform_2d_pos,
    )


class MovingUnitMemberWasDestroyedByStationaryUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] 0_Chief0 destroyed by 0_Static at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Moving unit member was destroyed by stationary unit")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=MOVING_UNIT_MEMBER_ACTOR_GROUP,
            attacker=STATIONARY_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_moving_unit_member_as_actor,
        transform_stationary_unit_as_attacker,
        transform_2d_pos,
    )


class MovingUnitMemberWasDestroyedByAIAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] 0_Chief0 destroyed by r01000 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Moving unit member was destroyed by AI aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=MOVING_UNIT_MEMBER_ACTOR_GROUP,
            attacker=AI_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_moving_unit_member_as_actor,
        transform_ai_aircraft_as_attacker,
        transform_2d_pos,
    )


class MovingUnitMemberWasDestroyedByHumanAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] 0_Chief0 destroyed by User0:Pe-8 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Moving unit member was destroyed by human aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=MOVING_UNIT_MEMBER_ACTOR_GROUP,
            attacker=HUMAN_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_moving_unit_member_as_actor,
        transform_human_aircraft_as_attacker,
        transform_2d_pos,
    )


class MovingUnitMemberWasDestroyedByMovingUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] 0_Chief0 destroyed by 1_Chief at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Moving unit member was destroyed by moving unit")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=MOVING_UNIT_MEMBER_ACTOR_GROUP,
            attacker=MOVING_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_moving_unit_member_as_actor,
        transform_moving_unit_as_attacker,
        transform_2d_pos,
    )


class MovingUnitMemberWasDestroyedByMovingUnitMember(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] 0_Chief0 destroyed by 1_Chief0 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("Moving unit member was destroyed by moving unit member")
    matcher = make_matcher(
        "{time}{actor}{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=MOVING_UNIT_MEMBER_ACTOR_GROUP,
            attacker=MOVING_UNIT_MEMBER_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_moving_unit_member_as_actor,
        transform_moving_unit_member_as_attacker,
        transform_2d_pos,
    )


class AIAircraftHasDespawned(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000 removed at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("AI aircraft has despawned")
    matcher = make_matcher(
        "{time}{actor}{s}removed{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_ACTOR_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_as_actor,
        transform_2d_pos,
    )


class AIAircraftWasDamagedOnGround(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000 damaged on the ground at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("AI aircraft was damaged on the ground")
    matcher = make_matcher(
        "{time}{actor}{s}damaged{s}on{s}the{s}ground{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_ACTOR_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_as_actor,
        transform_2d_pos,
    )


class AIAircraftWasDamagedByHumanAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000 damaged by User1:Bf-109G-6_Late at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft was damaged by human aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}damaged{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_ACTOR_GROUP,
            attacker=HUMAN_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_as_actor,
        transform_human_aircraft_as_attacker,
        transform_2d_pos,
    )


class AIAircraftWasDamagedByStationaryUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000 damaged by 0_Static at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft was damaged by stationary unit")
    matcher = make_matcher(
        "{time}{actor}{s}damaged{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_ACTOR_GROUP,
            attacker=STATIONARY_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_as_actor,
        transform_stationary_unit_as_attacker,
        transform_2d_pos,
    )


class AIAircraftWasDamagedByMovingUnitMember(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000 damaged by 0_Chief0 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft was damaged by moving unit member")
    matcher = make_matcher(
        "{time}{actor}{s}damaged{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_ACTOR_GROUP,
            attacker=MOVING_UNIT_MEMBER_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_as_actor,
        transform_moving_unit_member_as_attacker,
        transform_2d_pos,
    )


class AIAircraftWasDamagedByMovingUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000 damaged by 0_Chief at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft was damaged by moving unit")
    matcher = make_matcher(
        "{time}{actor}{s}damaged{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_ACTOR_GROUP,
            attacker=MOVING_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_as_actor,
        transform_moving_unit_as_attacker,
        transform_2d_pos,
    )


class AIAircraftWasDamagedByAIAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000 damaged by r01001 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft was damaged by AI aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}damaged{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_ACTOR_GROUP,
            attacker=AI_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_as_actor,
        transform_ai_aircraft_as_attacker,
        transform_2d_pos,
    )


class AIHasDamagedOwnAircraft(ParsableEvent):
    """
    Examples:

        "[8:33:05 PM] r01000 damaged by landscape at 100.0 200.99"
        "[8:33:05 PM] r01000 damaged by NONAME at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("AI has damaged own aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}damaged{s}by{s}{himself}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_ACTOR_GROUP,
            himself=HIMSELF,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_as_actor,
        transform_2d_pos,
    )


class AIHasDestroyedOwnAircraft(ParsableEvent):
    """
    Examples:

        "[8:33:05 PM] r01000 shot down by landscape at 100.0 200.99"
        "[8:33:05 PM] r01000 shot down by NONAME at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("AI has destroyed own aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}shot{s}down{s}by{s}{himself}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_ACTOR_GROUP,
            himself=HIMSELF,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_as_actor,
        transform_2d_pos,
    )


class AIAircraftHasLanded(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000 landed at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("AI aircraft has landed")
    matcher = make_matcher(
        "{time}{actor}{s}landed{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_ACTOR_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_as_actor,
        transform_2d_pos,
    )


class AIAircraftHasCrashed(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000 crashed at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("AI aircraft has crashed")
    matcher = make_matcher(
        "{time}{actor}{s}crashed{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_ACTOR_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_as_actor,
        transform_2d_pos,
    )


class AIAircraftWasShotDownByHumanAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000 shot down by User1:Bf-109G-6_Late at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft was shot down by human aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}shot{s}down{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_ACTOR_GROUP,
            attacker=HUMAN_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_as_actor,
        transform_human_aircraft_as_attacker,
        transform_2d_pos,
    )


class AIAircraftWasShotDownByAIAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000 shot down by r01001 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft was shot down by AI aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}shot{s}down{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_ACTOR_GROUP,
            attacker=AI_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_as_actor,
        transform_ai_aircraft_as_attacker,
        transform_2d_pos,
    )


class AIAircraftWasShotDownByStationaryUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000 shot down by 0_Static at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft was shot down by stationary unit")
    matcher = make_matcher(
        "{time}{actor}{s}shot{s}down{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_ACTOR_GROUP,
            attacker=STATIONARY_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_as_actor,
        transform_stationary_unit_as_attacker,
        transform_2d_pos,
    )


class AIAircraftWasShotDownByMovingUnitMember(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000 shot down by 0_Chief0 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft was shot down by moving unit member")
    matcher = make_matcher(
        "{time}{actor}{s}shot{s}down{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_ACTOR_GROUP,
            attacker=MOVING_UNIT_MEMBER_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_as_actor,
        transform_moving_unit_member_as_attacker,
        transform_2d_pos,
    )


class AIAircraftWasShotDownByMovingUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000 shot down by 0_Chief at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft was shot down by moving unit")
    matcher = make_matcher(
        "{time}{actor}{s}shot{s}down{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_ACTOR_GROUP,
            attacker=MOVING_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_as_actor,
        transform_moving_unit_as_attacker,
        transform_2d_pos,
    )


class AIAircraftWasShotDownByAIAircraftAndAIAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000 shot down by r01001 and r01002 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'assistant', 'pos', ]

    verbose_name = _("AI aircraft was shot down by AI aircraft and AI aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}shot{s}down{s}by{s}{attacker}{s}and{s}{assistant}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_ACTOR_GROUP,
            attacker=AI_AIRCRAFT_ATTACKER_GROUP,
            assistant=AI_AIRCRAFT_ASSISTANT_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_as_actor,
        transform_ai_aircraft_as_attacker,
        transform_ai_aircraft_as_assistant,
        transform_2d_pos,
    )


class AIAircraftWasShotDownByHumanAircraftAndAIAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000 shot down by User0:Bf-109G-2 and r01001 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'assistant', 'pos', ]

    verbose_name = _("AI aircraft was shot down by human aircraft and AI aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}shot{s}down{s}by{s}{attacker}{s}and{s}{assistant}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_ACTOR_GROUP,
            attacker=HUMAN_AIRCRAFT_ATTACKER_GROUP,
            assistant=AI_AIRCRAFT_ASSISTANT_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_as_actor,
        transform_human_aircraft_as_attacker,
        transform_ai_aircraft_as_assistant,
        transform_2d_pos,
    )


class AIAircraftWasShotDownByAIAircraftAndHumanAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000 shot down by r01001 and User0:Bf-109G-2 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'assistant', 'pos', ]

    verbose_name = _("AI aircraft was shot down by AI aircraft and human aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}shot{s}down{s}by{s}{attacker}{s}and{s}{assistant}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_ACTOR_GROUP,
            attacker=AI_AIRCRAFT_ATTACKER_GROUP,
            assistant=HUMAN_AIRCRAFT_ASSISTANT_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_as_actor,
        transform_ai_aircraft_as_attacker,
        transform_human_aircraft_as_assistant,
        transform_2d_pos,
    )


class AIAircraftWasShotDownByHumanAircraftAndHumanAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000 shot down by User0:Bf-109G-2 and User1:Bf-109G-2 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'assistant', 'pos', ]

    verbose_name = _("AI aircraft was shot down by human aircraft and human aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}shot{s}down{s}by{s}{attacker}{s}and{s}{assistant}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_ACTOR_GROUP,
            attacker=HUMAN_AIRCRAFT_ATTACKER_GROUP,
            assistant=HUMAN_AIRCRAFT_ASSISTANT_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_as_actor,
        transform_human_aircraft_as_attacker,
        transform_human_aircraft_as_assistant,
        transform_2d_pos,
    )


class AIAircraftCrewMemberWasKilled(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000(0) was killed at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("AI aircraft crew member was killed")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}killed{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_crew_member_as_actor,
        transform_2d_pos,
    )


class AIAircraftCrewMemberWasKilledByStationaryUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000(0) was killed by 0_Static at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft crew member was killed by stationary unit")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}killed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=STATIONARY_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_crew_member_as_actor,
        transform_stationary_unit_as_attacker,
        transform_2d_pos,
    )


class AIAircraftCrewMemberWasKilledByHumanAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000(0) was killed by User1:Bf-109G-6_Late at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft crew member was killed by human aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}killed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=HUMAN_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_crew_member_as_actor,
        transform_human_aircraft_as_attacker,
        transform_2d_pos,
    )


class AIAircraftCrewMemberWasKilledByAIAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000(0) was killed by r01001 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft crew member was killed by AI aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}killed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=AI_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_crew_member_as_actor,
        transform_ai_aircraft_as_attacker,
        transform_2d_pos,
    )


class AIAircraftCrewMemberWasKilledByMovingUnitMember(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000(0) was killed by 0_Chief0 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft crew member was killed by moving unit member")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}killed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=MOVING_UNIT_MEMBER_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_crew_member_as_actor,
        transform_moving_unit_member_as_attacker,
        transform_2d_pos,
    )


class AIAircraftCrewMemberWasKilledByMovingUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000(0) was killed by 0_Chief at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft crew member was killed by moving unit")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}killed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=MOVING_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_crew_member_as_actor,
        transform_moving_unit_as_attacker,
        transform_2d_pos,
    )


class AIAircraftCrewMemberWasKilledInParachuteByAIAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000(0) was killed in his chute by r01001 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft crew member was killed in parachute by AI aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}killed{s}in{s}his{s}chute{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=AI_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_crew_member_as_actor,
        transform_ai_aircraft_as_attacker,
        transform_2d_pos,
    )


class AIAircraftCrewMemberWasKilledInParachuteByStationaryUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000(0) was killed in his chute by 0_Static at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft crew member was killed in parachute by stationary unit")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}killed{s}in{s}his{s}chute{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=STATIONARY_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_crew_member_as_actor,
        transform_stationary_unit_as_attacker,
        transform_2d_pos,
    )


class AIAircraftCrewMemberWasKilledInParachuteByMovingUnitMember(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000(0) was killed in his chute by 0_Chief0 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft crew member was killed in parachute by moving unit member")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}killed{s}in{s}his{s}chute{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=MOVING_UNIT_MEMBER_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_crew_member_as_actor,
        transform_moving_unit_member_as_attacker,
        transform_2d_pos,
    )


class AIAircraftCrewMemberWasKilledInParachuteByMovingUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000(0) was killed in his chute by 0_Chief at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft crew member was killed in parachute by moving unit")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}killed{s}in{s}his{s}chute{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=MOVING_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_crew_member_as_actor,
        transform_moving_unit_as_attacker,
        transform_2d_pos,
    )


class AIAircraftCrewMemberWasKilledInParachuteByHumanAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000(0) was killed in his chute by User0:Pe-8 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft crew member was killed in parachute by human aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}killed{s}in{s}his{s}chute{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=HUMAN_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_crew_member_as_actor,
        transform_human_aircraft_as_attacker,
        transform_2d_pos,
    )


class AIAircraftCrewMemberParachuteWasDestroyedByAIAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000(0) has chute destroyed by r01001 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft crew member's parachute was destroyed by AI aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}has{s}chute{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=AI_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_crew_member_as_actor,
        transform_ai_aircraft_as_attacker,
        transform_2d_pos,
    )


class AIAircraftCrewMemberParachuteWasDestroyedByStationaryUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000(0) has chute destroyed by 0_Static at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft crew member's parachute was destroyed by stationary unit")
    matcher = make_matcher(
        "{time}{actor}{s}has{s}chute{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=STATIONARY_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_crew_member_as_actor,
        transform_stationary_unit_as_attacker,
        transform_2d_pos,
    )


class AIAircraftCrewMemberParachuteWasDestroyedByMovingUnitMember(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000(0) has chute destroyed by 0_Chief0 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft crew member's parachute was destroyed by moving unit member")
    matcher = make_matcher(
        "{time}{actor}{s}has{s}chute{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=MOVING_UNIT_MEMBER_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_crew_member_as_actor,
        transform_moving_unit_member_as_attacker,
        transform_2d_pos,
    )


class AIAircraftCrewMemberParachuteWasDestroyedByMovingUnit(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000(0) has chute destroyed by 0_Chief at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft crew member's parachute was destroyed by moving unit")
    matcher = make_matcher(
        "{time}{actor}{s}has{s}chute{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=MOVING_UNIT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_crew_member_as_actor,
        transform_moving_unit_as_attacker,
        transform_2d_pos,
    )


class AIAircraftCrewMemberParachuteWasDestroyedByHumanAircraft(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000(0) has chute destroyed by User0:Bf-109G-2 at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'attacker', 'pos', ]

    verbose_name = _("AI aircraft crew member's parachute was destroyed by human aircraft")
    matcher = make_matcher(
        "{time}{actor}{s}has{s}chute{s}destroyed{s}by{s}{attacker}{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            attacker=HUMAN_AIRCRAFT_ATTACKER_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_crew_member_as_actor,
        transform_human_aircraft_as_attacker,
        transform_2d_pos,
    )


class AIAircraftCrewMemberParachuteWasDestroyed(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000(0) has chute destroyed at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("AI aircraft crew member's parachute was destroyed")
    matcher = make_matcher(
        "{time}{actor}{s}has{s}chute{s}destroyed{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_crew_member_as_actor,
        transform_2d_pos,
    )


class AIAircraftCrewMemberWasWounded(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000(0) was wounded at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("AI aircraft crew member was wounded")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}wounded{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_crew_member_as_actor,
        transform_2d_pos,
    )


class AIAircraftCrewMemberWasHeavilyWounded(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000(0) was heavily wounded at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("AI aircraft crew member was heavily wounded")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}heavily{s}wounded{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_crew_member_as_actor,
        transform_2d_pos,
    )


class AIAircraftCrewMemberWasCaptured(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000(0) was captured at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("AI aircraft crew member was captured")
    matcher = make_matcher(
        "{time}{actor}{s}was{s}captured{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_crew_member_as_actor,
        transform_2d_pos,
    )


class AIAircraftCrewMemberHasBailedOut(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000(0) bailed out at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("AI aircraft crew member has bailed out")
    matcher = make_matcher(
        "{time}{actor}{s}bailed{s}out{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_crew_member_as_actor,
        transform_2d_pos,
    )


class AIAircraftCrewMemberHasLanded(ParsableEvent):
    """
    Example:

        "[8:33:05 PM] r01000(0) successfully bailed out at 100.0 200.99"

    """
    __slots__ = ['time', 'actor', 'pos', ]

    verbose_name = _("AI aircraft crew member has landed")
    matcher = make_matcher(
        "{time}{actor}{s}successfully{s}bailed{s}out{pos}"
        .format(
            time=TIME_GROUP_PREFIX,
            actor=AI_AIRCRAFT_CREW_MEMBER_ACTOR_GROUP,
            pos=POS_GROUP_SUFFIX,
            s=WHITESPACE,
        )
    )
    transformers = (
        transform_time,
        transform_ai_aircraft_crew_member_as_actor,
        transform_2d_pos,
    )