Skip to content

Commit 3557ecd

Browse files
authored
Merge pull request spookybear0#130 from EboMike/scorecard
Add friendly medic hits as a notable event.
2 parents b4c5134 + 26fadfb commit 3557ecd

File tree

2 files changed

+140
-6
lines changed

2 files changed

+140
-6
lines changed

helpers/sm5helper.py

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ async def get_sm5_player_stats(game: SM5Game, main_player: Optional[EntityStarts
485485

486486
@cache()
487487
async def get_sm5_lives_over_time(game: SM5Game, team_roster: dict[Team, List[PlayerInfo]], granularity_millis: int) -> \
488-
dict[int, list[int]]:
488+
dict[int, list[int]]:
489489
lives_timeline = defaultdict(list)
490490
current_lives = {}
491491

@@ -554,7 +554,7 @@ async def get_sm5_lives_over_time(game: SM5Game, team_roster: dict[Team, List[Pl
554554

555555
async def get_sm5_rating_over_time(entity_id: str, min_time: datetime = _MIN_DATETIME,
556556
max_time: datetime = _MAX_DATETIME) -> \
557-
Optional[TimeSeriesRawData]:
557+
Optional[TimeSeriesRawData]:
558558
"""Creates a time series of the SM5 rating for a specific player.
559559
560560
entity_id: Entity ID of the player to get the rating for.
@@ -883,6 +883,52 @@ def add_event(time_ms: int, event: str, short_event: list[str], team: Team):
883883
break
884884

885885
nuke_check_index += 1
886+
887+
# Any friendly medic hits?
888+
if events[event_index].type in [
889+
EventType.DOWNED_OPPONENT,
890+
EventType.DOWNED_TEAM,
891+
EventType.MISSILE_DOWN_OPPONENT,
892+
EventType.MISSILE_DOWN_TEAM]:
893+
# One player downed another. Was it a medic?
894+
tag_time_ms = events[event_index].time
895+
target_entity_id = events[event_index].entity2
896+
897+
if target_entity_id not in entity_id_map:
898+
print(f"ERROR - cannot find entity for target {target_entity_id}")
899+
event_index += 1
900+
continue
901+
902+
target_entity = entity_id_map[target_entity_id]
903+
target_team = team_from_entity_id[target_entity_id]
904+
905+
# We only care about medics getting hit.
906+
if target_entity.role != IntRole.MEDIC:
907+
event_index += 1
908+
continue
909+
910+
aggressor_entity_id = events[event_index].entity1
911+
912+
if aggressor_entity_id not in entity_id_map:
913+
print(f"ERROR - cannot find entity for aggressor {aggressor_entity_id}")
914+
event_index += 1
915+
continue
916+
917+
aggressor_entity = entity_id_map[aggressor_entity_id]
918+
aggressor_team = team_from_entity_id[aggressor_entity_id]
919+
920+
if target_team == aggressor_team:
921+
# Friendly fire!
922+
if events[event_index].type in [EventType.MISSILE_DOWN_TEAM,
923+
EventType.MISSILE_DOWN_OPPONENT]:
924+
add_event(tag_time_ms,
925+
f"{aggressor_entity.name} MISSILES own medic {target_entity.name}",
926+
[aggressor_entity.name, "MISSILES own medic"], target_team)
927+
else:
928+
add_event(tag_time_ms,
929+
f"{aggressor_entity.name} tags own medic {target_entity.name}",
930+
[aggressor_entity.name, "tags own medic"], target_team)
931+
886932
event_index += 1
887933

888934
sort_notable_events(result)

tests/helpers/sm5helper_test.py

Lines changed: 92 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from helpers.sm5helper import get_sm5_last_team_standing, get_sm5_notable_events, update_team_sizes
66
from helpers.statshelper import NotableEvent
77
from helpers.tdfhelper import create_event
8-
from tests.helpers.environment import setup_test_database, ENTITY_ID_1, ENTITY_ID_2, get_sm5_game_id, \
8+
from tests.helpers.environment import setup_test_database, ENTITY_ID_1, ENTITY_ID_2, ENTITY_ID_4, get_sm5_game_id, \
99
teardown_test_database, add_entity, get_red_team, get_green_team, add_sm5_stats, ENTITY_ID_3, add_sm5_event
1010

1111

@@ -31,7 +31,6 @@ async def test_get_team_sizes_counts_correctly(self):
3131
team_sizes = [game.team1_size, game.team2_size]
3232
self.assertCountEqual([1, 2], team_sizes)
3333

34-
3534
async def test_get_team_sizes_counts_only_one_team(self):
3635
game = await SM5Game.filter(id=get_sm5_game_id()).first()
3736

@@ -45,7 +44,6 @@ async def test_get_team_sizes_counts_only_one_team(self):
4544
self.assertEqual(2, game.team1_size)
4645
self.assertEqual(0, game.team2_size)
4746

48-
4947
async def test_get_team_sizes_counts_no_players(self):
5048
game = await SM5Game.filter(id=get_sm5_game_id()).first()
5149

@@ -54,7 +52,6 @@ async def test_get_team_sizes_counts_no_players(self):
5452
self.assertEqual(0, game.team1_size)
5553
self.assertEqual(0, game.team2_size)
5654

57-
5855
async def test_get_sm5_last_team_standing_both_alive(self):
5956
game = await SM5Game.filter(id=get_sm5_game_id()).first()
6057
entity_start, entity_end = await add_entity(entity_id=ENTITY_ID_1, team=get_red_team())
@@ -265,5 +262,96 @@ async def test_get_sm5_notable_events(self):
265262
id='event11',
266263
position='80%')], notable_events)
267264

265+
async def test_get_sm5_notable_events_medic_hits(self):
266+
await teardown_test_database()
267+
await setup_test_database(basic_events=False)
268+
269+
game = await SM5Game.filter(id=get_sm5_game_id()).first()
270+
271+
# Player 1 is RED MEDIC.
272+
entity_start, entity_end = await add_entity(entity_id=ENTITY_ID_1, team=get_red_team(),
273+
role=IntRole.MEDIC,
274+
name="FireMedic")
275+
await add_sm5_stats(entity_start)
276+
277+
# Player 2 is GREEN MEDIC.
278+
entity_start2, entity_end2 = await add_entity(entity_id=ENTITY_ID_2, team=get_green_team(),
279+
role=IntRole.MEDIC,
280+
name="GreenMedic")
281+
await add_sm5_stats(entity_start2)
282+
283+
# Player 3 is RED SCOUT.
284+
entity_start3, entity_end3 = await add_entity(entity_id=ENTITY_ID_3, team=get_red_team(),
285+
role=IntRole.SCOUT,
286+
name="Red Scout")
287+
await add_sm5_stats(entity_start3)
288+
289+
# Player 4 is GREEN AMMO.
290+
entity_start4, entity_end4 = await add_entity(entity_id=ENTITY_ID_4, team=get_green_team(),
291+
role=IntRole.AMMO,
292+
name="Green Ammo")
293+
await add_sm5_stats(entity_start4)
294+
295+
await game.entity_starts.add(entity_start, entity_start2, entity_start3, entity_start4)
296+
await game.entity_ends.add(entity_end, entity_end2, entity_end3, entity_end4)
297+
298+
# 5000: Irrelevant event.
299+
await add_sm5_event(await create_event(time_ms=10000, type=EventType.LOCKING,
300+
entity1=ENTITY_ID_3,
301+
entity2=ENTITY_ID_1,
302+
))
303+
304+
# 10000: Medic to medic. IGNORED: Across teams, ignored
305+
await add_sm5_event(await create_event(time_ms=10000, type=EventType.DOWNED_OPPONENT,
306+
entity1=ENTITY_ID_1,
307+
entity2=ENTITY_ID_2,
308+
))
309+
310+
# 20000: Scout to medic. Friendly fire
311+
await add_sm5_event(await create_event(time_ms=20000, type=EventType.DOWNED_OPPONENT,
312+
entity1=ENTITY_ID_3,
313+
entity2=ENTITY_ID_1,
314+
))
315+
316+
# 30000: Medic to scout. Ignored
317+
await add_sm5_event(await create_event(time_ms=30000, type=EventType.DOWNED_OPPONENT,
318+
entity1=ENTITY_ID_1,
319+
entity2=ENTITY_ID_3,
320+
))
321+
322+
# 40000: Ammo to medic. Friendly fire.
323+
await add_sm5_event(await create_event(time_ms=40000, type=EventType.DOWNED_TEAM,
324+
entity1=ENTITY_ID_4,
325+
entity2=ENTITY_ID_2,
326+
))
327+
328+
# 50000: Scout to medic with missile (yeah right). Friendly fire
329+
await add_sm5_event(await create_event(time_ms=50000, type=EventType.MISSILE_DOWN_OPPONENT,
330+
entity1=ENTITY_ID_3,
331+
entity2=ENTITY_ID_1,
332+
))
333+
334+
notable_events = await get_sm5_notable_events(game)
335+
336+
# All events, in chronological order.
337+
self.assertEqual([NotableEvent(seconds=20,
338+
event='Red Scout tags own medic FireMedic',
339+
short_event=['Red Scout', 'tags own medic'],
340+
team=Team.RED,
341+
id='event1',
342+
position='90%'),
343+
NotableEvent(seconds=40,
344+
event='Green Ammo tags own medic GreenMedic',
345+
short_event=['Green Ammo', 'tags own medic'],
346+
team=Team.GREEN,
347+
id='event2',
348+
position='80%'),
349+
NotableEvent(seconds=50,
350+
event='Red Scout MISSILES own medic FireMedic',
351+
short_event=['Red Scout', 'MISSILES own medic'],
352+
team=Team.RED,
353+
id='event3',
354+
position='70%')], notable_events)
355+
268356
if __name__ == '__main__':
269357
unittest.main()

0 commit comments

Comments
 (0)