diff --git a/solitaire_engine/src/daily_challenge_plugin.rs b/solitaire_engine/src/daily_challenge_plugin.rs index 86917c3..9ac8213 100644 --- a/solitaire_engine/src/daily_challenge_plugin.rs +++ b/solitaire_engine/src/daily_challenge_plugin.rs @@ -18,7 +18,7 @@ use chrono::{Local, NaiveDate}; use solitaire_data::{daily_seed_for, save_progress_to}; use solitaire_sync::ChallengeGoal; -use crate::events::{GameWonEvent, NewGameRequestEvent}; +use crate::events::{GameWonEvent, NewGameRequestEvent, XpAwardedEvent}; use crate::game_plugin::GameMutation; use crate::progress_plugin::{ProgressResource, ProgressStoragePath, ProgressUpdate}; use crate::resources::GameStateResource; @@ -81,6 +81,7 @@ impl Plugin for DailyChallengePlugin { .add_event::() .add_event::() .add_event::() + .add_event::() .add_systems(Startup, fetch_server_challenge) .add_systems(Update, poll_server_challenge) // record/award after the base ProgressUpdate so we don't fight @@ -149,6 +150,7 @@ fn handle_daily_completion( mut progress: ResMut, path: Res, mut completed: EventWriter, + mut xp_awarded: EventWriter, ) { for ev in wins.read() { if game.0.seed != daily.seed { @@ -170,6 +172,7 @@ fn handle_daily_completion( continue; } progress.0.add_xp(DAILY_BONUS_XP); + xp_awarded.send(XpAwardedEvent { amount: DAILY_BONUS_XP }); if let Some(target) = &path.0 { if let Err(e) = save_progress_to(target, &progress.0) { warn!("failed to save progress after daily completion: {e}"); diff --git a/solitaire_engine/src/weekly_goals_plugin.rs b/solitaire_engine/src/weekly_goals_plugin.rs index e90e4c9..b108aa2 100644 --- a/solitaire_engine/src/weekly_goals_plugin.rs +++ b/solitaire_engine/src/weekly_goals_plugin.rs @@ -9,7 +9,7 @@ use solitaire_data::{ WEEKLY_GOAL_XP, }; -use crate::events::GameWonEvent; +use crate::events::{GameWonEvent, XpAwardedEvent}; use crate::game_plugin::GameMutation; use crate::progress_plugin::{LevelUpEvent, ProgressResource, ProgressStoragePath, ProgressUpdate}; use crate::resources::GameStateResource; @@ -27,6 +27,7 @@ impl Plugin for WeeklyGoalsPlugin { fn build(&self, app: &mut App) { app.add_event::() .add_event::() + .add_event::() .add_systems(Startup, roll_weekly_goals_on_startup) // Run after GameMutation (so GameWonEvent is available) and // ProgressUpdate (so we don't fight ProgressPlugin's add_xp). @@ -62,6 +63,7 @@ fn evaluate_weekly_goals( path: Res, mut completions: EventWriter, mut levelups: EventWriter, + mut xp_awarded: EventWriter, ) { let mut events: Vec<&GameWonEvent> = wins.read().collect(); if events.is_empty() { @@ -99,6 +101,7 @@ fn evaluate_weekly_goals( } if bonus_xp > 0 { + xp_awarded.send(XpAwardedEvent { amount: bonus_xp }); let prev_level = progress.0.add_xp(bonus_xp); if progress.0.leveled_up_from(prev_level) { levelups.send(LevelUpEvent {