wowlab_parsers/parsers/transform/loot/
pvp.rs1use wowlab_types::data::{PvpSeasonFlat, PvpTier, PvpTierRewardEntry};
2
3use crate::parsers::dbc::DbcData;
4
5fn current_pvp_season_id(dbc: &DbcData) -> Option<i32> {
6 dbc.pvp_season_reward_levels
7 .values()
8 .flatten()
9 .map(|row| row.PvpSeasonID)
10 .max()
11}
12
13#[must_use]
15pub fn transform_all_pvp_seasons(dbc: &DbcData) -> Vec<PvpSeasonFlat> {
16 let Some(season_id) = current_pvp_season_id(dbc) else {
17 return Vec::new();
18 };
19 let Some(season) = dbc.pvp_season.get(&season_id) else {
20 return Vec::new();
21 };
22 let tier_rewards: Vec<PvpTierRewardEntry> = dbc
23 .pvp_season_reward_levels
24 .get(&season_id)
25 .map(|rewards| {
26 rewards
27 .iter()
28 .map(|reward| {
29 let tier = dbc.pvp_tier.values().find(|t| t.Rank == reward.Tier);
30
31 PvpTierRewardEntry {
32 tier_index: reward.Tier,
33 tier_name: tier.and_then(|t| t.Name_lang.clone()).unwrap_or_default(),
34 min_rating: tier.map_or(0, |t| t.MinRating),
35 max_rating: tier.map_or(0, |t| t.MaxRating),
36 bracket_id: tier.map_or(0, |t| t.BracketID),
37 end_of_match_ilvl: reward.EndOfMatchILvl,
38 weekly_cache_ilvl: reward.WeeklyCacheILvl,
39 }
40 })
41 .collect()
42 })
43 .unwrap_or_default();
44
45 vec![PvpSeasonFlat {
46 id: season.ID,
47 milestone_season: season.MilestoneSeason,
48 alliance_achievement_id: season.AllianceAchievementID,
49 horde_achievement_id: season.HordeAchievementID,
50 tier_rewards,
51 }]
52}
53
54#[must_use]
56pub fn transform_all_pvp_tiers(dbc: &DbcData) -> Vec<PvpTier> {
57 dbc.pvp_tier
58 .values()
59 .map(|row| PvpTier {
60 id: row.ID,
61 name: row.Name_lang.clone().unwrap_or_default(),
62 min_rating: row.MinRating,
63 max_rating: row.MaxRating,
64 prev_tier: row.PrevTier,
65 next_tier: row.NextTier,
66 bracket_id: row.BracketID,
67 rank: row.Rank,
68 rank_icon: row.RankIcon,
69 })
70 .collect()
71}