orcs-in-the-forest / src /globals.js
Codex CLI
feat(powerups): add infinite ammo powerup mechanics and UI integration
a646668
import * as THREE from 'three';
// Centralized mutable game state shared across modules
export const G = {
renderer: null,
scene: null,
camera: null,
controls: null,
clock: null,
state: 'menu',
ground: null,
flashlight: null,
sunLight: null,
moonLight: null,
sunSprite: null,
moonSprite: null,
ambientLight: null,
// Lightweight sky clouds
clouds: [],
// Foliage chunk refs for LOD/culling
foliage: { grass: [], flowers: [] },
mountains: null,
input: {
w: false,
a: false,
s: false,
d: false,
shoot: false,
sprint: false,
crouch: false,
jump: false,
grenade: false
},
player: null, // initialized in main
enemies: [],
treeColliders: [],
treeMeshes: [],
// Subset of meshes used for bullet blocking (trunks only)
treeTrunks: [],
// Spatial index for trees to accelerate queries
treeGrid: null,
// Static blockers array for raycasting (ground + trees)
blockers: [],
shootCooldown: 0,
raycaster: new THREE.Raycaster(),
tmpV1: new THREE.Vector3(),
tmpV2: new THREE.Vector3(),
tmpV3: new THREE.Vector3(),
weapon: {
group: null,
muzzle: null,
basePos: new THREE.Vector3(),
baseRot: new THREE.Euler(0, 0, 0),
recoil: 0,
swayT: 0,
ammo: 0,
reserve: Infinity,
reloading: false,
reloadTimer: 0,
anchor: { depth: 0.80, right: 0.417, bottom: 0.365 },
// Dynamic aim spread (NDC units) and helpers
spread: 0,
targetSpread: 0,
// View recoil offsets applied to camera (radians)
viewPitch: 0,
viewYaw: 0,
appliedPitch: 0,
appliedYaw: 0,
// Dynamic fire-rate buff
rofMult: 1,
rofBuffTimer: 0,
rofBuffTotal: 0,
// Infinite ammo buff
infiniteAmmoTimer: 0,
infiniteAmmoTotal: 0,
ammoBeforeInf: null,
reserveBeforeInf: null,
materials: [],
glowT: 0
},
// Temporary movement speed buff (used by accelerator)
movementMult: 1,
movementBuffTimer: 0,
fx: { tracers: [], impacts: [], flashes: [], dusts: [], portals: [] },
// Player grenades and preview helpers
grenades: [],
heldGrenade: null,
grenadeCount: 0,
grenadePreview: null,
// Explosion VFX
explosions: [],
enemyProjectiles: [],
// Health orbs and other pickups
orbs: [],
// Ephemeral wave pickups (e.g., ROF accelerators)
powerups: [],
// Ejected shell casings
casings: [],
// Detached props (helmets) with simple physics
helmets: [],
damageFlash: 0,
healFlash: 0,
hitFlash: 0,
// Deferred GPU resource disposal queue to avoid frame spikes
disposeQueue: [],
waves: {
current: 1,
aliveCount: 0,
spawnQueue: 0,
nextSpawnTimer: 0,
breakTimer: 0,
inBreak: false,
spawnAnchor: null,
shamansToSpawn: 0,
wolvesToSpawn: 0,
golemsToSpawn: 0
},
random: null,
// Day/night cycle
timeOfDay: 0.25 // 0..1, where ~0.5 is noon
};