Repository navigation
Releases: royt93/Flutter_Game_Base_Project
Releases · royt93/Flutter_Game_Base_Project
Release list
0.6.6 — Sprite Arena pause and bullet guard
Changes
- Fix Sprite Arena example accepting Attack while paused or still loading. The button is disabled and its callback re-checks game state.
- Fix the example's 24-bullet limit ignoring bullets queued for mounting. Pending bullets now count toward the limit, and removing a bullet releases its slot.
- Add regression coverage for paused attack spam, pending-bullet limits and slot reuse, disabled loading/paused controls, stale callbacks, and system background/foreground attack locking. No public package API changed.
Verification
- Root non-golden: 3,502 tests pass. Example: 330 tests pass. Analyzers, API compatibility and quality gates pass.
- CI run 40322312945 on
68c4a142passes all three jobs.consumer-smoketimed out once on the emulator; the failed job passed on rerun. - TECNO KJ7 (Android 14): smoke test and manual lifecycle checks pass. Attack remains disabled across Pause/background/foreground; five paused taps produce no queued burst. Step screenshots and existing evidence are in the FEAT-101 evidence directory. No rotation/screen-lock test.
- Not yet published to pub.dev.
🤖 Generated with Claude Code
0.6.5 — Mini-game hub and Sprite Arena
Changes
- Split the Flame demo into a mini-game hub: Home "Flame Demo" opens
MiniGameHubScreen, with the unchanged classic demo (GameDemoScreen) and a dedicated full-screenSpriteArenaDemoScreen. The 0.6.4 notes that put the joystick and Attack button insideGameDemoScreenno longer apply; that screen is classic-only again. - Sprite Arena (example): a 32x24 Tiled map with visible crate, barrel and rock tiles aligned to the collision objects, a perimeter wall, and a camera that follows the player within the map bounds.
- Add
PlayableCharacter.onAttack, an optional hook that replaces the default spark burst. The example fires bullets from the sprite's barrel with it; bullets belong to the example, so the package still has no combat API. - Fix
PlayableCharactertunnelling through thin terrain walls when one frame covered a large distance; movement now advances in short steps. - Fix Tiled polygon colliders drawing a white fill;
TerrainPolygon.toComponent()is now hitbox-only.
Verification
- Root non-golden 3,502 tests and example 328 tests pass; analyzers report 0 issues; public API check is additive (
onAttack); five quality gates and the example asset-license check pass. - Pixel 7 Pro integration smoke passes (sprite and map load, eight joystick directions, camera follow, wall and crate blocking, bullets from the barrel, pause/resume). The TECNO KJ7 lost its USB connection during this work, so device evidence is from the Pixel 7 Pro.
- GitHub Actions CI Linux: run 40265823288 on
7cfadcepasses all three jobs. - Clean-tree
dart pub publish --dry-runreports 0 warnings (one hint: pub.dev latest is still 0.6.3 because 0.6.4 was never published). - Not published to pub.dev.
🤖 Generated with Claude Code
0.6.3 — Wallet consistency, FAB accessibility, and workload performance budgets
Changes
- Add
WorkloadPerformanceBudgetincore/utils/performance_budget.dartto evaluate integration test frame timings against configurable p95, slow-frame percentage, and minimum frame thresholds with actionable failure diagnostics, plusextractMetricsfor baseline integration. - Add localized tooltips and semantics to
GameDemoScreen's icon-only pause and info FloatingActionButtons (game_demo_pause_tooltipandgame_demo_info_tooltipin bothenandvilocales). - Harden
MonetizationScreendemo to verifyEconomyWallet.earn()results for consumables and rewarded ads; on storage or persistence failure, error haptics and status are shown without granting phantom consumable ledger items or crediting unearned currency.
Verification
- 22 unit tests in
performance_budget_test.dart(including 5 workload evaluator tests), 13 tests inmonetization_screen_test.dart, key parity inapp_translations_test.dart, and 21 tests ingame_demo_screen_test.dartpass. - Physical TECNO KJ7 (Android 14): integration smoke tests for wallet failure consistency and accessible FAB tooltips pass; benchmark runs for accessibility preview panel (202 frames, p95=21.45ms, slow-frame=13.37%) and offline earnings (3227 frames, p95=12.12ms, slow-frame=2.32%) satisfy performance budgets.
- Analyzers report 0 issues on package and example; public API compatibility gate is additive; five quality gates pass; GitHub Actions CI Linux (run 40102532740 and 40106606257) passed all three jobs.
- Clean-tree pub publish dry-run passes with 0 warnings.
🤖 Generated with Claude Code
0.6.2 — Event schema audit summary
Changes
- Add
EventSchemaAuditCard, a read-only summary of caller-mapped accepted, rejected and redacted validation counts. - Keep event names, parameter keys/values and raw violation strings out of the widget.
- State clearly that schema validation does not confirm analytics delivery.
Verification
- 21 Linux + Flutter 3.35.1 golden baselines (3 states × 7 variants).
- Root 3,484 and example 316 non-golden tests; analyzers, API compatibility and five quality gates passed.
- CI 40065468318 passed all jobs. TECNO KJ7 smoke verified aggregate UI only, not actual analytics delivery.
🤖 Generated with Claude Code
0.6.1 — Experiment override and onboarding fixes
- Fixed
ExperimentVariantAssignmentCardto hide and reject debug variant overrides in release builds, matchingExperimentBucketingService.debugSetVariantOverride. - Restricted
OnboardingFlowQueueCardmark-seen action to caller-designatednextEligibleFlow; loading indicator now applies only to that flow. - Verified: 21 focused widget tests, a profile-mode override integration test on a TECNO KJ7, and CI 39969956180 (all three jobs). A throwaway release-mode probe on the same device rendered both a control and an overridden row with the callback supplied and showed no override or clear button; that probe is not kept in the repo.
🤖 Generated with Claude Code
0.6.0 — Widget kit expansion, transitive API check, verified device smoke
- Widget kit expansion, additive only: the public API check reports no removed export. The new service-state widgets are presentation-only: pass plain state and callbacks, your code calls the service. Constructors that validate input at runtime are not
const. Failures show generic copy, and a pending call locks the buttons. Some widgets take an explicit status from the caller instead of inferring success from a callback that returns. - The API check (
tool/api_compatibility.dart) now follows localexportbarrels (includingshow/hide, relative paths and cycles) and fails loudly on export forms it cannot resolve. It is still a regex scanner, not the Dart analyzer: class fields and getters are not covered, so a break there is not detected. - Added save-recovery widgets
CloudSaveStatusCard,SaveConflictPicker(keep local / use cloud, each with inline confirmation) andCheckpointResumeCard(confirm before discarding a checkpoint). - Added content-delivery widgets
ContentPackStatusCard,ScenePreloadStatusPanelandContentRevisionHistoryPanel. The panel lists metadata only (opaque revision reference, version, label, time) and never a checksum or content body; restoring needs confirmation, and the caller performs the rollback (for exampleRemoteContentPack.rollbackToChecksum) and refreshes its content. - Added offline-delivery widgets
OutboxQueueStatusCardandOutboxConflictSummaryPanel. Neither shows a queued payload or key; the conflict panel works on caller-approved labels and opaque references, and accepting the remote version states that it does not undo local effects. - Added
PlayerDataRightsPanel(export, plus erase behind inline confirmation, forPlayerDataRightsService),PrestigeReadinessCard(progress toward the threshold; the button is enabled only when ready, and the caller should confirm, for example withPrestigeConfirmationCard.show, before callingPrestigeService.prestige) andCooldownActionButton(disabled while aPersistentCooldownServicecooldown runs). The cooldown gate is UI only: re-check the service inside your tap handler. - Added
ConsentPreferencesPanel(ongoing per-category choices with explicit granted/denied/unknown status; the caller applies the change, for exampleConsentStateService.grant/deny),SyncStatusCard(idle/syncing/synced/failed state with a retry button for achievement or leaderboard sync; the caller maps itsSdkResultto the status) andBatterySaverIndicator(banner while the caller holds performance reduced for low battery; renders nothing when inactive). - Added
RemoteKillSwitchPanel(device-local kill behind inline confirmation, plus clear for an existing local override; it never re-enables a remotely killed feature and shows only caller-sanitized text),PlatformCapabilityMatrix(read-only supported/unsupported list shown by icon and text, with a note that values are platform defaults rather than a live check) andDeepLinkResultCard(generic outcome per status; it never renders the link, its parameters or an exception, so the caller mapsDeepLinkHandleResultto a status). - Added
SessionTimelineInspector(bounded, caller-formatted session-relative history; never accepts raw controller metadata),EconomyCertificateStatusCard(displays verification status and never accepts balances, certificate data or the secret; “valid” means signature checked, not player honesty) andGuardrailStatusPanel(read-only caller-supplied rollout rows, without new read APIs or actions onShadowActivationController). - Added
MemoryWatchdogPanel(bounded caller-fed debug diagnostics; detector only),AnnouncementPreviewCard(shows caller-resolved localized text and invokes a caller preview callback) andRewardedAdResultCard(caller-owned seam state; it never grants a reward, which the caller grants exactly once aftershowRewardedAdreturns true). - Added
AnalyticsQueueStatusCard(caller-supplied queue snapshot: counts and generic status only, never event names or payloads) andSaveRestorePreviewPanel(read-only preview of what a restore would change, with restore behind inline confirmation; the caller performs the restore). - Added
RemoteConfigHealthCard(source and schema-violation count only; no keys or values),ReminderPreferencesPanel(caller-owned preferences; notification delivery may be delayed or skipped), andConnectivityStatusCard(reachability/queue count; queued work drains automatically when online). - Added
RewardPlanPreviewCard(caller-formatted reward lines with explicit ready/stale/executing/applied/failed status; a preview is not a grant, and the caller setsappliedonly from a committed record),ReplayVerificationResultCard(outcome and randomness checks reported separately, with a skipped randomness check shown as skipped, never as a match; it is not proof of fair play) andRewardAuditTrailPanel(sanitized, bounded rows and one retry-all action for unfinished rewards; the caller refreshes the rows afterwards because completion of the retry does not mean every record committed). - Added
OnboardingFlowQueueCard(read-only queue of caller-mapped onboarding flows with seen/next/pending state and an optional mark-seen action; flow ids identify rows in callbacks and are never shown) andExperimentVariantAssignmentCard(caller-mapped experiment assignments; the per-device anonymous id never enters the widget, and the override action is debug-only, so pass the callback only in debug or profile builds). - Added accessibility and player-comfort widgets, retention/progression/social HUD widgets and juice/motion widgets (see
common_widgets.dartand the showcase screen for the full list). - Verified (see each task spec in
doc/task/done/for the exact run): Linux + Flutter 3.35.1 golden baselines per widget wave, full root and example suites, API compatibility, analyzers, five quality gates and CI. Wave 23 device smoke ran on a Samsung S24 Ultra; Waves 26, 27, 29, 31 and 32 ran on a TECNO KJ7; other waves' device results are recorded in their task specs. Showcase and test callbacks are UI fixtures held in memory: they prove layout and callback wiring, not real certificate verification, rewarded-ad payout, platform screen-reader announcement, memory-leak freedom, 60 FPS or persistence.