Spaces:
Running
Running
| // Game configuration constants | |
| export const CFG = { | |
| forestSize: 300, | |
| treeCount: 400, | |
| clearRadius: 12, | |
| // Ground cover (instanced) config | |
| foliage: { | |
| chunkSize: 30, // world units per chunk (controls draw calls) | |
| grassPerChunk: 220, // avg blades per chunk (denser) | |
| flowersPerChunk: 10, // avg flower sprites per chunk | |
| bushesPerChunk: 2, // avg bushes per chunk | |
| rocksPerChunk: 1, // avg rocks per chunk | |
| maxSlope: 0.98, // skip very steep surfaces (0..1, 1 = flat) | |
| windStrength: 0.45, // vertex sway amount for grass/flowers | |
| densityNearClear: 0.45, // density multiplier at the edge of the clearing | |
| // Distance culling for instanced ground cover | |
| grassViewDist: 95, // draw grass within this radius from camera | |
| flowerViewDist: 85, // draw flowers within this radius from camera | |
| seedOffset: 8888 // extra salt for deterministic placement | |
| }, | |
| player: { | |
| speed: 8, | |
| sprintMult: 1.5, | |
| crouchMult: 0.6, | |
| radius: 0.8, | |
| health: 100, | |
| jumpVel: 5, | |
| eyeHeight: 1.8, | |
| crouchEyeHeight: 1.2, | |
| // Apex-like movement tuning | |
| move: { | |
| friction: 5.5, // ground friction (~4-6) | |
| stopSpeed: 6.0, // speed where friction clamps (m/s) | |
| groundAccel: 9.5, // slightly slower to build speed | |
| airAccel: 12.0, // reduce mid-air drift/control | |
| gravity: 15.0, // matches prior gravity | |
| jumpSpeed: 5.0, // vertical impulse (mirrors jumpVel) | |
| airSpeedCap: 8.0, // tighter cap to curb air strafing | |
| // Sliding | |
| slideFriction: 1.6, // a bit less slide drift | |
| slideAccel: 8.0, // less push while sliding | |
| slideMinSpeed: 6.0, // enter slide when crouch and >= this speed | |
| slideJumpBoost: 0.85, // tone down slide-jump boost slightly | |
| // Helpers | |
| jumpBuffer: 0.12, // seconds to buffer jump presses | |
| coyoteTime: 0.12, // late jump after leaving ground | |
| // Wall bounce | |
| wallBounceWindow: 0.10, // seconds after wall contact to accept jump | |
| wallBounceImpulse: 1.2 // outward push on wall bounce (m/s) | |
| } | |
| }, | |
| flashlight: { | |
| on: true, | |
| distance: 150, | |
| intensity: 38.0, | |
| angle: 0.6 | |
| }, | |
| fogDensity: 0.008, | |
| waves: { | |
| baseCount: 6, | |
| perWaveAdd: 4, | |
| spawnEvery: 0.7, | |
| spawnDecay: 0.03, | |
| spawnMin: 0.25, | |
| maxAlive: 30, | |
| annulusMin: 28, | |
| annulusMax: 45, | |
| breakTime: 2.5 | |
| }, | |
| enemy: { | |
| hp: 100, | |
| radius: 0.9, | |
| baseSpeed: 2.5, | |
| speedPerWave: 0.25, | |
| dps: 15, | |
| // Ranged weapon settings | |
| rof: 0.6, // shots per second (archers) | |
| range: 120, | |
| shotDamage: 8, | |
| bloom: 0.015, // aim error | |
| // Arrow projectile settings | |
| arrowSpeed: 40, | |
| arrowGravity: 20, | |
| arrowDamage: 12, | |
| arrowLife: 6, | |
| arrowHitRadius: 0.6 | |
| }, | |
| // Wolf-specific tuning | |
| wolf: { | |
| speedMult: 2.0, // 2x faster than other enemies | |
| biteRange: 1.6, // distance to trigger a bite | |
| biteInterval: 0.9, // seconds between bites | |
| biteWindup: 0.22, // time before bite lands | |
| biteDamage: 14, // damage per bite when it lands | |
| radius: 0.8 // collision radius for wolves | |
| }, | |
| // Shaman-specific tuning | |
| shaman: { | |
| // Fireball slightly slower than orc arrow (40) | |
| fireballSpeed: 42, | |
| fireballDamage: 60, | |
| fireballLife: 5, | |
| fireballHitRadius: 0.9, | |
| teleportCooldown: 6, | |
| teleportDistance: 12 | |
| }, | |
| // Golem-specific tuning | |
| golem: { | |
| hp: 1000, // 5x basic enemy (100) | |
| radius: 1.8, // bigger footprint | |
| baseSpeed: 1.6, | |
| speedPerWave: 0.10, | |
| dps: 20, // contact damage if you hug it | |
| range: 90, | |
| // Throwing | |
| throwInterval: 1.8, // seconds between throws | |
| throwWindup: 0.40, | |
| bloom: 0.01, | |
| // Rock projectile | |
| rockSpeed: 34, | |
| rockGravity: 22, | |
| rockDamage: 45, | |
| rockLife: 7, | |
| rockHitRadius: 0.9 | |
| }, | |
| gun: { | |
| // Faster, closer to AK full-auto feel (~600 RPM is 10 RPS) | |
| rof: 10.5, | |
| damage: 34, | |
| range: 120, | |
| // Minimum hipfire spread (normalized device coords) | |
| bloom: 0.004, | |
| // CS-style dynamic spread tuning | |
| spreadMin: 0.003, | |
| spreadMax: 0.028, | |
| spreadShotIncrease: 0.0030, // added per shot (faster bloom) | |
| spreadDecay: 6.8, // slightly slower recovery while spraying | |
| spreadMoveMult: 2.2, // walking | |
| spreadSprintMult: 3.2, // sprinting | |
| spreadAirMult: 4.0, // not grounded | |
| spreadCrouchMult: 0.6, // crouching for precision | |
| magSize: 24, | |
| reloadTime: 1.6, | |
| recoilKick: 0.065, | |
| recoilRecover: 9.0, | |
| headshotMult: 2.0, | |
| // View recoil (adds to camera; radians suggested) | |
| viewKickPitchDeg: 1.2, // a touch more kick | |
| viewKickYawDeg: 0.5, // slightly more horizontal wander | |
| viewReturn: 9.0 // per second return to neutral | |
| }, | |
| fx: { | |
| tracerLife: 0.08, | |
| impactLife: 0.25, | |
| muzzleLife: 0.05 | |
| }, | |
| // Player grenades | |
| grenade: { | |
| speed: 24, // initial throw speed | |
| gravity: 20, // matches enemy arrow gravity | |
| fuse: 3.0, // seconds after priming | |
| radius: 6.5, // explosion radius | |
| maxDamage: 140, // center damage to enemies | |
| selfMaxDamage: 90,// center damage to player | |
| previewSteps: 36, // points along arc preview | |
| previewDt: 0.06, // timestep used for preview sim | |
| minPitchDeg: 28, // minimum upward throw angle for a nice arc (not enforced if yBoost used) | |
| yBoost: 3.5 // additional upward speed added for nicer arc (scaled by horizontal aim) | |
| }, | |
| audio: { | |
| master: 0.6, | |
| gunshotVol: 0.9, | |
| headshotVol: 0.8, | |
| reloadVol: 0.7, | |
| pickupVol: 1.0, | |
| reloadStart: true, | |
| reloadEnd: true, | |
| // Background music | |
| musicEnabled: true, | |
| musicVol: 0.18, | |
| musicTempo: 138 | |
| }, | |
| hud: { | |
| damageMaxOpacity: 0.6, | |
| damageFadeSpeed: 2.5, // per second | |
| damagePulsePerHit: 0.5, // adds to flash on single hit | |
| damagePulsePerHP: 0.01, // adds per HP of damage | |
| // Heal overlay | |
| healMaxOpacity: 0.5, | |
| healFadeSpeed: 2.5, // per second | |
| healPulsePerPickup: 0.45, // adds to flash per orb pickup | |
| healPulsePerHP: 0.01, // adds per HP healed | |
| // Hitmarker (X) flash | |
| hitFadeSpeed: 12.0, // higher = faster fade (per second) | |
| hitMaxOpacity: 0.3, // cap opacity to 30% | |
| hitSize: 12, // shorter segment length | |
| hitGapExtra: 6 // extra center gap vs crosshair | |
| }, | |
| seed: 1337 | |
| }; | |
| // Day/Night cycle configuration | |
| export const DAY_NIGHT = { | |
| enabled: true, | |
| lengthSec: 180, // full cycle duration | |
| // Orbit | |
| sunDistance: 200, // distance of sun sprite from origin | |
| moonDistance: 200, // distance of moon sprite from origin | |
| sunTiltDeg: -30, // yaw tilt of the sun path (azimuth) | |
| // Intensities | |
| nightAmbient: 0.45, | |
| dayAmbient: 0.65, | |
| nightKey: 0.9, // keep night brighter than before | |
| dayKey: 1.5, | |
| // Fog densities | |
| nightFogDensity: 0.006, | |
| dayFogDensity: 0.0035, | |
| // Colors | |
| colors: { | |
| ambientSkyNight: 0x6a7f9a, | |
| ambientSkyDay: 0xbfd4ff, | |
| ambientGroundNight: 0x2a3544, | |
| ambientGroundDay: 0x7a8c6e, | |
| dirNight: 0x8baae0, | |
| dirDay: 0xfff1cc, | |
| // Sun color grading | |
| sunSunrise: 0xffa04a, // warmer at horizon | |
| sunNoon: 0xfff1cc, // softer pale at zenith | |
| fogNight: 0x101922, | |
| fogDay: 0x9cc3ff, | |
| bgNight: 0x121a24, | |
| bgDay: 0x6ea7e0 | |
| } | |
| }; | |
| // Simple clouds config | |
| export const CLOUDS = { | |
| enabled: true, | |
| count: 12, | |
| height: 92, | |
| radius: 200, | |
| sizeMin: 28, | |
| sizeMax: 48, | |
| speed: 2.0, // base drift speed | |
| windDeg: 35, // wind direction in degrees (0 = +X, 90 = +Z) | |
| opacityDay: 0.55, | |
| opacityNight: 0.25, | |
| colorDay: 0xffffff, | |
| colorNight: 0xa0b0c8 | |
| }; | |
| // Background mountains (purely visual) | |
| export const MOUNTAINS = { | |
| enabled: true, | |
| radius: 420, | |
| segments: 96, | |
| baseHeight: 20, | |
| heightVar: 60, | |
| yOffset: -30, | |
| colorDay: 0x6e8ba6, | |
| colorNight: 0x223140, | |
| // Per-vertex gradient along height | |
| colorBase: 0x1d2a35, | |
| colorPeak: 0xd7e0ea, | |
| // Bottom fade to avoid visible base demarcation | |
| fadeEdge: 0.45, // 0..1, where it starts to become opaque | |
| fadePow: 1.3 | |
| }; | |