Skip to content

Commit e00144b

Browse files
committed
Convert old prof trigger to new specs trigger
1 parent 4ae4a1b commit e00144b

File tree

6 files changed

+176
-19
lines changed

6 files changed

+176
-19
lines changed

src/context/player/mod.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,7 @@ impl PlayerContext {
3434
if mumble.read_ui_tick() > 0 {
3535
match mumble.parse_identity() {
3636
Ok(identity) => {
37-
self.prof =
38-
Profession::try_from(identity.profession as u8).map_err(|err| err.number);
37+
self.prof = Profession::try_from(identity.profession as u8);
3938
self.spec = Specialization::try_from(self.prof.ok(), identity.spec)
4039
.ok_or(identity.spec);
4140
self.race = (identity.race as u8).try_into();

src/context/player/profession.rs

Lines changed: 96 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,14 @@ use crate::{
22
colors::{self, Color},
33
traits::{Colored, ShortName},
44
};
5-
use num_enum::{IntoPrimitive, TryFromPrimitive};
5+
use enumflags2::{bitflags, BitFlags};
66
use serde::{Deserialize, Serialize};
77
use strum::{AsRefStr, Display, EnumIter, IntoStaticStr, VariantArray};
88

9+
use super::Specialization;
10+
11+
// TODO: transition from bitflags to enum after sufficient grace period for updating
12+
913
#[derive(
1014
Debug,
1115
Clone,
@@ -22,20 +26,99 @@ use strum::{AsRefStr, Display, EnumIter, IntoStaticStr, VariantArray};
2226
VariantArray,
2327
Serialize,
2428
Deserialize,
25-
TryFromPrimitive,
26-
IntoPrimitive,
2729
)]
28-
#[repr(u8)]
30+
#[bitflags]
31+
#[repr(u16)]
2932
pub enum Profession {
30-
Guardian = 1,
31-
Warrior = 2,
32-
Engineer = 3,
33-
Ranger = 4,
34-
Thief = 5,
35-
Elementalist = 6,
36-
Mesmer = 7,
37-
Necromancer = 8,
38-
Revenant = 9,
33+
Guardian = 1 << 1,
34+
Warrior = 1 << 2,
35+
Engineer = 1 << 3,
36+
Ranger = 1 << 4,
37+
Thief = 1 << 5,
38+
Elementalist = 1 << 6,
39+
Mesmer = 1 << 7,
40+
Necromancer = 1 << 8,
41+
Revenant = 1 << 9,
42+
}
43+
44+
impl TryFrom<u8> for Profession {
45+
type Error = u8;
46+
47+
fn try_from(value: u8) -> Result<Self, Self::Error> {
48+
match value {
49+
1 => Ok(Self::Guardian),
50+
2 => Ok(Self::Warrior),
51+
3 => Ok(Self::Engineer),
52+
4 => Ok(Self::Ranger),
53+
5 => Ok(Self::Thief),
54+
6 => Ok(Self::Elementalist),
55+
7 => Ok(Self::Mesmer),
56+
8 => Ok(Self::Necromancer),
57+
9 => Ok(Self::Revenant),
58+
_ => Err(value),
59+
}
60+
}
61+
}
62+
63+
impl Profession {
64+
pub fn specializations(&self) -> BitFlags<Specialization> {
65+
match self {
66+
Self::Guardian => {
67+
Specialization::Guardian
68+
| Specialization::Dragonhunter
69+
| Specialization::Firebrand
70+
| Specialization::Willbender
71+
}
72+
Self::Warrior => {
73+
Specialization::Warrior
74+
| Specialization::Berserker
75+
| Specialization::Spellbreaker
76+
| Specialization::Bladesworn
77+
}
78+
Self::Revenant => {
79+
Specialization::Revenant
80+
| Specialization::Herald
81+
| Specialization::Renegade
82+
| Specialization::Vindicator
83+
}
84+
Self::Engineer => {
85+
Specialization::Engineer
86+
| Specialization::Scrapper
87+
| Specialization::Holosmith
88+
| Specialization::Mechanist
89+
}
90+
Self::Ranger => {
91+
Specialization::Ranger
92+
| Specialization::Druid
93+
| Specialization::Soulbeast
94+
| Specialization::Untamed
95+
}
96+
Self::Thief => {
97+
Specialization::Thief
98+
| Specialization::Daredevil
99+
| Specialization::Deadeye
100+
| Specialization::Specter
101+
}
102+
Self::Elementalist => {
103+
Specialization::Elementalist
104+
| Specialization::Tempest
105+
| Specialization::Weaver
106+
| Specialization::Catalyst
107+
}
108+
Self::Mesmer => {
109+
Specialization::Mesmer
110+
| Specialization::Chronomancer
111+
| Specialization::Mirage
112+
| Specialization::Virtuoso
113+
}
114+
Self::Necromancer => {
115+
Specialization::Necromancer
116+
| Specialization::Reaper
117+
| Specialization::Scourge
118+
| Specialization::Harbinger
119+
}
120+
}
121+
}
39122
}
40123

41124
impl ShortName for Profession {

src/tree/load.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
use super::VisitMut;
2-
use crate::elements::{IconElement, IconList};
2+
use crate::{
3+
elements::{IconElement, IconList},
4+
trigger::MetaTrigger,
5+
};
36

47
#[derive(Debug, Default, Clone, Copy)]
58
pub struct Loader;
@@ -14,4 +17,8 @@ impl VisitMut for Loader {
1417
fn visit_icon(&mut self, el: &mut IconElement) {
1518
el.icon.load()
1619
}
20+
21+
fn visit_meta_trigger(&mut self, trigger: &mut MetaTrigger) {
22+
trigger.load();
23+
}
1724
}

src/tree/visit.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
use crate::elements::{Bar, Element, ElementType, Group, IconElement, IconList, Text};
1+
use crate::{
2+
elements::{Bar, Element, ElementType, Group, IconElement, IconList, Text},
3+
trigger::MetaTrigger,
4+
};
25

36
pub trait VisitMut {
47
fn visit_elements(&mut self, elements: &mut [Element]) {
@@ -8,7 +11,12 @@ pub trait VisitMut {
811
}
912

1013
fn visit_element(&mut self, element: &mut Element) {
11-
match &mut element.kind {
14+
self.visit_meta_trigger(&mut element.trigger);
15+
self.visit_element_type(&mut element.kind);
16+
}
17+
18+
fn visit_element_type(&mut self, element_type: &mut ElementType) {
19+
match element_type {
1220
ElementType::Group(group) => {
1321
self.visit_group(group);
1422
self.visit_elements(&mut group.members);
@@ -29,4 +37,6 @@ pub trait VisitMut {
2937
fn visit_text(&mut self, _text: &mut Text) {}
3038

3139
fn visit_bar(&mut self, _bar: &mut Bar) {}
40+
41+
fn visit_meta_trigger(&mut self, _trigger: &mut MetaTrigger) {}
3242
}

src/trigger/meta.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@ pub struct MetaTrigger {
1313
pub map: Memo<MapTrigger>, // memoize map
1414
}
1515

16+
impl MetaTrigger {
17+
pub fn load(&mut self) {
18+
self.player.load();
19+
}
20+
}
21+
1622
impl Trigger for MetaTrigger {
1723
fn is_active(&mut self, ctx: &Context) -> bool {
1824
if ctx.has_update(ContextUpdate::Map) {

src/trigger/player.rs

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use super::{CombatTrigger, Trigger};
22
use crate::{
3-
context::{Context, Mount, Specialization},
3+
context::{Context, Mount, Profession, Specialization},
44
render_util::enum_combo_bitflags,
55
serde_bitflags,
66
traits::RenderOptions,
@@ -14,13 +14,29 @@ use serde::{Deserialize, Serialize};
1414
pub struct PlayerTrigger {
1515
pub combat: CombatTrigger,
1616

17+
#[serde(skip_serializing)]
18+
#[serde(with = "serde_bitflags")]
19+
profs: BitFlags<Profession>, // TODO: remove after grace period
20+
1721
#[serde(with = "serde_bitflags")]
1822
pub specs: BitFlags<Specialization>,
1923

2024
#[serde(with = "serde_bitflags")]
2125
pub mounts: BitFlags<Mount>,
2226
}
2327

28+
impl PlayerTrigger {
29+
pub fn load(&mut self) {
30+
// translate old profs to specs if specs empty
31+
// TODO: remove after grace period
32+
if self.specs.is_empty() {
33+
for prof in self.profs.iter() {
34+
self.specs.insert(prof.specializations());
35+
}
36+
}
37+
}
38+
}
39+
2440
impl Trigger for PlayerTrigger {
2541
fn is_active(&mut self, ctx: &Context) -> bool {
2642
self.combat.is_active(ctx)
@@ -61,3 +77,39 @@ where
6177
.map(|value| check_bitflags(flags, value))
6278
.unwrap_or(true)
6379
}
80+
81+
#[cfg(test)]
82+
mod tests {
83+
use super::*;
84+
85+
#[test]
86+
fn prof_transition() {
87+
let mut trigger = PlayerTrigger {
88+
profs: Profession::Guardian | Profession::Necromancer,
89+
..Default::default()
90+
};
91+
trigger.load();
92+
assert_eq!(
93+
trigger.specs,
94+
Specialization::Guardian
95+
| Specialization::Dragonhunter
96+
| Specialization::Firebrand
97+
| Specialization::Willbender
98+
| Specialization::Necromancer
99+
| Specialization::Reaper
100+
| Specialization::Scourge
101+
| Specialization::Harbinger
102+
);
103+
104+
let mut trigger = PlayerTrigger {
105+
profs: Profession::Guardian | Profession::Necromancer,
106+
specs: Specialization::Dragonhunter | Specialization::Reaper,
107+
..Default::default()
108+
};
109+
trigger.load();
110+
assert_eq!(
111+
trigger.specs,
112+
Specialization::Dragonhunter | Specialization::Reaper
113+
);
114+
}
115+
}

0 commit comments

Comments
 (0)