use super::class_targets::{ClassTargetError, ClassVtable, SlotTargets};
use crate::tf2::scoreboard::ScoringTeam;
use sdk_raw::players::{TEAM_SPECTATOR, TEAM_UNASSIGNED};
use sdk_raw::tf2::scoreboard::{TF_TEAM_BLUE, TF_TEAM_RED};
use sdk_raw::tf2::teams::CHANGE_TEAM_SLOT;
use std::ffi::c_int;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum Team {
#[doc(alias("TEAM_UNASSIGNED"))]
Unassigned,
#[doc(alias("TEAM_SPECTATOR"))]
Spectator,
#[doc(alias("TF_TEAM_RED"))]
Red,
#[doc(alias("TF_TEAM_BLUE"))]
Blue,
}
impl Team {
pub const ALL: [Self; 4] = [Self::Unassigned, Self::Spectator, Self::Red, Self::Blue];
pub const PLAYING: [Self; 2] = [Self::Red, Self::Blue];
pub const fn from_raw(raw: c_int) -> Option<Self> {
match raw {
TEAM_UNASSIGNED => Some(Self::Unassigned),
TEAM_SPECTATOR => Some(Self::Spectator),
TF_TEAM_RED => Some(Self::Red),
TF_TEAM_BLUE => Some(Self::Blue),
_ => None,
}
}
pub const fn is_playing(self) -> bool {
matches!(self, Self::Red | Self::Blue)
}
pub const fn opponent(self) -> Option<Self> {
match self {
Self::Red => Some(Self::Blue),
Self::Blue => Some(Self::Red),
Self::Unassigned | Self::Spectator => None,
}
}
pub const fn scoring(self) -> Option<ScoringTeam> {
match self {
Self::Red => Some(ScoringTeam::Red),
Self::Blue => Some(ScoringTeam::Blue),
Self::Unassigned | Self::Spectator => None,
}
}
pub const fn to_raw(self) -> c_int {
match self {
Self::Unassigned => TEAM_UNASSIGNED,
Self::Spectator => TEAM_SPECTATOR,
Self::Red => TF_TEAM_RED,
Self::Blue => TF_TEAM_BLUE,
}
}
}
impl From<ScoringTeam> for Team {
fn from(team: ScoringTeam) -> Self {
match team {
ScoringTeam::Red => Self::Red,
ScoringTeam::Blue => Self::Blue,
}
}
}
pub type TeamTarget<'s> = ClassVtable<'s>;
pub type TeamTargetError = ClassTargetError;
pub type TeamTargets<'s> = SlotTargets<'s, CHANGE_TEAM_SLOT>;