4/19/2026 at 3:08:00 PM
One of the fun features that I developed for Warcraft (the RTS) was to fade the screen to grayscale when the game is paused.Since the game uses a 256 color palette, it was only necessary to update a few bytes of data (3x256) instead of redrawing the whole screen, so the effect was quick.
I also used this trick when the game stalled due to missing network packets from other players. Initially the game would still be responsive when no messages were received so that you could still interact and send commands. After a few seconds the game would go into paused state with grayscale screen to signify the player that things were stuck. Then several seconds after that a dialog box would show allowing a player to quit the game.
This was much less disruptive than displaying a dialog box immediately on network stall.
by netcoyote
4/19/2026 at 5:24:12 PM
One of my favourite things of being on HN is reading comments like this. Namely, devs who worked on games I played growing up. I absolutely love hearing stories from their past about little technical nuances like this comment. The more technical / specific, the better.I'd honestly love to compile a book of "war stories" told by devs like netcoyote.
Maybe I will.
Net, if you're interested, hit me up.
by upmostly
4/19/2026 at 5:34:09 PM
This is a great idea, but respectfully, if you're going to get traction you need to be the one instigating getting people to talk to you. Have a pitch, have an explicit ask, and be willing to put effort into making it happen.Fantastic idea though, you should do it.
by ryanisnan
4/19/2026 at 7:58:30 PM
There are a few of these floating around for older games, but the world needs more:Ara technica has a war stories feature on game development.
https://arstechnica.com/video/series/war-stories
For apple 2 games John Romero did a podcast. It’s decent but he seems to have stopped doing them.
https://appletimewarp.libsyn.com/ Or YouTube
Ted dabney experience has a lot of interesting interviews with older arcade game designers:
by acomjean
4/20/2026 at 12:56:31 PM
Gamasutra's "Postmortem" series was great: https://web.archive.org/web/20210823172711/https://www.gamas...by branon
4/20/2026 at 3:26:52 AM
Wow, thank you for sharing. If I could upvote your comment twice, I would. I'm going to enjoy this series.by ryanisnan
4/19/2026 at 11:00:14 PM
Sid Meier's Memoir! is exactly that, Sid Meier wrote a memoir which is indeed mostly war stories of his involvement in making games.by colechristensen
4/19/2026 at 7:19:14 PM
Oh, and I forgot to mention that pause had to be synchronized across the network, so the pause button would pause for all players.And in the "this is why we can't have nice things", that also introduced problems, because we didn't want a player who was losing to keep pausing the game until the winning player quit out of frustration, so I think we kept a per-player pause counter, which would only be restored if other players also paused? (I don't quite remember all the details, just that we had to prevent yet another abuse vector).
by netcoyote
4/19/2026 at 8:55:40 PM
I remember something like this back when playing StarCraft (maybe Brood War, it's been a minute) online.by spike021
4/19/2026 at 3:13:38 PM
Palette rotation was also heavily used by Ultima & Origin games up to U8 - Paganby KellyCriterion
4/19/2026 at 4:56:21 PM
Omg I love this! I have been finding excuses to do little animation engine features that arent on the critical path of development for the sake of creative self-indulgence. Such features shipped was alpha channel based fading using the fundamental opengl fade parameter (under the hood its a linear interpolation of alpha values over 256, pieced together over a provided pair of timestamps).I tell you what I'll do today on my dev time, I'll try implementing grayscale without aby research on pause and then compare notes (I'm assuming this wc code is available somewhere, which may be a bad assumption)
by RobRivera
4/19/2026 at 5:06:52 PM
WC code is likely not (legally) available, but Wolfenstein and Doom both did similar palette tricks and are documented in the Black Books for each - https://fabiensanglard.net/three_books_update/index.htmlCode for those is available.
by bombcar
4/19/2026 at 5:36:36 PM
Oh rad! Thanks for the heads up. I'll do a post-dev comparison to see what I land on and what was done here.by RobRivera
4/19/2026 at 7:13:57 PM
While I don't have the original code, it's something along the lines of this: // for each palette entry:
pal.r = pal.b = pal.g = (byte) (0.299 * pal.r + 0.587 * pal.b + 0.114 * pal.b)
by netcoyote
4/20/2026 at 5:48:39 AM
From my recollection of doing fun palette stuff back in the DOS VGA days, I'm betting it was more like: pal.r = pal.g = pal.b = (77 * pal.r + 150 * pal.g + 29 * pal.b) >> 8;
Hardware floating point was rare before the 486 DX and Pentiums. Not to mention that Integer<->FP conversion was slow. And division of any kind has always been slow. So you'd see a lot of fixed-point math approximations with power-of-two divisors so that you can shift-right.
by a_e_k
4/19/2026 at 11:45:32 PM
So I was able to create all the bits necessary to introduce the palette change in a similar manner (3x256 changes) on the triggerz and at the moment of truth instead of grey I got a GREEN and PURPLE fadeout (I wasnt sure if you meant rbg or rgb for the ratios so i tried both).I also tried 128 across the board for grey, and it just made a dull fade which may be the best I can do with my method.
I think it may simply be because rather than have palletes controlled by rgb, I load predrawn sprites using sfml's sprite and texture classes. So the default rgba is 255,255,255,255 - so I have a sidequest to figure out the RIGHT WAY of applying rgb changes to predrawn sprites.
It may very well be a simple matter of "sfml does it differently" or perhaps having grey variants of all sprites and toggling. I feel there has to be a way to accomplish the fade to grey programmatically. Fun little dive tho! I'll have to post an update when I figure it out.
by RobRivera
4/19/2026 at 9:02:01 PM
I havent gotten behind the console, but thats like, exactly what I was gonna do, except precompute like 5 or 6 tween values for r,g,b between 255 and the target for greyscale.But rather than do that and cache them for timing triggers, I kind of like the scaling down by multiplication approach.
Edit: manipulate the rgb values that is - I wouldnt have converged on those hard values on my own.
by RobRivera
4/19/2026 at 4:17:10 PM
This was a neat design choice I remember it well.And also that my “sound card works perfectly!”
by herodoturtle