Codex CLI
feat: Implement dynamic fire-rate powerups and enemy behavior updates
5cf582c
// 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
};