← Back to Darkture
Changelog
All notable changes to Darkture will be documented in this file.
Format based on Keep a Changelog.
[0.4.0] - 2026-09-03
Added
- Friend system (Unit 43): add friends via trainer ID (hex 6 digits), profile preview before sending, accept/reject incoming requests, private friend list with remove
TrainerId::parse() — inverse of hex(): normalizes a user-supplied hex (1-6 digits, case-insensitive) back to users.trainer_number
friendships table (canonical user_id < friend_id + requester_id + status + accepted_at, UNIQUE(user_id, friend_id)); Friendship model with user/friend/requester relations and pending/accepted scopes
FriendService: index / lookup / sendRequest / acceptRequest / rejectRequest / removeFriend / isFriendsWith (all writes transactional with lockForUpdate); isFriendsWith is the contract for messaging (unit 44)
FriendController with 6 endpoints under the verified group: GET /friends, GET /friends/lookup?trainer_id=, POST /friends/requests, POST /friends/requests/{friendship}/accept, POST /friends/requests/{friendship}/reject, DELETE /friends/{friendship}
- Cap of 10 pending outgoing requests per player (
config('game.friends.max_pending_outgoing'))
- Notifications:
friend_request (recipient) and friend_accepted (requester) with i18n keys + icons in the bell; new error codes (invalid_trainer_id, cannot_add_self, already_friends, request_already_sent, friend_request_limit_reached)
- New
#/friends view: my trainer ID card, add-by-ID form with lookup preview + send, friends list with "friends since" + remove, incoming (accept/reject), outgoing (informative only)
- Nav item "Friends" (
nav.friends) with a users icon; sidebar now has 12 items
- i18n EN/ES:
nav.friends + full friends.* section (26 keys) + friend notification keys
api.del() convenience wrapper on the SPA API client
Changed
app.blade.php: friends section rendered between Trades and Notifications; app.js registers friendsView; router.js adds the friends route
[0.3.2] - 2026-09-02
Added
- Dedicated Progression view (
#/progression) aggregating every player stat in one place: core stats (badges, battles won, catches, zones completed, dex %, shinies, score from /leaderboard/{id}), world completion bars (zones + zone bosses from /regions), league progress (La Singularidad via /singularidad/trainers), titles, badges/medals, achievements with claim buttons, and recent catches
- New nav item "Progression" (
nav.progression) with a chart-bar icon; sidebar now has 11 items
- i18n EN/ES:
nav.progression + full progression.* section (20 keys)
Changed
- Achievements moved from the bottom of Maps & Regions (
mapsView) to the dedicated Progression view; the dashboard "Claim" banner now navigates to #/progression
mapsView no longer fetches /achievements (keeps /titles for the league title badge)
Fixed
- Router JS tests updated for the new nav item (10 → 11)
[0.3.1] - 2026-09-02
Added
- Achievement system (Unit 42):
achievements + user_achievement_claims activated with seeder, server-side conditions, one-time prizes via MoneyService (gems bypass the weekly drop cap)
GET /api/achievements + POST /api/achievements/{key}/claim; progress cards with "Reclamar" in the progression view (moved from profile in the post-42 review) + dashboard summary
- Notification system:
GET /api/notifications, POST /api/notifications/{notification}/read, POST /api/notifications/read-all; real notifications view with unread badge in topbar
- Battle-driven notifications: badge / title / boss & league defeat / level_up (once per pokemon per battle)
- EXP curve flattening:
exp_base 80→50, exp_exponent 1.6→1.2, battle_reward_base 40→80 (~6-7 battles per level-up)
- EXP bars on darture cards (team / box / healing / daycare slots / battle team bar) + exact EXP / "X EXP to next level" in creature detail
- Creature detail: learnset (all
move_learnsets for the species, ordered by level) with learn level, type, power; panel-styled sections
- Server-authoritative hunt by tier:
POST /api/battle/hunt (map_slug + method) with per-tier requirements; map detail shows ONE card per tier with "Cazar"
- Trainer ID (hex 6 digits):
app/Support/TrainerId, exposed in /auth/me and leaderboard index/show; shown in profile and leaderboard
- Easier flee:
flee.base 0.25→0.80, speed_divisor 200→300
- Better capture:
capture_rate starter/common 0.45→0.55, rare 0.30→0.40, very_rare 0.15→0.25; hp_multiplier.empty 2.0→2.5
- Shop: quantity min 0 (buttons/inputs disabled at 0), "Total" label, large total beside the currency toggle
- Care Center: breeding slots gated by unlock (locked cards show 🔒 instead of being selectable)
- Care Center (review): breeding grid iterates an explicit
breedingSlots getter so the free first pair slot always shows its interface; added the missing daycare.tab_pairs / daycare.tab_eggs i18n keys
- Gems: probabilistic drops (
drop_chance 8%) + weekly cap 12/drop (gem_weekly_totals); specific prizes (titles, achievements) bypass the cap
- Maps sub-tabs: Zonas | Liga | Especiales (same design principle as the Liga tab); Zonas keeps internal zone tabs
- Liga header: Zone Bosses X/9 + La Singularidad Y/12 + Aldemere title status badge
- i18n EN/ES:
achievements.*, notifications.*, map_detail.hunt, regions.zones_tab/special_tab, league.title_status, profile.trainer_id/registered, detail.exp/learnset, shop.total relabeled
docs/data-contract.md: achievements section
Fixed
- Session refresh race:
trySilentRefresh now reuses the deduplicated refreshToken() (single /auth/refresh per load cycle) — no more logout when returning from legal/changelog/roadmap
- Topbar: app name hidden on mobile (no overflow); username is now a link to profile
markdown.blade.php: removed duplicated <h1> in legal/changelog/roadmap
- Profile: restored registered date + progress cards (achievements panel moved to the progression view)
- Notification ownership enforced in controller (403 on foreign notifications)
Changed
config/game.php: exp curve, flee, capture rates, gems (drop_chance / weekly_drop_limit / accumulated_limit)
MoneyService: new creditDroppedGems (weekly cap); creditGems/GemDailyTotal obsolete but kept
BattleRewardService: rollGems now probabilistic via drop_chance; emits badge/title/defeat/level_up notifications
PokemonSerializer/PokemonDetailSerializer: added exp, exp_to_next, exp_progress_pct (summarize) and learnset (detail)
routes/api.php: achievements, notifications, battle/hunt endpoints
- Migrations:
2026_09_02_000000_create_gem_weekly_totals.php, 2026_09_02_000001_add_achievement_conditions.php
[0.3.0] - 2026-09-01
Added
- Boss & league progression (Unit 41)
- Zone boss rewards rework: LC curve 2000→5000 + guaranteed items per boss (no gems/random drops)
- Progression gate change: zone N+1 unlocks when boss N is defeated (previously: zone N completed)
- La Singularidad league: 12 trainers (6 mono-type ×3 creatures + 6 combined ×4), fixed level 50, 9000 LC each, fightable in any order after 9 bosses
- Title system:
titles + user_titles tables; "Entrenador Singular de Aldemere" title with one-time prize (50,000 LC + 12 AG)
regions.unlocked_after_title_slug mechanism for future region gating
GET /api/singularidad/trainers (league progress + roster), GET /api/titles (awarded state)
stateFor exposes boss_defeated; regions expose unlocked
- Leaderboard public profile includes titles
- UI: "Liga {region}" hub tab with internal Jefes de Zona / La Singularidad sub-tabs; profile titles list; league battle entry
- i18n EN/ES:
league.*, titles.*, leaderboard.profile.titles
Fixed
isFullReward defeat check now scoped per user (cross-user bug)
boss_defeated replaces frontend z.completed proxy for boss progress
Changed
zone_bosses.php: reward luma_coins 500→2000 (ramp to 5000), new reward.items
singularidad_trainers.php: 1 guardian → 12 league trainers with {species, level} fixed teams
drops.php: removed boss:* entries (bosses use guaranteed items)
[0.2.9] - 2026-08-31
Added
- Complete Gen1 dataset: 220 species (174 new) with stats, passives, oddity, types, descriptions (EN/ES)
- Learnsets for all 220 species (1320 entries, 6 moves each)
- Sprite descriptions brief for all 220 species (
gen_data/gen1_sprite_descriptions.md)
- Tests: Gen1SeedTest (8), LearnsetTest (4), SpriteDescriptionsTest (3) — 15 new tests
Changed
species.php: 46 existing entries updated with oddity => 'common'; 174 new entries added
move_learnsets.php: 1044 new learnset entries added
DeployPipelineTest: species count updated from 46 to 220
[0.2.8] - 2026-08-30
Fixed
- Trainer leaderboard: LEFT JOIN shows all verified players even without trainer_stats
- Leaderboard my_rank returns correct position for current user
- Alpine
isEmpty not defined error on leaderboard view
Changed
- Leaderboard renamed from "Leaderboard" to "Trainers" / "Entrenadores"
- Leaderboard shows total count label, user's own rank above filters, highlighted row in table
- Leaderboard sidebar entry now has a trophy SVG icon
- Empty state shows contextual "No trainers match your search" message
[0.2.7] - 2026-08-29
Changed
- Complete daycare & breeding system redesign (Unit 37)
- Daycare: XP-based with 6 slots (slot 0 free, escalating LC unlock: 10k/25k/100k/250k/1M)
- Breeding: pair-based with 5 slots (slot 0 free, same unlock prices), no daycare deposit required
- Breeding selection: click slot → select creature from box → compatible list auto-filtered by backend
- Creatures in breeding are NOT locked (can battle/trade); creatures in daycare ARE locked
- XP calculated on demand (100 XP/hour) via
DaycareExpService, no background jobs
- New
slot_unlocks table tracks both daycare and breeding slot unlocks
- Breeding pairs use creature FKs directly (
pokemon_a_id/pokemon_b_id)
- Care Center view: no tabs — 3 panels stacked vertically (Healing, Daycare, Breeding)
- Config restructured:
game.care_center.daycare + game.care_center.breeding
- New
SlotUnlockService and DaycareExpService services
- New
SlotUnlock model
[0.2.6] - 2026-08-29
Changed
- Merged Daycare into Care Center (healing view) with tabs: Heal / Daycare
- Care Center heal tab now shows creature cards (same format as Dartures) instead of plain text list
- Moved logout button from topbar to sidebar (separator + icon at bottom)
- Added SVG icons (Heroicons 24x24 outline) to all sidebar nav items
- Removed obsolete REDIRECTS from router — old hashes (
#/home, #/team, etc.) now resolve to not-found
- Removed dead i18n nav keys (
nav.home, nav.team, nav.box, nav.pokedex, nav.regions, nav.settings, nav.daycare, nav.battle, nav.exploration)
- Renamed
nav.healing to "Care Center" / "Centro de Cuidados"
- Fixed stale
navigate('home') and navigate('team') calls in auth views
- Removed dead
'welcome' route check in auth store
- Renamed task files:
ux-auth-fullscreen-layout.md → 22-..., ux-inventory-redesign.md → 30-...
Fixed
- Removed duplicate profile template (simple version without border/settings was rendering alongside the combined version)
Removed
- Daycare as standalone sidebar option
- Logout button from topbar
[0.2.5] - 2026-08-29
Changed
- Complete theme recolor from gold/purple to blue/orange palette
- Dark theme: deep navy backgrounds (
#0D1B2A, #1B2838, #243447), warm light text (#E0ECF4)
- Light theme: soft blue backgrounds (
#83BBEB, #DDF1F8, #FFFFFF), dark navy text (#1E364B)
- CTA accent: orange
#FF9829 (consistent across both themes)
- Gold CSS utilities renamed to CTA (
gold-text → cta-text, btn-primary uses CTA gradient, etc.)
- Content panel in light mode: rounded container (
#EBF5FB) with margin from navbars
- Footer and topbar decorative borders use CTA orange gradient
- Removed legacy purple tokens (
--color-darkture-*)
Fixed
- SPA layout: main content always renders in DOM (login/register/starter no longer hidden in fullscreen mode)
- Content panel styling applied conditionally via
:class binding instead of <template x-if>
[0.2.4] - 2026-08-29
Added
- Sell tab always visible in shop (shows "no items to sell" when empty)
- Dual pricing (LC + AG) on ALL shop items with currency toggle in balance panel
- Grand total display in shop balance panel (updates per selected currency)
- Debug user
gonza5913 seeded for local development
DatabaseSeeder now runs all game seeders — php artisan migrate:fresh --seed works out of the box
Changed
- Shop currency toggle moved from per-card to balance panel header
- "Total" label renamed to "Subtotal" in shop item cards
[0.2.3] - 2026-08-29
Added
- Key item badge (🗝️) in shop and inventory cards
- Gem toggle in shop for items with both LC and AG prices
rematch_finder added to ITEM_CATALOG (display name + description in EN/ES)
family field added to all shop listings in config
owned_key_items endpoint in shop index to prevent duplicate key item purchases
key_item_owned error when attempting to buy an already-owned key item
pay_with / key_item_owned / buy_disabled i18n keys (EN/ES)
Fixed
- Shop items now show display name instead of internal key
- Shop items now show description instead of "unknown"
- Key items can no longer be purchased twice
- Key items no longer appear as usable in battle
- Inventory family labels use localized names instead of raw keys
Changed
ShopService::buy accepts optional currency parameter for dual-price items
ShopController::buy validates currency parameter
- Battle view filters out key items from usable item list
- Shop buy button uses
canBuy() (checks ownership + affordability)
[0.2.2] - 2026-08-28
Added
- Complete shop UI redesign: item cards with icons, descriptions, prices (LC/AG)
- Shop tabs: Buy / Sell (sell tab hidden when no sellable items)
- Search bar for filtering shop items by name/description
- Per-item quantity selector with +/- buttons and direct input
- Quick "Buy 100" / "Sell 100" button per item
- Price display with LC/AG badges, per-unit price, and running total
- Buy button disabled when insufficient balance
- Quantity validation: 1..100 (backend max increased from 99)
Changed
- Shop view rewritten with responsive grid cards (2-5 columns)
ShopController max quantity raised from 99 to 100
- Shop view uses shared
ITEM_CATALOG helpers (itemName, itemDesc, itemFamily, familyIcon)
[0.2.1] - 2026-08-27
Added
- Complete inventory UI redesign: item cards with sprites, descriptions, and family tags
- Inventory tabs: All, Capture, Healing, Buffs, Equipable, Key items
- Search bar for filtering items by name/description
- Capacity upgrade system: buy +50 slots with LC or AG (escalating price)
- Equip modal: select a team creature to equip items from inventory
- Use modal: select a team creature to use healing items from inventory
POST /api/inventory/upgrade-capacity endpoint
inventory_upgrades table for tracking upgrade count per user
- 12 new tests for upgrade mechanics (service + API)
Changed
- Inventory view rewritten with grid cards (2-5 columns responsive)
- Capacity bar now shows color-coded progress (green/yellow/red)
- Item catalog expanded with descriptions and family classification in frontend
[0.2.0] - 2026-08-27
Added
- Shell layout v0.1: sidebar plana, topbar con saldos, footer, vistas combinadas (unit 25)
- Dartures view redesign: team+box unificado, drag-and-drop, creature detail page (unit 26)
- Region tabs: dos niveles de tabs, display_group en zones (unit 27)
- Full Gen1 dataset: 46 species, 56 moves, 20 abilities, battle UI redesign (unit 28)
- Battle items: potions, revives, status cures, buffs in combat (unit 29)
- Debug panel for dev users at /#/debug (unit 29)
Fixed
- Topbar LC/AG balances now refresh reactively after shop/battle/trades/debug operations
- Theme toggle changed from text to sun/moon SVG icon
- Sidebar reordered: Home, Dartures, Inventory, Maps, Codex, Healing, Daycare, Shop, Trades, Profile
- Dashboard label: "Home" (EN) / "Inicio" (ES) instead of "Panel"
[0.1.1] - 2026-08-26
Changed
UI Palette
- Dark theme: matte black backgrounds (#1f1f1f, #2a2a2a) replacing purple
- Light theme: warm off-white (#f8f6f0, #ffffff) replacing lavender
- Gold accent (#D4AF37 dark / #C9A84C light) as primary brand color
- Warm muted text colors (no pure white/black) to reduce eye fatigue
- Gold gradient borders on topbar and footer
- Gold glow on primary button hover
- Gold top border on summary cards and battle result
- Gold left border on active nav items
- Gold focus ring on all inputs and selects
- Game title and h1 headings in gold with text shadow
- Version number displayed in footer (single source of truth from CHANGELOG.md)
[0.1.0] - 2026-08-25
Added
Core
- Laravel 13 + PHP 8.4 project foundation
- MariaDB/MySQL exclusively (dev + test environments)
- Laravel Sanctum authentication with rotating HTTP-only refresh tokens
- Alpine.js + Tailwind v4 SPA shell with hash router
- Dark/light theme persistence
- English/Spanish i18n with dictionary-driven translation
Creatures
- Stat calculator with HP/aggressive formula and nature modifiers
- IV generator, gender generator, shiny mechanic
- Evolution system (manual, preserves identity)
- Starter selection (3 seeded species)
- Codex (pokedex) with shiny tracking
- Team management (6 active, 24 box) with exploration lock
Battle Engine
- Server-authoritative turn-based combat (15 min TTL)
- Type chart (12x12), STAB, critical hits, accuracy
- Status effects, buff/debuff stages
- 20 passive abilities with trigger conditions
- Wild, trainer, boss, and singularidad battle modes
- Capture system (cards, master card guarantee)
- Flee mechanic
World & Progression
- 2 regions, 12 zones (9 mandatory + 3 optional)
- 24 maps with gated access (key items + exploration moves)
- Zone progression (sequential, optional after 9 mandatory)
- 9 zone bosses with badges
- 21 NPC trainers, singularidad trainer
- 6 exploration moves (tajo, empuje, nado, vuelo, inmersion, teletransporte)
- Free healing centers (blocked during battle/exploration)
Economy
- Luma Coins (base currency) and Aenix Gems (premium, daily limits)
- Shop (buy/sell), inventory with capacity
- Cards, equipables, key items
- Drop tables with configurable rewards
- Boss first-clear reward progression
Social
- Creature and item trading (Coins only, Gems excluded)
- Notifications system
Breeding
- Daycare (4 slots per player)
- Breeding with egg group + gender compatibility
- Egg production, IV inheritance, hatch at level 5
Assets
- Asset pipeline (install command, fallback SVGs)
- Source asset directory structure
Deploy Pipeline
- Reproducible build script (
scripts/build-data-package.sh) with quality gates
- Idempotent server installer (
scripts/install.sh) driven by a deploy manifest
- Deploy manifest (schema/data/assets fingerprints + version) via
php artisan deploy:manifest
- Apache
public/.htaccess hardened for Hostinger (HTTPS, PHP 8.4, security headers)
- Production SMTP + canonical-domain signed links
- Backup & rollback procedures (
docs/backup-rollback.md, docs/deploy.md)
Testing
- 255 tests, 2870 assertions
- Unit tests (stat calculator, battle engine, balance config, content data, asset paths)
- Feature tests (auth, battle, breeding, creature, economy, exploration, healing, i18n, trades, SPA, deploy pipeline)
- Integration tests (full flow, concurrency, progression, roles, installation)
- JavaScript tests (API client, router)
Known Issues
- None blocking production. The refresh-cookie
EncryptCookies tech debt was resolved (EncryptCookies registered in the api middleware group; tests assert the cookie is encrypted at rest and the refresh round-trip works).