Posts in Gaming (20 found)
Unsung Today

“The broken, slapdash, bed-shitting end to one of the most iconic franchises in all of gaming history”

I absolutely love Billy Maher’s body of work . He’s been writing about older games and software in general since 2011; it’s always solid, always an enjoyable read, and always providing new perspectives even on stuff I thought I knew well. (Maher also goes by The Digital Antiquarian.) I linked to his work once before , and today I wanted to share a recent essay about the disaster that was the 1999’s game Ultima IX . = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/the-broken-slapdash-bed-shitting-end-to-one-of-the-most-iconic-franchises-in-all-of-gaming-history/1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/the-broken-slapdash-bed-shitting-end-to-one-of-the-most-iconic-franchises-in-all-of-gaming-history/1.1600w.avif" type="image/avif"> I have never played any Ultima games, but this felt a gripping read. […] Richard Garriott, the motivating force behind Ultima from first to last, has done his level best to write the aforementioned last out of history entirely. Ultima IX is literally never mentioned at all in his autobiography. But, much though I may be tempted to, I can’t similarly sweep under the rug the eminently unsatisfactory denouement to the Ultima series. I have to tell you how this unfortunate last gasp fits into the broader picture of the series’s life and times, and do what I can to explain to you how it turned out so darn awful. In some sense software projects always fail for one of the few obvious reasons, and it’s just details that change. Here, the details are fascinating. The Ultima series started in the very early 1980s as a series of small games made by one person, and ended ignominiously as an almost-AAA title rushed to market that no longer wanted it: They met the deadline — what other choice did they have? — but the playable game eluded them. It’s not just the deadline. There’s also a studio past its prime, a fascinating but deeply flawed leader, the market forces and trends, and perhaps even some enshittification long before the word’s invention. It is also a story of the first two decades of the videogame industry itself. It happened so long ago that it almost feels like a fairytale itself, but one with a sad ending. Maher also lists some learnings that are universal enough to apply to a lot of other projects: And, in case you want more, here are handy links to Maher’s all Ultima essays: I (3 parts!), II (3 parts), III , IV , Multima , V , VI , Worlds , Underworld (2 parts), VII , and VIII . I have no personally read them in order, and I’m better for it. #enshittification #games #software evolution No game can be all things to all people. Development teams need a clear leader with a clear vision. Checking off a list of bullet points sent down from marketing does not a good game make. When the design goals do change radically, it’s often better to throw everything out and start over from scratch than to keep retro-fitting bits and pieces onto the Frankenstein’s monster. It’s better to release a good game late than a bad game on time.

0 views
Brain Baking 4 days ago

The Decline Of The Family Computer

During a discussion in the Retronaut podcast episode on Duke Nukem 3D , the podcast hosts and invitees thought back to the first time they came in contact with the Duke. Most of them first played the shareware edition—something that Apogee and 3D Realms made very good use of—on the family computer . Intrigued by those two words, I started thinking: what’s a family computer? It’s certainly not Nintendo’s Famicom even though that indeed correctly abbreviates the words. No, the computer wasn’t a console you’d hook onto your television set: it was a separate piece of furniture placed somewhere centrally in the house for all family members to access. More importantly, it was the only computer in the house. That thought bears repeating: the only computational machine with a central processing unit, dedicated memory, expansion slots, and a (very) heavy monitor in the house. How many computers do you have lying around in yours now? We have 2 personal laptops, 1 old but still functioning one, 2 work laptops not owned by us, and 3 retro PCs: that’s eight in total—but none of those could be called a family computer. I don’t want my wife to touch my MacBook: she has her own where she can make a mess on. Joey doesn’t share foo—ahem, laptops. In the early nineties, my dad bought our first family computer: a super modern 80486 with 40 Mhz that back then cost (more than twice the amount of what my father in law paid for his in 1994 ). Taking inflation into account, that’s more than . Needless to say, it was a huge investment and every little bit of usage was squeezed out of it in the following years. I even remember my dad driving to Brussels to fetch it, presumably because in our neighbourhood there was no-one making a similar offer? That 486 became the family computer: it was used by everyone. My eldest sister and I were small kids and my youngest sister was still a toddler so more than playing edutainment DOS games initially didn’t happen. When the Pentium arrived and the Voodoo 3Dfx cards came along, my dad couldn’t resist upgrading. He even got into overclocking (and blew up one of our graphics cards along the way). I started showing even more interest in that mesmerising beige machine. When I moved on to high school and got my Christian confirmation, my parents bought me my very own computer. Finally I could mess around without fearing the loss of important bookkeeping files and other things I wasn’t allowed to touch on the family computer downstairs. That must have been in 1997 or 1998: the beginning of the end of the family computer. Why ask to play on the family computer when I have my own? I still did because my dad’s PC was more powerful and he liked to keep it upgraded. I initially couldn’t play early 3D platformers (e.g. PlayStation ports like Pandemonium!) because a Voodoo card was expensive and we only had one. As years flew by during that period of extremely rapid hardware invention, that difference disappeared. The family computer became my dad’s computer. My sisters got their own desktop PCs. In other words, computing individualism became affordable. The family PC in the kitchen or living room moved out to the private study. In In Defense of the Family Computer , Niklas Barning predicts that with prices of RAM and general hardware going up again, the family computer might return. He writes: Back in the day, a computer was something so special and expensive that you only had one, and it was set up in a way that everyone had access to it. Dropping easily qualifies as “special and expensive”. But buying a new MacBook with 344686 TB RAM and 3482354 M4 CPUs only costs you nowadays. When turning our attention to cars, you can see the same evolution: the single family car got turned into mom’s car and dad’s car (or even the son/daughter’s car) appeared on the driveway as well. Another victory for capitalism and individualism—I’ll leave it as an exercise for the reader to figure out their relationship. Or how about the single family TV that gradually leaked to children’s (and parent’s) bedrooms and now is so pervasive that small children like ours know that you can watch anything on a phone? I have mixed feelings about the history of the family computer. It is thanks to that machine that I now am what I am, but it is also thanks to its decline that I retreated more often than not to my room to game, program, or do other naughty computery stuff. The social aspect that sparked conversation died along with it. Or at least moved to ICQ and then MSN . By Wouter Groeneveld on 26 May 2026.  Reply via email .

0 views
Unsung 4 days ago

“But obviously, that’s just silly stuff.”

This 22-minute video by Karl Jobst describes a pretty wild discovery of a glitch called Crystal Storage Glitch, allowing to skip a certain level for much faster completion times in Mega Man X2: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/but-obviously-thats-just-silly-stuff/yt1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/but-obviously-thats-just-silly-stuff/yt1.1600w.avif" type="image/avif"> I won’t spoil the glitch because it’s a fascinating combination of a corner case, a race condition, and even a dose of dumb luck. Its finding unveils almost like a scientific discovery over many years – first a theoretical possibility, then a first sighting done in a modified emulator, then confirmation made by a machine via a tool-assisted speedrun, and eventually actual performance by someone by hand. And a lot of this achieved by relative newcomers to the community, too. There is certain poetry here in having to go slow to go fast – you’ll see what I mean. #bugs #games #speedrunning #youtube

0 views
./techtipsy 6 days ago

You can run Forza Horizon 6 on an unsupported AMD RX 400/500 series GPU on SteamOS

This post serves as a personal bookmark and a mirror of this fantastic guide by Ok-Pace-1900 on /r/linux_gaming to ensure that this information does not get lost. I learned the hard way that the GPU I have in a DIY Steam Machine PC, the AMD RX 480, is strictly unsupported by Forza Horizon 6. Forza Horizon 6 will not work for AMD users with GPUs based on the Polaris or Vega architectures and older (for example Radeon 400 and 500 series players). These architectures are below our minimum supported specification. I knew that asking for a refund on Steam would be the easy way out. Deciding against it, I did a quick search for the FH201 error code and stumbled on the Reddit post mentioned above. My CPU is good enough for Forza Horizon 6 (Intel i5-10500), so the additional launch options command that worked for me is the following: Simple fix, but the context around this is actually kind of funny. The way a lot of Windows-only games work on SteamOS is via a translation layer referred to as Proton. With this trick, you can pretend that your GPU has some DirectX features that it actually does not have, but it doesn’t matter since it can be successfully emulated via translation to Vulkan, which the GPU supports well! As a result, I can play Forza Horizon 6 on a hacky SteamOS build, with 1080p low or medium settings. Low settings is a 60 FPS experience, with medium settings some areas like Tokyo can struggle a bit and drop below it to ~40 FPS. Now all I need to do is to get rid of the urge to splurge on a great GPU, which would also require a case and PSU upgrade… Slightly off-topic, but can you monitor your gaming PC via Prometheus Node Exporter and visualize it in Grafana? :)

0 views
Unsung 1 weeks ago

“Why pay for an orchestra when your computer can do it all?”

A delightful 24-minute video from ToffeeBun about sampling in videogame music and how it changed over the years: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/why-pay-for-an-orchestra-when-your-computer-can-do-it-all/yt1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/why-pay-for-an-orchestra-when-your-computer-can-do-it-all/yt1.1600w.avif" type="image/avif"> The video helped me understand the difference between tunes purely synthesized from soundchips, those sequenced with samples (e.g. MIDI or sound trackers), and those that are completely “streamed” (e.g. MP3). It’s stuff in between that’s the most interesting – it always is – with really surprising sources of samples (and, surprising samples!) needed to “perform” sequenced music. The video itself is frenetically edited, and the opposite of “dry” (which I mean as a compliment). #games #sound design #youtube

0 views
flowtwo.io 1 weeks ago

Othello World

I was introduced to the board game Othello (also known as Reversi) on a recent trip to Japan. It's one of those games where you can learn the rules in 5 minutes, but the gameplay dynamics are surprisingly deep. When I saw it's played on an 8x8 board, like chess is, I immediately started thinking about how to program a game engine for it. The 8x8 board is helpful because it allows you to represent the board state with 64-bit longs; each set bit in the number indicates the presence of a piece on that square. When you perform a bitwise operation on these numbers you're essentially computing multiple piece movements in parallel with a single CPU instruction. This computational efficiency enables deep searching of the move tree. I purposely started out without reading too much about game strategies because I wanted to explore it through coding the engine logic. It didn't take long to create an algorithm that is significantly stronger than me. Although it's not a high bar. There's a demo available here if you're interested in playing it. The basic building blocks of the game engine are as follows: Once you have these four elements built and wired together, you have a functional game engine to play against. The first two pieces are fairly straightforward—the real strength of an engine comes from how the last two are implemented. Like I mentioned above, we can represent the complete board state with just two 64-bit numbers. One number represents the black piece positions and the other for the white pieces. How you encode the 64 squares to the 64 bits is arbitrary, but I chose to represent each row as one byte (8 bits) and from left to right, top to bottom in terms of bit significance. In other words: And that's all that's needed to represent the piece positions. I created an immutable data class to encapsulate this: In Othello, if one player has no legal moves at any point in time, they skip their turn and the other player gets to go again. If both players have no legal moves, the game ends. Instead of computing both player's legal moves every time to check for those situations, I created a enum so that information somewhat pre-computed. The combination of and provides everything needed to determine the state of the game for the other stages in the engine. This is where things get tricky. Move generation requires codifying the rules of Othello in such a way that, given a board state, all the legal moves for either player can be computed—quickly, ideally. In Othello, you can only place a piece somewhere that will "sandwich" the other player's piece(s) between the piece you're placing and another "anchor" piece of yours. There can't be any blank spaces either. This rule applies to any of the 8 directions of the board (diagonals count). This screenshot illustrates the valid moves for black in this position: This function will calculate all the eligible squares for a single direction of movement (up, down, up-left etc.). What's cool is that it calculates eligible squares for all 8 rows/columns/diagonals at the same time. It's invoked as follows. For each of the 8 directions, you pass in a movement function and an ineligible square bitmask if required for that direction. For example, if shifting towards the left, you need to mask out the pieces on the leftmost column to prevent wrapping to the other side of the board (similarly for moving right). Moving up or down doesn't require a mask because shifting the bits "up" or "down" enough will just drop them from the number entirely. The function will return all valid moves for a given position for the "moving" pieces (the 1st argument). The moves are returned as a where each set bit is a valid square to place a piece. This part was interesting to me as I don't know much about strategy in Othello besides that the corners are important. The corners are important because once you claim a corner it can't be unflipped by the other player. Also, simply maximizing for the most pieces isn't the best strategy either, apparently. I do have a "greedy" algorithm that you can select in the demo app if you want to see that strategy in action. But of course, closer to the end of the game, having more pieces is more important since that's how the winner is determined. I represented this in the eval function by linearly shifting the weighting towards piece score as you get closer to the end of the game. I have two piece scores actually. The is a step function that only returns 1 or -1 depending on which piece colour has more pieces. But in the heuristic evaluation, I look at the actual piece differential score which returns between -100% and +100% depending on what "percentage" of the overall possible pieces the leading player has. That score is given 40% weighting in the heuristic evaluation function, the other 60% is a positional score based on the following square values I came up with: This was my best guess at which squares matter most. My reasoning is that the more central the square is, the more likely it is to be flipped. The closer to the edge it is, the less likely it is to be flipped and the more likely it is to be used as an anchor piece. So putting this all together, the heuristic evaluation is computed as follows: And that's it. The top-level function provides a relative score between -1.0 and +1.0 which represents the strength of a given position, relative to black. Since Othello is a zero-sum game, a good score for one player is an equivalently bad score for the other player. This is important in the next phase, the move search algorithm. This part of the engine is fairly "textbook". There's lots of explanation for how these algorithms work on wikipedia and chessprogramming.org is an incredible knowledge base for this sort of thing too. For zero-sum games, you can use a variant of minimax search called Negamax . That's what's shown here: For Othello specifically, the Negamax function needs to handle the case that the moving player has no legal moves and must pass to the opposing player. This is in the branch in the middle. We check if we're already in a position where the previous player had to pass, which means both players can't move and the game would be over in this branch. If not, we simply call again with the SAME and reverse the score returned from that call. With those 4 components built, I now had a functional engine to play against. I created an class that accepts a move selection algorithm. It exposes 3 methods: - for showing valid player moves in the UI - which validates and then applies a specified player move - which chooses and applies the best move using the I exposed the via a stateless REST API. Each request needs to supply the current game state information in order to make a move. For example: For the demo , it uses HTMX instead to return a rendered board component. The request format is the same but it returns HTML instead of JSON. I read this article recently that took a contrarian view on agentic coding and it's pitfalls. The author makes a lot of good points and it was thought-provoking. While I don't agree that using agentic coding will make you dumber per se ... I do think there's something to be said for regularly exercising the critical thinking and problem solving part of your brain if you want to be a good software engineer. Side projects like this are a great opportunity to do that. The incredible rise in coding competency for AI agents over the last 12 months has made a project like this into a one-shot, one prompt task for a recent LLM. I obviously didn't do that, because the point of this project was the act of doing it, not the end result. I learned a bit about Othello and refreshed myself on bitwise operations. The parts I wasn't interested in doing, the UI and the API wiring, I delegated to an agent to implement for me. To me, that's one of the best parts about coding with AI. I can now offload the tasks I'm not interested in or that's not as critical, and focus on the parts of the system I want to work on. It's never been easier to build and bring ideas to life with software. Board representation Move generation Position evaluation Game tree search

0 views
Brain Baking 1 weeks ago

Bread Baking In Video Games

In September last year, as part of a series on card games, I wrote about card game mini games in video games . It was fun to conduct a little bit of research related to a specific topic in the world of video games. Since you are reading this on Brain Baking , my interest is always piqued when a game allows me to bake crusty baked goods. The idea to dig into the topic of bread baking in the many virtual gaming worlds came to fruition when I played Bug Fables in 2021. As I wrote in the review: As a professional baker myself, I especially adored the baking honeybee in the Golden Outpost, that exclusively sells flour, which you can use to bake tarts, doughnuts, croissants, glazed honey treats, cupcakes, and more. Discovering new recipes was a great distraction—albeit an expensive one, if an expensive ingredient was turned into a mistake, healing one measly HP and TP (“team points”, or mana, just like in Paper Mario). The local bakery in Bug Fables, trying out new recipes. Bug Fables is a love letter to Paper Mario where the lovely toad Zess T. cooks up jummy stuff for Mario to recover heart and flower points—but Zess T. doesn’t specialise in (bread) baking: she’s a chef that whips up as much spaghetti as cupcakes. You can have Zess combine cake mix with inky sauce to bake a choco cake. Eathing the cake will replenish 5 HP and 15 FP, but alas there are no bread-like recipes present in the game. How about a recipe in The Legend of Zelda: Breath of the Wild ? The closest thing I can think of is throwing a carrot into the fire that yields a carrot cake . Bug Fables still wins, where the baker—with proper baker’s hat—can be seen popping dough into the oven using a pizza peel. In Breath of the Wild , the cooking/baking process is the same: throw stuff into the cauldron, do a happy dance, and poof. How about farm simulation games like Stardew Valley and its inspiration Harvest Moon ? In the former you can cook (indeed, not “bake”) a crusty baguette in the kitchen using wheat flour. There are a lot of recipes that require wheat flour such as pizza, muffins, and pies. In many iterations of the latter, such as the GBA’s Friends of a Mineral Town , you can buy bread in the store and use it as an ingredient to whip up raisin or curry bread, jam buns, or even a cheese fondue . Weirdly enough, you can buy flour that’s required for baking an apple pie, noodles, and (pan)cakes but you can’t bake bread with it. Many RPG Codex members dug up computer role playing games where you can bake bread . The list includes the Ultima games (VII, Online 1 , …), EverQuest , Arx Fatalis , The Elder Scrolls games ( Skyrim ), … In Morrowind , you can grind store-bought bread in a mortar and pestle to turn it into a restore health potion, but there exist survival mods such as Morrowind Crafting that introduce cooking. Still no dedicated bread oven, though. The Ultima VII baker: I am the baker here in Britain and I make the sweetest bread thou has ever tasted. In 2018, James Davenport wrote about the rise of video game bread for PC Gamer, focusing on the early presence of bread in games. But the presence of bread doesn’t automatically mean the crusty goodness can be baked yourself. The article does mention World of Warcraft —the MMORPG as another subgenre of games where crafting and thus cooking is a big part of the meta game. Still no dedicated bread oven, though. In Level 5’s Fantasy Life you can become a cook who masters their skill using three mini-games inside the kitchen: the frying pan, the cutting board, and the oven. Baking is done in front of the oven, not the pan, effectively splitting how ingredients are converted into an edible end product. Except that there’s nothing to consume as it’s not that kind of game. Also, I can’t seem to find bread-specific cooking recipes from the game : only the classic apple pie that requires Faraway Wheat. I’m waiting to play the game until I eventually buy a Switch 2 so I’ll report back when I know more. Some Rune Factory games seem to approach bread baking the same way. Maybe complex roguelike games offer a more realistic way to produce bread? According to the Dwarf Fortress wiki you can bake bread: “You can use flour or sugar milled from plants to either bake bread or make candy”. The Dwarven Cuisine mod adds more variations that even require making dough that then can be turned into bread by baking it. This is the only example I could find of a video game that introduces a “kneading” step before baking! Different types of Dwarven bread to be baked in the Dwarf Fortress mod A surprising entry popped up during my research: The Sims . In the Get To Work expansion of the fourth instalment, you can have your sims engage in some serious cookery/bakery activities . It’s not just bread but also bread sticks, bagels, whole wheat loaves, potato bread, and even a sourdough loaf! As a huge fan of sourdough, I guess The Sims 4 wins this one. And then there’s Bakery Simulator that takes virtual bread baking to a whole new level. Even the reviews say mixed . Get it, mixed? As in mixing dough? No? OK then. Other dedicated cooking simulation games include Lemon Cake , a game I discovered thanks to Kat Thompson’s article on virtual armchair baking for Bon Appétit that looks like a cosy variant of the frantic multiplayer Overcooked! series. EuroGamer’s YouTube video “5 Brilliant Games About Bread (that you probably never even knew existed)” showcases how the physics-based game on bread called I Am Bread redefines bread slice stickiness. It might not enable you to bake a lovely loaf of bread, but a game where you are the slice and have to slather yourself with savoury spreads deserves a special mention: Let me know if I missed a game that features getting your hands dirty with dough and oven. I have to run; writing this post made me hungry. I especially enjoyed Lauren and Lloyd Sommerer’s 2001 essay entitled I Want To Bake Bread on Ultima Online .  ↩︎ Related topics: / bread baking / video games / By Wouter Groeneveld on 22 May 2026.  Reply via email . I especially enjoyed Lauren and Lloyd Sommerer’s 2001 essay entitled I Want To Bake Bread on Ultima Online .  ↩︎

0 views
JSLegendDev 1 weeks ago

The Trick to Designing Highly Replayable Arcade and Linear Games

I recently finished a prototype for a game called HARVEST MOVE based on an arcade style game of the same name that I developed 3 years ago. In the original version, the player moves on a grid and needs to collect as many crops as possible while avoiding enemies. If they get hit, the player is presented with their current score, their best score and the ability to play again. A screenshot of my HARVEST MOVE prototype However, while remaking it, I took a few design decisions that altered massively the replayability of the game. I’d like to share what I did. First, I structured the game into configuration of enemies (I’ll start using the term level rather than configuration to make things clearer) that determined what enemy types and how many where to be placed on the grid. I then, tied those levels to specific score thresholds. Therefore, once a player reached a threshold they would be seamlessly moved to the next level. Secondly, I turned the player’s score into a currency. When they had a game over, they could spend the wealth accumulated to unlock more valuable crops that would start spawning in their next attempt. Even though players always replayed the game starting from the first level, they could accumulate wealth much faster which translated to faster progress through levels they had previously played. Additionally, the more crops they unlocked, the more likely they were to reach late game levels locked behind higher score thresholds because they simply earned more. Now, why does this structure seemingly works in making an arcade/linear game more replayable? I have a few hypothesis to present which are listed below. There is now a sense of permanent progression which mitigates the feeling of loss you experience after losing in a score based game. This makes you more likely to try again. Replaying previous levels while being more powerful/quicker gives the player a very satisfying feeling of power which feeds into an innate power fantasy of some sort. If your game has upgrades that meaningfully alter the gameplay experience, then you tap into a novelty effect that will make the game more enjoyable for longer. For example, having unique items/weapons the player can unlock or alternative pathways in a level or an alternative level. I don’t think so. Roguelikes usually rely on procedural generation and randomization to keep things fresh. There is less emphasis on level design and more emphasis on making builds and testing them out. Rather, I would estimate this structure to be more similar to time loop based games like The Legend of Zelda Majora’s Mask. In Majora’s Mask, you play through the same handcrafted environment over and over and progressively unlock things in the game allowing you to access things you couldn’t before. However, that doesn’t mean procedural generation can’t be used. In fact, I used it in my game, but I don’t believe in it being a core aspect. Considering I accidently discovered this through experimentation, I still think there is room for fine tuning. However, this makes me excited to test this structure again in future projects. I wonder how this would fit with an RPG or a platformer, etc… That said, it would be nice if I could get your feedback on my game. To make things as convenient as possible, here is a google form (link to the game is inside the form) for you to provide your feedback so you don’t have to create an account to be able to comment. Anyway, if you’re interested in all things related to programming, game development and game design I recommend subscribing to not miss out on future posts. Subscribe now A screenshot of my HARVEST MOVE prototype However, while remaking it, I took a few design decisions that altered massively the replayability of the game. I’d like to share what I did. First, I structured the game into configuration of enemies (I’ll start using the term level rather than configuration to make things clearer) that determined what enemy types and how many where to be placed on the grid. I then, tied those levels to specific score thresholds. Therefore, once a player reached a threshold they would be seamlessly moved to the next level. Secondly, I turned the player’s score into a currency. When they had a game over, they could spend the wealth accumulated to unlock more valuable crops that would start spawning in their next attempt. Even though players always replayed the game starting from the first level, they could accumulate wealth much faster which translated to faster progress through levels they had previously played. Additionally, the more crops they unlocked, the more likely they were to reach late game levels locked behind higher score thresholds because they simply earned more. Now, why does this structure seemingly works in making an arcade/linear game more replayable? I have a few hypothesis to present which are listed below. There is now a sense of permanent progression which mitigates the feeling of loss you experience after losing in a score based game. This makes you more likely to try again. Replaying previous levels while being more powerful/quicker gives the player a very satisfying feeling of power which feeds into an innate power fantasy of some sort. If your game has upgrades that meaningfully alter the gameplay experience, then you tap into a novelty effect that will make the game more enjoyable for longer. For example, having unique items/weapons the player can unlock or alternative pathways in a level or an alternative level.

0 views
JSLegendDev 1 weeks ago

How I Accidentally Made a Game for No One

I initially set out to make an arcade game, then I tried turning it into an incremental. Finally, I ended up with a game that’s neither an arcade game, neither an incremental and on top of that, it looks like a puzzle game. In this video, I explain how I ended up making a game that appeals to no one!

0 views
Cassidy Williams 1 weeks ago

La Pedra Go Club in Barcelona

When I was off on vacation in Spain a few weeks ago (I’m still in denial that I’m back), I went to La Pedra (“The Stone” in Catalan), which is the oldest Go club in Barcelona! La Pedra started way back in 1979, and the club has been active ever since, and they meet weekly. I love playing Go. I normally play online , and have played here in Chicago in the past, but this was my first time playing outside of the… place where I live, ha. Whenever I travel, I do look up if there’s a go club or presence anywhere, but almost always it’s hard for me to get to, or the timing doesn’t work out. On this trip though, the apartment where I was staying was a short walk away from the club, which was perfect! I was so excited to play. When I got there, I was immediately intimidated and had to flex every Spanish-speaking muscle I had. The people there are experienced players. The two folks that I played with have been playing go longer than I’ve been alive. …As you can imagine, they destroyed me, even though I had a nice handicap to start with. They were really kind to me and explained which moves I made that were good, which were bad, and which things I needed to focus on to improve. It was a humbling, enjoyable time!

0 views
Unsung 2 weeks ago

“193 hours of attempts (and practice)”

More unexpected Mario content: a 7-minute video speedrunning composite by FlibidyDibidy : = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/193-hours-of-attempts-and-practice/yt1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/193-hours-of-attempts-and-practice/yt1.1600w.avif" type="image/avif"> This video combines my first 5,162 attempts to speedrun Super Mario Bros. I recorded 193 hours of attempts (and practice) on an original 1985 Nintendo Entertainment System, then I wrote a custom computer program to process those videos and combine them via machine learning and conventional image processing techniques. This is not just fun to look at, and – presumably – study as you’re speedrunning yourself. A sign of a good visualization is that it makes you see stuff that you haven’t before and here, at some point (after 1:42), you start noticing strange comb-like patterns in Mario running. Turns out this is actually a thing called a “frame rule,” a quirk of game’s timing code where it only checks for a completion of the level every 21 frames, or one third of a second. That means that for every level after the first one, your start will be rounded up to the nearest 21st frame : The analogy often given is to think of a bus that leaves every 21 frames, and levels can only end by getting on that bus, and so other than in the last level (which has no new level to load at the end of it), improvements in Super Mario Bros. can only happen in 21 frame increments. If you save a frame or two in a level, but it’s not enough to make the previous frame rule, it’s not enough to take the previous bus, you’ll just end up waiting for it to happen anyway. Stay tuned to the end of the video for some fun stats, and click through in the description below to see the same tech applied live during an in-person speedrunning event. #speedrunning #super mario bros #youtube

0 views
Brain Baking 2 weeks ago

Do You Take Ethics Into Account When Buying Video Games?

Something terrible almost happened. I almost bought a ModRetro Chromatic retro handheld device until someone pointed me towards Natalie’s Don’t Buy from ModRetro post who outlined you’re indirectly supporting a war: […] I am against children dying […] Also, there is a evidence that this was done by the US most likely through bad information from AI. We’ve also seen this month that AI companies like Open AI and Anthropic are largly entangled in the US empire’s war machine. You know another that exclusively mixes AI and weapons? Anduril. Anduril’s co-founder is Palmer Luckey who is the creater of ModRetro. ModRetro has release a Game Boy Color FPGA emulator, the Chromatic. More toxic and very questionable evidence is provided by Natalie. But how could I have known all this? I accidentally discovered the existence of the Chromatic through a YouTube video on modern retro-inspired handhelds (that include my own Analogue Pocket). I was shocked to discover this—not only because of Luckey’s actions, but also because of how easy it is to willingly or unwillingly ignore all this and buy a Chromatic anyway. This begs the question: should we be actively researching the ethics behind every product we want to buy? I think the answer to that is yes in theory . In practice, as Roy Baumeister taught us about the working of willpower, pouring energy into this means having less energy in reserve for other more pressing urgent matters happening in your immediate vicinity such as your family. In practice, thoroughly researching something—especially ethics which isn’t as easy to find as technical features—requires willpower I don’t always have available in abundance. This is where the government should step up by providing regulations to prevent such shady products from entering the market in the first place. We all know how that turned out… Do you ever wonder why the ethically sound chocolate bars are put in lower shelves (or entire different aisles) while the cheap and established brands promote their bars all over the place? Whoops, slave labour still exists, did you know you’re supporting it through the purchase of a stupid chocolate bar? Why are the organic locally-grown apples put somewhere else besides next to the other apples? No wait, why are the other apples there in the first place? Sadly enough there are ample publicly leaked examples of ethically questionable behaviour by video game developers; some of which I only found out after playing their game. A few examples then: The most obvious example without a doubt is Activision Blizzard’s many abuses of their employees. They lost nearly billion in market value thanks to a discrimination lawsuit . More lawsuits two years later were “settled” (read: bribed). The stock prices tanked and Microsoft bought them, resulting in a huge payday for the exact executives that were under fire. That’s irony for you. Some developers are very vocal on social media about their extreme-right, transphobic, and/or homophobic beliefs. I don’t know what goes on in their stupid heads as this obviously damages your reputation and game sales. At least, you’d think. Apparently, it doesn’t damage them enough? Voidpoint, the makers of Ion Fury , are one example of this . It’s so sad to read as I really enjoyed that game and feel very conflicted about it now. The lead developer of Pizza Tower apparently left an offensive joke in some private Discord channel that was of course screenshotted and much later discovered by (or explicitly sent into?) the angry Reddit mob. He later apologised, but I wonder: is this a case of extremism on the defensive side? Is this a recurring theme in the indie development scene because the teams are small and their edgy jokes that mean no harm that otherwise would be filtered out by a huge HR department are easily misinterpreted? Or not? There are more examples to be found but you get the gist. The problem is not limited to video games. I was recently shopping around for a new terminal emulator after growing tired of iTerm2’s blatant genAI feature adoption. Apparently, the developer of Kitty adopts a toxic stance telling some of their users to “go soak your head” if he disagrees with their statement. I do understand that it’s tiresome to reject silly feature request after request but that doesn’t mean you have to resort to an aggressive stance. But again, how would you know? I didn’t until I found out about that in some random blog post. Should I uninstall Kitty now? Or what about JK Rowling’s crazy public transphobia outings? What if you read about that in the news after you read all the Harry Potter books and loved them? Would you burn them and vow to never read or watch related material? Or just shrug? Another question might be this: does the maker’s preference for vices instead of virtues affect my opinion on the made product? I love Pizza Tower —it’s in my Top 25 Games of All Time although that might be recency bias talking here. I’m typing this on a MacBook instead of a Framework laptop. God knows how the materials of this Apple laptop are mined (and will that differ from another one?). We buy lots of stuff that carries the label “made in PRC” that might or might not be ethically bad. It’s all just one big question mark. Why are so many companies opaque about their ethics? (I think the answer begins with the letters C-A-P-I…) There should be a community-based filter for this. And there is, it’s called “asking around”, but that method is far from perfect. I wish companies would be more open about their ethics—and not in a meaningless code of conduct letter written by the legal department. Perhaps then the honesty and peer pressure around it might enforce them to behave. Related topics: / ethics / By Wouter Groeneveld on 14 May 2026.  Reply via email .

0 views
Playtank 2 weeks ago

Complexity and Player Agency

There’s sometimes an idea that a systemic game is inherently complicated to play. If you simulate a world, you must simulate everything that can potentially exist in that world. If you don’t want to constrain the player , and you want to lean strongly into player agency , this seems to lead naturally to a high degree of complexity . In some ways, yes. You need to plan for more redundancy than what a feature-rich game may need. But complexity itself is not a goal, and I’d even argue that some measure of complexity is a strength for this type of design. How to make games that are high in player agency without making them incredibly complicated , however — that’s the topic for this post. Let’s set some terminology before moving ahead. Complicated things are difficult, intricate, or require specialised knowledge to understand, but are predictable and can be solved. A complicated game is hard to interact with and may require that you internalise deep mechanical interactions before you can understand what kinds of decisions you need to make. This is not always intentional, but can be the product of a badly designed user interface. Complex things, on the other hand, are composed of interconnected parts where the whole is greater than the sum of those parts, often unpredictably. As you can tell, complex is extremely close to emergent . The difference between complicated and complex is that you don’t need to understand the whole of a complex system: it’s enough to internalise the system’s consistent elements . This last boldface point is what we’ll circle back to later. A system’s state-space complexity is measured by counting the total number of states that are reachable from an initial configuration. A linear game will have a small initial state-space complexity, because there isn’t enough branching to introduce it. Picture a game where you make setup choices at the start, like the excellent Caves of Qud . You pick a character, difficulty, starting location, and you have some other choices you can make as well. Some of these choices are unknown to you the first time you play, meaning that you may pick what sounds cool or what you were told was the optimal choice in a wiki guide. Each such choice affects the resulting state-space complexity. Particularly if they have synergies between them. A complicated game with high state-space complexity will take time to understand fully, but may instead lead to boredom once all permutations have been understood and the layers of uncertainty overcome. A complex game with high state-space complexity, on the other hand, will rarely be fully explorable even after years of play. There can always be emergent effects left to discover. The mental resource requirements for solving a particular problem is what leads to potential analytic complexity. When there are so many different elements to keep track of that the outcome might as well be random, there can be argued to be too much analytic complexity. But this is of course a matter of taste more than anything. Some players love this type of complexity and actively seek it. For a complicated game, analytic complexity can be caused by the intricacies of the interface or having to understand every dynamic before you make decisions. For a complex game, high analytic complexity will make things feel random and unpredictable, because it’s too hard to internalise the hows and whys. No amount of analytic thrill can happen if you don’t understand what is going on or if there is simply so much information that it becomes overwhelming. Whenever someone derogatorily refers to playing a certain game as “playing an Excel sheet,” for example, what they’re probably complaining about is the game’s cognitive complexity. There are too many pieces of information, they are hidden too deep in the game’s menus, or otherwise difficult to access at the right time. Complicated games reach here by having menus with submenus, strange keywords you must learn, and other forms of cognitive boundaries. Complex games will arrive at cognitive complexity by hiding effect from cause, so that it’s hard to figure out where emergent effects are coming from. Combining gaming with adulting isn’t always easy, making your wetware memory a crucial component. If you played a great game two months ago, and now you must recall what it was about, you can easily forget important parts of the narrative, which button to press to do the special attack, etc. Both complex and complicated memory problems are often of a related variety, where you need to remember the meaning of A before you can understand B. When you come back to a long-lasting TV show and you see a familiar face you can’t quite place, this is the same thing. Once your memory “clicks,” you’ll understand what the recurrence of this character means, but before then you’re probably stumped. The same is true for narrative elements and for synergies. Another instance of wetware weakness is muscle memory. While playing through a game with many interconnected mechanics and button combinations, you may learn it, even internalise it, to the point that you can play it almost intuitively. Practice makes perfect, as the saying goes. But some players have a harder time with this than others, and where you may be one of the players who will instinctively say “git gud,” others will simply quit the game and never touch it again because button gymnastics is not why they play games. Complicated skill thresholds will gatekeep elements of the game off your failure. Perhaps making it so you can’t proceed in the game until you’ve killed the next boss or used the new mechanic. Complex skill thresholds will generally be because you haven’t realised how the game’s rules can be applied, and you need to learn it. Some players are “hardcoded” to find the right way to play, and will frustratingly lock themselves into trying it again and again rather than attempting something new. This is a good example of a complex skill threshold. The systemic focus on this blog began in earnest with my three-part treatment of “ immersive sims ,” back in 2022. But the immersive sim is a very interesting case study, since its vagueness has led to countless labelling discussions. This brings us to a kind of complexity that is maybe more disruptive than we usually admit: conventions. For most console gamers, using dual analogue sticks is second nature. But that doesn’t acknowledge the many hours of training you need to actually master it. Genre conventions are similar, in that they take a lot of time to internalise, and for people who haven’t internalised them they become tough obstacles to beat. Conventions can be game-, genre-, or even developer-specific, and sometimes as game designers we’re not aware of them to the extent that we should be. “Agency: The player can control their decisions and those decisions have consequences in the game world . (And hopefully, there’s enough information in the world to make said decisions.)” Chris Siegel The vague almost nonsensical definition of player agency that I personally prefer is that a game respects player intent . Why I like it is because it has fairly deep-rooted implications. It means the player must be able to form intent — they must know what’s possible and what’s not. It also means that the player is the driver of what happens, not the game. Choices and consequences (C&C from now on) were touted as a major game feature for a while, during BioWare’s Mass Effect heyday. C&Cs are the clearest, perhaps most fundamental, expression of player agency. Bob Case, MrBtongue on Youtube , talked about two key types of C&Cs that directly map to the authorship-emergence scale: C&Cs for replayability or simulation . “Complete Mordin’s loyalty mission and he’ll live through the game’s ending. Ignore it and he may die in a certain cutscene. This is intended to increase the game’s replayability, as in play the game again, make different choices, see a different ending. […] Why would Mordin’s hypothetical loyalty level make any difference in whether or not he happens to take a stray bullet?” In today’s gamedev vernacular, replayability is often equated to seeing more content . Content is certainly the hallmark of replayability C&C, but let’s look at the contact point with player agency. “You’re using game mechanics to attempt to make the game world behave as though it was a hypothetical real world. […] The first two Fallout games became classics largely because of the quality and reactivity of their settings. The world of Fallout seemed like a real place, because it reacted to the actions of the player in a realistic way.” One of Bob Case’s examples of C&C in the first Fallout is that, if you talk about where you’re from, this can end up having your whole vault looted and destroyed. A consequence that makes intuitive sense in a cutthroat environment, but is never advertised as a choice. It just happens. This is the kind of systemic player agency I personally like, and here are some of the things that can make it sing. Many games offer high degrees of player agency using smoke and mirrors. Harvey Smith talked about Dishonored and the assassination of High Overseer Campbell, going into some detail on how all of it was constructed through level design and scripting. You have many options and you may feel that you’re outsmarting the game’s developers, but all of those options were carefully staged. Effectively, Dishonored is far to the left of the Content – Experience scale. This is great! That assassination is one of the most iconic moments in the Dishonored franchise. You don’t have to make everything actually systemic to create a systemic experience. The only thing that’s unfortunate with a content-driven setup is that it’s directly content-limited — you will never offer more variety than you have the content production capability to produce. To contextualise our gaze into the player agency abyss, we’ll look at the three main “loops” most games can be said to have: Micro, Macro, Meta. These represent the second-to-second, minute-to-minute, and hour-to-hour interactions you have with the game. Agency means very different things in different loops, and as you can hopefully see, its implications vary. Most video games have micro agency: choose which action to use, where to go, how quickly to proceed, and which events to prioritise. Consequences for failure are usually transactional in nature, where you lose a few points of health or need to spend in-game coin if you fail. Games that have low micro agency will stop until you perform the right action. Games with high micro agency will allow you to progress at your own pace. Macro agency is about being able to choose where to go. Consequences for failure are almost exclusively a cost in time. Watch the loading screen, walk back to your dead body, climb up from your missed jumping challenge, or try the dialogue tree a second time. Games with low macro agency will force checkpoint reloads if you make the wrong choice. Games with high macro agency will let you choose which missions to pick and which ones to abandon. Meta agency is less common, since it’s the layer where most modern games will lean into linearity, and where production is most expensive. Allowing the player to alter a story’s outcome, to turn into a villain, or to explore character builds that were never quite intended to be played in the ways you play them. Consequences for failure at this layer may mean the end of the game, or that you need to start from scratch with a new character. Games with low meta agency will force you into a linear story or community-enforced meta. Games with high meta agency will let you kill the princess and save the dragon (one of my favorite examples), or discover new metas even deep into the game’s life cycle. “I wanted the player to play the game enough so that they could intuit the health of their ecosystem and understand how to approach it moving forward. But players generally don’t do that. That’s not how they start. They start by using their own intuition not the game’s intuition.” Andy Schatz Think back to the point on internalising consistent elements . There are some things that almost always hold true in games, that most of us have to learn the hard way: What this effectively means is both that Andy Schatz’ point on intuition, above, and the idea that consistent elements can be internalised are directly related. To put it another way, we can’t know with certainty what the player’s intent will be . Because of this, we can only provide more player agency by covering enough ground with our simulation. Simulation is a scary word. Many times when I’ve lectured on systemic design, the interpretation has been that everything must be possible, or the idea of emergence isn’t real. This is what makes it too complicated for realistic implementation, seems to be the implication. But this is not true. High degree of emergence leads to a complex game, yes. But though emergence is complexity, it doesn’t have to be complicated . As has been covered in previous posts, all you really need is a strong mental model and a good understanding of the state-space needed to represent it . No one thinks L.A. Noire lacks agency because you can’t use your gun at any time. No one thinks Thief: The Dark Project lacks agency because you can’t cook an omelette between thefts. Remember: permissions, restrictions, and conditions. If we can find rules that fit the mental model, we can never go wrong. “If people compare our combat to Half-Life, we’re dead; if they compare us to Thief’s stealth, we’re dead; if they compare our RPG elements to BioWare’s latest, we’re dead. But if they get that they can decide how to play, to do any of those they want, we might rule the world.” Warren Spector It’s fine if you don’t simulate everything to be able to create your systemic game. You’re not expected to. What’s important is that you understand what choices the player will want to make and that you nudge them in that direction. Just don’t require them to listen to your nudges if they don’t want to. Unique rewards . A common form for replayability C&C is to provide you with gameplay rewards that you can’t get any other way. A special weapon, a unique armor, or even just a chunk of virtual gold. For some achievers, this is enough to warrant a replay. Outcome response . You get some kind of feedback from the game based on the choice you make, and if you want to see another outcome you need to replay the level or even the whole game. Downstream effects . It’s quite common to tally the result of choices made during the game and make a difference at the end rather than throughout play. For example the Mass Effect 2 ending and how it’s affected by party loyalty, or a high/low chaos ending in Dishonored . Branching impact . If you decide to destroy the town of Megaton in Fallout 3 , it won’t exist anymore. If you decide to kill a character, it stays dead and won’t show up in later scenes. Replayability C&C will usually be limited to few but very obvious choices like this. Irrevocability . If you make the choice, you suffer the consequences. There are no reversals or revivals to be had: the result is irrevocable. Defiance . Allowing players to disregard instructions and then provide consequences for it. If you wait too long or if you make enemies with the wrong person. Can be good, can be bad, but it should make intuitive sense. Vandalism . Consciously breaking the game is the hardcore version of defiance. When you take a “what if?” to the edge and beyond. Optional . Choosing to exclude yourself from things you don’t care much about, say stealth, while focusing on things you do like, say combat. This is something that truly distinguishes games with high player agency from other games. Versatile . Often goes hand in hand with optionality, since versatility needs it. Versatility is about offering more than one solution to any given problem. Chris Crawford found it so essential to game design that he didn’t consider puzzles to be games . Players don’t read text. Players don’t play the way we think.

0 views
Unsung 2 weeks ago

“Nothing short of a magic trick.”

A fascinating 25-minute video from Mark Brown at Game Maker’s Toolkit about how the team building Grand Theft Auto 3 conquered the technical limitations of PlayStation 2: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/nothing-short-of-a-magic-trick/yt1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/nothing-short-of-a-magic-trick/yt1.1600w.avif" type="image/avif"> How do you squeeze a city that occupies over 50 megabytes into the 32MB memory of the console? You simply do what The Truman Show did , and construct the city around the player as they’re moving around : This has, as you can expect, a lot of technical and even game-design consequences, and the video goes into a lot of detail on these – including Brown rebuilding the Grand Theft Auto 3 source to visualize things better. This technique is also used in interface design, for example if you have a really long list of things that would take too much memory or GPU power to render. What the video calls “streaming” is, in the context of UI, often called “virtualization”: instead of having a full long list (or an entire world), you abstract it away – or, virtualize – into something nimbler. Some of the challenges and techniques used by Grand Theft Auto 3 apply pretty directly here, as well: On the other hand, “speedy players” and “pop in” can’t ever be solved because any UI list is random access, and slowing users down is not typically appropriate; better to make loading as pleasant as possible than introduce any roadblocks, even if figurative ones. #definitions #games #performance #youtube you can use UI skeletons as “low poly” models, in some contexts, you can guess the user is more likely to move in one direction (for example, going through fonts in a font picker), and more eagerly preload where they’re going to look next, rather than symmetrically in both directions.

0 views

Emulating old junk from yesteryear – or my obsession making native resolution PS2 emulation look good

Lately I’ve been on a kick to tackle the latter part of PS2 graphics emulation that never seems to come up, analog TV emulation. 99% of the PS2 emulation space is all about upscaling to the max, cranking out 4K with polygons so sharp they can cleave mountains in half, but that’s not particularly to my taste, which is why paraLLEl-GS focuses more on the super-sampling aspects rather than raw upscaling. Earlier blog post on the paraLLEl-GS here if you have no idea what I’m referring to. For example, a raw native render with progressive scan (640×448) with paraLLEl-GS backend: With Vulkan HW renderer in PCSX2, a basic 2x upscale would look like: which is obviously higher resolution, but does not attempt to resolve aliasing either, and as upscaling factors go up, the mismatch between texture resolution, polygon counts and output resolution create a jarring effect for me. The approach I tend to favor is super-sampling and keeping the resolution native, even if it means a more blurred resolve. Here’s how it’d look with 16x SSAA. This is quite overkill for most cases, but why not. There is a special mode in paraLLEl-GS that can scanout the 16x super-samples at double the resolution, which is effectively 4x SSAA at double the resolution. It can look great when it works well, but the key word is when . This approach is not playing to the strengths of paraLLEl-GS at all, but it’s a thing. The main problem is that 2D images like HUD elements remain at native resolution with integer scale, which can create a jarring look, and post processing passes can mess up things in some cases. My main focus is on the native resolution, super sampled output, since it has very few gotchas compared to other upscaling styles. For a while, I’ve relied on FSR1 to do the upscaling, which is just a temporary hack. While properly anti-aliased 3D can look surprisingly good with FSR1 when blown up to large resolutions (what it is designed for), 2D game elements still create questionable artifacts. Text upscaling starts looking like those old HQ2x, SuperEagle and xBR filters that used to be popular with SNES emulators. That’s likely because FSR1 is “just” edge-aware Lanczos filtering at its core. Still, at SD resolutions there’s only so much you can do to blow it up to a modern display. The result here is of course quite blurry, but looking at it from a reasonable distance, it can look sort-of okay on a good day. The only proper way to display SD content is in my opinion to use a CRT, or in lieu of getting a nerd tan, CRT shaders. Simulating CRTs has been done to death to the point Hel is blushing, so I feel a bit uncomfortable even trying to write about it, but this post wouldn’t be complete without it. RetroArch has like 23428323 CRT shader presets already, and there’s nothing novel about any of this. However, there are some considerations for PS2 that most CRT shaders don’t target: A lot of CRT shaders assume a high quality VGA-style monitor. Nothing wrong with that of course, but I find most of them a bit “too” good for PS2. Where we’re going, we’ll need that analog fuzz too. I’ve been deep down the rabbit hole looking up old specifications to get a deeper appreciation for the brilliant engineering involved in making color TV work all those years ago, and the PS2 era was the last hurrah for SD CRTs, 480i warts and all. I’ve sort of gone through all of this stuff before back in my early days of programming, but I’d like to think I’m a little smarter than I was back then, and I learned far more details than I knew before. From a graphics programming PoV this is hardly “difficult” stuff like debugging random GPU hangs at 10pm on a Friday coming from the latest and greatest AAA game, but hey, sometimes you just gotta relax with some good old DSP coding to stay sane. The signal processing for NTSC and PAL is fairly straight forward and it’s actually a good entry point into signal processing for graphics programmers since it combines very visual things with actual real world problems. Component is the highest quality analog cable (actually, 3 cables!) available to consumers. It supports progressive scan which very few PS2 games natively supported. Simulating this cable is quite trivial. Composite is the yellow cable “everyone” used. This one is the hardest since separating luma from chroma in the same single-channel signal is actually kinda complicated to do well. Most of the time I spent was trying various strategies for this problem and try to come up with a look that seems authentic and “tastefully shitty” S-Video is very similar to composite, except that luma and chroma are separate signals. Chroma is packed into one cable and chroma decoding is basically same as for composite signals, where phase and amplitude dictate the hue and saturation. Main difference to component is that bandwidth for chroma should be quite low, so more color smearing should be present. Us Euro-bros technically had RGB SCART too, but I’ve never seen those cables myself for a Sony console. I believe our old N64 and GameCube had those, but I’d have to double check next time I visit the family … While it is very easy to find a ton of content online about old TV standards, your random YouTube video is not going to have the minute detail needed to implement much. I found “Video Demystified – A Handbook for the Digital Engineer (2005)” by Keith Jack which has ton of great detail that is often left out to make sure my implementation stays grounded. BT.601 defined how to take NTSC and PAL signals and turn them into the digital domain. It is the foundation for all digital video today. The primary interest for us is that the standard defines a 13.5 MHz sampling rate. This was supposedly chosen since it was convenient for both NTSC and PAL and filtering requirements. This scheme works out to 720 horizontal pixels for NTSC and PAL when you account for 525 lines at 29.97 Hz and 625 lines at 30 Hz. The H-sync part of the analog signal pads out to a bit over 800 pixels, but that’s irrelevant here. I also learned just recently why it’s called YUV444, 422, 420, etc: The “4:2:2” notation now commonly used originally applied to NTSC and PAL video, 480i and 480p Systems implying that Y, U and V were sampled at 4×, 2× and 2× the color subcarrier frequency, respectively. The “4:2:2” notation was then adapted to BT.601 digital component video, implying that the sampling frequencies of Y, Cb and Cr were 4×, 2× and 2× 3.375 MHz, respectively. Now you know! The Nyquist frequency of SD video is thus 6.75 MHz. Talking about video like this is a little weird, but it will make more sense later since analog signals like NTSC and PAL have a certain bandwidth, which limits how much horizontal resolution we can cram into it. The number of video lines is hardcoded. The video signal is really just a 1D signal if you look at it in an oscilloscope (haven’t seen those since my Bachelors …). The next question was to determine the sampling rate of the PS2 CRTC. Given it generates analog signals, it’s not obvious that PS2 would use a standard frequency here. However, several old forum threads I found did indeed suggest that PS2 is based around the 13.5 MHz rate. This is likely because it could use off-the-shelf video DACs at the time. The nominal maximum horizontal resolution of PS2 is 640 pixels, but it seems like overscan is supposed to stretch the 640 pixels out to fill the screen anyway. Even if 480 lines are “visible” in NTSC, games typically just render 448 lines since the top and bottom is eaten by overscan by most TVs. The actual CRTC clock seems to be 54 MHz, because when programming the CRTC, you’re supposed to set some dividers which ends up determining the resolution. E.g. 640 pixel width is a divider of 4, 512 pixels a divider of 5 and so on. It conveniently supports most relevant horizontal resolutions like this. My armchair theory for how this works is that the CRTC runs at 54 MHz and uses the divider to do a zero order hold (aka nearest filtering) which is then fed into the DAC. Either that or the console is really doing horizontal linear filtering up to 640 pixels and does composite video generation at 13.5 MHz. I’m not sure what really happens, so I just have to guess. I’m not quite obsessed enough to have an oscilloscope to suss out micro-details like these from a real PS2. The PS2 is technically able to emit 1080i and 720p signals, so there’s no reason why it couldn’t do analog video processing at the full 54 MHz. To debug any of this we need test images. I don’t exactly have test signal generators that TV engineers had back in the day, so I had to synthesize something. The use for these is to validate various edge cases in the NTSC and PAL decoding process. The basic idea is to have some 75% color bars at the top to validate the color pipeline. The middle section is a sweeping increase of horizontal frequency up to Nyquist of 6.75 MHz. Each 1 MHz section is delimited by a single line color bar. The lower portion is a sweep with increasing frequencies. This is used to test the comb filter. Doing FIR filter design by hand is uh … not something I have time for. Anything beyond the basic windowed sinc design process gets annoying very quickly. GNU Octave is a free alternative to Matlab that does what we need for these tasks. While we can do composite video generation at the 13.5 MHz rate, it is not easy to avoid aliasing, especially since we will be modulating with a chroma subcarrier that will shift the spectrum all over the place, potentially creating aliases out of thin air. The handbook calls for a 2x oversampling to avoid this. First, the image is padded out to fill 720 horizontal pixels for BT.601 reasons. Then, integer scale the image up to 2880xN (to match with how I understand the CRTC to work), and downsample that with a low-pass to 1440xN which completes a clean 2x oversampling. A polyphase upsampling filter is of course possible too to avoid the intermediate upscale, but that’s needless complexity for something that literally takes 10 microseconds on the GPU The immediate upscale is not written to memory at least, the filter just assumes a 2880 pixel input and it’s just sampling the input texture redundantly instead. Since these are fundamentally analog signals, we only filter horizontally. The natural image type for these is 1D Array. All the processing shaders are 1D as well. (The 1504 width is just extra padding for convolutions.) It’s all the same thing really. NTSC is the oddball one with YIQ but in practice this difference is completely irrelevant. The original idea of IQ was to take the blue and red difference signals and rotate them by 33 degrees to make it so that I would align with skin tones better, and give I more bandwidth than Q . However, the handbook doesn’t seem to give it too much consideration. Especially not for composite signals which are not meant to be sent over the air. The implementation of this is really just doing a 3×3 matrix multiply with RGB, nothing special. NTSC and PAL have fairly narrow bandwidth defined for their broadcast signals, but composite signals don’t really have those strict limits. However, since the digital input has Nyquist at 6.75 MHz the handbook calls for bandlimiting the signal to about 6 MHz anyway. Super sharp falloff filters just lead to ringing. Component video is specified by BT.1358 and doubles the sampling rate to 27 MHz. Y should fall off at about 11 MHz and chroma half that. Interpreting that in interlaced terms, the falloff should start at 5.5 MHz, getting close-ish to the Nyquist limit for SD video. After filtering luma and chroma, just decode back to RGB and we have a nice signal, done. Chroma is nuked down to ~1.3 MHz or so for composite / S-Video. Sometimes, 0.6 MHz is called for it seems, but it’s quite unclear … S-Video can ignore the modulation + demodulation part if we just want to simulate the smear, but it was easier to let it go through the full chain for completeness. Despite the chroma bandwidth being so horrible, it sort of looks good. Amazing how terrible our eyes are at seeing color detail. I wonder if this is there the esoteric 4:1:1 YCbCr subsampling mode comes from now that I think about it … E.g. NTSC luma filter, which starts falling off at about 4.2 MHz and stops at 6.75 MHz-ish. Broadcast NTSC is capped well below this bandwidth. Chroma encode, with ~1.3 MHz passband: Main difference for PAL is that luma passband is a bit higher. PAL-B (which Norway used) seems to specify 5 MHz rather than 4.2 MHz. Generating these filters can be done easily with firls and friends in Octave. The handbook calls for a gaussian kernel for chroma to avoid any ringing, but I missed that memo Either way, these are implemented with trivial convolutions which GPUs eat up like butter. This is the first point where NTSC and PAL differ significantly. While NTSC and PAL have different color subcarrier frequencies, PAL is also a bit more sophisticated. The “sign” of V is where Phase Alternate Line comes in. It flips every scanline. In broadcasting, this was meant to fix bad colors being introduced during broadcasting through complicated terrain (and boy do we have that over here in Norway). Bad phase shifts being introduced by NTSC will manifest as hue shifts. The basic idea behind PAL is that if phase shifts are introduced by signal reflections the sign flipping of V every scanline ensures that the decoded hue is complementary from scanline to scanline. This manifests as the Hanover Bar artifact. By averaging chroma from scanlines, the errors cancel out and we recover the correct color with slightly less saturation. The cost is of course reduced vertical chroma precision, but given how comically smeared chroma is horizontally, I’m not sure this matters, and digital video uses 4:2:0 subsampling anyway. Now, broadcasting considerations are kind of irrelevant for something like composite video (I would think), but I’m not sure if PAL TVs skip the filter for anything not coming from an antenna. I kept the vertical chroma filter in my implementation because it’s neat to have. The NTSC chroma subcarrier is constructed such that every scanline completes 227.5 cycles. Every line flips chroma phase which is very convenient and makes luma and chroma separation less complicated. The NTSC chroma pattern is a checkerboard as a result. PAL is more annoying here. A half cycle method would not work since V is already flipping every line, so PAL chose 287.75 cycles. On top of that a tiny 1 / 625 cycle offset per line is added for … reasons. The V flipping leads to a chroma pattern where U takes a diagonal pattern while V has a pattern along the other diagonal. Frame progression is also a concern. As fields are scanned, each time the same field is drawn, the chroma subcarrier should have opposite phases. This follows naturally from how fields are drawn. The period of NTSC is 4 fields: As we can see, things repeat after 4 fields and this point is easy to miss. The artifacts introduced by composite video should ideally cancel themselves out over time which manifests itself as flickery noise rather than a horribly glitched image. PAL is annoying and has a longer cycle of 8 fields due to the three-quarter of a cycle setup. After completing 2500 lines (625 * 4), the chroma subcarrier has completed an integer number of cycles, and the sign of V is back to where it started. After modulation, the NTSC color bar signal looks more like: and the next line flips phase as expected: Some old Nintendo consoles (and likely others) emit NTSC and PAL in non-standard ways. E.g. NES is infamous for shifting the chroma carrier by 120 degrees instead of 180 which leads to very particular artifacts. See NESdev Wiki for more detail. It’s easy to mess up RGB to YUV conversions and the compositing process. The handbook had reference outputs for RGB inputs in NTSC and PAL where I could confirm that the math was indeed correct. The things to check are that minimum and maximum of the signal are what they should be. NTSC, at least the US variant of it maps black to 7.5 IRE (just think of it as some abstract voltage) and white to 100.0 IRE, and it tripped me up a bit at first since the NTSC color bars were defined in terms of this shifted and scaled IRE value. Looking at the peaks and valleys of the generated composite signal in RenderDoc is enough since we just need to eyeball it. Close enough is good enough. This is non-trivial and a source of endless head scratching. Chroma information lives in the frequency spectrum around the carrier, but so does higher frequency luma detail. The basic theory for comb filters is to take advantage of the opposing phase of the chroma carrier. For NTSC, I used this basic structure from the handbook: In code, this translates to: Ideally, by adding two neighbor lines, chroma should cancel out and only luma remains. Subtracting, we cancel luma and only chroma remains. We know that chroma won’t (or at least shouldn’t) exist outside its bandwidth, so the result is run through a bandpass filter that centers around the carrier frequency, and we have an estimate for the modulated chroma signal. Since the composite signal is Y + C, we subtract the chroma estimate from composite signal to form a Y estimate. Chroma can now be demodulated and low-passed to remove the harmonics introduced by demodulation. This filter works “perfectly” for regions where the chroma is constant, but not so much where there are discontinuities. This results in “chroma dots” where the color subcarrier bleeds into decoded luminance. Notice the dot pattern on the bottom of the image. Thus, different colors modulate the luminance intensity differently, creating a “dot” pattern on the scan line between two col- ors. To eliminate these “hanging dots,” a chroma trap filter is sometimes used after the comb filter. In the real world of analog circuitry, having a perfectly locked signal like this is probably also not too realistic to assume. The literature also calls out for notch filtering as an approach. I attempted combining a comb filter with a notch filter on top to reduce the artifacts, but it is quite tricky to create a notch filter that works well. A simple FIR notch filter with zeroes is easy enough to make: This filter is convolved with a simple low-pass to complete the luma decoding filter. This approach just leads to severe blurring for NTSC and a band-stop filter approach just lead to less severe blurring and ringing instead, so I’m not sure what should be done. Unfortunately, the handbook isn’t clear on what kind of filtering is called for here. IIR notch filter designs can be super sharp to surgically carve out the carrier, but IIR filtering is also a massive pain in the ass on GPUs. It’s also likely to ring heavily too, which I found rather annoying in my testing. E.g. 3-line comb NTSC without the notch (integer nearest upscale from 640×240): and with notch: Yikes. There’s no way this notch approach is correct. It’s like we’re getting double vision here. It does clean up the chroma dots though, so … yay? Going beyond these base techniques there’s adaptive filtering where the filtering strategy changes based on which kind of case we’re dealing with. And even more sophisticated is taking advantage of temporal information (look ma’, TAA has been a thing since forever :D) since N fields in the past we have complementary chroma phase perfectly aligned to our pixel grid. Very cool stuff, but I doubt consumer TVs at the time would have those. The added latency for doing this kind of analysis doesn’t sound like something you’d want for games at least … Either way, I’m not designing high-end TV circuitry in the late 90s/early 2000s here. We can just flip on S-Video to simulate the perfect Y/C separator, so at some point I have to decide that I’ve done enough filter masturbation and move on. This was way harder than expected and I had to bang my head against the wall for a while to come up with a good solution. The ~90 degree shift every scanline means the basic comb filter for NTSC won’t work at all. The handbook has two main strategies here. Either a delay line which is slightly longer than a scanline to align the phases: Or use a highly magical “PAL modifier”: The function of this modifier is esoteric as all hell, but I think the purpose of it is to phase shift the signal by 90 degrees to “realign” the carrier somehow (it will still be off by 0.6 degrees). This filter path with two bandpass filters just got so messy, and I couldn’t figure out how to debug the thing effectively (were the inevitable visual artifacts my bugs or just the filter being bad?) that I eventually gave up and designed my own filter. That’s more fun anyway. I started from first principles and designed a 3×3 kernel that should be able to perfectly pass a chrominance signal and 100% reject any luminance signal that is DC in either horizontal or vertical direction. To make things simple I started with the assumption of 4 samples per subcarrier cycle to make the examples easier. Given a constant value of 1.0 for U, a signal would look something like: U = sin(wt) with N + 0.75 cycles per line here. A kernel that satisfies the criteria is: The sum of all rows and column is 0, meaning that if the signal is DC either horizontally or vertically, the result is completely filtered out. The filter also rejects V signals. V = +/- cos(wt) and looks like This is just the same signal flipped horizontally, so: Then a combined filter is made that accepts U and V signals together. U and V can be perfectly split later during demodulation so that is okay. This just boils down to a simple diagonal edge detection filter (high pass vertically and horizontally), but actually works quite well. To deal with the actual 2x oversampled rate of 27 MHz and the PAL subcarrier at ~4.433 MHz, the ~90 degree shift per line is about 1.51 samples, so to make this sort of work, I stretched out the horizontal kernel to a 5-tap filter: The vertical kernel remains the same of Some error is introduced since we’re not sampling the signal 100% correctly anymore (theoretically we need a sinc to reconstruct the signal perfectly), but I measured the reconstructed error to be -40 dB, which is good enough I think. The measured error for U and V were also similar, which indicates no weird artifacts from the V flips. With this 15-tap kernel, we get a pretty good chroma estimate even in PAL. From here the same ideas as NTSC apply, bandpass the estimate and subtract it from composite signal to get luma. Notch filtering to cleanup the chroma dots worked way, way better for PAL than NTSC, likely because the carrier has a much higher frequency on PAL, so the low pass behavior of the notch isn’t as devastating to image quality as it is on NTSC. In the end I think I prefer 3-line comb + notch for PAL and just plain 3-line comb for NTSC. These screenshots are just one still frame (or rather, field). The color fringing will cancel out the next field and it’s hard to show the effect without seeing it at full 60 fields per second. While PlayStation 2 didn’t support this hack mode, GameCube did back in the day. It’s a non-standard video mode that has same refresh rate as NTSC and vertical resolution, but retains the bandwidth and chroma encoding system of PAL, the best of both worlds! My implementation can trivially implement this by just enabling PAL on 60 Hz games. Only thing I’m not quite clear on is how the 1 / 625 subcarrier offset per line is supposed to work, but it’s a non-standard mode anyway, so eeeeeh. With comb filter and notch on NTSC: As expected, luma detail is murdered around ~3.58 MHz carrier. Also serious color fringing due to the extreme high frequency diagonal patterns. In the pattern at the bottom, no fringing is observed since the comb filter did its job as expected. PAL is similar, but the carrier and notch moves to ~4.43 MHz instead: The main feature of PAL is being robust against phase shifts during analog broadcasts. It’s a little unclear if composite inputs cared about this case, but for completeness sake, I implemented it. This path is naturally skipped for S-Video and Component outputs since I can’t imagine a TV caring about that for the more luxurious inputs. It doesn’t take many degrees of error in the phase to get quite different colors for NTSC. For PAL, the phase error manifests as complementary errors every line. However, by averaging out chroma vertically, we can recover the original chroma almost perfectly. At worst, a little less saturation. This topic is kind of unfortunate in that it’s done to death already, and it’s a 100% subjective topic meaning that everyone has some kind of opinion, none which agree with each other. Holy wars have been fought over less. Trying to write anything fresh about this topic is futile in 2026 – the heyday of CRT hobbyist shader development was in the early 2010s – but I felt the need to explain what I did at the very least. If anything, it’s a useful intro to writing your own shader. https://nyanpasu64.gitlab.io/blog/crt-appearance-tv-monitor/ is a good read too for more background information. The most obvious part of a CRT filter is scanlines, however, the idea that CRT images should have clearly visible scanlines is actually an artifact of 240p. For PS2 games, we’re operating at either 480i or 480p for NTSC. For interlaced video, we expect each individual field to have clearly visible scanlines, but the complete image (fused together by our brains) should not. The beam profile should be tuned as such. What most shaders do is for each scanline to take a gaussian distribution in the Y direction, sampled for the neighbor lines to cover the useful portion of the kernel. Another common effect is that very bright scanlines are smeared out, supposedly due to the electron guns not being as stable when they’re driven at high voltages. This can be simulated by varying the standard deviation. It can be subtle, but creates a neat effect I think. Exactly how to come up with the beam profile for a given input voltage is purely up to taste I suppose, I doubt there is a linear relationship between R’G’B’ value and standard deviation of the beam The sampled RGB value is in gamma-space still, since the CRT gamma curve is due to the phosphor response, not the CRT itself adjusting the gamma curve. The BT.1886 standard calls for a 2.4 gamma for SD content, which is the default and looks good. I also added options to use 2.2 (NTSC legacy) and 2.8 (?!, PAL legacy) for fun. Most CRT shaders I’ve seen apply gamma in this way: I think it would depend on whether or not the phosphor’s response is a function of how many electrons hit it, or individual “particles” respond to the energy of the electrons hitting them, where the gaussian beam profile is just a distribution of how many particles light up. In the latter interpretation, the code as-is makes sense, while the first interpretation would call for apply a gamma function on the gaussian profile. The visual output as-is looks good to me at any rate. After this point, all color math happens in linear light, so floating point render targets is a must. Color CRTs get their colors by having colored phosphors that are arranged in some kind of grid. The venerable Trinitrons use vertical stripes of RGB, and I like that look. While CRTs don’t really have a horizontal resolution, there is a “dot pitch”, which sort of dictates resolution. This part is the key to create the “texture” of a CRT. From what I read online a typical dot pitch for consumer TVs was 0.5 – 1.0 mm, and for a typical 20″ CRT, I estimated a reasonable number of RGB triads to be ~640 or so. Close enough to BT.601 standard horizontal resolution, neat. From what I understand, this value is also referred to as “TVL”, and these values seem ballpark reasonable. When looked at a distance from the screen, the dots blend together nicely as we’d expect. It’s basically just LCD subpixels, just larger. The dot layout I used was mostly lifted from Lotte’s CRT shader, but the approach can probably be found in a million shaders already. Just alternating stripes of R, G and B. I suppose a perfect mask of 0.0 should be used here, but it doesn’t end up looking as good as I’d like, even after adding glow effects, so I think the intent behind passing through a portion of other colors is more of a pragmatic decision. At least I cannot think of a physical interpretation of why we’d want to do it. The signal we are creating has a ton of high frequency information and we need to be very careful sampling it such that obvious aliasing is avoided. The common mistake is to just render this shader at output resolution and hoping for the best. This will almost surely lead to terrible aliasing patterns in the image. Bad aliasing of the scanlines in Y direction leads to a low frequency pumping pattern in the image which is extremely distracting, and bad aliasing in the X direction leads to a horribly noisy pattern due to uneven sampling of the dot mask. The easy fix is to render the effect at an integer multiple. E.g. if input image is 240 lines, render to a height that is an integer multiple of that. For the color dot mask, make sure the horizontal resolution is e.g. 3 times the dot resolution (one pixel for R, G, B dots). I ended up with something like width = 640 * 3, and height = 240 * 6 (3x sampling for progressive). A nebulous effect of the CRT is the glow aspect to it. Anyone can tell it’s there, but it’s not entirely clear to me why this happens. Google searches don’t turn up anything useful either. Without knowing the physical reason for it, it’s hard to emulate accurately. Could it be scattering effects inside the thick CRT glass perhaps? Either way, the common way to emulate this effect is to compute a gaussian blur (lots of those around here) and composite it over the original image. Very similar to the usual HDR + bloom effect that games in the 2010s loved to overuse. The main effect here is that the phosphor dots end up blending together nicely, yet retain the added “texture” that the aperture grille pattern gives. Humans like to see some high frequency detail, even if that detail is completely bogus. That’s the common trick behind video compression after all. The glow component, boosted up a ton to make it very visible: With the typical HDR effect in HD games, only very bright pixels participate in the effect, effectively spreading excess light energy over a larger area of pixels. It makes little sense to do anything like this for a CRT shader unless there is a physical threshold where phosphors just randomly start to glow more than they should, but all of this is purely up to taste anyway. Here’s from Soul Calibur II with progressive scan, component cable emulation and 16x SSAA, without any glow added. The look is very harsh to me. (The full-screen image is needed to see it without the extreme aliasing caused by thumbnailing.) Some glow on top and it looks like: Purely up to taste how much to add of course. I like a decent amount of glow. Phosphors don’t turn off right away when they’re lit. It’s very quick though, but adding a few percent of feedback between frames seems to help a bit with making 480i games look better with less flicker. This is not really how things work in the real world I think, but a reasonable approximation. We need a high quality rescaler to get the integer sampled CRT to the screen without introducing significant aliasing from the aperture grille or scanlines. The way to go here is simply to use a proper windowed sinc or something like that. I don’t like it, so I don’t implement it. If you do, make sure to consider resampling it properly to not introduce more aliasing. A point many shaders miss is that the RGB of a modern monitor is not the same as RGB on an old CRT TV. What we think of RGB today is usually BT.709 sRGB which defines a set of color primaries and white point. Old SDTV era video uses BT.601 which is a bit narrower than BT.709. In linear RGB space, this transform is a trivial 3×3 matrix multiply. I actually learned that the very old NTSC 1953 standard defines a set of primaries that were extremely saturated compared to the standards of today. While the primaries of 1953 were aspirational, it was clearly way too early. SMPTE refined NTSC to use more reasonable primaries as part of BT.601. PAL primaries are almost exactly the same (TVs tended to use the same phosphor formulation across the world I suppose), but there’s a theoretical difference so I added both for good measure. Supposedly, Japan kept the use of legacy NTSC 1953 primaries, so that opens an interesting question if the same games actually looked vastly different in Japan compared to the rest of the world? I’ve never heard anything mention this before, so who knows. Either way, I support enabling those primaries for fun. The look of it is quite … something? It would need a HDR monitor with solid gamut to do justice. Here’s with standard BT.601 primaries: (From Legaia 2, which is a purely field rendered game, hence the scanlines) and with NTSC 1953 primaries. Almost like the “Interpret sRGB as Display P3” bullshit that phones do these days to “pop”. Given all the masking we’re doing which lower average brightness, it’s beneficial to support HDR10 rendering. Now that HDR is widely available on Linux too, enjoying some HDR CRT shaders is a good time I added a few modes where I can target a specified maximum nit level. KDE at least respects MaxCLL HDR metadata and disables tonemapping if MaxCLL falls within bounds of the display. I also added a no-tonemap option where MaxCLL = 0 (unknown), which makes KDE tonemap how it wants to. Black Frame Insertion and their friends have been a thing in emulation for ages, and it works quite well with CRT simulation, especially to sell the de-interlacing effect properly. In my implementation, I query EXT_present_timing and decide how many frames I should insert in-between. There’s a gentler falloff between the frames. The overall screen brightness decreases a lot as expected, but with HDR, we can crank the brightness of the proper frame up to compensate. It’s still very experimental and any missed frame leads to horrrrrrrible flicker at the moment (big epilepsy warning), so it’s not something I actually recommend, but it’s fun to experiment with. While simulating each field independently with scanlines, we get de-interlacing the same way a CRT would in theory. This is not free from flicker of course, but most games had mitigation strategies for this. The PS2 supported blending two frames being sent to the video output. Most games render internally at e.g. 448p @ 30 FPS, but since they cannot output that resolution without component cables, the frame is output interlaced over two fields where the CRTC scans every other line rather than every line. That tends to look quite flickery if done as-is given how aliased PS2 graphics are, so what pretty much every game did was using the two CRTCs to blend the two frames vertically before sending it by programming a 1 pixel offset with duplicate inputs. By shifting the offset every field, the 30 FPS progressive image could be scanned out nicely into a 60 FPS interlaced image. This is the “flicker filter” that some games allowed toggling. Here’s a RenderDoc capture showing that CRTC 1 and 2 are configured with one pixel offset in Y: After merging and blending the frames together, a smoothed image is sent. PCSX2 GSdx and paraLLEl-GS have modes to detect this pattern and just scan out the full 480p of course, without the added blurring. Most games fall into this pattern, which is fortunate if we want to avoid interlacing shenanigans, but not all games are so nice to deal with. The “Anti-Blur” option is designed precisely for disabling this filter. I also added an option to force-disable the automatic progressive scan, mostly to test the video output that the games would actually have output back in the day, which is interlaced video. Some games decided that they wanted to render at 60 FPS and sacrifice half the vertical resolution to do so, jittering the rendering to stay in sync with the interlaced output. These are painful to deal with to this day since they absolutely require some kind of de-interlacing solution to look good. I never got satisfactory results with a typical de-interlacer, but the CRT simulation does a quite good job at it I think. It’s not perfect (interlacing wasn’t exactly perfect on CRTs either), but it’s usable for me to the point now that I can play interlaced games as intended. It’s not really possible to demonstrate this with screenshots. Some games break if you try to promote them to progressive scan, because the games might decide for some stupid reason to use the SCANMSK feature to discard pixels every other line, and rely on the FRAME scanout mode to exactly scan out the pixels that were not masked. Kings’s Field IV is an example of this absolute insanity. I maintain a patch for PCSX2-git which supports parallel-gs and now this CRT/analog thing. This is super niche stuff that I don’t really expect many people to actually use, but it’s there for those who are interested. It does what I need at least, and that’s what’s important to me. I put together some test video clips in HEVC/PQ/4:4:4/1440p at ridiculously high bitrates. I tried AV1 but my CPU could not decode it in real time, so it is what it is ._. Clip 1 is: Raw RGB passed into the CRT. It uses the game’s native 480p and widescreen support. Super sampling is 4x SSAA. Clip 2 is: “PAL60” with 3-line comb + notch. It also uses the more default 4:3 and interlaced video. It has some frame drops which completely botch the interlace and even at comically large bitrates, the aperture grill effect doesn’t translate well, so it is what it is, but it’s a rough approximation of what it should look like. Anyway, I’m happy with the results. Time to actually play something instead of debugging stuff Analog TV input path 480i instead of 240p High refresh rate simulation Field 0: 262 lines, chroma carrier starts in + phase, ends in + phase due to even number of lines Field 1: 263 lines, chroma carrier starts in + phase, ends in – phase due to odd number of lines Field 2: 262 lines, chroma carrier starts in – phase, …

0 views

Photo Journal - Day 5

Thought I would try something different for this entry! Each of these photos were taken with my Gameboy Camera attached to an Analogue Pocket (since it allows easy exporting). I've had this cartridge since I was a kid (I included 2 photos from back then for fun)! The following photos are from when I was a kid and have been sitting on the cartridge for 20+ years. ↑ This was one of the cats we had when I was a kid, his name was Benthem. He had massive cheeks! ↑ I imagine this was one of my friend's chickens that lived in the countryside.

0 views
Thomasorus 3 weeks ago

Chemical love combo

/# The chemical love combo Chemical Love is one of the a signature moves of I-no, a character from the fighting game series Guilty Gear. The Chemical Love combos are one of the most complex things I ever had to master in a fighting game, and the biggest knowledge check I ever encountered just to be able to properly use a character. It took me days of trial and error to make it work for the first time. It's a great testimony about how older fighting games used to be humbling bottomless pits. Chemical Love is a powerful move: when doing it, I-no flips herself into the air, does a front split, and launches a sound wave what goes almost full screen and knocks the opponent down (a very powerful thing in Guilty Gear as recovery timings are fixed and give plenty of time to prepare your next attack). It's counterpart is that his execution is demanding: a half circle backward then forward motion + Kick button (or →↘↓↙← → Kick.) But this move isn't just a standalone attack you throw out of nowhere, it's also a core part of I-no's combos. And that's where it becomes both complicated and amazing. Guilty Gear XX provides a move cancelling technique called Roman Cancel . By pressing 3 buttons, it frees the character from what is it currently doing, while leaving its existing projectiles active. The basic version creates a red halo around the character. Some of those cancels, when done during a specific time window that usually last 2 to 4 frames (32 to 64 milliseconds) and only exists on specific moves, are called Force Roman Cancel (or FRC) and show a blue halo instead of red. The Chemical Love has an FRC point, meaning it can be used during combo. But as I-no lifts herself in the air at the first frame of the move, cancelling it makes her fall to the ground before she can continue and attack. And as I-no does not have a traditional running motion, she cannot catch the opponent she just hit with the sound wave. Guilty Gear XX allows character to dash in the air, and I-no can do it too. Since we are canceling the Chemical Love, a move that lifts I-no in the air, she should be able to just air dash without having to go on the ground first, right? Well no. Because if the moves gives some properties akin to being in the air (like invincibility on the legs), I-no is considered on the ground , thus she cannot air dash. She has to jump first, then do the Chemical Love in the air, then cancel it with the FRC, then air dash. Jumping and then inputing the complicated motion of the Chemical Love is near to impossible to do in such a short amount of time, which is why a tiger knee motion has to be used. A Tiger Knee motion means inputing the move motion, then an extra upward direction, then the button that triggers the move. By doing so, the game input buffer is tricked: it has the move motion in memory, but only triggers it when the button is pressed, which happens after the jump. For I-no, it means doing a half-circle backward that ends with a up-backward direction that acts as a jump, then forward, then the button (or →↘↓↙←↖ → Kick.). By doing so, I-no does the Chemical Love close to the ground, but is considered in the air. Once the character is properly considered in the air and the cancel can happen and I-no can technically air dash, the player has to input a double tap forward extremely fast before I-no falls. It's almost impossible to do when close to the ground, so once again the game buffer must be abused. Instead of doing Chemical Love > 3 buttons > Forward, Forward, it's necessary to input Chemical Love > Forward > 3 Buttons > Forward. This way, the I-no doesn't have the time to fall back on the ground and instantly air dashes outside of the cancel, allowing the combo to continue. And that's it, that's all the basics needed to do a proper combo with I-no! But it's not over. Depending on the starter before the Chemical Love, the distance, and other factors, like the weight of the character, the remaining of the combo changes. There's actually another way of doing this combo! In Guilty Gear XX, there's a technique called Jump Install , which consists of making the game believe the character is both on the ground and in the air, allowing them to store a jump or an air dash until they go back to their idle stance. The way it works is by using normal moves that are jump-cancellable , which means their recovery animations can be cancelled by the character jumping. But the animation of the jump can also be cancelled by another move before the jump starts, yet the jump still registers. Which means the character does an attack, cancels its animation to jump, then cancels the jump animation with another attack. Nothing on the screen indicates a Jump Install happened, it can only be seen after the fact, when a character uses the air dash or the additional jump, in a situation where it's normally not possible. Which is perfect for I-no! If she can make the game believe she is in the air while she is on the ground, when she cancels the Chemical Love with the FRC, she can air dash without doing the additional Tiger Knee motion. This combo is an incredible knowledge check even by fighting games standards of the period. It requires not only to know how I-no works, but also to know some Guilty Gear specific techniques that are not explained in the game manual, as well as others, more generic fighting games techniques. Before the internet allowed knowledge to be shared more easily, it was near to impossible to learn this by yourself. Today, most fighting games don't try put essential stuff like this behind a knowledge or execution barrier. For business reasons, they prefer to tone down the strength of the moves and reduce the complexity of motions, which makes the game more accessible, less punitive, and overall, more successful. Still, it feels good to do this combo in a real match. It's the same feeling as beating a hard boss in any other game. I miss this kind of feeling in more recent games.

0 views
Unsung 3 weeks ago

“Watchmaker’s delicate precision and ornate mechanical intent”

A surprising entry in the thread started by Photoshop and continuing through screwdriver handles is this 11-minute video from Errant Signal about a platformer game called Derelict Star : = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/watchmakers-delicate-precision-and-ornate-mechanical-intent/yt1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/watchmakers-delicate-precision-and-ornate-mechanical-intent/yt1.1600w.avif" type="image/avif"> I was inspired by the video, and really enjoyed its exploration of a demanding game that’s composed of just a few mechanics that are done really, really well: The number of inputs are small, but the expression those inputs allow is deceptively expansive. […] Derelict Star’s various areas are all built to explore the way movement systems function and even interact with one another. I think of user interfaces similarly, and of their need to build a certain consistent vocabulary of names, gestures, interface elements, concepts, and so on. Perhaps in an enterprise app you right click and discover something useful in a menu, and this will teach you about the usefulness of right click menus in general. Maybe pressing ⌥ to get to alternate symbols on your keyboard would inspire you (either consciously or not!) to try holding ⌥ in said menus, only to discover this brings up useful alternative options. Maybe seeing a keyboard shortcut next to one of these options will suggest to do that next time, and so on, and so on. I really loved this bit in the video that could apply to a lot more software than just videogames: It took me maybe an hour to do this, but right on the other side is a checkpoint. The game is hard, but it isn’t cruel. It’s designed to challenge you, but it has faith in your ability to complete it. The narrator uses the term “ludocentrism” to refer to games that ruthlessly prioritize the mechanics and gameplay over narrative, aesthetics, and so on. (“Ludic” meaning “relating to play.”) Of course, the calculus of what videogames care about will be different than goals of creative software or enterprise software; no one cares about the hero’s journey of the largest number in your Excel spreadsheet. But I think some version of ludocentrism applies to “boring”software as well. My beliefs here are probably something like this: #definitions #details #games #youtube you can’t reduce everything to just functionality or just efficiency, especially in creative moments of software use, and people use software creatively much more often than we suspect, including software not thought as “for creatives.”

0 views
Brain Baking 3 weeks ago

Favourites of March 2026

It’s May! What happened? This weekend was unusually hot! What happened? Everyone knows but no-one admits or cares… Anyway, welcome to another month of 2026. I like May. It’s got a lot of national holidays. It signals the start of lots of great local food: strawberries in abundance, a strong asparagus month that you should enjoy while it lasts as in June the season is usually over, and we already ate some fresh French artichokes. It’s getting warmer but not as scorching as some of the coming months (although given the start of this month, that remains to be seen). But most of all: the end of May usually indicates the beginning of the exam period, which for me as an examiner instead of student is always interesting. Let’s light a candle and pray for not too many LLM-only submissions. Previous month: March 2026 . A miracle happened: I made some time to get back into gaming—and writing about games. In May, we’re finally digging into UFO 50 , in chronological order. If we play one a week we might finish in May 2027… So far, the first entry already is a home run. Related topics: / metapost / By Wouter Groeneveld on 3 May 2026.  Reply via email . I finally got to the Kirby spin-offs on the Game Boy: Kirby’s Pinball Land , Kirby’s Block Ball , and Kirby’s Star Stacker . They’re all really good! But then Robert and a GOG discount pushed me to finally try out The Drifter . What a thrill. I loved every minute of it. If you like gritty pixelated adventure games, you can’t miss this. After being turned off by the bad technical performance of Ruffy and the Riverside on the Nintendo Switch, I switched gears to other games. I picked it up and finished it. It’s an OK N64-inspired collect-a-thon that should be enjoyed on PC instead. Speaking of Robert, his /concerts slash page is very cool: it contains scans of all concert tickets he ever went to. Kenneth Reitz tells us to separate our identity from our work/projects , otherwise bad things happen (via Roy Tang ). Stefano Marinelli explains why he loves FreeBSD . The Power To Serve conveys such as strong message, its almost convincing me to jump ship! Until I read about the laptop gap . This year huh. Zakhary Kaplan stole the GBC logo from a ROM and made a cool web logo from it. Cal Newport’s In Defense of Thinking hits yet another nail on the head. Forrest’s essay On Pulling The Master Sword links Link’s (ha!) N64 behaviour to our capitalistic world. It’s a very long essay but well worth your time if you can stomach a game rant, some swearing, and philosophical questions about life and society. Drakenvlieg manages to pull more students into literature using journaling (in Dutch). Juhis shares his favourite two-player board games . Hive (pocket) is on the list! Chris Smith rates the movies he watched . I’m always interested in the rating systems other people employ when they do something like this. I liked blinry’s Do It Yourself soft drinks experiment. Translucent coke looks weird! Night’s Ham Stock examines the ending story of SKALD the video game I played in 2024 . It was great but I couldn’t make sense of the ending. Now I still can’t… Kain Klarden’s Gex Trilogy review saved me from throwing money at Limited Run Games. Again. It Fits On A Floppy is a strong manifesto for small software that more developers should read and take heart. Eli (Oatmeal) re-iterates something very important: “choose to truly care about something.” But then he goes much further. I need to re-read this a couple of times and let it sink in. It was also Eli who pointed out the existence of picoSYNTH . Richard Moss, the author known for The Secret History of Mac Gaming , is writing a book on Age of Empires ! Ruben Schade’s enthusiasm for the Commodore 64 knows no boundaries. The newly released C64 Ultimate looks very enticing, but where to put all these things? Amelia’s little blog website/host got hammered by AI bots . It’s yet another infuriating story but the visualisation part is very cool. There’s an interesting upcoming documentary on Clojure the programming language that might be worth checking out. https://www.codingfont.com/ is a cool way to help pick a monospaced editing font. I’m using JetBrains Mono for now. Did you know Windows was released for the Game Boy: I didn’t know palm rejection was a thing on Linux/KDE . The Underkeep Steam demo looks very promising; something to keep close tabs on! I don’t know what this is, but Listography looks like a lot of fun. I happen to like lists so I should be liking this. Isowulf is a very cool isometric perspective Wolfenstein 3D mod . You can build retro games using WebAssembly with https://wasm4.org/ I love the GoodEnough guestbook that even used to print the drawn images on thermal paper! Thomas Lehmann, the designer of one of my favourite card games ever Race for the Galaxy , took the deck building genre for another spin. The result is Dark Pact . Needless to say, it’s on my list.

0 views