A 24/7 AI-driven competitive training environment built entirely in UEFN/Verse. 35+ production Verse files. Zero external dependencies. Pure in-engine architecture.
ProAI Training Map is a fully autonomous competitive practice island for Fortnite Creative. A player joins, fights an AI bot that adapts to their skill level in real time, receives metric-driven coaching feedback after every round, and returns days later to find their ELO, analytics history, and purchased cosmetics exactly where they left them.
Every system โ from the ELO calculator's Taylor-series exponentiation to the quest tracker's integer bitfield compression โ was designed to run within UEFN's hard constraints: 4 persistent weak_maps, ~100 active spawned props, zero HTTP calls, and no external databases.
The analytics engine computes a composite performance score from DPS, accuracy, headshot ratio, reaction time, and edit speed after every round. The ELO calculator updates the player's rating using a full Elo expected-probability model with bracket-aware K-factor selection (K=48 for placement rounds, K=64 during volatility injection, K=32 standard, K=16 for stabilized veterans). The probability function 1 / (1 + 10^((BotELO - PlayerELO) / 400)) requires 10^x โ which Verse doesn't provide โ so the calculator implements an 8-term Taylor series expansion of e^(xยทln10) with exponent clamping to [-3, 3] for numerical stability.
The difficulty mapper then translates the new ELO into concrete bot parameters using smooth linear interpolation within five brackets (Beginner through Elite). A player at 1400 ELO doesn't get a hard step-change from "Advanced settings" โ they get 37.5% of the way between Advanced and Pro parameters, producing reaction times, aim variance, build speed, strafe intensity, and aggression levels that feel natural and progressive.
The bot's runtime is a layered concurrent system built on Verse's race and branch expressions:
bot_behavior_base (npc_behavior)
โโ race:
โโ CombatLifecycle
โ โโ branch: AimTrackingLoop (continuous focus retry)
โ โโ foreground: bot_combat_state_machine.RunCombatLoop()
โ โโ COMBAT_APPROACH (navigate toward player)
โ โโ COMBAT_ENGAGE_CLOSE (perpendicular strafe + shotgun)
โ โโ COMBAT_ENGAGE_MID (AR burst at range)
โ โโ COMBAT_DISENGAGE (retreat vector + defensive wall)
โ โโ COMBAT_BUILD_AGGRO (box-up or ramp-rush sequence)
โโ WaitForDeath (instant cleanup on elimination)
Five sub-modules (bot_navigation, bot_focus_aim, bot_weapon_controller, bot_combat_state_machine, build_sequence_choreographer) are plain classes initialized via Init() because npc_behavior cannot hold @editable references. All use post-38.10 movement APIs (using { /Fortnite.com/AI/movement_types } with bare Running/Walking).
NPCs cannot access Fortnite's native build API (HC-01). All building is simulated with pre-placed props and TeleportTo:
- Build Pool Manager: 4 typed pools (wall, floor, ramp, cone) of
creative_propreferences placed in the editor and teleported to Z=-5000 staging at startup. Claims deploy props to calculated grid positions; exhaustion triggers FIFO reclaim of the oldest active prop.ReclaimAllyields every 4 teleports to spread frame load. - Build Prop Spawner: Grid-aligned position math (
GRID_TILE_SIZE=256) with snap functions, directional wall placement, and multi-piece layout calculators for box-ups (4 walls + floor + cone), ramp rushes (floor + ramp + wall), 90-degree retakes, and defensive covers. - Edit State Manager: The "edit illusion" uses clusters of 2-3 overlapping prop variants (full wall, window edit, door edit) swapped via TeleportTo โ hide one at staging, show another at position โ synchronized with the build_animation_sync module's phase-precise timing.
Every build gesture is modeled as three phases: WINDUP (arm raises, 40%), THROW (arm swings, 30%), RECOVERY (arm returns, 30%). The prop deploys at the exact end of the THROW phase:
SpawnMoment = BaseDuration ร (WindupPct + ThrowPct) / PlayRate
At PlayRate 1.5 (Pro bracket), props materialize in 0.30s. At PlayRate 0.5 (Beginner), 0.91s. The choreographer pre-calculates total sequence durations for timeouts without playing any animations.
All UI is rendered from Verse code using the player_ui + canvas + text_block API โ no Widget Blueprint dependency for core functionality:
- Live Combat Stats (top-left): DPS, accuracy, headshot% โ updates every 500ms during fights
- Status Bar (top-right): ELO with bracket progress percentage, round number, W/L/D record
- Coach Message (bottom-center): Post-round feedback with auto-hide timer
- Post-Round Scorecard: Full-screen overlay with outcome, ELO delta, all metrics, and coach commentary
All display values are simultaneously exposed as public variables for optional UMG Widget Blueprint binding (dual-mode display).
The predictive advisor analyzes the player's rolling metric history to detect:
- Stagnation: ELO plateau detection with oscillation analysis (distinguishes true stagnation from volatile but engaged play). Triggers volatility injection (K-factor boost) with cooldown.
- Frustration: Two-criteria system requiring consecutive losses AND performance degradation vs pre-streak baseline. A player who loses but maintains high DPS gets challenge encouragement; a player whose metrics are declining gets difficulty easing + break suggestion.
- Metric Trends: Five independent trend channels (DPS, accuracy, headshot%, reaction time, edit speed) computed by splitting history into halves and comparing averages.
- Weakness Identification: Compares the player's recent averages against bracket-expected baselines and returns the specific metric name where they're furthest below par.
- Performance Anomaly: Detects sudden single-round drops (fatigue, tilt, AFK) by comparing against rolling baseline.
The coach controller evaluates 10 trigger conditions in priority order (frustration > comeback > milestone > stagnation > fatigue > weakness > improvement > standard), delivers one message per round through multiple channels, and rotates through 3-5 template variants per category to avoid repetition.
All player data persists across sessions using exactly 4 weak_map allocations (the engine maximum):
| Slot | Store | Data | Budget |
|---|---|---|---|
| 1 | AnalyticsStore |
Lifetime averages (DPS, HS%, accuracy, reaction), session/round counts, build/edit totals, consistency score | ~80 bytes |
| 2 | RatingStore |
ELO, peak/lowest ELO, W/L/D counts, training minutes, best win streak, version tag, last-played timestamp | ~80 bytes |
| 3 | ProgressionStore |
Quest bitfield (32 flags), milestones, highest bracket, daily challenges, total quests completed | ~40 bytes |
| 4 | EconomyStore |
Analytics Pass ownership, arena skins bitfield, challenge tokens, equipped skin, V-Bucks spent, purchase count | ~48 bytes |
All fields are primitives (int, float, logic) โ zero strings, zero arrays. Quest states are compressed into integer bitfields using approximated bitwise operations (BitShiftLeft, BitwiseAnd, BitwiseOr via integer math). Schema versioning uses the Optional Fields pattern with migration_v1_to_v2.verse for safe evolution.
The data validator sanitizes every load: ELO clamped to [0, 5000], PeakELO โฅ CurrentELO, non-negative counts, percentage ranges [0, 100]. The persistence manager caches all 4 slots in memory at load and writes both cache and weak_map on every save, with auto-save on every round end via event bus listener.
The shop system implements the complete In-Island Transaction pipeline:
- Validation: Product existence check + durable duplicate prevention
- Payment: In-Island Transaction API integration point (simulated for development)
- Fulfillment: Inventory controller grants the item
- Persistence: Immediate Slot 4 save
- Side Effects: Auto-equip cosmetics, arena skin swap
- Telemetry: Revenue tracking
Physical button_device props at a shop terminal trigger purchases via InteractedWithEvent.Await() listeners. The XP reward system distributes accolades within Epic's safe range (30K-200K per 10-minute block) with budget tracking and automatic cap enforcement.
The event_bus.verse device is the central nervous system โ 14 typed event() channels with the Dispatch/Listen pattern:
DispatchRoundStart(RoundNum) โ RoundStartEvent.Signal()
ListenForRoundEnd() โ RoundEndEvent.Await()
Every module subscribes to the events it cares about. The game manager dispatches. No module calls another module's methods directly for cross-cutting concerns. This decoupling means you can remove the entire coaching system, the shop, or the XP system without touching a single line in the game manager or analytics engine.
Content/
โโโ event_bus.verse Core โ 14-channel pub/sub broker
โโโ game_manager.verse Core โ Master round lifecycle (5-phase state machine)
โโโ arena_controller.verse Core โ Bot spawn/despawn, arena reset orchestration
โ
โโโ bot_behavior_base.verse Module A โ NPC behavior entry point (race/branch concurrency)
โโโ bot_combat_state_machine.verse Module A โ 5-state combat FSM
โโโ bot_navigation.verse Module A โ Dual-pattern NavMesh movement
โโโ bot_focus_aim.verse Module A โ Focus tracking with head-height targeting
โโโ bot_weapon_controller.verse Module A โ Shotgun/AR profiles, LCG hit simulation
โโโ bot_difficulty_profile.verse Module A โ ELO-driven parameter container (10 fields)
โ
โโโ build_pool_manager.verse Module B โ Object pool with FIFO overflow reclaim
โโโ build_prop_spawner.verse Module B โ Grid-aligned deployment math
โโโ edit_state_manager.verse Module B โ Prop-variant swap illusion for edits
โโโ build_sequence_choreographer.verse Module B โ Multi-piece sequence orchestration
โโโ build_animation_sync.verse Module B โ Phase-precise timing calculator
โ
โโโ metric_definitions.verse Module C โ 25-field round_metrics + supporting structs
โโโ analytics_engine.verse Module C โ Real-time metric computation (6 branch listeners)
โโโ elo_calculator.verse Module C โ Expected probability, K-factor, Taylor Pow10
โโโ difficulty_mapper.verse Module C โ ELO โ bot parameters (5-bracket interpolation)
โโโ predictive_advisor.verse Module C โ Trend analysis, frustration, stagnation
โโโ session_aggregator.verse Module C โ Session summary compiler + cross-session delta
โ
โโโ data_schema_v1.verse Module D โ Persistable class definitions (4 slots)
โโโ data_schema_v2.verse Module D โ V2 schema with expanded fields
โโโ migration_v1_to_v2.verse Module D โ Safe schema migration with field derivation
โโโ data_validator.verse Module D โ Integrity checks, sanitization, telemetry
โโโ persistence_manager.verse Module D โ 4 weak_maps, cache layer, auto-save
โ
โโโ feedback_templates.verse Module E โ 10-category rotated coaching messages
โโโ coach_controller.verse Module E โ Priority-based trigger evaluation (P0-P9)
โโโ coach_game_bridge.verse Module E โ Coach decisions โ game state actions
โ
โโโ shop_manager.verse Module F โ Product catalog, transaction pipeline
โโโ inventory_controller.verse Module F โ String-based item API + bitfield ownership
โโโ cosmetic_applicator.verse Module F โ Arena skin swap with preview system
โโโ xp_reward_system.verse Module F โ Accolade-based XP with budget enforcement
โ
โโโ hud_binding.verse UI โ Canvas-driven live HUD + UMG binding bridge
โโโ scorecard_renderer.verse UI โ Post-round scorecard overlay
โโโ shop_ui_controller.verse UI โ Shop menu canvas + terminal listeners
35 files. ~8,500 lines of production Verse.
| ID | Constraint | How We Handle It |
|---|---|---|
| HC-01 | NPCs cannot use native build/edit API | Prop-based illusion with TeleportTo swap |
| HC-02 | ~100 active spawned prop ceiling | Object pooling with FIFO reclaim, never SpawnProp at runtime |
| HC-03 | Dynamic props invisible to NavMesh | Traditional geometry props as NavMesh proxy layers |
| HC-04 | No HTTP/Web API calls | All data self-contained via Verse Persistence |
| HC-05 | Maximum 4 persistent weak_maps | 4-slot partitioned storage with serialization budgeting |
| HC-06 | Persistent structs immutable after deploy | Optional Fields pattern + migration functions |
| HC-07 | Island memory limits | Pooled props counted at budget time, staging at Z=-5000 |
- Create a new UEFN project from the blank island template
- Create all 35
.versefiles in the rootContent/folder - Paste code from each file
Ctrl+Shift+Bโ Build Verse Code (target: zero errors)- Follow the UEFN Editor Checklist in the repository for device placement and wiring
- Launch Session โ verify full round lifecycle
- Zero stubs: Every method is complete, functional, tested against the spec
- Event-driven: Modules communicate through the event bus, never through direct method coupling
- Structured concurrency:
racefor competing conditions,branchfor parallel tasks,loopfor reactive listeners - Fail gracefully: Every persistence load is validated. Every pool claim has a FIFO fallback. Every nav call has a timeout
- Budget everything: XP per block, props per pool, bytes per weak_map slot, corrections per validation pass
Proprietary. All rights reserved.
ProAI Training Map โ ืกืืืืช ืืืืื ืชืืจืืชืืช ืขื ืืื ื ืืืืืืชืืช ืืคืืจืื ืืื Creative
ืกืืืืช ืืืืื ืชืืจืืชืืช ืืืืืืืืช ืืืืืืื, ืืื ืขืช ืืื ื ืืืืืืชืืช, ืฉื ืื ืชื ืืืื ื-UEFN/Verse. ืืขื 35 ืงืืฆื Verse ืคืจืืืงืฉื. ืืคืก ืชืืืืืช ืืืฆืื ืืืช. ืืจืืืืงืืืจื ืืืืจื ืืชืื ืืื ืืข.
ProAI Training Map ืืื ืื ืชืจืืื ืชืืจืืชื ืขืฆืืื ืืืืืืื ืขืืืจ ืคืืจืื ืืื Creative. ืืฉืืงื ืืฆืืจืฃ, ื ืืื ืืืื AI ืฉืืชืืื ืืช ืขืฆืื ืืจืืชื ืืืื ืืืช, ืืงืื ืืฉืื ืงืืืฆ'ืื ื ืืืืกืก-ืืกืคืจืื ืืืืจ ืื ืกืืืื, ืืืืืจ ืืืื ืืืจ ืื ืืื ืืืฆืื ืืช ื-ELO ืฉืื, ืืืกืืืจืืืช ืืื ืืืืืงืก ืฉืื ืืืงืืกืืืืงืืช ืฉืจืืฉ โ ืืืืืง ืืืงืื ืฉืื ืืฉืืืจ ืืืชื.
ืื ืืขืจืืช โ ืืื ืืืืฉืื ืืืจ ืืืืืืจ ืืืืฉืื ื-ELO ืืขื ืืืืืกืช ืืฆื ืืงืืืกืืื ืืฉืื bit ืืืื โ ืชืืื ื ื ืืคืขืื ืืชืื ืืืืืืืช ืืงืฉืืืืช ืฉื UEFN: 4 weak_maps ืขืงืืืืช, ื-100 ืืืืจืื ืคืขืืืื ืืืงืืื, ืืคืก ืงืจืืืืช HTTP, ืืืื ืืกืื ื ืชืื ืื ืืืฆืื ืืื.
ืื ืืข ืืื ืืืืืงืก ืืืฉื ืฆืืื ืืืฆืืข ืืืจืื ื-DPS, ืืืื ืคืืืขืืช, ืืืื ืืืื ืืจืืฉ, ืืื ืชืืืื ืืืืืจืืช ืขืจืืื โ ืืืืจ ืื ืกืืืื. ืืืฉืืื ื-ELO ืืขืืื ืืช ืืืืจืื ืฉื ืืฉืืงื ืืืืฆืขืืช ืืืื Elo ืืื ืืกืืืื-ืฆืคืื, ืขื ืืืืจืช ืืงืื K ืืืชืืืช-ืืืจืื (K=48 ืืกืืืืื ืืืื, K=64 ืืืื ืืืจืงืช ืชื ืืืชืืืช, K=32 ืจืืื, K=16 ืืืืชืืงืื ืืืืฆืืื). ืคืื ืงืฆืืืช ืืกืืืื 1 / (1 + 10^((BotELO - PlayerELO) / 400)) ืืืจืฉืช ืืืฉืื 10^x โ ืืืจ ืฉVerseืื ืืกืคืงืช โ ืืืื ืืืืฉืืื ืืืืฉ ืคืืชืื ืืืจ ืืืืืืจ ื-8 ืืืืจืื ืฉื e^(xยทln10) ืขื ืืกืืืช ืืืงืกืคืื ื ื ื-[-3, 3] ืืืืฆืื ืืกืคืจื.
ืืืืจ ืืงืืฉื ืืชืจืื ืืช ื-ELO ืืืืฉ ืืคืจืืืจืื ืงืื ืงืจืืืื ืฉื ืืืื ืืืืฆืขืืช ืืื ืืจืคืืืฆืื ืืื ืืจืืช ืืืงื ืืชืื ืืืืฉื ืจืืืช (ืืชืืื ืืขื ืขืืืืช). ืฉืืงื ื-1400 ELO ืื ืืงืื ืงืคืืฆื ืืื ื"ืืืืจืืช Advanced" โ ืืื ืืงืื 37.5% ืืืืจื ืืื ืคืจืืืจื Advanced ื-Pro, ืื ืฉืืืืฆืจ ืืื ื ืชืืืื, ืฉืื ืืช ืืืื, ืืืืจืืช ืื ืืื, ืขืืฆืืช ืืื-ืืฆืื ืืจืืืช ืืืจืกืืืืืช ืฉืืจืืืฉืืช ืืืขืืืช ืืงืืืชืืืช.
ืกืืืืช ืจืืฆื ืฉื ืืืื ืืื ืืขืจืืช ืืงืืืืืช ืืจืืืืช ืืื ืืื ืขื ืืืืืืืื race ื-branch ืฉื Verse:
bot_behavior_base (npc_behavior)
โโ race:
โโ CombatLifecycle
โ โโ branch: AimTrackingLoop (ื ืืกืืื ืืืืจ ืฉื ืคืืงืืก ืจืฆืืฃ)
โ โโ foreground: bot_combat_state_machine.RunCombatLoop()
โ โโ COMBAT_APPROACH (ื ืืืื ืืขืืจ ืืฉืืงื)
โ โโ COMBAT_ENGAGE_CLOSE (ืืื-ืืฆืื ื ืืฆืืช + ืจืืื ืฆืื)
โ โโ COMBAT_ENGAGE_MID (ืคืจืฅ AR ืืืจืืง)
โ โโ COMBAT_DISENGAGE (ื ืกืืื + ืงืืจ ืืื ืชื)
โ โโ COMBAT_BUILD_AGGRO (ืืืฉืช ืงืืคืกื ืื ืจืืคื ืืชืงืคืืช)
โโ WaitForDeath (ื ืืงืื ืืืืื ืืกืืืืง)
ืืืืฉื ืชืช-ืืืืืืื (bot_navigation, bot_focus_aim, bot_weapon_controller, bot_combat_state_machine, build_sequence_choreographer) ืื ืืืืงืืช ืจืืืืืช ืฉืืืชืืื ืืจื Init() ืืืืืื ืฉ-npc_behavior ืื ืืืืื ืืืืืืง ืืคื ืืืช @editable. ืืืื ืืฉืชืืฉืืช ืืืืฉืงื ืชื ืืขื ืฉื ืืจืกื 38.10+ (using { /Fortnite.com/AI/movement_types } ืขื Running/Walking ืืฉืืจ).
NPCืื ืื ืืืืืื ืืืฉืช ื-API ืืื ืืื ืื ืืืืื ืฉื ืคืืจืื ืืื (HC-01). ืื ืืื ืืื ืืกืืืืฆืช ืขื ืืืืจืื ืฉืืืฆืื ืืจืืฉ ื-TeleportTo:
- ืื ืื ืืืืจ ืืื ืืื: 4 ืืืืจืื ืืกืืืื (ืงืืจ, ืจืฆืคื, ืจืืคื, ืืจืื) ืฉื ืืคื ืืืช
creative_propืฉืืืฆืื ืืขืืจื ืืขืืจื ืืืคืืจื ื-Z=-5000 ืืืคืขืื. ืชืืืขืืช ืืฆืืืืช ืืืืจืื ืืืืงืืื ืจืฉืช ืืืืฉืืื; ืจืืงืื ืืืืืจ ืืคืขืื ืคืื ืื FIFO ืฉื ืืืืืจ ืืคืขืื ืืืืชืืง ืืืืชืจ.ReclaimAllืืืืชืจ ืฉืืืื ืื 4 ืืืคืืจืืื ืืื ืืคืืจ ืืช ืขืืืก ืืคืจืืื. - ืืืงื ืืืืืจืื: ืืืฉืื ืืืงืื ืืืืฉืจ-ืจืฉืช (
GRID_TILE_SIZE=256) ืขื ืคืื ืงืฆืืืช snap, ืืืงืื ืงืืจ ืืืืื ื, ืืืืฉืื ื ืคืจืืกื ืืจืืืช-ืืืงืื ืืืืฉืืช ืงืืคืกื (4 ืงืืจืืช + ืจืฆืคื + ืืจืื), ืืืืื ืจืืคื (ืจืฆืคื + ืจืืคื + ืงืืจ), ืคื ืืืช 90 ืืขืืืช ืืืืกืืช ืืื ืชืืื. - ืื ืื ืืฆื ืืขืจืืื: "ืืฉืืืืช ืืขืจืืื" ืืฉืชืืฉืช ืืืฉืืืืืช ืฉื 2-3 ืืจืกืืืช ืืืคืคืืช ืฉื ืืืืจืื (ืงืืจ ืืื, ืืจืกืช ืืืื, ืืจืกืช ืืืช) ืฉืืืืืคืืช ืืจื TeleportTo โ ืืกืชืืจืื ืืืช ืืืืืื, ืืฆืืืื ืืืจืช ืืืืงืื โ ืืกืื ืืจื ืขื ืชืืืื ืืชืืื-ืืฉืื ืฉื ืืืืื
build_animation_sync.
ืื ืืืืื ืื ืืื ืืืืืื ืช ืืฉืืืฉื ืฉืืืื: WINDUP (ืืจืืช ืืจืืข, 40%), THROW (ื ืคื ืืฃ ืืจืืข, 30%), RECOVERY (ืืืืจืช ืืจืืข, 30%). ืืืืืจ ืืืคืืข ืืืืืง ืืกืืื ืฉืื ื-THROW:
SpawnMoment = BaseDuration ร (WindupPct + ThrowPct) / PlayRate
ื-PlayRate 1.5 (ืจืืช Pro), ืืืืจืื ืืืคืืขืื ืชืื 0.30 ืฉื ืืื. ื-PlayRate 0.5 (ืืชืืื), ืชืื 0.91 ืฉื ืืื. ืืืืจืืืืืจืฃ ืืืฉื ืืจืืฉ ืืช ืืฉืื ืืจืฆืฃ ืืืืืืื ืืชืืืืช ืืื ืืจืฆืช ืื ืืืฆืืืช.
ืื ืืืฉืง ืืืฉืชืืฉ ืืจืื ืืจ ืืงืื Verse ืืืืฆืขืืช ืืืฉืง ื-player_ui + canvas + text_block โ ืืื ืชืืืช ื-Widget Blueprint ืืคืื ืงืฆืืื ืืืืช ืืืื:
- ื ืชืื ื ืืืืื ืืืื (ืฉืืื-ืืืขืื): DPS, ืืืื ืคืืืขืืช, ืืืื ืืืื ืืจืืฉ โ ืืชืขืืื ืื 500ms ืืืืื ืงืจืืืช
- ืกืจืื ืกืืืืก (ืืืื-ืืืขืื): ELO ืขื ืืืื ืืชืงืืืืช ืืจืื, ืืกืคืจ ืกืืืื, ืืืื ื ืืฆืืื ืืช/ืืคืกืืื/ืชืืงื
- ืืืืขืช ืงืืืฆ' (ืืจืื-ืืืื): ืืฉืื ืืืืจ ืืกืืืื ืขื ืืืืืจ ืืกืชืจื ืืืืืืืืช
- ืืจืืืก ืชืืฆืืืช ืืืืจ ืืกืืืื: ืฉืืืช-ืขื ืืกื ืืื ืขื ืชืืฆืื, ืฉืื ืื ELO, ืื ืืืืืื ืืคืจืฉื ืืช ืืงืืืฆ'
ืื ืขืจืื ืืชืฆืืื ื ืืฉืคืื ืื-ืืื ืืช ืืืฉืชื ืื ืฆืืืืจืืื ืืืคืฉืจืืช ืืจืืืช UMG Widget Blueprint (ืืฆื ืชืฆืืื ืืคืื).
ืืืืขืฅ ืืืืืื ืื ืชื ืืช ืืืกืืืจืืืช ืืืืืื ืืืืืืช ืฉื ืืฉืืงื ืืื ืืืืืช:
- ืงืืคืืื: ืืืืื ืืืจืืช ELO ืขื ื ืืชืื ืชื ืืืืช (ืืืืื ืืื ืงืืคืืื ืืืืชื ืืืฉืืง ืชื ืืืชื ืื ืืขืืจื). ืืคืขืื ืืืจืงืช ืชื ืืืชืืืช (ืืืืคืช ืืงืื K) ืขื ืืื ืงืืจืืจ.
- ืชืกืืื: ืืขืจืืช ืฉื ื-ืงืจืืืจืืื ืื ืืืืจืฉืช ืืคืกืืื ืจืฆืืคืื AND ืืจืืืช ืืืฆืืขืื ืืขืืืช ืืกืืก ื-Pre-streak. ืฉืืงื ืฉืืคืกืื ืื ืฉืืืจ ืขื DPS ืืืื ืืงืื ืขืืืื ืืืชืืจ; ืฉืืงื ืฉืืืืื ืืืจืืื ืืงืื ืืงืืช ืงืืฉื + ืืฆืขื ืืืคืกืงื.
- ืืจื ืืื ืืืืืื: ืืืืฉื ืขืจืืฆื ืืจื ื ืขืฆืืืืื (DPS, ืืืื ืคืืืขืืช, ืืืื ืืืื ืืจืืฉ, ืืื ืชืืืื, ืืืืจืืช ืขืจืืื) ืืืืืฉืืื ืืคืืฆืื ืืืืกืืืจืื ืืืฆืืื ืืืฉืืืืช ืืืืฆืขืื.
- ืืืืื ืืืืฉื: ืืฉืืื ืืืืฆืขื 5 ืืกืืืืืื ืืืืจืื ืื ืฉื ืืฉืืงื ืืืกืืกื ืฆืืคืืื ืืจืืชื ืืืืืืจ ืืช ืฉื ืืืื ืืกืคืฆืืคื ืื ืืื ืืื ืืชืืช ืืกืื ืืจื.
- ืืจืืืช ืืืฆืืขืื: ืืืื ืืจืืืืช ืืืืช ืืกืืืื ืืืื (ืขืืืคืืช, tilt, AFK) ืืืฉืืืื ืืืกืืก ืืืืืช.
ืืงืจ ืืงืืืฆ' ืืขืจืื 10 ืชื ืื ืืจืืืจ ืืคื ืกืืจ ืขืืืคืืช (ืชืกืืื > ืงืืืืง > ืืื ืืจื > ืงืืคืืื > ืขืืืคืืช > ืืืืฉื > ืฉืืคืืจ > ืกืื ืืจื), ืืขืืืจ ืืืืขื ืืืช ืืกืืืื ืืจื ืืกืคืจ ืขืจืืฆืื, ืืืกืชืืื ืืื 3-5 ืืจืกืืืช ืชืื ืืช ืืื ืงืืืืจืื ืืื ืืืืื ืข ืืืืจืชืืืช.
ืื ื ืชืื ื ืืฉืืงื ื ืฉืืจืื ืืื ืืคืืฉืื ืืืืฆืขืืช ืืืืืง 4 ืืงืฆืืืช weak_map (ืืืงืกืืืื ืฉื ืืื ืืข):
| ืืจืืฅ | ืืืืจ | ื ืชืื ืื | ืชืงืฆืื |
|---|---|---|---|
| 1 | AnalyticsStore |
ืืืืฆืขื ืืืื (DPS, HS%, ืืืื ืคืืืขืืช, ืชืืืื), ืื ืืื ื ืืคืืฉ/ืกืืืื, ืกื"ื ืื ืืืช/ืขืจืืืืช, ืฆืืื ืขืงืืืืช | ~80 ืืืื |
| 2 | RatingStore |
ELO, ELO ืฉืื/ื ืืื, ื ืืฆืืื ืืช/ืืคืกืืื/ืชืืงื, ืืงืืช ืืืืื, ืจืฆืฃ ื ืืฆืืื ืืช ืืืืื, ืชื ืืจืกื, ืืืชืืช-ืืื ืืฉืืง ืืืจืื | ~80 ืืืื |
| 3 | ProgressionStore |
ืฉืื bit ืฉื ืงืืืกืืื (32 ืืืืื), ืืื ื ืืจื, ืจืื ืืืืื ืืืืชืจ, ืืชืืจืื ืืืืืื, ืกื"ื ืงืืืกืืื ืฉืืืฉืืื | ~40 ืืืื |
| 4 | EconomyStore |
ืืขืืืช Analytics Pass, ืฉืื bit ืฉื ืกืงืื ืื ืืืืจื, ืืกืืืื ื ืืชืืจ, ืกืงืื ืืฆืืื, V-Bucks ืฉืืืฆืื, ืืกืคืจ ืจืืืฉืืช | ~48 ืืืื |
ืื ืืฉืืืช ืื ืคืจืืืืืืืืื (int, float, logic) โ ืืคืก ืืืจืืืืช, ืืคืก ืืขืจืืื. ืืฆืื ืงืืืกื ืืืืืกืื ืืฉืืืช bit ืฉืืืื ืืืืฆืขืืช ืคืขืืืืช bitwise ืืขืจืืืืช (BitShiftLeft, BitwiseAnd, BitwiseOr ืืจื ืืฉืืื ืฉืืืื). ืืจืกืืืช ืืกืืื ืืฉืชืืฉืืช ืืืคืืก Optional Fields ืขื migration_v1_to_v2.verse ืืืืืืืฆืื ืืืืื.
ืืืืช ืื ืชืื ืื ืืืื ืื ืืขืื ื: ELO ืืืืื ื-[0, 5000], PeakELO โฅ CurrentELO, ืื ืืืืช ืื-ืฉืืืืืืช, ืืืืื ืืืื [0, 100]. ืื ืื ืืขืงืืืืช ืฉืืืจ ืืืืื ืฉื ืื 4 ืืจืืฆืื ืืืืืจืื ืืืขืื ื ืืืืชื ืื ืืืืื ืืื weak_map ืืื ืฉืืืจื, ืขื ืฉืืืจื-ืืืืืืืืช ืืื ืกืืฃ ืกืืืื ืืจื ืืืืื ืืืืืืืก ืืืืจืืขืื.
ืืขืจืืช ืืื ืืช ืืืืฉืช ืืช ืฆืื ืืจ ืืขืกืงืืืช In-Island ืืืื:
- ืืืืืช: ืืืืงืช ืงืืื ืืืฆืจ + ืื ืืขืช ืืคืืืืืืช ืขืืืจ ืคืจืืืื ืขืืืืื
- ืชืฉืืื: ื ืงืืืช ืฉืืืื API ืฉื ืขืกืงืช In-Island (ืืกืืืืฅ ืืคืืชืื)
- ืืืืืฉ: ืืงืจ ืืืืื ืืขื ืืง ืืช ืืคืจืื
- ืขืงืืืืช: ืฉืืืจื ืืืืืืช ืฉื ืืจืืฅ 4
- ืชืืคืขืืช ืืืืื: ืฆืืื ืงืืกืืืืงื ืืืืืืื, ืืืืคืช ืกืงืื ืืืืจื
- ืืืืืจืื: ืืขืงื ืืื ืกืืช
ืืืืจื button_device ืคืืืืื ืืืืื ืื ืืช ืืคืขืืืื ืจืืืฉืืช ืืจื ืืืืื ื InteractedWithEvent.Await(). ืืขืจืืช ืชืืืืื XP ืืืืงืช ืคืจืกืื ืืืืื ืืืืื ืฉื Epic (30K-200K ืืื ืืืืง ืฉื 10 ืืงืืช) ืขื ืืขืงื ืชืงืฆืื ืืืืืคืช ืื ืืืืืืืืช.
ืืชืงื event_bus.verse ืืื ืืขืจืืช ืืขืฆืืื ืืืจืืืืช โ 14 ืขืจืืฆื event() ืืกืืืื ืขื ืืคืืก Dispatch/Listen:
DispatchRoundStart(RoundNum) โ RoundStartEvent.Signal()
ListenForRoundEnd() โ RoundEndEvent.Await()
ืื ืืืืื ื ืจืฉื ืืืืจืืขืื ืฉืืืคืช ืื ืืื. ืื ืื ืืืฉืืง ืฉืืื. ืืฃ ืืืืื ืื ืงืืจื ืืฉืืจืืช ืืืชืืืืช ืฉื ืืืืื ืืืจ ืืขื ืืื ืื ืืืฆื-ืืืืืืื. ื ืืชืืง ืื ืืืืจ ืฉืืคืฉืจ ืืืกืืจ ืืช ืื ืืขืจืืช ืืงืืืฆ'ืื ื, ืืื ืืช, ืื ืืขืจืืช ื-XP ืืืื ืืืขืช ืืฉืืจื ืืืช ืืื ืื ืืืฉืืง ืื ืืื ืืข ืืื ืืืืืงืก.
Content/
โโโ event_bus.verse ืืืื โ ืืจืืงืจ pub/sub ืื 14 ืขืจืืฆืื
โโโ game_manager.verse ืืืื โ ืืืืืจ ืืื ืกืืืืืื ืจืืฉื (ืืืื ืช ืืฆื 5 ืฉืืืื)
โโโ arena_controller.verse ืืืื โ ืืคืขืื/ืืฉืืชืช ืืื, ื ืืืื ืืืคืืก ืืืืจื
โ
โโโ bot_behavior_base.verse ืืืืื A โ ื ืงืืืช ืื ืืกื ืืชื ืืืืช NPC (ืืงืืืืืืช race/branch)
โโโ bot_combat_state_machine.verse ืืืืื A โ FSM ืืืืื ืื 5 ืืฆืืื
โโโ bot_navigation.verse ืืืืื A โ ืชื ืืขืช NavMesh ืื-ืืคืืกืืช
โโโ bot_focus_aim.verse ืืืืื A โ ืืขืงื ืคืืงืืก ืขื ืืืื ืืืืื ืจืืฉ
โโโ bot_weapon_controller.verse ืืืืื A โ ืคืจืืคืืื ืจืืื ืฆืื/AR, ืกืืืืืฆืืืช ืคืืืขื LCG
โโโ bot_difficulty_profile.verse ืืืืื A โ ืืืื ืคืจืืืจืื ืืื ืข-ELO (10 ืฉืืืช)
โ
โโโ build_pool_manager.verse ืืืืื B โ ืืืืจ ืืืืืืงืืื ืขื ืคืื ืื FIFO ืืืืืฉื
โโโ build_prop_spawner.verse ืืืืื B โ ืืฉืืื ืคืจืืกื ืืืืฉืจ-ืจืฉืช
โโโ edit_state_manager.verse ืืืืื B โ ืืฉืืืืช ืืืืคืช ืืจืกืช ืืืืจ ืืขืจืืืืช
โโโ build_sequence_choreographer.verse ืืืืื B โ ื ืืืื ืจืฆืคื ืืืงืื ืืจืืืื
โโโ build_animation_sync.verse ืืืืื B โ ืืืฉืืื ืชืืืื ืืืืืง-ืืฉืื
โ
โโโ metric_definitions.verse ืืืืื C โ round_metrics ืื 25 ืฉืืืช + ืืื ืื ืชืืืืื
โโโ analytics_engine.verse ืืืืื C โ ืืืฉืื ืืืืื ืืืื ืืืช (6 ืืืืื ื branch)
โโโ elo_calculator.verse ืืืืื C โ ืกืืืื ืฆืคืื, ืืงืื K, Taylor Pow10
โโโ difficulty_mapper.verse ืืืืื C โ ELO โ ืคืจืืืจื ืืื (ืืื ืืจืคืืืฆืื 5 ืจืืืช)
โโโ predictive_advisor.verse ืืืืื C โ ื ืืชืื ืืจื ืืื, ืชืกืืื, ืงืืคืืื
โโโ session_aggregator.verse ืืืืื C โ ืืืืจ ืกืืืื ืืคืืฉ + ืืืชื ืืื-ืืคืืฉืื
โ
โโโ data_schema_v1.verse ืืืืื D โ ืืืืจืืช ืืืืงื ืขืงืืืช (4 ืืจืืฆืื)
โโโ data_schema_v2.verse ืืืืื D โ ืกืืืช V2 ืขื ืฉืืืช ืืืจืืืื
โโโ migration_v1_to_v2.verse ืืืืื D โ ืืขืืจื ืืืืื ืขื ืืืืจืช ืฉืืืช
โโโ data_validator.verse ืืืืื D โ ืืืืงืืช ืฉืืืืช, ืืืืื, ืืืืืจืื
โโโ persistence_manager.verse ืืืืื D โ 4 weak_maps, ืฉืืืช ืืืืื, ืฉืืืจื-ืืืืืืืืช
โ
โโโ feedback_templates.verse ืืืืื E โ ืืืืขืืช ืงืืืฆ'ืื ื ืืกืชืืืืืช ื-10 ืงืืืืจืืืช
โโโ coach_controller.verse ืืืืื E โ ืืขืจืืช ืืจืืืจืื ืืคื ืขืืืคืืช (P0-P9)
โโโ coach_game_bridge.verse ืืืืื E โ ืืืืืืช ืงืืืฆ' โ ืคืขืืืืช ืืฆื ืืฉืืง
โ
โโโ shop_manager.verse ืืืืื F โ ืงืืืื ืืืฆืจืื, ืฆืื ืืจ ืขืกืงืืืช
โโโ inventory_controller.verse ืืืืื F โ API ืคืจืืืื ืืืืกืก-ืืืจืืืช + ืืขืืืช bitfield
โโโ cosmetic_applicator.verse ืืืืื F โ ืืืืคืช ืกืงืื ืืืืจื ืขื ืืขืจืืช ืชืฆืืื ืืงืืืื
โโโ xp_reward_system.verse ืืืืื F โ XP ืืืืกืก-ืคืจืกืื ืขื ืืืืคืช ืชืงืฆืื
โ
โโโ hud_binding.verse UI โ HUD ืื ืืืืกืก-Canvas + ืืฉืจ ืืจืืืช UMG
โโโ scorecard_renderer.verse UI โ ืฉืืืช-ืขื ืืจืืืก ืชืืฆืืืช ืืืืจ ืกืืืื
โโโ shop_ui_controller.verse UI โ Canvas ืชืคืจืื ืื ืืช + ืืืืื ื ืืืื
35 ืงืืฆืื. ื-8,500 ืฉืืจืืช Verse ืคืจืืืงืฉื.
| ืืืื | ืืืืื | ืืืฆื ืืืคืืื ืื |
|---|---|---|
| HC-01 | NPCืื ืื ืืืืืื ืืืฉืชืืฉ ื-API ืืื ืืื/ืขืจืืื ืื ืืืืื | ืืฉืืืืช ืืืืจืื ืขื ืืืืคื ื-TeleportTo |
| HC-02 | ืื ืฉื ื-100 ืืืืจืื ืฉืืืคืขืื ืคืขืืืื | ืืืืจ ืืืืืืงืืื ืขื ืคืื ืื FIFO, ืืขืืื ืื SpawnProp ืืืื ืจืืฆื |
| HC-03 | ืืืืจืื ืืื ืืืื ืืืชื-ื ืจืืื ื-NavMesh | ืืืืจื ืืืืืืืจืื ืืกืืจืชืืื ืืฉืืืืช proxy ื-NavMesh |
| HC-04 | ืืื ืงืจืืืืช HTTP/Web API | ืื ืื ืชืื ืื ืขืฆืืืืื ืืจื Verse Persistence |
| HC-05 | ืืงืกืืืื 4 weak_maps ืขืงืืืืช | ืืืกืื ืืืืืง ื-4 ืืจืืฆืื ืขื ืชืงืฆืื ืกืจืืืืืืฆืื |
| HC-06 | struct-ืื ืขืงืืืื ืืืชื-ื ืืชื ืื ืืฉืื ืื ืืืืจ ืคืจืืกื | ืืคืืก Optional Fields + ืคืื ืงืฆืืืช ืืขืืจื |
| HC-07 | ืืืืืืช ืืืืจืื ืืื | ืืืืจืื ืืืืืจ ื ืกืคืจืื ืืืื ืชืงืฆืื, ืืืืื ื-Z=-5000 |
- ืฆืืจ ืคืจืืืงื UEFN ืืืฉ ืืชืื ืืช ืืื ืืจืืง
- ืฆืืจ ืืช ืื 35 ืงืืฆื
.verseืืชืืงืืืช ืืืกืืกContent/ - ืืืืง ืงืื ืืื ืงืืืฅ
Ctrl+Shift+Bโ ืื ื ืงืื Verse (ืืืจื: ืืคืก ืฉืืืืืช)- ืขืงืื ืืืจ ืจืฉืืืช ืืืืืงื ืฉื ืขืืจื UEFN ืืืืืจ ืืฆืืจื ืืืงืื ืืืืืืื ืฉื ืืืชืงื ืื
- ืืคืขื ืืคืืฉ โ ืืืช ืืืืืจ ืืื ืกืืืื ืืื
- ืืคืก stubืื: ืื ืืชืืื ืฉืืื, ืคืื ืงืฆืืื ืืืช, ื ืืืงื ืืื ืืืคืจื
- ืืื ืข-ืืืจืืขืื: ืืืืืืื ืืชืงืฉืจืื ืืจื ืืืืืืืก ืืืืจืืขืื, ืืขืืื ืื ืืจื ืงืืฉืืจ ืืฉืืจ ืืื ืืชืืืืช
- ืืงืืืืืืช ืืืื ืืช:
raceืืชื ืืื ืืชืืจืื,branchืืืฉืืืืช ืืงืืืืืืช,loopืืืืืื ืื ืชืืืืชืืื - ืืืฉืืื ืืืืงืจ: ืื ืืขืื ืช ืขืงืืืืช ืืืืืชืช. ืืื ืชืืืขืช ืืืืจ ืืฉ ืืืืื FIFO. ืืื ืงืจืืืช ื ืืืื ืืฉ timeout
- ืชืงืฆืื ืืื ืืืจ: XP ืืื ืืืืง, ืืืืจืื ืืื ืืืืจ, ืืืืืื ืืื ืืจืืฅ weak_map, ืชืืงืื ืื ืืื ืืขืืจ ืืืืืช
ืงื ืืื ื. ืื ืืืืืืืช ืฉืืืจืืช.