developer.reactivedrop.com

Mapping Distances

Architecture

Object Dimensions
1 foot 16 units
Maximum Climbable Step 24 units or 45.573* degree slope
Small Vent 64×64
Small Hallway 192 wide
Large Hallway 384 wide
Very Large Hallway 896 wide
Standard heavy door 32×128×160
Vault door 16×160×160

*The exact maximum slope angle is arccos(0.7).

Creature Hulls

Creatures Dimensions
Marine 32×32×72*
Colonist 26×26×72
Drone (all variants) 40×40×69
Ranger 40×40×69
Buzzer 20×20×20*
Boomer 60×60×110
Parasite 24×24×12
Shieldbug 80×80×72
Mortarbug 46×46×69
Harvester 46×46×69
Xenomite 24×24×12
Grub 24×24×12
Mender 32×32×64
Queen 240×240×160
Antlion (both) 32×32×64
Antlion Guard (both) 60×60×110
Headcrab (all variants) 24×24×12
Headcrab Zombie (all variants) 26×26×72
Combine Soldier (all variants) 26×26×72
Combine Hunter 44x44x100
Combine Strider, Dropship, Gunship 76x76x76*
Combine Scanner, Claw Scanner 20x20x20*

*Marine hulls are biased 2 units south (regardless of camera orientation).
*Flying creature hulls are vertically centered. All other hulls start at the origin and go up. Striders are considered to be flying creatures.

Player View

With asw_controls 1, the camera has a fixed angle when moving the mouse. Unless explicitly disabled in asw_gamerules, players can rotate the camera's yaw axis in 90 degree increments. For other values of asw_controls, the player has full control of the camera angle.

The player can also change the center point of their view on the X and Y axes by moving their mouse. The default values for maximum camera shifting offsets are 300 left/right, 200 forward, and 380 back.

Calculator


Result

<script> const inputs = {}; ["calculator", "result1", "result2", "pitch", "dist", "fov", "aspect_w", "aspect_h", "test_z"].forEach(name => { const el = document.getElementById(name); inputs[name] = el; if (el.nodeName === "INPUT") { el.addEventListener("input", recalculate, false); } }); function recalculate() { if (!inputs.calculator.reportValidity()) { return; } const pitch = Math.PI - inputs.pitch.valueAsNumber * Math.PI / 180; const camOffsetY = -inputs.dist.valueAsNumber * Math.cos(pitch); // camera -> feet const camOffsetZ = -inputs.dist.valueAsNumber * Math.sin(pitch); // camera -> feet const aspect = inputs.aspect_w.valueAsNumber / inputs.aspect_h.valueAsNumber; const halfFOVY = inputs.fov.valueAsNumber * Math.PI / 360; const halfFOVX = Math.atan(aspect * Math.tan(halfFOVY)); const angleTop = pitch + halfFOVY; // +z sin, +y cos const angleBottom = pitch - halfFOVY; // +z sin, +y cos const testZ = inputs.test_z.valueAsNumber + camOffsetZ; // camera -> floor const floorTopY = testZ / Math.tan(angleTop) - camOffsetY; const floorBottomY = testZ / Math.tan(angleBottom) - camOffsetY; const floorTopX = -testZ * Math.sin(halfFOVX) / Math.sin(angleTop); const floorBottomX = -testZ * Math.sin(halfFOVX) / Math.sin(angleBottom); if (floorTopY <= floorBottomY) { inputs.result1.textContent = "The player cannot see a floor that is " + inputs.test_z.valueAsNumber.toFixed(1) + " units above their feet."; inputs.result2.textContent = ""; } else { inputs.result1.textContent = "The player can see a floor that is " + inputs.test_z.valueAsNumber.toFixed(1) + " units above their feet from " + floorTopY.toFixed(1) + " units in front of them to " + (-floorBottomY).toFixed(1) + " units behind them."; inputs.result2.textContent = "At the far end, the player can see " + floorTopX.toFixed(1) + " units to the left and right on the floor, and at the near end, the player can see " + floorBottomX.toFixed(1) + " units to the left and right on the floor."; } } recalculate();