use num_derive::FromPrimitive;
use std::hash::Hash;
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, FromPrimitive)]
pub enum IFF {
Friend,
Foe,
Unknown,
None,
}
impl Default for IFF {
fn default() -> Self {
IFF::None
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, FromPrimitive)]
pub enum CbtResult {
Normal,
Crit,
Glance,
Block,
Evade,
Interrupt,
Absorb,
Blind,
KillingBlow,
Downed,
Breakbar,
None,
}
impl Default for CbtResult {
fn default() -> Self {
CbtResult::None
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, FromPrimitive)]
pub enum CbtActivation {
None,
Normal,
Quickness,
CancelFire,
CancelCancel,
Reset,
}
impl Default for CbtActivation {
fn default() -> Self {
CbtActivation::None
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, FromPrimitive)]
pub enum CbtStateChange {
None,
EnterCombat,
ExitCombat,
ChangeUp,
ChangeDead,
ChangeDown,
Spawn,
Despawn,
HealthUpdate,
LogStart,
LogEnd,
WeapSwap,
MaxHealthUpdate,
PointOfView,
Language,
GwBuild,
ShardId,
Reward,
BuffInitial,
Position,
Velocity,
Facing,
TeamChange,
AttackTarget,
Targetable,
MapId,
ReplInfo,
StackActive,
StackReset,
Guild,
BuffInfo,
BuffFormula,
SkillInfo,
SkillTiming,
BreakbarState,
BreakbarPercent,
Error,
Tag,
BarrierUpdate,
}
impl Default for CbtStateChange {
fn default() -> Self {
CbtStateChange::None
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, FromPrimitive)]
pub enum CbtBuffRemove {
None,
All,
Single,
Manual,
}
impl Default for CbtBuffRemove {
fn default() -> Self {
CbtBuffRemove::None
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, FromPrimitive)]
pub enum CbtCustomSkill {
Resurrect = 1066,
Bandage = 1175,
Dodge = 65001,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, FromPrimitive)]
pub enum Language {
Eng = 0,
Fre = 2,
Gem = 3,
Spa = 4,
}
impl Default for Language {
fn default() -> Self {
Language::Eng
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, FromPrimitive)]
pub enum Attribute {
None,
Power,
Precision,
Toughness,
Vitality,
Ferocity,
Healing,
Condition,
Concentration,
Expertise,
CustomArmor,
CustomAgony,
CustomStatInc,
CustomFlatInc,
CustomPhysInc,
CustomCondInc,
CustomPhysRec,
CustomCondRec,
CustomAttackSpeed,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, FromPrimitive)]
pub enum BuffCategory {
Boon = 0,
Any = 1,
Condition = 2,
Food = 4,
Upgrade = 6,
Boost = 8,
Trait = 11,
Enhancement = 13,
Stance = 16,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Clone, Debug, PartialEq, Eq, Hash, Default)]
pub struct CbtEvent {
pub time: u64,
pub src_agent: u64,
pub dst_agent: u64,
pub value: i32,
pub buff_dmg: i32,
pub overstack_value: u32,
pub skillid: u32,
pub src_instid: u16,
pub dst_instid: u16,
pub src_master_instid: u16,
pub dst_master_instid: u16,
pub iff: IFF,
pub buff: u8,
pub result: CbtResult,
pub is_activation: CbtActivation,
pub is_buffremove: CbtBuffRemove,
pub is_ninety: bool,
pub is_fifty: bool,
pub is_moving: bool,
pub is_statechange: CbtStateChange,
pub is_flanking: bool,
pub is_shields: bool,
pub is_offcycle: bool,
pub padding_end: u32,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct Agent {
pub addr: u64,
pub prof: u32,
pub is_elite: u32,
pub toughness: i16,
pub concentration: i16,
pub healing: i16,
pub condition: i16,
pub name: [u8; 64],
}
impl Agent {
pub fn is_gadget(&self) -> bool {
self.is_elite == std::u32::MAX && (self.prof & 0xffff_0000) == 0xffff_0000
}
pub fn is_character(&self) -> bool {
self.is_elite == std::u32::MAX && (self.prof & 0xffff_0000) != 0xffff_0000
}
pub fn is_player(&self) -> bool {
self.is_elite != std::u32::MAX
}
}
impl Default for Agent {
fn default() -> Self {
Self {
addr: Default::default(),
prof: Default::default(),
is_elite: Default::default(),
toughness: Default::default(),
concentration: Default::default(),
healing: Default::default(),
condition: Default::default(),
name: [0; 64],
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct Skill {
pub id: i32,
pub name: [u8; 64],
}
impl Skill {
pub fn name_string(&self) -> Option<String> {
let bytes = self
.name
.iter()
.cloned()
.take_while(|b| *b != 0)
.collect::<Vec<_>>();
String::from_utf8(bytes).ok()
}
}
impl Default for Skill {
fn default() -> Self {
Self {
id: Default::default(),
name: [0; 64],
}
}
}