Cite as
DescentDevelopers/Descent3
Original
https://github.com/DescentDevelopers/Descent3
Pinned
DescentDevelopers/Descent3 @ 61bb9a337d958be9b4716d67d548a06194ff2b5e
Accessed
2026-10-22
Licence
GPL-3.0 for the code since 2024-04-20. At the pinned commit, LICENSE is the MIT License (“Copyright (c) 2024 Kevin Bentley”) and the source files carry no license header. Five days later Kevin Bentley's commit 1f45163, “Updated source to reflect the license that this code is released under.”, replaced LICENSE with the GNU General Public License, version 3, and added a header to each file reading “Copyright (C) 2024 Parallax Software” under GPL version 3 or later. The game data is not in the repository; the current README says “you must provide your own game files”.
Credit
Outrage Entertainment's code for Descent 3, released by Kevin Bentley, who writes in the README “Thanks to Jeff Slutter, who did most of the work modernizing the code from the 90's”. The SourceSafe headers left in the files name Outrage programmers by first name (Chris, Matt, Jason, Jeff, Kevin) in their revision logs.
Notes
The pinned commit is the initial import plus two same-day README edits, so its code is the code as released. The README there calls it “the latest version of the Descent 3 source code”, which “includes the '1.5' patch that Jeff Slutter and Kevin Bentley wrote several years ago”, and says “Some proprietary sound and video libraries from Interplay have been stripped out”. It is not the 1999 retail build: the SourceSafe headers date the cited files from March 2000 to September 2001, and physics/physics.cpp has no header at all. Every claim here reads this commit. The community has since reformatted and fixed the tree (the current README: the '1.5' patch “brought to a stable condition by the Descent community”); on 2026-10-22 the constants the claims cite were unchanged at the head commit (a3e82bc). Ship and weapon values (thrust, drag, mass, turn rates, homing cones) live in the game's data tables, which the release doesn't include.

Cited on

Claims (8)

The README of the Descent 3 source release, at its initial import, calls it "the latest version of the Descent 3 source code" and says it "includes the '1.5' patch that Jeff Slutter and Kevin Bentley wrote several years ago"; the SourceSafe header comment of WeaponFire.cpp gives its last revision as 279, dated 9/20/01.README.md L3Descent3/WeaponFire.cpp L2–4Code
In Descent 3's released source, which includes the unreleased "1.5" patch, the player ship's thrust is the sum of a forward, an up, and a sideways push along the ship's own axes, each the control's value times full_thrust, the whole scaled by the player's movement_scalar and by 1.3 outdoors; the physics then moves a thrusting object against a drag proportional to velocity, solved in closed form over the frame: v = (v₀ − F/d)·e^(−(d/m)·t) + F/d. Computed from that formula, drag acts while the ship thrusts too, and speed levels off at F/d, as in Doom, whose floor friction multiplies momentum by 0.90625 each tic thrust or not; Quake's ground acceleration instead stops at the wish speed.Descent3/object.cpp L2580–2585physics/physics.cpp L994–998physics/physics.cpp L279–293Code
Descent 3's released source turns the player ship on three axes the same way it moves it on three: pitch, heading, and bank each take the control's value times full_rotthrust times the player's turn_scalar, and an object flagged PF_USES_THRUST with a rotational drag above 0 has its turning speed solved against that drag with the same closed form, ω = (ω₀ − R/d)·e^(−(d/m)·t) + R/d. Computed from it, a held turn levels off at R/d and a released one fades out at rate d/m. The input code clamps pitch to 0.75 and heading and bank to 1, except in a Macintosh build, which skips those three clamps; before the drag step, PhysicsDoSimRot can add auto-leveling thrust to pitch and bank, which this claim doesn't cover.Descent3/object.cpp L2566–2568Descent3/Controls.cpp L430–432Descent3/Controls.cpp L887–895physics/physics.cpp L714–721physics/physics.cpp L245–252physics/physics.cpp L684Code
Descent 3's input code clamps the forward, up, and sideways thrust controls to ±1 each, separately, and the released source adds the three pushes along the ship's perpendicular axes, so all three held at once push √3 ≈ 1.73 times as hard as forward alone, and, computed from the linear drag, the ship settles at 1.73 times the speed; Doom does the same with two axes, clamping its forward and side moves apart and thrusting them at 90°.Descent3/Controls.cpp L896–902Descent3/Controls.cpp L433–435Descent3/object.cpp L2583–2585Code
Descent 3's released source gives the afterburner a 5-second tank (AFTERBURN_TIME, 5000 in an E3 demo build): while it is held and time is left, the forward control is replaced by the afterburner control times 1.6, and times a punch factor of 1.8 while over 90% of the tank is left, the factor easing to 1 by 80%, and the tank drains by the frame time. Let go, the tank refills by the frame time, or twice that with the "Afterburner" item in the inventory, but only while energy is above 5, and energy drops by the same amount, so a full refill costs 5 energy (computed) whichever rate applies.Descent3/player.h L372–377Descent3/object.cpp L2289–2317Descent3/object.cpp L2325–2345Code
In Descent 3's released source a homing weapon with thrust left starts homing 0.1 s after it is created, unless it is guided. Without a target, it scans every object in a room the missile's room can see: robots, players, and buildings with AI, not its own shooter, not cloaked, and only enemies of the shooter, inside a cone where the dot product of the direction to it with the missile's facing exceeds the weapon's homing_fov. In object order, a chaff chunk ends the scan (by a 1-in-4 roll in single player) and so does anything within 15 units (the distance between centers less both objects' sizes); otherwise the missile takes the object within 500 units most nearly straight ahead with a clear line to it. A target it has is kept while it stays inside the cone and either within 15 units, or within 500 units, in a visible room, with a clear line.Descent3/WeaponFire.cpp L1719–1726Descent3/WeaponFire.cpp L1461–1462Descent3/WeaponFire.cpp L1604–1621Descent3/WeaponFire.cpp L1623–1659Descent3/WeaponFire.cpp L1660–1681Descent3/WeaponFire.cpp L1497–1580Code
Descent 3's released source steers a homing weapon at the target's position plus a tenth of the target's velocity when the target moves under physics or walks. A weapon with rotational drag fires full full_rotthrust left or right and up or down, by which side of the missile the aim point is on, with no roll; one without it turns straight toward the aim point by at most full_rotthrust × the frame time and has its velocity set along its new facing at full_thrust/drag. A weapon whose shooter is not a player has its turning scaled by difficulty: 0.20, 0.70, 1.00, 1.20, and 1.40 from Trainee to Insane.Descent3/WeaponFire.cpp L1413–1418Descent3/WeaponFire.cpp L1420–1443Descent3/WeaponFire.cpp L1445–1457Descent3/AImain.cpp L2206–2208Descent3/difficulty.cpp L16Descent3/difficulty_external.h L7–11Code
In Descent 3's released source, every 3 to 5 seconds an AI object that is more than barely aware and has its fourth goal slot free can take fright, by one of three tests on its own life_preservation (lp), the first two only for generic objects (robots, buildings, clutter, and powerups): its shields are under lp of its hit points, it dodged an enemy shot since the last check, it has fewer than 2 friends near, and a random number below lp; or it lost more than 25% × (1 − lp) of the shields it had some checks ago, and a random number below lp; or lp is over 0.5 and the friends it had are gone while enemies remain. Frightened, it wanders at its flee speed, facing the way it moves, for 10 × lp + 5 seconds.Descent3/AImain.cpp L6704–6709Descent3/AImain.cpp L6640–6645Descent3/AImain.cpp L6651–6686Descent3/AImain.cpp L4995–4996Descent3/AIGoal.cpp L1700–1706Descent3/object_external.h L172Code