use wows_replays::analyzer::decoder::{DeathCause, Recognized};
use crate::map_data::MinimapPos;
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum ShipVisibility {
Visible,
MinimapOnly,
Undetected,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ShipConfigCircleKind {
Detection,
MainBattery,
SecondaryBattery,
Radar,
Hydro,
}
#[derive(Debug, Clone)]
pub struct ChatEntry {
pub clan_tag: String,
pub clan_color: Option<[u8; 3]>,
pub player_name: String,
pub team_color: [u8; 3],
pub ship_species: Option<String>,
pub ship_name: Option<String>,
pub message: String,
pub message_color: [u8; 3],
pub opacity: f32,
}
#[derive(Debug, Clone)]
pub struct KillFeedEntry {
pub killer_name: String,
pub killer_species: Option<String>,
pub killer_ship_name: Option<String>,
pub killer_color: [u8; 3],
pub victim_name: String,
pub victim_species: Option<String>,
pub victim_ship_name: Option<String>,
pub victim_color: [u8; 3],
pub cause: Recognized<DeathCause>,
}
#[derive(Debug)]
pub enum DrawCommand {
ShotTracer {
from: MinimapPos,
to: MinimapPos,
color: [u8; 3],
},
Torpedo { pos: MinimapPos, color: [u8; 3] },
Smoke {
pos: MinimapPos,
radius: i32,
color: [u8; 3],
alpha: f32,
},
Ship {
pos: MinimapPos,
yaw: f32,
species: Option<String>,
color: Option<[u8; 3]>,
visibility: ShipVisibility,
opacity: f32,
is_self: bool,
player_name: Option<String>,
ship_name: Option<String>,
is_detected_teammate: bool,
name_color: Option<[u8; 3]>,
},
HealthBar {
pos: MinimapPos,
fraction: f32,
fill_color: [u8; 3],
background_color: [u8; 3],
background_alpha: f32,
},
DeadShip {
pos: MinimapPos,
yaw: f32,
species: Option<String>,
color: Option<[u8; 3]>,
is_self: bool,
player_name: Option<String>,
ship_name: Option<String>,
},
BuffZone {
pos: MinimapPos,
radius: i32,
color: [u8; 3],
alpha: f32,
marker_name: Option<String>,
},
CapturePoint {
pos: MinimapPos,
radius: i32,
color: [u8; 3],
alpha: f32,
label: String,
progress: f32,
invader_color: Option<[u8; 3]>,
},
TurretDirection {
pos: MinimapPos,
yaw: f32,
color: [u8; 3],
length: i32,
},
Building {
pos: MinimapPos,
color: [u8; 3],
is_alive: bool,
},
Plane {
pos: MinimapPos,
icon_key: String,
},
ConsumableRadius {
pos: MinimapPos,
radius_px: i32,
color: [u8; 3],
alpha: f32,
},
PatrolRadius {
pos: MinimapPos,
radius_px: i32,
color: [u8; 3],
alpha: f32,
},
ConsumableIcons {
pos: MinimapPos,
icon_keys: Vec<String>,
is_friendly: bool,
has_hp_bar: bool,
},
ShipConfigCircle {
pos: MinimapPos,
radius_px: f32,
color: [u8; 3],
alpha: f32,
dashed: bool,
label: Option<String>,
kind: ShipConfigCircleKind,
player_name: String,
is_self: bool,
},
PositionTrail {
player_name: Option<String>,
points: Vec<(MinimapPos, [u8; 3])>,
},
TeamBuffs {
friendly_buffs: Vec<(String, u32)>,
enemy_buffs: Vec<(String, u32)>,
},
ScoreBar {
team0: i32,
team1: i32,
team0_color: [u8; 3],
team1_color: [u8; 3],
max_score: i32,
team0_timer: Option<String>,
team1_timer: Option<String>,
advantage_label: String,
advantage_team: i32,
},
TeamAdvantage {
label: String,
color: [u8; 3],
breakdown: crate::advantage::AdvantageBreakdown,
},
Timer {
time_remaining: Option<i64>,
elapsed: f32,
},
PreBattleCountdown { seconds: i64 },
KillFeed { entries: Vec<KillFeedEntry> },
ChatOverlay { entries: Vec<ChatEntry> },
BattleResultOverlay {
text: String,
subtitle: Option<String>,
color: [u8; 3],
},
}
pub trait RenderTarget {
fn begin_frame(&mut self);
fn draw(&mut self, cmd: &DrawCommand);
fn end_frame(&mut self);
}