HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
id-Software
Quake
C2012–2025
id-Software / Quake

Quake

Quake GPL Source Release

21Distinct people
22Mentions
1Explicit recommenders
6.1KGitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

Quake GPL Source Release

GitHub

Where it is used

No documented product use was verified in the last source check.

What people are saying

Good chance it was John Carmack, probably one the top 10 programmers of all time. He basically built the Quake engine himself. There is a pretty decent analysis of it here: *…

Eisenstein used a recommendation phrase. One indexed comment matches. This is a phrase match, not a verdict.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

No other repository is repeatedly linked in the same discussions.

This week on Hacker News

Nov 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 1:49:46 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by year22 dated mentions

Observed mentions: 2012-10-13 01:43:25 UTC to 2025-11-24 03:28:39 UTC.

012342012-01-01 00:00:00 UTC to 2013-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments20122013-01-01 00:00:00 UTC to 2014-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2014-01-01 00:00:00 UTC to 2015-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2015-01-01 00:00:00 UTC to 2016-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2016-01-01 00:00:00 UTC to 2017-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2017-01-01 00:00:00 UTC to 2018-01-01 00:00:00 UTC (exclusive): 3 mentions; 0 submissions, 3 comments2018-01-01 00:00:00 UTC to 2019-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments20182019-01-01 00:00:00 UTC to 2020-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 3 mentions; 0 submissions, 3 comments2021-01-01 00:00:00 UTC to 2022-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2022-01-01 00:00:00 UTC to 2023-01-01 00:00:00 UTC (exclusive): 2 mentions; 1 submissions, 1 comments2023-01-01 00:00:00 UTC to 2024-01-01 00:00:00 UTC (exclusive): 3 mentions; 0 submissions, 3 comments2024-01-01 00:00:00 UTC to 2025-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments2025-01-01 00:00:00 UTC to 2026-01-01 00:00:00 UTC (exclusive): 4 mentions; 0 submissions, 4 comments2025

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
20122012-01-01 00:00:00 UTC2013-01-01 00:00:00 UTC202
20132013-01-01 00:00:00 UTC2014-01-01 00:00:00 UTC000
20142014-01-01 00:00:00 UTC2015-01-01 00:00:00 UTC000
20152015-01-01 00:00:00 UTC2016-01-01 00:00:00 UTC101
20162016-01-01 00:00:00 UTC2017-01-01 00:00:00 UTC101
20172017-01-01 00:00:00 UTC2018-01-01 00:00:00 UTC303
20182018-01-01 00:00:00 UTC2019-01-01 00:00:00 UTC000
20192019-01-01 00:00:00 UTC2020-01-01 00:00:00 UTC000
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC303
20212021-01-01 00:00:00 UTC2022-01-01 00:00:00 UTC101
20222022-01-01 00:00:00 UTC2023-01-01 00:00:00 UTC211
20232023-01-01 00:00:00 UTC2024-01-01 00:00:00 UTC303
20242024-01-01 00:00:00 UTC2025-01-01 00:00:00 UTC202
20252025-01-01 00:00:00 UTC2026-01-01 00:00:00 UTC404

What Hacker News says

22 sources
The impulse console command originates from Quake, the Half-Life 1 engine (GoldSrc[0]), was based on the Quake engine, and the Half-Life 2 engine (Source), was based on GoldSrc. In quake, the impulse commands were used mostly to switch weapons[1]. I'm not really sure about the naming though, why choose the word "impulse". [0]: https://en.wikipedia.org/wiki/GoldSrc. [1]: https://github.com/id-Software/Quake/blob/0023db327bc1db0006...
In A time-travelling door bug in Half Life 2
Only tangentially related: In the Quake source code, they have strings to represent the intensity over time of a flickering light source: https://github.com/id-Software/Quake/blob/bf4ac424ce754894ac... // 3 CANDLE (first variety) lightstyle(3, "mmmmmaaaaammmmmaaaaaabcdefgabcdefg"); They range from a to z and progress through the string with time, so the candle starts out at medium "m" intensity for a bit before it goes dark ("a") for some time, etc.
In Candle Flame Oscillations as a Clock
Since John Carmack actually ocassionally posts on Hacker News this seems like a valid @JohnCarmack If comprehended correctly, Half Life, Half Life 2, CounterStrike, and Portal are all using Carmack's code for “Quake” from 1996 and Romero's flickering presets from 1993 “DoomED”. The lights themselves have 26 positions, a = 0 = OFF, and b-z = Various ON brightnesses. This is where some of this starts getting a bit confusing. In "world.qc" [1] the top comments note: // Setup light animation tables. 'a' is total darkness, 'z' is maxbright. However, "r_light.c" [2] the comment instead reads: // light animations // 'm' is normal light, 'a' is no light, 'z' is double bright The first [1] sounds like b-z = 1-25 = 4%-100% brightness. The second sounds like 100% is at 'm' and then upward toward 200% at 'z'. The code in [2] is also rather c
Read the rest
onfusing with: k = i % cl_lightstyle[j].length; k = cl_lightstyle[j].map[k] - 'a'; k = k*22; d_lightstylevalue[j] = k; and later on: scale = d_lightstylevalue[surf->styles[maps]]; r += *lightmap * scale; lightmap += ((surf->extents[0]>>4)+1) * ((surf->extents[1]>>4)+1); It looks like it's taking the frame you're on, mapping to a letter in the cl_lightstyle, subtracting the letters from each other using C's 'char' subtraction, so 'm' (13) - 'a' (1) = 12, multiplying by 22, so 'm' = 264, and then using that as a lookup into a scaling factor for the lightmap? This is mostly a bunch of deduction since this is not even kind of a language I write in normally (QuakeC), with a bunch of odd features being used. Does this seem like what this code is actually doing? It seems like something must be wrong, cause 264 for "normal light" is not something you'd normally expect. Even the 'map' function usage is a little weird, since C usually does not have a 'map' function. Expect it's hidden in the code somewhere and looks something like: // Map function void map(int *arr, int size, int (*func)(int)) { for (int i = 0; i < size; i++) { arr[i] = func(arr[i]); } } Anybody with greater amounts of QuakeC or Quake modding experience (maybe Half Life ect...) able to comment on what this actually does? Also, vaguely hillarious, everybody's favorite light is: // 10 FLUORESCENT FLICKER And the light constantly goes: lightstyle(10, "mmamammmmammamamaaamammma"); The light is literally crying like a child. Maybe that explains some of the infantile FPS player behavior. [1] https://github.com/id-Software/Quake/blob/bf4ac424ce754894ac... [2] https://github.com/id-Software/Quake/blob/bf4ac424ce754894ac...
In Valve's Flickering Lights
Have you considered not using an engine at all, in favor of libraries? There are many amazing libraries I've used for game development - all in C/C++ - that you can piece together: General: stb https://github.com/nothings/stb 2D Phys: box2d https://box2d.org/ UI / Editor: imgui https://github.com/ocornut/imgui Platform: SDL https://www.libsdl.org/ Engine: Quake https://github.com/id-Software/Quake Ok, Quake is more of an engine than a library - but it is well documented & widely used. Even many current day AAA engines are still originally based on the Q1 engine (though, of course, heavily modified over the years to stay modern). I don't mean to bring down anyone but I feel like game engine announcements are a dime a dozen these days. As someone who has worked in the industry I'd favor putting together my own simple engine based on librari
Read the rest
es for smaller scoped projects. Most open-source engines, I presume, are not really going to be battle tested, well-supported, well-funded etc. There are some exceptions of course (like Godot). If your goal is too complex; why not just use UE5 or Unity? Epic has been in the industry for a long time, Tim Sweeney is a really smart guy, and the engine has been widely used in AAA and indie games.
In Nebula is an open-source and free-to-use modern C++ game engine
K5/Cyrix could overlap Integer and FPU operations, what they couldnt do was interleave (pipeline) FPU operations so that multiple floating point instructions ran in parallel. https://www.phatcode.net/res/224/files/html/ch63/63-02.html Here a non perspective correction related Quake FPU code example https://github.com/id-Software/Quake/blob/bf4ac424ce754894ac... Lcliploop: fld ds:dword ptr[0+0+esi] fmul ds:dword ptr[0+0+ebx] fld ds:dword ptr[0+4+esi] fmul ds:dword ptr[0+4+ebx] fld ds:dword ptr[0+8+esi] fmul ds:dword ptr[0+8+ebx] fxch st(1) faddp st(2),st(0) fld ds:dword ptr[0+0+edx] fmul ds:dword ptr[0+0+ebx] fld ds:dword ptr[0+4+edx] fmul ds:dword ptr[0+4+ebx] fld ds:dword ptr[0+8+edx] fmul ds:dword ptr[0+8+ebx] fxch st(1) faddp st(2),st(0) fxch st(3)
Read the rest
faddp st(2),st(0) faddp st(2),st(0) fsub ds:dword ptr[12+ebx] fxch st(1) fsub ds:dword ptr[12+ebx] fxch st(1) fstp ds:dword ptr[Ld0] fstp ds:dword ptr[Ld1] FXCH instruction is free (zero cycles) on Pentium for most instruction combinations, AMD caught up in late 1998 with CXT revision K6-2. http://www.azillionmonkeys.com/qed/cpuwar.html
In Don't waste money on a math coprocessor they said
Eisenstein·Jun 15, 2023Recommendation phrase
Good chance it was John Carmack, probably one the top 10 programmers of all time. He basically built the Quake engine himself. There is a pretty decent analysis of it here: * https://fabiensanglard.net/quakeSource/index.php I recommend checking it out. EDIT: i was thinking of the analysis done on Quake 2, which is more about the engine: * https://fabiensanglard.net/quake2/index.php while the one about is regarding the multiplayer system, which is still an amazing bit of dev. Github: * https://github.com/id-Software/Quake
In Quake's lightning gun bug explained [video]
I have also done Quake mapping and even done an editor for fun[0] some time ago :-P. You are supposed to stick to the grid, the crate texture is sized so that it fits perfectly on the grid. If you go off the grid things become a bit harder, but this is why pretty much everything on Quake is axis aligned :-P. It is ridiculously simple to make stuff actually. About rotation, most editors that people used even in the 90s had support for texture locking for both translation and rotation. id's original editor was very primitive though, but later editors like Worldcraft and Radiant had those features. WRT. texture coordinates, they are converted to U/V (or actually S/T) pairs, but it happens quite late during the edge span rasterization. You can see the inner rasterizer loop here[1] where it draws an edge span and performs a linear interpolatio
Read the rest
n of the S/T values calculated at [2] above and [3] (during the surface draw setup). Having said that i think what you described is closer to what Ken Silverman was working on at the time as a successor to the Build engine (at least based on my understanding from what he wrote years ago). [0] https://i.imgur.com/5xWOw3K.jpg [1] https://github.com/id-Software/Quake/blob/master/WinQuake/d_... [2] https://github.com/id-Software/Quake/blob/master/WinQuake/d_... [3] https://github.com/id-Software/Quake/blob/master/WinQuake/d_...
In Path Tracing Quake in Blender
This is a really nice system. Quake used it back in 1996 to fit the game in 8MB. They called it a "hunk"[0] and it worked pretty much exactly as you said. The main drawback I find is that you can't use some generic data structure implementations that expect to be able to free memory out of order, unless you're fine with leaking before the final cleanup (if integrated into a generic allocator interface, the "free" method will probably be a no-op). For example, maybe you need a temporary hashmap to help with parsing a text file. It can be interesting to come up with implementations that work without freeing out of order. Of course, you can always opt to use another, more general purpose allocator, on a block of memory retrieved from the hunk (see Quake's "zones"). [0] https://github.com/id-Software/Quake/blob/master/WinQuake/zo...
In Custom Allocators Demystified

Showing the 15 most recent of 22 sources. Enable JavaScript to search and browse every indexed mention.

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.