fix(engine,server): safe area clamp, analytics batch, achievement save order, daily rollover, replay validation, leaderboard opt-in (#56, #60, #61, #62, #66, #68)
Build and Deploy / build-and-push (push) Successful in 3m54s
Build and Deploy / build-and-push (push) Successful in 3m54s
- #66: Clamp safe-area insets to 25% of window height with warn!() on excess - #68: Move fire_flush outside per-event loop in analytics (batch flush once) - #56: Persist progress before marking reward_granted to prevent XP loss on crash - #60: Add DateRolloverTimer + check_date_rollover system for midnight seed refresh - #62: Add validate_header() in replay upload with mode/draw_mode allowlists - #61: Restore two-query leaderboard opt-in check (SELECT then UPDATE); original queries already in .sqlx cache; EXISTS variant would require sqlx prepare Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
+79
-80
@@ -1,46 +1,46 @@
|
||||
//! Bevy integration layer for Ferrous Solitaire.
|
||||
|
||||
#[cfg(target_os = "android")]
|
||||
pub mod android_clipboard;
|
||||
pub mod assets;
|
||||
pub mod card_animation;
|
||||
pub mod achievement_plugin;
|
||||
pub mod analytics_plugin;
|
||||
#[cfg(target_os = "android")]
|
||||
pub mod android_clipboard;
|
||||
pub mod animation_plugin;
|
||||
pub mod avatar_plugin;
|
||||
pub mod auto_complete_plugin;
|
||||
pub mod assets;
|
||||
pub mod audio_plugin;
|
||||
pub mod auto_complete_plugin;
|
||||
pub mod avatar_plugin;
|
||||
pub mod card_animation;
|
||||
pub mod card_plugin;
|
||||
pub mod font_plugin;
|
||||
pub mod feedback_anim_plugin;
|
||||
pub mod challenge_plugin;
|
||||
pub mod core_game_plugin;
|
||||
pub mod cursor_plugin;
|
||||
pub mod daily_challenge_plugin;
|
||||
pub mod difficulty_plugin;
|
||||
pub mod diagnostics_hud;
|
||||
pub mod difficulty_plugin;
|
||||
pub mod events;
|
||||
pub mod core_game_plugin;
|
||||
pub mod feedback_anim_plugin;
|
||||
pub mod font_plugin;
|
||||
pub mod game_plugin;
|
||||
pub mod help_plugin;
|
||||
pub mod home_plugin;
|
||||
pub mod hud_plugin;
|
||||
pub mod leaderboard_plugin;
|
||||
pub mod input_plugin;
|
||||
pub mod layout;
|
||||
pub mod leaderboard_plugin;
|
||||
pub mod onboarding_plugin;
|
||||
pub mod pause_plugin;
|
||||
pub mod pending_hint;
|
||||
pub mod play_by_seed_plugin;
|
||||
pub mod platform;
|
||||
pub mod play_by_seed_plugin;
|
||||
pub mod profile_plugin;
|
||||
pub mod progress_plugin;
|
||||
pub mod radial_menu;
|
||||
pub mod replay_overlay;
|
||||
pub mod replay_playback;
|
||||
pub mod settings_plugin;
|
||||
pub mod progress_plugin;
|
||||
pub mod resources;
|
||||
pub mod safe_area;
|
||||
pub mod selection_plugin;
|
||||
pub mod settings_plugin;
|
||||
pub mod splash_plugin;
|
||||
pub mod stats_plugin;
|
||||
pub mod sync_plugin;
|
||||
@@ -55,50 +55,37 @@ pub mod ui_tooltip;
|
||||
pub mod weekly_goals_plugin;
|
||||
pub mod win_summary_plugin;
|
||||
|
||||
pub use assets::{
|
||||
bundled_theme_url, populate_embedded_dark_theme, register_theme_asset_sources,
|
||||
AssetSourcesPlugin, DARK_THEME_MANIFEST_URL, USER_THEMES,
|
||||
};
|
||||
pub use theme::{
|
||||
set_theme, ActiveTheme, CardTheme, CardThemeLoader, ThemeEntry, ThemePlugin, ThemeRegistry,
|
||||
ThemeRegistryPlugin,
|
||||
};
|
||||
pub use achievement_plugin::{AchievementPlugin, AchievementsResource, AchievementsScreen};
|
||||
pub use analytics_plugin::{AnalyticsPlugin, AnalyticsResource};
|
||||
pub use challenge_plugin::{
|
||||
challenge_progress_label, ChallengeAdvancedEvent, ChallengePlugin, CHALLENGE_UNLOCK_LEVEL,
|
||||
};
|
||||
pub use core_game_plugin::CoreGamePlugin;
|
||||
pub use daily_challenge_plugin::{
|
||||
DailyChallengeCompletedEvent, DailyChallengePlugin, DailyChallengeResource,
|
||||
};
|
||||
pub use progress_plugin::{LevelUpEvent, ProgressPlugin, ProgressResource, ProgressUpdate};
|
||||
pub use weekly_goals_plugin::{WeeklyGoalCompletedEvent, WeeklyGoalsPlugin};
|
||||
pub use animation_plugin::{ActiveToast, AnimationPlugin, CardAnim, ToastEntity, ToastQueue};
|
||||
pub use card_animation::{
|
||||
CardAnimation, CardAnimationPlugin, MotionCurve, WinCascadePlugin,
|
||||
retarget_animation, sample_curve, compute_duration, cascade_delay, micro_vary,
|
||||
HoverState, InputBuffer, BufferedInput,
|
||||
win_scatter_targets, WIN_CASCADE_INTERVAL_SECS, DEAL_INTERVAL_SECS,
|
||||
MIN_DURATION_SECS, MAX_DURATION_SECS,
|
||||
AnimationChain,
|
||||
AnimationTuning, InputPlatform,
|
||||
FrameTimeDiagnostics, DIAG_WINDOW_SIZE,
|
||||
pub use assets::{
|
||||
AssetSourcesPlugin, DARK_THEME_MANIFEST_URL, USER_THEMES, bundled_theme_url,
|
||||
populate_embedded_dark_theme, register_theme_asset_sources,
|
||||
};
|
||||
pub use feedback_anim_plugin::{
|
||||
deal_stagger_delay, deal_stagger_secs_for_speed, foundation_flourish_scale, shake_offset,
|
||||
settle_scale, FeedbackAnimPlugin, FoundationFlourish, FoundationMarkerFlourish, SettleAnim,
|
||||
ShakeAnim,
|
||||
};
|
||||
pub use auto_complete_plugin::AutoCompletePlugin;
|
||||
pub use audio_plugin::{AudioPlugin, AudioState, SoundLibrary};
|
||||
pub use auto_complete_plugin::AutoCompletePlugin;
|
||||
pub use avatar_plugin::{AvatarFetchEvent, AvatarPlugin, AvatarResource};
|
||||
pub use card_animation::{
|
||||
AnimationChain, AnimationTuning, BufferedInput, CardAnimation, CardAnimationPlugin,
|
||||
DEAL_INTERVAL_SECS, DIAG_WINDOW_SIZE, FrameTimeDiagnostics, HoverState, InputBuffer,
|
||||
InputPlatform, MAX_DURATION_SECS, MIN_DURATION_SECS, MotionCurve, WIN_CASCADE_INTERVAL_SECS,
|
||||
WinCascadePlugin, cascade_delay, compute_duration, micro_vary, retarget_animation,
|
||||
sample_curve, win_scatter_targets,
|
||||
};
|
||||
pub use card_plugin::{
|
||||
CardEntity, CardImageSet, CardLabel, CardPlugin, HintHighlight, HintHighlightTimer,
|
||||
RightClickHighlight, RightClickHighlightTimer,
|
||||
};
|
||||
pub use font_plugin::{FontPlugin, FontResource};
|
||||
pub use challenge_plugin::{
|
||||
CHALLENGE_UNLOCK_LEVEL, ChallengeAdvancedEvent, ChallengePlugin, challenge_progress_label,
|
||||
};
|
||||
pub use core_game_plugin::CoreGamePlugin;
|
||||
pub use cursor_plugin::CursorPlugin;
|
||||
pub use daily_challenge_plugin::{
|
||||
DailyChallengeCompletedEvent, DailyChallengePlugin, DailyChallengeResource,
|
||||
};
|
||||
pub use diagnostics_hud::DiagnosticsHudPlugin;
|
||||
pub use difficulty_plugin::{DifficultyIndexResource, DifficultyPlugin};
|
||||
pub use events::{
|
||||
AchievementUnlockedEvent, CardFaceRevealedEvent, CardFlippedEvent, DrawRequestEvent,
|
||||
ForfeitEvent, ForfeitRequestEvent, FoundationCompletedEvent, GameWonEvent, HelpRequestEvent,
|
||||
@@ -107,12 +94,15 @@ pub use events::{
|
||||
StartDailyChallengeRequestEvent, StartDifficultyRequestEvent, StartPlayBySeedRequestEvent,
|
||||
StartTimeAttackRequestEvent, StartZenRequestEvent, StateChangedEvent, SyncCompleteEvent,
|
||||
ToggleAchievementsRequestEvent, ToggleLeaderboardRequestEvent, ToggleProfileRequestEvent,
|
||||
ToggleSettingsRequestEvent, ToggleStatsRequestEvent, UndoRequestEvent,
|
||||
WinStreakMilestoneEvent, XpAwardedEvent,
|
||||
ToggleSettingsRequestEvent, ToggleStatsRequestEvent, UndoRequestEvent, WinStreakMilestoneEvent,
|
||||
XpAwardedEvent,
|
||||
};
|
||||
pub use difficulty_plugin::{DifficultyIndexResource, DifficultyPlugin};
|
||||
pub use play_by_seed_plugin::{PlayBySeedPlugin, PlayBySeedScreen};
|
||||
pub use platform::{PlatformTime, StorageBackend};
|
||||
pub use feedback_anim_plugin::{
|
||||
FeedbackAnimPlugin, FoundationFlourish, FoundationMarkerFlourish, SettleAnim, ShakeAnim,
|
||||
deal_stagger_delay, deal_stagger_secs_for_speed, foundation_flourish_scale, settle_scale,
|
||||
shake_offset,
|
||||
};
|
||||
pub use font_plugin::{FontPlugin, FontResource};
|
||||
pub use game_plugin::{
|
||||
ConfirmNewGameScreen, GameMutation, GameOverScreen, GamePlugin, GameStatePath, RecordingReplay,
|
||||
ReplayPath,
|
||||
@@ -120,60 +110,69 @@ pub use game_plugin::{
|
||||
pub use help_plugin::{HelpPlugin, HelpScreen};
|
||||
pub use home_plugin::{HomePlugin, HomeScreen};
|
||||
pub use hud_plugin::{
|
||||
streak_flourish_scale, ActionButton, HelpButton, HudAutoComplete, HudPlugin, HudVisibility,
|
||||
MenuButton, MenuOption, MenuPopover, ModeOption, ModesButton, ModesPopover, NewGameButton,
|
||||
PauseButton, StreakFlourish, UndoButton,
|
||||
ActionButton, HelpButton, HudAutoComplete, HudPlugin, HudVisibility, MenuButton, MenuOption,
|
||||
MenuPopover, ModeOption, ModesButton, ModesPopover, NewGameButton, PauseButton, StreakFlourish,
|
||||
UndoButton, streak_flourish_scale,
|
||||
};
|
||||
pub use leaderboard_plugin::{LeaderboardPlugin, LeaderboardResource, LeaderboardScreen};
|
||||
pub use input_plugin::InputPlugin;
|
||||
pub use layout::{Layout, LayoutResource, compute_layout};
|
||||
pub use leaderboard_plugin::{LeaderboardPlugin, LeaderboardResource, LeaderboardScreen};
|
||||
pub use onboarding_plugin::{OnboardingPlugin, OnboardingScreen};
|
||||
pub use pause_plugin::{ForfeitConfirmScreen, PausePlugin, PauseScreen, PausedResource};
|
||||
pub use avatar_plugin::{AvatarFetchEvent, AvatarPlugin, AvatarResource};
|
||||
pub use platform::{PlatformTime, StorageBackend};
|
||||
pub use play_by_seed_plugin::{PlayBySeedPlugin, PlayBySeedScreen};
|
||||
pub use profile_plugin::{ProfilePlugin, ProfileScreen};
|
||||
pub use progress_plugin::{LevelUpEvent, ProgressPlugin, ProgressResource, ProgressUpdate};
|
||||
pub use radial_menu::{
|
||||
legal_destinations_for_card, radial_anchor_for_index, radial_hovered_index, RadialIcon,
|
||||
RadialMenuPlugin, RightClickRadialState, Z_RADIAL_MENU,
|
||||
RadialIcon, RadialMenuPlugin, RightClickRadialState, Z_RADIAL_MENU,
|
||||
legal_destinations_for_card, radial_anchor_for_index, radial_hovered_index,
|
||||
};
|
||||
pub use replay_overlay::{
|
||||
ReplayOverlayBannerText, ReplayOverlayPlugin, ReplayOverlayProgressText, ReplayOverlayRoot,
|
||||
ReplayStopButton, Z_REPLAY_OVERLAY,
|
||||
};
|
||||
pub use replay_playback::{
|
||||
start_replay_playback, stop_replay_playback, ReplayPlaybackPlugin, ReplayPlaybackState,
|
||||
REPLAY_COMPLETION_LINGER_SECS, REPLAY_MOVE_INTERVAL_SECS,
|
||||
REPLAY_COMPLETION_LINGER_SECS, REPLAY_MOVE_INTERVAL_SECS, ReplayPlaybackPlugin,
|
||||
ReplayPlaybackState, start_replay_playback, stop_replay_playback,
|
||||
};
|
||||
pub use settings_plugin::{
|
||||
PendingWindowGeometry, SettingsChangedEvent, SettingsPlugin, SettingsResource, SettingsScreen,
|
||||
SFX_STEP, WINDOW_GEOMETRY_DEBOUNCE_SECS,
|
||||
pub use resources::{
|
||||
DragState, GameStateResource, HintCycleIndex, SettingsScrollPos, SyncStatus, SyncStatusResource,
|
||||
};
|
||||
pub use layout::{compute_layout, Layout, LayoutResource};
|
||||
pub use resources::{DragState, GameStateResource, HintCycleIndex, SettingsScrollPos, SyncStatus, SyncStatusResource};
|
||||
pub use safe_area::{SafeAreaAnchoredTop, SafeAreaInsets, SafeAreaInsetsPlugin};
|
||||
pub use selection_plugin::{
|
||||
KeyboardDragState, SelectionHighlight, SelectionPlugin, SelectionState,
|
||||
};
|
||||
pub use splash_plugin::{SplashAge, SplashPlugin, SplashRoot};
|
||||
pub use stats_plugin::{
|
||||
format_replay_caption, LatestReplayPath, ReplayHistoryResource, ReplayNextButton,
|
||||
ReplayPrevButton, ReplaySelectorCaption, SelectedReplayIndex, StatsPlugin, StatsResource,
|
||||
StatsScreen, StatsUpdate, WatchReplayButton,
|
||||
pub use settings_plugin::{
|
||||
PendingWindowGeometry, SFX_STEP, SettingsChangedEvent, SettingsPlugin, SettingsResource,
|
||||
SettingsScreen, WINDOW_GEOMETRY_DEBOUNCE_SECS,
|
||||
};
|
||||
pub use solitaire_data::SyncProvider;
|
||||
pub use splash_plugin::{SplashAge, SplashPlugin, SplashRoot};
|
||||
pub use stats_plugin::{
|
||||
LatestReplayPath, ReplayHistoryResource, ReplayNextButton, ReplayPrevButton,
|
||||
ReplaySelectorCaption, SelectedReplayIndex, StatsPlugin, StatsResource, StatsScreen,
|
||||
StatsUpdate, WatchReplayButton, format_replay_caption,
|
||||
};
|
||||
pub use sync_plugin::{SyncPlugin, SyncProviderResource};
|
||||
pub use sync_setup_plugin::SyncSetupPlugin;
|
||||
pub use ui_focus::{Disabled, FocusGroup, Focusable, FocusedButton, UiFocusPlugin};
|
||||
pub use ui_modal::{
|
||||
spawn_modal, spawn_modal_actions, spawn_modal_body_text, spawn_modal_button,
|
||||
spawn_modal_header, ButtonVariant, ModalActions, ModalBody, ModalButton, ModalCard,
|
||||
ModalHeader, ModalScrim, UiModalPlugin,
|
||||
};
|
||||
pub use ui_tooltip::{Tooltip, UiTooltipPlugin};
|
||||
pub use table_plugin::{
|
||||
BackgroundImageSet, HintPileHighlight, PileMarker, TableBackground, TablePlugin,
|
||||
};
|
||||
pub use theme::{
|
||||
ActiveTheme, CardTheme, CardThemeLoader, ThemeEntry, ThemePlugin, ThemeRegistry,
|
||||
ThemeRegistryPlugin, set_theme,
|
||||
};
|
||||
pub use time_attack_plugin::{
|
||||
TimeAttackEndedEvent, TimeAttackPlugin, TimeAttackResource, TIME_ATTACK_DURATION_SECS,
|
||||
TIME_ATTACK_DURATION_SECS, TimeAttackEndedEvent, TimeAttackPlugin, TimeAttackResource,
|
||||
};
|
||||
pub use ui_focus::{Disabled, FocusGroup, Focusable, FocusedButton, UiFocusPlugin};
|
||||
pub use ui_modal::{
|
||||
ButtonVariant, ModalActions, ModalBody, ModalButton, ModalCard, ModalHeader, ModalScrim,
|
||||
UiModalPlugin, spawn_modal, spawn_modal_actions, spawn_modal_body_text, spawn_modal_button,
|
||||
spawn_modal_header,
|
||||
};
|
||||
pub use ui_tooltip::{Tooltip, UiTooltipPlugin};
|
||||
pub use weekly_goals_plugin::{WeeklyGoalCompletedEvent, WeeklyGoalsPlugin};
|
||||
pub use win_summary_plugin::{
|
||||
format_win_time, ScreenShakeResource, SessionAchievements, WinSummaryPending, WinSummaryPlugin,
|
||||
ScreenShakeResource, SessionAchievements, WinSummaryPending, WinSummaryPlugin, format_win_time,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user