Monthly Development Report: Duriano
1. Executive Summary
June was a feature-and-foundation month for Duriano, carrying the build from v1.1.0 through v1.1.3 across four patch releases. The month was defined by four strategic bets: a complete cloud-save overhaul with a real-money-safe merge resolver and per-account local saves, the launch of Google Play Subscriptions plus an in-game Redeem Code system, the multiplayer foundation (NGO + UGS Relay/Lobby clearing Phase 0 and Phase 1a), and a broad UX polish pass on the Challenge system, Codex, and loadout screens. Stability work centered on a high-impact Mali GPU soft-particle regression (Poco X7 Pro) and the rollout of Firebase Crashlytics.
Key Achievements:
- Releases: Shipped 4 versions (v1.1.0 – v1.1.3).
- Cloud Save: Field-merge resolver that loses no progress, a real-money-safe fertilizer purchase ledger, and per-account local saves keyed by platform account id.
- Monetization: Google Play Subscriptions (with an upgrade path for existing full-game owners, instant character unlocks, and an end-round fertilizer bonus) and a full Redeem Code system.
- Multiplayer: Network bootstrap (NGO + UGS Relay/Lobby) and Phase 1a enemy targeting of the nearest live player.
- UX Polish: Re-visualized Challenge system, Codex UX improvements, loadout-info panel sync, and a new loading scene.
- Stability/LiveOps: Mali soft-particle fix, Firebase Crashlytics integration, and a Google Play AAB + IL2CPP symbols upload lane.
2. Cloud Save & Cross-Device Sync
- Field-Merge Resolver: Replaced the kills-proxy conflict heuristic (which discarded the losing save) with a no-progress-lost resolver — monotonic subsystems max/union, the fertilizer purchase ledger unions by order id, soft accumulators max, prefs/run use recency, and consent OR-merges.
- Real-Money-Safe Ledger: CurrencyData now keeps an order-id PurchaseLedger (union-merged, idempotent) with reconstructable balance; perma/unlock spends are derived from merged state so divergent offline spends can no longer under-count into free currency, with pre-ledger saves seeded once.
- Per-Account Local Saves: Each signed-in account gets its own local save (PlayerSave_<accountId>) keyed by platform account id; BindToAccount reconciles on auth so established accounts stay authoritative and brand-new accounts adopt the guest save.
- Identity Sync: Server-side checking of player-name and nation-flag changes keeps the local profile current cross-device.
3. Monetization: Subscriptions & Redeem Codes
- Google Play Subscriptions: Implemented the subscription feature with an upgrade path for players who already purchased the full game.
- Subscriber Benefits: Instant character unlocks and an end-round fertilizer bonus for subscribers, plus a debug UI for testing subscriptions.
- Redeem Code System (client): Built the in-game redeem code system UI and flow.
- Shop Discount: Added a backend-controlled shop discount driven by Firebase Remote Config.
4. Multiplayer Foundation (Phase 0 + Phase 1a)
- Phase 0 (Network Bootstrap): Installed NGO + UGS Relay/Lobby, merged the co-op design, built the MP_Spike scene + networked player prefab, migrated to the unified Multiplayer Services SDK, extracted an ISessionService seam for swappable connectivity, and fixed Input System movement with a unique auth profile per instance.
- Phase 1a (Enemy Targeting): Added a PlayerRegistry + nearest-player enemy targeting — StateController and boss/special subclasses now target the nearest live player; co-op gaps were logged and Phase 1a marked done.
5. Challenge System, Codex & UX Polish
- Challenge Re-Visualization: Polished the challenge UI, matched the challenge icon with the active challenge, refreshed the "challenge found" visual, and added challenge UI assets/icons (merged via PR #161).
- Codex & Navigation: Improved the Duriano Codex UX and topic-button selection, and made vertical main-menu buttons loop with up/down navigation.
- Loadout Info Panel: Synced the loadout info panel with the unlock-info popup visibility, waited for the loadout image to load before resetting, combined weapon + augment damage into one info entry, and fixed the wishlist button position/size.
- Loading Experience: Built a new base loading scene with a smooth init screen and a loading "line wink" animation.
6. Gameplay & Mechanics
- Endless Speed Multiplier: Added an endless speed-multiplier perma stat with a speed-multiplier button for PC and mobile.
- Auto God Skill: Added a toggle button with persistent state and the auto god skill visual in the skill button.
- Challenge Objectives: Supported excluding multiple objectives by id, excluded OB_TakeTrap in Muspelheim_01, hid challenges in the endless chamber, fixed OBJ007 multi-trigger, and added challenge localization.
- Balance & Fixes: Changed T4008 stat/effect and added T4037, fixed W011A5 damage, and fixed the Slow status effect so it no longer affects the boss buff.
- Leaderboard/Multiplayer Fixes: Fixed player name/nation-flag cross-machine sync, the leaderboard snapping back to the first category, and the pause button not showing in ranked mode.
7. Stability, LiveOps & Device Fixes
- Mali GPU Soft Particles (Poco X7 Pro): Fixed VFX/soft particles vanishing on Mali GPUs with an adaptive SoftParticleGuard backstop sweep, catching particles on all VFX spawn paths with instant spawn hooks (scoped to Poco X7 Pro).
- Firebase Crashlytics: Added Crashlytics with a crash-context helper (v1.1.3).
- Analytics: Fixed Game Analytics headers/parameters and Firebase Analytics event calls.
- iOS / Misc: Added deferred system gestures for iOS, disabled the Arabic language, and changed the rename gap from 24 hours to 15 days.
- Tooling: Added MCP for Unity configuration.
8. CI/CD, Build & Platform
- Releases: Shipped v1.1.0, v1.1.1, v1.1.2, and v1.1.3.
- Multi-Store Deployment: Added deployment parameters for Android, iOS, Epic, Steam, and Xbox in the Jenkinsfile.
- Google Play AAB: Added an upload lane for Android AAB with Unity IL2CPP symbols and enhanced the release stage with AAB + symbols validation.
- Build Fixes: Fixed the Firebase Mac Standalone build failure and enhanced keystore-password logging + Android debug-symbol support.
9. API / Backend (Duriano API)
- Redeem Code System: Added redeemCodeFunction (claims a code inside a Firestore transaction with one-time-use + per-player validation; reward type/amount read from Firestore, never trusted from the client) and an addRedeemCodeFunction admin endpoint (code normalization + duplicate guard), with a backend & admin operations guide.
- Ranking Anti-Cheat: Server-side validation in addRanking/updateLeaderboardStats — raw caps plus run-length-independent ratio caps (gold/kill, gold/sec, dmg/sec, kills/sec) derived from the real player distribution; endlessTime is the capped ranked metric. Rejected attempts are recorded to a blockedRankings collection, with ops scripts for cheater cleanup + archival.