summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--cs2pov/cli.py11
-rw-r--r--cs2pov/parser.py49
2 files changed, 54 insertions, 6 deletions
diff --git a/cs2pov/cli.py b/cs2pov/cli.py
index f21e368..0d2ec26 100644
--- a/cs2pov/cli.py
+++ b/cs2pov/cli.py
@@ -597,17 +597,15 @@ def print_demo_info_extended(
print(f"\nPlayers ({len(demo_info.players)}):")
for player in demo_info.players:
- team_str = f"[{player.team}]" if player.team else "[--]"
timeline = timelines.get(player.steamid)
print(f" {player.name}")
- print(f" SteamID: {player.steamid} Team: {team_str}")
+ print(f" SteamID: {player.steamid}")
+ print(f" Kills: {player.kills} Deaths: {len(timeline.deaths) if timeline else 0} Assists: {player.assists}")
if timeline:
- death_count = len(timeline.deaths)
alive_time = sum(seg.duration_seconds for seg in timeline.alive_segments)
- print(f" Deaths: {death_count}, Alive segments: {len(timeline.alive_segments)}, "
- f"Alive time: {alive_time:.1f}s")
+ print(f" Alive segments: {len(timeline.alive_segments)}, Alive time: {alive_time:.1f}s")
if verbose and timeline.alive_segments:
print(f" Alive segments:")
@@ -650,7 +648,8 @@ def format_info_json(
player_data = {
"name": player.name,
"steamid": player.steamid,
- "team": player.team,
+ "kills": player.kills,
+ "assists": player.assists,
}
if timeline:
diff --git a/cs2pov/parser.py b/cs2pov/parser.py
index d9a89ca..133d62c 100644
--- a/cs2pov/parser.py
+++ b/cs2pov/parser.py
@@ -18,6 +18,8 @@ class PlayerInfo:
name: str
team: Optional[str] = None
user_id: Optional[int] = None # Player slot from demo (use user_id + 1 for spec_player)
+ kills: int = 0
+ assists: int = 0
@dataclass
@@ -71,6 +73,12 @@ def parse_demo(demo_path: Path) -> DemoInfo:
tick_df = parser.parse_ticks(["team_num", "user_id"])
players = _extract_players(tick_df)
+ # Get kill/assist counts
+ kills, assists = _extract_kills_assists(parser)
+ for player in players:
+ player.kills = kills.get(player.steamid, 0)
+ player.assists = assists.get(player.steamid, 0)
+
# Get round events
rounds = _extract_rounds(parser)
@@ -118,6 +126,47 @@ def _extract_players(tick_df) -> list[PlayerInfo]:
return players
+def _extract_kills_assists(parser: DemoParser) -> tuple[dict[int, int], dict[int, int]]:
+ """Extract kill and assist counts per player from player_death events.
+
+ Returns:
+ Tuple of (kills_dict, assists_dict) mapping steamid to count
+ """
+ kills: dict[int, int] = {}
+ assists: dict[int, int] = {}
+
+ try:
+ events_df = parser.parse_event("player_death")
+ if events_df is None or len(events_df) == 0:
+ return kills, assists
+
+ for _, row in events_df.iterrows():
+ # Count kills (attacker_steamid)
+ attacker = row.get("attacker_steamid")
+ if attacker is not None:
+ try:
+ attacker_id = int(attacker)
+ if attacker_id > 0:
+ kills[attacker_id] = kills.get(attacker_id, 0) + 1
+ except (ValueError, TypeError):
+ pass
+
+ # Count assists (assister_steamid)
+ assister = row.get("assister_steamid")
+ if assister is not None:
+ try:
+ assister_id = int(assister)
+ if assister_id > 0:
+ assists[assister_id] = assists.get(assister_id, 0) + 1
+ except (ValueError, TypeError):
+ pass
+
+ except Exception:
+ pass
+
+ return kills, assists
+
+
def _extract_rounds(parser: DemoParser) -> list[RoundInfo]:
"""Extract round boundaries from demo events."""
rounds = []