Skip to main content

wowlab_parsers/parsers/transform/loot/
pvp.rs

1use 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/// Build the single-row `PvpSeasonFlat` list for the current `PvP` season.
14#[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/// 1:1 transform of `PvpTier` rows.
55#[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}