Skip to content

cdtauman/Fortnite-Project

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

3 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

ProAI Training Map โ€” Competitive AI Practice for Fortnite Creative

A 24/7 AI-driven competitive training environment built entirely in UEFN/Verse. 35+ production Verse files. Zero external dependencies. Pure in-engine architecture.


What This Is

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.


Core Systems

Adaptive ELO & Difficulty Scaling

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.

AI Bot with Structured Concurrency

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).

Object-Pooled Build Simulation

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_prop references 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. ReclaimAll yields 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.

Build Animation Sync

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.

Canvas-Driven HUD

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).

Predictive Coaching Intelligence

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.

4-Slot Persistent Storage

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.

In-Island Economy

The shop system implements the complete In-Island Transaction pipeline:

  1. Validation: Product existence check + durable duplicate prevention
  2. Payment: In-Island Transaction API integration point (simulated for development)
  3. Fulfillment: Inventory controller grants the item
  4. Persistence: Immediate Slot 4 save
  5. Side Effects: Auto-equip cosmetics, arena skin swap
  6. 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.

Event Bus Architecture

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.


File Manifest

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.


Engine Constraints Respected

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

Setup

  1. Create a new UEFN project from the blank island template
  2. Create all 35 .verse files in the root Content/ folder
  3. Paste code from each file
  4. Ctrl+Shift+B โ€” Build Verse Code (target: zero errors)
  5. Follow the UEFN Editor Checklist in the repository for device placement and wiring
  6. Launch Session โ†’ verify full round lifecycle

Architecture Principles

  • 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: race for competing conditions, branch for parallel tasks, loop for 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

License

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, ื•ืื™ืŸ ืžืกื“ื™ ื ืชื•ื ื™ื ื—ื™ืฆื•ื ื™ื™ื.


ืžืขืจื›ื•ืช ืœื™ื‘ื”

ELO ื•ืชืืžืช ืจืžืช ืงื•ืฉื™

ืžื ื•ืข ื”ืื ืœื™ื˜ื™ืงืก ืžื—ืฉื‘ ืฆื™ื•ืŸ ื‘ื™ืฆื•ืข ืžื•ืจื›ื‘ ืž-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, ืžื” ืฉืžื™ื™ืฆืจ ื–ืžื ื™ ืชื’ื•ื‘ื”, ืฉื•ื ื•ืช ื›ื•ื•ืŸ, ืžื”ื™ืจื•ืช ื‘ื ื™ื™ื”, ืขื•ืฆืžืช ื–ื–ื”-ื”ืฆื“ื” ื•ืจืžื•ืช ืื’ืจืกื™ื‘ื™ื•ืช ืฉืžืจื’ื™ืฉื•ืช ื˜ื‘ืขื™ื•ืช ื•ืงื“ืžืชื™ื•ืช.

ื‘ื•ื˜ AI ืขื ืžืงื‘ื™ืœื™ื•ืช ืžื•ื‘ื ื™ืช

ืกื‘ื™ื‘ืช ืจื™ืฆื” ืฉืœ ื”ื‘ื•ื˜ ื”ื™ื ืžืขืจื›ืช ืžืงื‘ื™ืœื™ืช ืžืจื•ื‘ื“ืช ื”ื‘ื ื•ื™ื” ืขืœ ื”ื‘ื™ื˜ื•ื™ื™ื 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 ืฉื ื™ื™ื”. ื”ื›ื•ืจื™ืื•ื’ืจืฃ ืžื—ืฉื‘ ืžืจืืฉ ืืช ืžืฉื›ื™ ื”ืจืฆืฃ ื”ื›ื•ืœืœื™ื ืœืชื–ืžื•ืช ืœืœื ื”ืจืฆืช ืื ื™ืžืฆื™ื•ืช.

ืชืฆื•ื’ืช HUD ืžื‘ื•ืกืกืช Canvas

ื›ืœ ืžืžืฉืง ื”ืžืฉืชืžืฉ ืžืจื•ื ื“ืจ ืžืงื•ื“ 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 ื—ืจื™ืฆื™ื

ื›ืœ ื ืชื•ื ื™ ื”ืฉื—ืงืŸ ื ืฉืžืจื™ื ื‘ื™ืŸ ืžืคื’ืฉื™ื ื‘ืืžืฆืขื•ืช ื‘ื“ื™ื•ืง 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 ื”ืžืœื:

  1. ืื™ืžื•ืช: ื‘ื“ื™ืงืช ืงื™ื•ื ืžื•ืฆืจ + ืžื ื™ืขืช ื›ืคื™ืœื•ื™ื•ืช ืขื‘ื•ืจ ืคืจื™ื˜ื™ื ืขืžื™ื“ื™ื
  2. ืชืฉืœื•ื: ื ืงื•ื“ืช ืฉื™ืœื•ื‘ API ืฉืœ ืขืกืงืช In-Island (ืžืกื•ืžืœืฅ ืœืคื™ืชื•ื—)
  3. ืžื™ืžื•ืฉ: ื‘ืงืจ ื”ืžืœืื™ ืžืขื ื™ืง ืืช ื”ืคืจื™ื˜
  4. ืขืงื‘ื™ื•ืช: ืฉืžื™ืจื” ืžื™ื™ื“ื™ืช ืฉืœ ื—ืจื™ืฅ 4
  5. ืชื•ืคืขื•ืช ืœื•ื•ืื™: ืฆื™ื•ื“ ืงื•ืกืžื˜ื™ืงื” ืื•ื˜ื•ืžื˜ื™, ื”ื—ืœืคืช ืกืงื™ืŸ ืœื–ื™ืจื”
  6. ื˜ืœืžื˜ืจื™ื”: ืžืขืงื‘ ื”ื›ื ืกื•ืช

ืื‘ื–ืจื™ 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

ื”ื’ื“ืจื”

  1. ืฆื•ืจ ืคืจื•ื™ืงื˜ UEFN ื—ื“ืฉ ืžืชื‘ื ื™ืช ื”ืื™ ื”ืจื™ืง
  2. ืฆื•ืจ ืืช ื›ืœ 35 ืงื‘ืฆื™ .verse ื‘ืชื™ืงื™ื™ืช ื”ื‘ืกื™ืก Content/
  3. ื”ื“ื‘ืง ืงื•ื“ ืžื›ืœ ืงื•ื‘ืฅ
  4. Ctrl+Shift+B โ€” ื‘ื ื” ืงื•ื“ Verse (ืžื˜ืจื”: ืืคืก ืฉื’ื™ืื•ืช)
  5. ืขืงื•ื‘ ืื—ืจ ืจืฉื™ืžืช ื”ื‘ื“ื™ืงื” ืฉืœ ืขื•ืจืš UEFN ื‘ืžืื’ืจ ืœืฆื•ืจืš ืžื™ืงื•ื ื•ื”ื—ื™ื•ื•ื˜ ืฉืœ ื”ื”ืชืงื ื™ื
  6. ื”ืคืขืœ ืžืคื’ืฉ โ†’ ืืžืช ืžื—ื–ื•ืจ ื—ื™ื™ ืกื™ื‘ื•ื‘ ืžืœื

ืขืงืจื•ื ื•ืช ืืจื›ื™ื˜ืงื˜ื•ืจื”

  • ืืคืก stubื™ื: ื›ืœ ืžืชื•ื“ื” ืฉืœืžื”, ืคื•ื ืงืฆื™ื•ื ืœื™ืช, ื ื‘ื“ืงื” ืžื•ืœ ื”ืžืคืจื˜
  • ืžื•ื ืข-ืื™ืจื•ืขื™ื: ืžื•ื“ื•ืœื™ื ืžืชืงืฉืจื™ื ื“ืจืš ืื•ื˜ื•ื‘ื•ืก ื”ืื™ืจื•ืขื™ื, ืœืขื•ืœื ืœื ื“ืจืš ืงื™ืฉื•ืจ ื™ืฉื™ืจ ื‘ื™ืŸ ืžืชื•ื“ื•ืช
  • ืžืงื‘ื™ืœื™ื•ืช ืžื•ื‘ื ื™ืช: race ืœืชื ืื™ื ืžืชื—ืจื™ื, branch ืœืžืฉื™ืžื•ืช ืžืงื‘ื™ืœื™ื•ืช, loop ืœืžืื–ื™ื ื™ื ืชื’ื•ื‘ืชื™ื™ื
  • ื›ื™ืฉืœื•ืŸ ืžื‘ื•ืงืจ: ื›ืœ ื˜ืขื™ื ืช ืขืงื‘ื™ื•ืช ืžืื•ืžืชืช. ืœื›ืœ ืชื‘ื™ืขืช ืžืื’ืจ ื™ืฉ ื’ื™ื‘ื•ื™ FIFO. ืœื›ืœ ืงืจื™ืืช ื ื™ื•ื•ื˜ ื™ืฉ timeout
  • ืชืงืฆื™ื‘ ืœื›ืœ ื“ื‘ืจ: XP ืœื›ืœ ื‘ืœื•ืง, ืื‘ื–ืจื™ื ืœื›ืœ ืžืื’ืจ, ื‘ื™ื™ื˜ื™ื ืœื›ืœ ื—ืจื™ืฅ weak_map, ืชื™ืงื•ื ื™ื ืœื›ืœ ืžืขื‘ืจ ืื™ืžื•ืช

ืจื™ืฉื™ื•ืŸ

ืงื ื™ื™ื ื™. ื›ืœ ื”ื–ื›ื•ื™ื•ืช ืฉืžื•ืจื•ืช.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors