Posts in Gaming (20 found)
Ruslan Osipov 2 days ago

Unveiling my gaming blog: Unmapped Worlds

For the past eight months, I’ve been running two parallel writing projects. You know about this one: my weekly posts in this blog (this is post 42, by the way). But there has been a shadow project running in the background. I love video games, and I’ve collected too many opinions on them to keep them to myself. Meet Rooslawn’s Unmapped Worlds , a blog where I write essays about games. I decided to go for a phonetic spelling of Ruslan in the title, in the hopes I’ll get misnamed less. I don’t review games. Instead, I write about game mechanics and tropes, and I love breaking down how digital worlds are constructed. It’s a place where I can complain about my dislike for map markers and quest GPS, or explore the reality that I rarely actually finish the games I play. It is a home for deep dives into immersion, design philosophy, and the specific friction that makes a game memorable. A few of the pieces I’m most proud of include when I didn’t speak the language of games and difficulty sliders are dumb . Running the project anonymously was a great idea - I was able to be more vulnerable, it allowed me to experiment more with different topics and formats, and find my voice. The voice of Unmapped Worlds can be described as rambly. I’ve been thinking of it as written gumbo . It isn’t clean and corporate, there’s texture, love and care put into it, and you know it’s authentic. Gumbo is something spicy, authentic, textured, visceral, and willing to take risks that alienate some of the audience. This is unlike slop, which usually comes from the desire for inoffensive predictability and consensus, even if we have to falsify our preferences to achieve it. - The FLUX Review, episode 211 Ultimately I felt like attaching my name to Unmapped Worlds does it justice - who I am is highly relevant to the writing. Gumbo’s flavor is unique to the chef. If you like video games, see if any of the 42 (so far) essays connect with you, and consider subscribing to my newsletter .

1 views
JSLegendDev 2 days ago

Why Text in Vampire Survivors Used to Look Like This

In 2022, Vampire Survivors, a game where you destroy hordes of enemies by just moving around, released. It ended up becoming extremely popular and spawning a whole genre by itself. At the time, I was working as a software developer for a company who’s product was a complex web application. Therefore, I became a web developer. I wasn’t really interested in game development as the working conditions and pay were known to be less than stellar. However, I quickly realized that the tools used to make web applications could also be used to develop games. Since I could make games with the skills and tooling I was already familiar with, I decided to try it out as a hobby to see if I’d enjoy it. As time passed, I got interested in the various ways one could use a web developer’s skill set to make games. After some research, I found out that Vampire Survivors was originally made in JavaScript (the programming language that is natively supported in all web browsers) using a game framework called Phaser . A game framework is essentially a game engine without the UI. While this is not the case for all game frameworks, it sure was for Phaser because it packed a lot of features out of the box. You didn’t have to reinvent the wheel. I wanted to give Phaser a try after seeing high profile games made with it, like Vampire Survivors and PokéRogue (A Pokémon Roguelike fan game). However, as I started my journey to learn this framework, I quickly gave up because the documentation was confusing. You also needed to write a lot more code to achieve the same results as the alternative I was already using called KAPLAY . I therefore, stuck with it leaving Phaser behind until some time had passed. As I got more comfortable in my game dev journey, I now wanted to make a small 2D RPG game with a combat system similar to Undertale. In my game, you would avoid projectiles and attack by stepping on attack zones. The player would be expected to learn to dodge various attack patterns. I also, wanted to publish the game on Steam. Prior to this, all games I made were mostly playable on the web. — SPONSORED SEGMENT — Speaking of publishing a game on Steam, since games made in JavaScript run in the browser you might be wondering how it’s possible to release them on Steam? For this purpose, most JavaScript-based games are packaged as desktop downloadable apps via technologies like Electron or NW.js. The packaging process consists in including a full Chromium browser alongside the game which results in bloated app sizes. However, technologies like Tauri offer a different approach. Instead of packaging a full browser alongside your app, it uses the Web engine already installed on your computer’s operating system. This results in leaner build sizes. That said, regardless of the technology used, you’ll have to spend a considerable amount of time setting it up before being able to export your game for Windows, Mac and Linux. In addition, extra work will be required for integrating the Steamworks API which allows implementing, among other things, Steam achievements and cloud saves which are features players have come to expect. If only there were a tool that made both the packaging process and the Steamworks API integration seamless. Fortunately, that tool exists, and is today’s sponsor : GemShell . GemShell allows you to package your JavaScript-based games for Windows, Mac and Linux in what amounts to a single click. It: Produces tiny executables with near-instant startup, avoiding the Chromium bloat by using the system’s WebView. Provides full access to Steamworks directly via an intuitive JavaScript API. Has built-in asset encryption to protect your code. Offers native capabilities allowing you to access the host’s file system. For more info, visit 👉 https://gemshell.dev/ To get the tool, visit 👉 https://l0om.itch.io/gemshell You have a tool/product you want featured in a sponsored segment? Contact me at [email protected] I got started working on my RPG project and things were progressing pretty smoothly until I ran into performance issues. By this point, I’d been developing the game in secret and wasn’t planning to reveal it yet. But I realized I could gather valuable performance feedback by sharing my progress publicly, so I decided to do just that. It turned out that, while KAPLAY was easy to learn to make games in, it was unfortunately not performant enough. FPS would tank in the bullet hell sections of my game. After doing all kinds of optimizations, I got the frame rate to be good enough but didn’t feel confident it would remain that way as I continued development. I initially thought of moving forward regardless but quickly changed my mind thinking of all the potential negative reviews I would get on Steam for poor performance. This led me to halt my game’s development. I needed to learn a more performant game framework or game engine. Unfortunately, this meant I’d have to restart making my game from scratch. At least, I could use the same assets. Among the options I was considering learning were Phaser and the Godot game engine. Since my game was made in JavaScript, I thought trying to learn Phaser again would save me time because I wouldn’t need to learn a different programming language and development environment. I would potentially also be able to reuse code I had already written for my game. Also, Phaser was the most mature and battle-tested option in the JavaScript game dev space as well as one of the most performant. Although I didn’t like how using Phaser would result in very verbose code, the perceived advantages in my situation, outweighed the cons. However, one thing that irked me with Phaser, looking at the many games showcased on its official website, was that all of them had blurry text or text with weird artifacts. This was also true for Vampire Survivors and for PokéRogue, if you looked closely enough. Text in Vampire Survivors. Text in Pokérogue. Weird outline around the text. Arrow placed by myself. Close up. While some may consider this a small detail, it annoyed me to no end. I almost gave up on Phaser again and even started to look for alternatives. Yet, what kept me going was that, in my previous attempt at learning Phaser, I had started working on a remake of my infinite-runner Sonic fan game which was originally made with KAPLAY. I remembered that I had pushed the project on GitHub and left it abandoned. Pulling the project again, I noticed that I had already made significant progress and that the font used didn’t produce any weird artifacts. I thought that I could get around the artifact problem by just carefully selecting which font to use for my games. Because of this, I continued working on the project, learning Phaser quickly in the process. There’s something to be said about how quickly you can learn a new technology by rebuilding a project you’ve already created. Since you already know exactly what the end result should look like, you can focus on understanding the key concepts of the technology you want to learn. Because each step in rebuilding the project is concrete, you know exactly what to search for. It’s now just a matter of translating between how things are done in the technology you already know VS the one you’re trying to learn. The rebuild of my Sonic fan game was nearing completion when I needed to display text elsewhere in the game at a different font size. To my dismay, when rendering the font at a smaller size, the artifact problem, which I thought was gone (at least with the font I was using), reared its ugly head again. This was a catastrophe. I was already knee-deep with Phaser and didn’t want to switch again. None of the Phaser games I knew of had clean text, so I assumed it was something inherent to the framework. I couldn’t believe I had forgotten to check how text was rendered at different sizes before committing to Phaser. In hindsight, it was a pretty stupid move, and I felt like I had wasted a lot of time for little benefit. Artifacts present in my Sonic game. At this point, the proper thing to do would have been to cut my losses and moved on to something else. However, afflicted by the sunk cost fallacy , I thought that there was no way I would give up now. Not after having spent this much time learning Phaser. I needed to fix this issue, come hell or high water. After some research, I figured out that the reason my text had artifacts, was because of my use of Phaser’s pixel art option. Since I was making a game with pixel art graphics, this option was needed so that my game sprites would scale without becoming blurry. Phaser would achieve this by applying a filtering method called Nearest-Neighbor. The issue, however, was that it wouldn’t only apply this to sprites, it also affected fonts, causing artifacts to appear around the text, since fonts don’t scale the same way. Since Vampire Survivors also used pixel art graphics, it now made sense why the text used to look so weird. The developer probably just applied the pixel art option and called it a day. By the way, the font used in the game is Phaser’s default font, Courier, which is also a font available on many electronic devices by default. It seems like the dev really didn’t care much about this aspect of the game’s presentation. Now that the game has been moved to Unity, text is rendered properly, though still using Courier, as it has become part of the game’s visual style. However, disabling the pixel art option wouldn’t solve the issue. Text would still render blurry by default, and the sprites would remain blurry as well. How the game looks without the pixel art option set to true. Fortunately, there was a fix for the font blurriness. The text method allowed setting the resolution of the rendered text. Setting the resolution to 4 made it render clearly. Still, this didn’t help in the end because I still needed the pixel art option for my sprites. How the game looks without the pixel art option + text resolution set to 4. A potential solution to my problem would have been to use a bitmap font, also known as a sprite font. As the name implies, instead of a .ttf font, which most people are accustomed to, a sprite font is stored as an image containing a sprite for each letter. This allows the font to render properly, scaling like other sprites when the pixel art option is enabled. That said, this solution was a non-starter because each character was a fixed image. I would lose out on the flexibility of a .ttf font that allows for text to be set to italic, bold, etc… I didn’t want to lose on that flexibility and didn’t want the hassle of converting my existing .ttf font. At this point, I couldn’t believe how much effort was needed just to do a simple thing like render text properly. In frustration, I decided to open the Godot game engine and figure out how to render text just to compare with what I currently had. As expected, I got the font to render nicely automatically. I was tired of having to do this much work for something that I would’ve gotten for free in Godot, this couldn’t go on. How text is rendered in Godot. I needed to take a break, so I stepped away from the computer, and the next day, I had an epiphany. Instead of using the pixel art option in Phaser, what if I could apply the Nearest-Neighbor filtering method to each sprite individually? I looked it up, and indeed, it was possible. Using this approach in conjunction with increasing the text resolution to 4 and voilà, I had both non-blurry pixel art and text that rendered clearly without weird artifacts. How the game looks with each sprites set to Nearest filtering individually + text resolution set to 4. My problem was fixed, but at what cost? I had wasted an enormous amount of time on something that was given for free in a game engine like Godot. I started to consider that going with Phaser was probably a huge blunder. Seeing how quickly I learned Phaser using this approach of remaking one of my previous projects, it hit me, what if I tried learning Godot the same way? Without waiting further, I jumped into Godot. As expected, it was very easy to learn considering I knew exactly what to search since my project’s requirements were crystal clear. It was only a matter of looking up how things were done in Godot for each piece of functionality I needed to implement. GDScript, the programming language used in that engine, was also very easy to pick up and felt like Python which I already had experience in. Godot version of my game. After completing the project, I now had a better view of Godot. Things were intuitive, the code was not verbose and it was an all around nice experience. Before trying the engine, I had the preconception that it no longer supported web export due to the transition from version 3 to 4. I’m happy to report that this is no longer the case. I’ve been using version 4.5, and exporting to the web is just as straightforward as exporting to desktop. Godot web export setup In conclusion, I think Godot is the right choice for my RPG project. I also want to gain mastery of the engine so I can eventually experiment with creating a game that uses 3D models for environments and props, but 2D sprites for characters. Godot makes developing this kind of game far less daunting. This style has been popularized recently by Octopath Traveler using the term HD-2D, although my real inspiration comes from the DS Pokémon era, which used a similar aesthetic without the over-the-top post-processing effects seen in Octopath Traveler. Screenshot from Octopath Traveler. Screenshot from Pokémon Diamond released on the Nintendo DS. That said, I’m now presented with two choices: Make multiple tiny games in Godot to become more proficient before restarting the development of my game. Jump into development headfirst and learn what I need along the way, just like I did for the Sonic project. I’m still thinking about it, but I’d appreciate your input. Anyway, if you want to try both the Phaser and the Godot versions of my Sonic game, they’re both available to play on the web. Here are the links: Phaser 4 version : https://jslegend.itch.io/sonic-ring-run-phaser-4 Godot 4 version : https://jslegend.itch.io/sonic-ring-run-godot-version I hope you enjoyed my little game dev adventure. If you’re curious about the small RPG I’m working on, feel free to read my previous post on the topic. If you’re interested in game development or want to keep up with updates regarding my small RPG, I recommend subscribing to not miss out on future posts and updates. Subscribe now In 2022, Vampire Survivors, a game where you destroy hordes of enemies by just moving around, released. It ended up becoming extremely popular and spawning a whole genre by itself. At the time, I was working as a software developer for a company who’s product was a complex web application. Therefore, I became a web developer. I wasn’t really interested in game development as the working conditions and pay were known to be less than stellar. However, I quickly realized that the tools used to make web applications could also be used to develop games. Since I could make games with the skills and tooling I was already familiar with, I decided to try it out as a hobby to see if I’d enjoy it. As time passed, I got interested in the various ways one could use a web developer’s skill set to make games. After some research, I found out that Vampire Survivors was originally made in JavaScript (the programming language that is natively supported in all web browsers) using a game framework called Phaser . A game framework is essentially a game engine without the UI. While this is not the case for all game frameworks, it sure was for Phaser because it packed a lot of features out of the box. You didn’t have to reinvent the wheel. I wanted to give Phaser a try after seeing high profile games made with it, like Vampire Survivors and PokéRogue (A Pokémon Roguelike fan game). However, as I started my journey to learn this framework, I quickly gave up because the documentation was confusing. You also needed to write a lot more code to achieve the same results as the alternative I was already using called KAPLAY . I therefore, stuck with it leaving Phaser behind until some time had passed. As I got more comfortable in my game dev journey, I now wanted to make a small 2D RPG game with a combat system similar to Undertale. In my game, you would avoid projectiles and attack by stepping on attack zones. The player would be expected to learn to dodge various attack patterns. I also, wanted to publish the game on Steam. Prior to this, all games I made were mostly playable on the web. — SPONSORED SEGMENT — Speaking of publishing a game on Steam, since games made in JavaScript run in the browser you might be wondering how it’s possible to release them on Steam? For this purpose, most JavaScript-based games are packaged as desktop downloadable apps via technologies like Electron or NW.js. The packaging process consists in including a full Chromium browser alongside the game which results in bloated app sizes. However, technologies like Tauri offer a different approach. Instead of packaging a full browser alongside your app, it uses the Web engine already installed on your computer’s operating system. This results in leaner build sizes. That said, regardless of the technology used, you’ll have to spend a considerable amount of time setting it up before being able to export your game for Windows, Mac and Linux. In addition, extra work will be required for integrating the Steamworks API which allows implementing, among other things, Steam achievements and cloud saves which are features players have come to expect. If only there were a tool that made both the packaging process and the Steamworks API integration seamless. Fortunately, that tool exists, and is today’s sponsor : GemShell . GemShell allows you to package your JavaScript-based games for Windows, Mac and Linux in what amounts to a single click. It: Produces tiny executables with near-instant startup, avoiding the Chromium bloat by using the system’s WebView. Provides full access to Steamworks directly via an intuitive JavaScript API. Has built-in asset encryption to protect your code. Offers native capabilities allowing you to access the host’s file system. Text in Vampire Survivors. Text in Pokérogue. Weird outline around the text. Arrow placed by myself. Close up. While some may consider this a small detail, it annoyed me to no end. I almost gave up on Phaser again and even started to look for alternatives. Yet, what kept me going was that, in my previous attempt at learning Phaser, I had started working on a remake of my infinite-runner Sonic fan game which was originally made with KAPLAY. I remembered that I had pushed the project on GitHub and left it abandoned. Pulling the project again, I noticed that I had already made significant progress and that the font used didn’t produce any weird artifacts. I thought that I could get around the artifact problem by just carefully selecting which font to use for my games. Because of this, I continued working on the project, learning Phaser quickly in the process. There’s something to be said about how quickly you can learn a new technology by rebuilding a project you’ve already created. Since you already know exactly what the end result should look like, you can focus on understanding the key concepts of the technology you want to learn. Because each step in rebuilding the project is concrete, you know exactly what to search for. It’s now just a matter of translating between how things are done in the technology you already know VS the one you’re trying to learn. The rebuild of my Sonic fan game was nearing completion when I needed to display text elsewhere in the game at a different font size. To my dismay, when rendering the font at a smaller size, the artifact problem, which I thought was gone (at least with the font I was using), reared its ugly head again. This was a catastrophe. I was already knee-deep with Phaser and didn’t want to switch again. None of the Phaser games I knew of had clean text, so I assumed it was something inherent to the framework. I couldn’t believe I had forgotten to check how text was rendered at different sizes before committing to Phaser. In hindsight, it was a pretty stupid move, and I felt like I had wasted a lot of time for little benefit. Artifacts present in my Sonic game. At this point, the proper thing to do would have been to cut my losses and moved on to something else. However, afflicted by the sunk cost fallacy , I thought that there was no way I would give up now. Not after having spent this much time learning Phaser. I needed to fix this issue, come hell or high water. After some research, I figured out that the reason my text had artifacts, was because of my use of Phaser’s pixel art option. Since I was making a game with pixel art graphics, this option was needed so that my game sprites would scale without becoming blurry. Phaser would achieve this by applying a filtering method called Nearest-Neighbor. The issue, however, was that it wouldn’t only apply this to sprites, it also affected fonts, causing artifacts to appear around the text, since fonts don’t scale the same way. Since Vampire Survivors also used pixel art graphics, it now made sense why the text used to look so weird. The developer probably just applied the pixel art option and called it a day. By the way, the font used in the game is Phaser’s default font, Courier, which is also a font available on many electronic devices by default. It seems like the dev really didn’t care much about this aspect of the game’s presentation. Now that the game has been moved to Unity, text is rendered properly, though still using Courier, as it has become part of the game’s visual style. However, disabling the pixel art option wouldn’t solve the issue. Text would still render blurry by default, and the sprites would remain blurry as well. How the game looks without the pixel art option set to true. Fortunately, there was a fix for the font blurriness. The text method allowed setting the resolution of the rendered text. Setting the resolution to 4 made it render clearly. Still, this didn’t help in the end because I still needed the pixel art option for my sprites. How the game looks without the pixel art option + text resolution set to 4. A potential solution to my problem would have been to use a bitmap font, also known as a sprite font. As the name implies, instead of a .ttf font, which most people are accustomed to, a sprite font is stored as an image containing a sprite for each letter. This allows the font to render properly, scaling like other sprites when the pixel art option is enabled. That said, this solution was a non-starter because each character was a fixed image. I would lose out on the flexibility of a .ttf font that allows for text to be set to italic, bold, etc… I didn’t want to lose on that flexibility and didn’t want the hassle of converting my existing .ttf font. At this point, I couldn’t believe how much effort was needed just to do a simple thing like render text properly. In frustration, I decided to open the Godot game engine and figure out how to render text just to compare with what I currently had. As expected, I got the font to render nicely automatically. I was tired of having to do this much work for something that I would’ve gotten for free in Godot, this couldn’t go on. How text is rendered in Godot. I needed to take a break, so I stepped away from the computer, and the next day, I had an epiphany. Instead of using the pixel art option in Phaser, what if I could apply the Nearest-Neighbor filtering method to each sprite individually? I looked it up, and indeed, it was possible. Using this approach in conjunction with increasing the text resolution to 4 and voilà, I had both non-blurry pixel art and text that rendered clearly without weird artifacts. How the game looks with each sprites set to Nearest filtering individually + text resolution set to 4. My problem was fixed, but at what cost? I had wasted an enormous amount of time on something that was given for free in a game engine like Godot. I started to consider that going with Phaser was probably a huge blunder. Seeing how quickly I learned Phaser using this approach of remaking one of my previous projects, it hit me, what if I tried learning Godot the same way? Without waiting further, I jumped into Godot. As expected, it was very easy to learn considering I knew exactly what to search since my project’s requirements were crystal clear. It was only a matter of looking up how things were done in Godot for each piece of functionality I needed to implement. GDScript, the programming language used in that engine, was also very easy to pick up and felt like Python which I already had experience in. Godot version of my game. After completing the project, I now had a better view of Godot. Things were intuitive, the code was not verbose and it was an all around nice experience. Before trying the engine, I had the preconception that it no longer supported web export due to the transition from version 3 to 4. I’m happy to report that this is no longer the case. I’ve been using version 4.5, and exporting to the web is just as straightforward as exporting to desktop. Godot web export setup In conclusion, I think Godot is the right choice for my RPG project. I also want to gain mastery of the engine so I can eventually experiment with creating a game that uses 3D models for environments and props, but 2D sprites for characters. Godot makes developing this kind of game far less daunting. This style has been popularized recently by Octopath Traveler using the term HD-2D, although my real inspiration comes from the DS Pokémon era, which used a similar aesthetic without the over-the-top post-processing effects seen in Octopath Traveler. Screenshot from Octopath Traveler. Screenshot from Pokémon Diamond released on the Nintendo DS. That said, I’m now presented with two choices: Make multiple tiny games in Godot to become more proficient before restarting the development of my game. Jump into development headfirst and learn what I need along the way, just like I did for the Sonic project. Phaser 4 version : https://jslegend.itch.io/sonic-ring-run-phaser-4 Godot 4 version : https://jslegend.itch.io/sonic-ring-run-godot-version

1 views
Brain Baking 3 days ago

Pascale De Backer Likes Playing On The Game Gear

After pointing out yesterday that Sinterklaas likes the Game Boy , I feel I need to make it up to Sega. It wasn’t that difficult to come up with a counterargument that’s also part of the Flemish canon . In F.C. De Kampioenen (“The Champions”), a long running Flemish sitcom about misunderstandings and misadventures of a lowly ranked football team, Pascale De Backer—the ex-wife of the ex-trainer of the club that runs the café that is not of René 1 —has been pictured playing the Game Gear: Pascale playing Sonic on the Game Gear. Copyright VRT 2001. Pascale is playing the mobile version of Sonic in season 12, episode 2 called Stoelendans (dancing chairs I guess?). For exactly ten seconds, we hear the iconic theme song of Sonic playing and the ploing jumping sound as she presses the buttons, before throwing the thing aside and calling her daughter. She’s alone that evening and having a hard time adjusting after her daughter and son-in-law just moved out. Bieke, her daughter, is fed up with Pascale constant checking up on her. This is different from Sinterklaas playing the Game Boy for a few key reasons. First, Sinterklaas is having fun, while Pascale is just seeking a distraction and doesn’t know what to do with herself. Second, Sinterklaas, being the saint of the children, is an authority when it comes to toys, while Pascale is just a lonely café owner. Yet De Kampioenen , with more than twenty seasons, is one of the most watched Flemish TV shows of all time, and loved by virtually everyone—even the ones who saw the unfortunate downfall after season eight or so. The strangest part of this very short Game Gear appearance is that episode 2 of season 12 originally aired in 2001—the launch year of the Game Boy Advance. The GBA got to us Europeans in the late summer of 2001, and season 2 aired the 15th December 2001. Why didn’t they have Pascale play Mario Advance ? At first, I couldn’t trace the exact episode in which the above scene takes place. Being the handheld game nerd that I am, I remembered the Game Gear scene, but I misremembered the period. I went looking for it in seasons five, six, and seven because my mind reconstructed the scene as a time period correct one, when the Game Gear was in full motion. Considered it ever was in motion at all. Dang it, I did it again, sorry Sega. Perhaps the crew asked Danni Heylen who portrayed Pascale to bring a handheld device. “We’re gonna do a scene in which you’re lonely and bored, bring an electronic device to play on the couch so our viewers can place the feeling”. If she brought a Game Boy—any Game Boy would do here—she certainly wouldn’t be bored. Ah dang it, again!? The Game Gear was discontinued in 1997, only six years after its initial release. Four years later, it pops up in F.C. De Kampioenen . It turns out to be next to impossible to find local historical sales data to see when the popularity of the Game Gear dipped into obscureness here in Belgium. I do remember Sega being stronger than initially suspected: we had a Mega Drive instead of a SNES and a buddy did own the Game Gear. Me and my sisters didn’t: we went the Game Boy—and later, Color—route. The suspected reasons for that? A couple: Yes, it’s got colours, but that’s basically it. Technically, the Game Gear was essentially a shrunken down Sega Master System, which was impressive considering the Game Boy couldn’t even emulate the NES until the 1998 Color revision came by. So why does Pascale like hers so much? The still image I captured might evoke “liking” but the scene in motion does not do a very good job at convincing potential buyers. For that, we’ll need Sinterklaas. Mijn Gedacht . For the international reader enticed by this piece of excellent writing, here’s one of my favourite episodes of the TV show called Doping available on YouTube.  ↩︎ Related topics: / game gear / flemish culture / tv shows / By Wouter Groeneveld on 7 December 2025.  Reply via email . The overabundance of Game Boy games available back then (on school playgrounds, during vacation trips, in shops, …) The GB’s 4 batteries lasted for 20 hours. The GG’s 6 batteries for nearly 4. The GG initially sold for —that’s almost nowadays. The GB? The Pocket revision released in 1996 started at . That’s less than half the price! Who are you going to Link Cable Play Tetris and Mortal Kombat with if you were the poor soul with rich parents that got you a Game Gear for Christmas? For the international reader enticed by this piece of excellent writing, here’s one of my favourite episodes of the TV show called Doping available on YouTube.  ↩︎

0 views
Brain Baking 4 days ago

Sinterklaas Likes Playing On The Game Boy

Today marks the yearly departure of Sinterklaas who, together with his faithful friend Zwarte Piet , makes his way back to sunny Spain—by horse and steamboat, of course. The festivities on the sixth of December are not to celebrate his departure but to celebrate the name day of Saint Nicholas, patron saint of the children, on which Sinterklaas is based. For those of you outside of Europe thinking “Hey, Sinterklaas sounds a lot like our Santa Claus”, well guess what: Sinterklaas was here first and your Santa is just a poor imitation. In The Netherlands and Belgium, Sinterklaas is a very popular tradition, where during the run up to today, even from half of November, children can put an empty shoe somewhere near the mantelpiece in the hope of the Sint (“the saint”) and Piet visiting the house (via the roof and said mantelpiece) to drop some candy in the children’s shoes. This is usually a combination of marzipan, onze-lieve-vrouw guimauves (harder marshmellows shaped like Mary), nic-nac letterkoekjes , speculaas ( spiced cookies ), and of course various chocolate figures. The popularity of Sinterklaas inevitably also means TV shows, live shows, specialized pop-up shops, school parties, and more. In the early nineties, the then Belgische Radio- en Televisieomroep (BRT) broadcaster hosted two seasons of the Dag Sinterklaas show featuring Jan Decleir as the Sint, Frans Van der Aa as Zwarte Piet, and Bart Peeters as the innocent visitor asking nosy questions on how the duo operates. Like many Flemish eighties/nineties kids, Dag Sinterklaas is permanently burned into my brain as part of my youth. The episode called Speelgoed (toys) from the second season is especially memorable for me, as we catch the Goedheiligen Man (The Good Saint) playing… on a Game Boy! Jan Decleir as Sinterklaas, trying to figure out a shoot-em-up on the Game Boy. Copyright BRT, 1993. In the episode, Sinterklaas is annoyed by the beeps and boops coming from Zwarte Piet’s Game Boy. Piet is usually portrayed as a (too) playful character that likes to fool around instead of doing the serious stuff such as reading the Spanish newspapers and updating the Dakenkaart (rooftop chart) needed to navigate the rooftops when dropping off presents. While Bart visits, Sinterklaas showcases that “simple toys” are much more enjoyable. He encourages them to play with dusty old dolls and a toll. Eventually, Piet and Bart make it outside whilst playing horse, only to catch the Sint grabbing Piet’s Game Boy to figure out for himself what these so-called compinuter spelletjes (computer games) are about. Hilarious. Of course, that was the perfect advert for Nintendo’s handheld, especially considering the upcoming Christmas holiday period. In 1993, lots of amazing Game Boy games were released, including Link’s Awakening , Kirby’s Pinball Land , Duck Tales 2 , Turtles III: Radical Rescue , and Tetris 2 . It would be next to impossible to go after the Flemish sales data of the machine to try and prove a correlation, but if the Sint likes playing on the Game Boy, and the Sint is thé person that gets to decide what kids can play with, then why bother getting your kid a Game Gear, right? Sorry, Sega. Perhaps I even got a Game Boy game thrown down the chimney, I can’t remember. All I can remember is the chocolate, marzipan, and VHS tapes of Disney movies. I have searched high and low for a Dutch Club Nintendo Magazine that contains a message from the Sint and came up empty, but Volume 2 Issue 6 in 1990 contained a lovely letter from Santa Mario: A partial of a Christmas letter from Mario in the Dutch Club Nintendo Magazine, 1990. Copyright Nintendo. Replace the goofy Christmas hat with the mijter (mitra) of Sinterklaas, add a staff, and we’re there. Dag Sinterklaas is undeniably a local cult hit. The DVDs are nowhere to be found, and the few copies surfacing the local second hand )e)markets go for outrageous prices. Cherishing our copy, this year is the first year we watched the episodes together with our daughter. She doesn’t have the patience to sit through some of the longer ones but it’s a giant nostalgic injection seeing Jan and Frans back in action. BRT—now VRT; Flemish instead of Belgian—aired the series every single year until 2018. In 2019, because of the ageing image quality (and probably the emerging woke culture), twenty new episodes were produced. However, in my view, Wim Opbrouck never managed to truly capture the Sint’s spirit like Jan did, and Jonas Van Thielen as Zwarte Piet is just not as funny as Frans. So we’ll be stuck in Dag Sinterklaas 1992-1993 mode for the next eight or so year, until our kids realize the big ruse. And even then. I will be keeping up the tradition. Related topics: / gameboy / sinterklaas / By Wouter Groeneveld on 6 December 2025.  Reply via email .

0 views
Tara's Website 6 days ago

(very) late autumn 2025 update

(very) late autumn 2025 update Servus from Tara’s offline outpost! We reached -6°C in the past days here and a dash of snow appeared. Nothing compared to the -12°C and the amount of snow I witnessed a few days ago in the Garmisch-Partenkirchen area. Beautiful… but… better experienced from the car! Even the UI of the car wasn’t able to display that temperature properly: the minus sign overlapped with another widget on the display.

0 views
Brain Baking 1 weeks ago

Favourites of November 2025

The more holiday seasons I see coming and going, the less enthused I am by the forced celebration that tastes an awful lot like capitalism. I put up my gift guide anyway, just in case anyone is willing to buy me that dough mixer, otherwise I’ll have to do it in January as an early expense for the upcoming year. Thanks in advance! There isn’t a lot of mental space left to prepare for celebrations anyway, with the second kid giving us an equally hard time as the first. Anyway. Welcome, last month of the year, I guess. The first one who plays Last Christmas is out . Previous month: September 2025 . Not really. None, to be very precise. But I did buy yet another one: Mara van der Lugt’s Hopeful Pessimism , which sounded like it was written for me. I expect equally great and miserable things from this work. I’ve only had the time to write the review for Rise of the Triad: Ludicrous Edition (ROTT) that I ended up buying for the Nintendo Switch thanks to Limited Run Games’ stock overflow. It felt wonderfully weird to be playing a 1994 DOS cult classic on the Switch. And yes, the Ludicrous Edition is ludicrous . I finally made it past the third map! I’m still feeling the retro shooter vibe and bought the Turok Trilogy on a whim after learning it was also done by Nightdive Studios. Another smaller game I played in-between the ROTT sessions was Shotgun King that somehow manages to combine chess with shotguns, and very successfully so. Unfortunately, it’s a bit of a bare bones roguelike, difficult as hell, and therefore not really my forte. I have yet to unlock all the shotguns. Don’t buy the game on MacOS: GOG ended up refunding my purchase because it kept on crashing in the introduction cutscene. The Switch edition is fine. Slightly game related: my wife sent me this YouTube video where Ghostfeeder explains how he uses the Game Boy to make music that I think is worth sharing here: Related topics: / metapost / By Wouter Groeneveld on 3 December 2025.  Reply via email . Charlie Theel put up a post called Philosophy and Board Games on Player Elimination where I learned about Mara’s Hopeful Pessimism . On a slightly more morbid topic, Wesley thought about How Websites Die and shared his notes. Lina’s map of the internet functions as a beautiful pixelated website map that inspires me to do something similar. Kelson Vibber reviews web browsers . The sad state of Mozilla made me look elsewhere, and I’m currently using both Firefox and Vivaldi. According to Hypercombogamer the Game Boy Advance is Nintendo’s Most Underrated Handheld . I don’t know if I agree, but I do agree that both the GBA and its huge library are awesome. Eurogamer regularly criticises Microsoft and their dumb Xbox moves. The last piece was the ridiculous Game Pass advent . Matt Bee’s retro gaming site is loaded with cool looking game badges that act as links to small opinion pieces. It’s a fun guessing game as I’m not familiar with some of the pixel art. Astrid Poot writes about lessons learned about making and happiness . Making is the route to creativity. Making is balance. Alyssa Rosenzweig proves that AAA gaming on Asahi Linux is totally possible. Patrick Dubroy has thoughts on ways to do applied research . His conclusion? Aim for practical utility first, by “building something that addresses an actual need that you have”. Eat your own dog shit, publish later? Here’s another way to block LLM crawlers without JavaScript by Uggla. Wolfgang Ziegler programs on the Game Boy using Turbo Rascal , something I hadn’t encountered before. Wes Fenlon wrote a lengthy document over at PC Gamer on how to design a metroidvania map . Jan Ouwens claims there are no good Java code formatters out there. Seb shared A Road to Common Lisp after I spotted his cool “warning: made with Lisp” badge. A lot of ideas are taking form, to be continued… Speaking of Lisp: Colin Woodbury is drawn to Lisp because of its simplicity and beauty. Robert Lützner wrote an honest report on the duality of being a parent . As a parent myself, I found myself sobbing and nodding in agreement as I read the piece. Michael Klamerus shares his thoughts on Crystal Caves HD . The added chiptune music just feels misplaced in my opinion. I’m looking forward to the Bio Menace remaster as well! Felienne Hermans criticizes the AI Delta Plan (in Dutch). We should stop proclaiming build, build, build! as the slogan of the future and start thinking about reduce & re-use. Hamilton shares his 2025 programming language tier list . The funny thing is that number one on the list suddenly got replaced by a more conventional alternative. I don’t agree with his reasoning at all (spoiler: it contains AI), but it’s an interesting read nonetheless. Mikko Saari published his 2025 edition of the top 100 board game list a little earlier this year. There are a bunch of interesting changes in the top 10! SETI also pops up quite high on my list, but I haven’t had the chance to create it yet. If you live near The Netherlands, consider visiting The Home Computer Museum . They also have a ton of retro magazines lying around to flip through! Wait, there’s a Heroes of Might & Magic card game? That box looks huge! (So does the backing price…) Death Code is an entirely self-hosted web application that utilizes Shamir’s Secret Sharing to share secrets after you die. tttool is a reverse-engineering effort to inspect how the Tip Toi educational pens work. I was somehow featured at https://twostopbits.com/ and now I know why: it’s Hacker News for retro nerds. Apparently things like WhatsApp bridges for Matrix exist, which got me thinking: can I run bridges for WhatsApp and Signal to merge all messaging into The One Ring ? Emulate Windows 95 right in the browser . Crazy to see what you can do nowadays with WASM/JS/Whatever. It looks like LDtk is the best 2D game map editor ever created. Wild Weasel created a retro looking Golf video game shrine in their little corner of the internet, and the result is lovely. I should really start playing my GBC Mario Golf cart.

0 views
./techtipsy 1 weeks ago

Oops, I accidentally built a Steam Machine

I like the Steam Deck. It’s what convinced me that gaming on Linux is actually viable now. But after playing through games like God of War Ragnarök 1 , I felt like I needed an upgrade. I love playing with the Steam Deck, but what I love more is playing without having to worry about playing around with graphics settings a lot. Great story and gameplay can only hide the fact that you’re running at 720p 30Hz on a big screen for a little bit. I also get to play relatively rarely, so I might as well make it a better, more enjoyable experience. Quality vs quantity. I went on a look-out for a used PC with roughly these requirements: The AMD GPU being a hard requirement turned out to be an interesting challenge. I wasn’t looking into putting together a custom build, but was rather going for a setup that works and that I can customize according to my specific needs. Turns out that most of the PC-s out there on the market are all based around NVIDIA GPU-s, and AMD builds of this range are relatively rare, with a guesstimate of the ratio being roughly 10 NVIDIA-based machines to 1 AMD-based machine. The good side of this is that the selection process was made way simpler as I got to choose between 3-4 options in the end. During my search I also saw some machines that I would call absolute overkill, and I almost got one in a bidding war, but eventually I found a more sensible option. It also included a monitor, keyboard, mouse and three SSD-s that I didn’t really need, but the PC itself was decent. Here’s what I landed on: All-in-all, it cost me 365 EUR in Estonia in October 2025, and so far I’ve made about 25 EUR back from the SSD sales alone, with some items still up for sale. It’s not as portable as a Steam Deck, but it’s cheaper even if we account for the cost of the game controller and cables/accessories/adapters that you usually need. Regarding the operating system choice, I tried both SteamOS from the Steam Deck recovery image, and Bazzite . Both work fine and in the default couch gaming mode you won’t notice a difference, but I ended up defaulting to SteamOS because I had my setup and configuration changes tuned around that. The SteamOS recovery image approach does assume that you have an NVMe drive available, so if you lack one, you’re better off trying Bazzite as that can be installed on any drive. I replaced the NVMe SSD with a cheap 128GB one and utilized the bigger drive in the LattePanda IOTA setup that now serves as my home server. As a game library drive, I took a 1TB Samsung SSD that I had around, which roughly matches the storage that I had available on my Steam Deck that I ended up modding with a 1TB M.2 2230 SSD. With games like God of War Ragnarök taking up around 176GB , it’s not going to be the most luxurious arrangement, but for now it’s okay. The Fractal case that it came up with was one that is fully metal, with sound dampening material present on the side panels. It’s a bit banged up, but still a pretty nice experience if you have the room for storing one in your setup. The case had one flaw that I stumbled upon: the power button on the Fractal case liked to get stuck, which seems to be a common issue with that model. I fixed that with a random power button that I sourced from a local electronic parts supplier for a few euros and that works really well now, with the additional bonus of it being slightly more cat-proof. The default fan curves on the motherboard were a bit too aggressive, so I had to slightly tune them down, and now the machine is quiet while doing a great job with keeping the internals cool. You can hear a subtle whirring when you’re in the same room with it, but during gaming it stays at reasonable volumes and is not noticeable. Certainly quieter than a Steam Deck would be. The AMD GPU is a low/midrange model, but it gets the job done in 1080p gaming, and with a lot of titles it can do 4K with ease. In God of War Ragnarök I stuck with 1080p and cranked the settings, but with games like Need for Speed Hot Pursuit Remastered, I pushed the resolution to 4K with high/ultra settings, and it runs smoothly at 60Hz. This setup also taught me that Linux supports HDR now , which was news to me! My tech setup usually lags behind the state of the art, mostly because I don’t really see a need to upgrade to the latest and greatest thing out there if the current one works well enough, but this was a really nice surprise. My TV has a crappy HDR implementation, so I don’t get the full HDR experience, but it’s nice to see the TV show that HDR logo when I start up the machine. Regarding the gaming experience, I’ve only noticed a few sore spots. For whatever reason, the Need for Speed (2015) just does not start up on anything but an actual Steam Deck. It just doesn’t work here. I can’t be arsed to investigate this yet, the wonky physics in this game are perhaps not worth that effort. It’s also clear that the choice of an Intel CPU is generally fine, but in God of War Ragnarök it was running too well, so the CPU kept dropping down to lower clock speeds, which then made the game performance inconsistent. Finding that this was the issue was actually quite straightforward: when I first loaded the game, the shader compilation was taking place in the background and even though the CPU was at a constant 100% usage, the game ran quite smoothly. It only started stuttering after that was done, and the integrated setup helped confirm the issue as its most detailed preset shows the frame time and CPU clock speed graphs really well. Since this is just a Linux box, then you can of course run a few commands to fix it. 3 Here’s how I fixed it. Create a desktop entry at with the contents: Create a file with the contents: Don’t forget to mark the script as executable with . Note that the script above does require that you have set up passwordless on the SteamOS installation. This can be configured in , just make sure that the line starting with looks like this: With all that set up, in desktop mode, right-click on the desktop shortcut, “Add to Steam”, and now you can run this script any time in Steam gaming mode, even while a game is running! All-in-all, I’m very satisfied with the experience that a cheap gaming PC box provides with SteamOS. The installation is painless, my wireless controllers just work, and aside from a few rare exceptions, my games run really well. It’s also way easier on my eyes and with the 4K resolution I can actually see oncoming cars better in games like Need for Speed Hot Pursuit Remastered. 4 Less than three weeks after buying that gaming PC, the Steam Machine was officially announced. The rumored specs suggesting a 6 core/12 thread CPU, 16GB DDR5 RAM, and a custom 8GB VRAM AMD GPU that seems to be roughly comparable to an AMD RX 6600XT-ish level of performance. It seems that I have accidentally built a Steam Machine. Oops. Of course, the specs and final performance are not public at the time of writing, and the Steam Machine has many benefits (better SteamOS compatibility, good WiFi, smaller size, likely more efficient and quiet), but it’s still interesting how close I got with my setup and selection criteria. I was slightly disappointed that I got this machine right before that announcement, but then I reminded myself of the fact that I can enjoy games on the big screen right now, and the Steam Machine is scheduled for a release in Q1 2026, which can be as late as 31st of March 2026. And hey, when the Steam Machine does come out and I decide to get one, the current gaming desktop will make for a very good home server candidate with all the room that it has available, and all the six SATA ports on the motherboard sure look tempting. I’m pretty sure that the Fractal case also allows something crazy like 17+ hard drives installed in it. This approach of building my own Steam Machine of sorts did lead to me selling my Steam Deck. Better to have someone else enjoy it than having it sit in a box until its battery dies. That also serves as a major sign of confidence for this big box that makes my sparse downtime sessions more fun. If you have a machine with a modern AMD GPU, then give SteamOS a try, you might be surprised at how well it works. Even a laptop with an AMD APU can do it, as long as you temper your expectations regarding the image quality. it’s a banger, try it if you’re into the story, or you just want to indiscriminately smash and kill.  ↩︎ this is called foreshadowing   ↩︎ some might see it as “ugh, Linux moment” type of thing, but I see it as freedom to fix issues that you would otherwise be unable to even diagnose and address. Power to the players!  ↩︎ you can probably tell that I had a blast replaying that game for the 5th time recently. It’s not even the best NFS game, and yet I love playing it over and over again.  ↩︎ any modern 6-core CPU or better includes both Intel and AMD as the CPU does not matter much here 2 an AMD GPU that can do 1080p/4K gaming, depending on the game NVIDIA was out of the question due to lack of support on SteamOS Intel GPUs are a risk that I was not willing to take right now has to support an NVMe drive using the SteamOS recovery image method is dependent on this acceptable case, PSU and cooling setup if it does not burn the house down and makes the machine cool and quiet, then I’m fine with anything Intel i5-10500 6 cores 12 threads at a reasonable speed (4.2 GHz in real-life use) adequate Cooler Master CPU cooler that does a lot of RGB if needed 16 GB DDR4 RAM @ 2666 MT/s I soon upgraded this to 32 GB because my brother had some leftover modules from his own memory upgrade I forced the modules to run at 3200 MT/s. It’s memtest-stable so good enough for me. AMD RX 6600XT with 8GB VRAM some might scoff at the VRAM amount, but coming from a Steam Deck where 16GB was shared between CPU and GPU, this is plenty! 512GB NVMe SSD three 256GB SATA SSD-s previous owner put them in as RAID0, which is clever and works well as a game library some Gigabyte motherboard that works it really doesn’t matter here some Fractal Design case, possibly a Define-series one all I know is that it’s huuuuuuuuuge it’s a banger, try it if you’re into the story, or you just want to indiscriminately smash and kill.  ↩︎ this is called foreshadowing   ↩︎ some might see it as “ugh, Linux moment” type of thing, but I see it as freedom to fix issues that you would otherwise be unable to even diagnose and address. Power to the players!  ↩︎ you can probably tell that I had a blast replaying that game for the 5th time recently. It’s not even the best NFS game, and yet I love playing it over and over again.  ↩︎

1 views
Raph Koster 2 weeks ago

Recommended posts, 2017-2025

It’s been over five years since the last time I gathered up recommended posts in one place and added them to the menu above. I figured I was due. As usual this will include talks and interviews as well as articles. Just think of it as “my take on what the best stuff to look at on the site is.” Previous collections of recommended posts can be found under the Blog heading on the menu bar or at these links: All of these posts are about game design in general and tend to cover big swaths of similar territory. These posts are all specifically about dealing with multiplayer game dynamics. These posts are about the games business and how we as developers get along within it. As always, there was a decent amount of stuff posted to the blog that answered questions about older games. I should probably specifically call out that my book Postmortems came out during this time period and collects 700+ pages of virtual world history. There were a bunch for Ultima Online specifically: And there’s a few more things that are of historical interest: These posts were basically written as marketing for Playable Worlds and our game Stars Reach. However, they also serve as a pretty good manifesto for what I think MMOs ought to be like. There was a huge boom in interest in the Metaverse during this time period. And frankly, most people had no clue what the hell they were talking about, or had very little idea how online worlds and therefore metaverses would even work. Sooooo… First was a series on how they work from a data point of view, aimed particular at folks who thought blockchains solved all the issues. Hint: they don’t. Then there were a series of panels, talks, and podcasts which touched on everything from governance in a metaverse to the hard realities of building one. Trivia: did you know the first one was built during the 90s? I built one during the 2000’s! I did a fair bit of work on emulators during this period. There is much more than just these three things, but these seemed like the most worthy of calling out. Recommended posts 1998-2012 Recommended posts 2012-2017 Reconciling Games , a talk which walks through the process of game design using a fish aquarium as a lens Disassembling Games also walks through high level views of game design, but with special attention to UX design Revisiting Fun: 20 Years of A Theory of Fun is a talk from GDC updating Theory of Fun Game design is simple, actually is now the most popular post on the site, and is an overview of the entire scope of game design as a field Consent systems , a post basically about tandem emotes between two players What old tennis players teach us , which is about overturning static leaderboards The Trust Spectrum is a whitepaper based on Google ATAP research on how trust operates within games, complete with ways to measure your game design for how much trust it demands and how that affects your audience From 1 to n : Multiplayer Game Design is a talk covering all sorts of multiplayer design including trust and social mechanics Depth and Design: Contrasting Human and AI Understandings is about what depth is and whether AI can see it. This talk is mathy and crunchy. Tabletop Game Grammar is a talk applying game grammar principles to poker in particular to see how the concepts translate Start with the Sim is a microtalk about balancing system design versus experience design What drives retention is a post listing the key drivers of retention in games Best practices for community engagement is a post that covers what the title says Why NYT’s Connections makes you feel bad is a crunchy game design breakdown of Connections Sandbox vs themepark is a historical overview of where these two terms come from and what they mean Some current game economics is a response to gamer questions about why the business of games looks like it does. Even though it is years old, everything in there is pretty much still true. The cost of games is a detailed breakdown of the costs involved in game development using data from 1985 to today, which then draws conclusions about what that means for players and for developers. Industry Lifecycles is a talk version of the above, which also describes the the cyclical nature of game platforms. The evolution of ‘gamers’ is a description of the way the term “gamer” and what target market is references has evolved from the 1970s to today. Classic Game Postmortem: Ultima Online at 20 , a talk given for that anniversary Ultima Online’s influence is a post about specifically what UO did to impact games in general Ultima Online’s 25th Anniversary is about Ultima Online terrain Spam Spam Spam Humbug Interview Looking back at a pandemic simulator describes the COVID public health simulator I designed in the midst of the pandemic Classic Game Postmortem: Star Wars Galaxies is a talk given at the 20th anniversary of the game’s launch Ten Lessons Learned is more of a career retrospective talk, ten pieces of advice I would give to any game developer starting now The Evolution of Online Worlds is an hour-long video survey of the history of online worlds The Future of Online Worlds is a manifesto on what living online worlds can be like Thinking long-term is about what makes them last Designing for Social Play gives guidelines on building proper communities and societies within online worlds Player-driven economies touches specifically on how economies play into that Revealing Playable Worlds Technology describes our technical platform But First, the Game is about why that tech, and how it impacts what we can make How Virtual Worlds Work, part one How Virtual Worlds Work, part two Digital Objects: How Virtual Worlds Work part 3 Object Behaviors: How Virtual Worlds Work part 4 Ownership: How Virtual Worlds Work, part 5 Building the Metaverse session Five Big Metaverse Questions covers similar ground to the How Virtual Worlds Work series, but extends it to governance and the question of the Internet as existential threat. Real Talk About a Real Metaverse gives a pile of historical context to it all The Metacast by Naavik: Mastering Digital Worlds Microvision Emulator Release Atari 8-bit Guide for lr-atari800 and Retropie Guide to Retroarch System, Emulator, Core, and ROM Config Files

1 views
Brain Baking 2 weeks ago

Is Collecting Physical Games Worth It? (Part IV)

I bought some more expensive looking Nintendo switch game cartridges. I blame Joel ’s convincing who manages to bypass my already weak resistance to these kinds of messages. This, combined with a diminishing amount of time available to put into gaming, results into my physical backlog being larger than ever before. It’s been three years since I wrote part III and I have more thoughts so here we go. Perhaps read Part I , Part II , and Part III first. Let’s talk about pricing. In part III, I wrote: […] I’m beginning to wonder whether or not I should give up this ridiculousness. Instead, I could buy three games instead of one, and send the money where it belongs: the developers. […] There’s no denying that the price point of a physical game is much higher than that of a digital one. In general, digital versions cost about less—without taking the frequent sales into account that for some reason never happens for physical counterparts. In part III, I discovered that including taxes, physical games cost about times more! Outrageous! Or is it? It’s not! Wait, what? I decided to keep part IV a positive one and have changed my mind since complaining about the price. The higher price comes with a few advantages, hear me out. First, if something is more expensive, it takes more of a deliberate action to buy it. You don’t blindly press the add to cart and check out buttons: you first contemplate whether it’s worth it. Is this game really something I’m willing to pour time into? Should I really get this version considering my backlog already has three too long jRPGs on it? Instead of buying three games on sale in the eShop, you can only buy one so you better make that choice count. Also, precisely because of that deliberate action, I find that actually playing and finishing these games is easier. If you’ve paid that much for a game, you better pour that time into it, otherwise it’s money wasted. Chances are much lower of buying a total bust as you’ll be more thoroughly researching instead of recklessly buying. In the end, I end up enjoying these games more because I feel the need to spend more time with them. And that’s a good thing. Third, that price has never really gone up. A typical Limited Run Game costs —including shipping and taxes, that’s almost . Sixty is the about same amount I paid for a brand new copy of Paper Mario: The Thousand-Year Door in 2004 and it is about the same amount I paid for a brand new copy of the 2024 Paper Mario: The Thousand-Year Door remake on the Switch last year. When taking inflation into account , that should have been instead, an increase of . Observe the following graph depicting a very imprecise history of video game pricing from 1985 (NES) to now. The blue top line is the actual value adjusted for inflation, the red bottom line is the sticker price. Video Games Price History Chart 1985 - 2024. Yes, in the early nineties, cartridge gaming was expensive, although there were many exceptions. Most Mega Drive carts we bought were new and on sale, never reaching or their Belgian Francs equivalent. We transitioned to pirating PC games when those N64 carts became even more expensive. But the biggest takeaway from that graph is the flatline from 2000-ish to just before 2023: relatively speaking, the full price of a physical video game has been stable for more than twenty years. That means for a console game 1 and for the GB(A)/(3)DS counterpart acts as my golden reference point. Convenient then, that limited physical edition releases of Switch games also aim for that range if you include shipping and taxes. This is the reason why I will be totally fine by paying the “full price” for Hollow Knight: Silksong when the digital counterpart is only . Ridiculously cheap, by the way, as this is a slap in the face for other indie studios that struggle to get attention, but that’s an entirely different matter. Sixty “bucks”—can I say bucks when I’m in the Euro zone?—is perfectly reasonable to put down in exchange for deliberate action. Deliberate action that finally got me to sit down and finish the Rise of the Triad: The Dark War campaign while back in 1994 I didn’t even make it to the fourth level of the shareware episode, even though I admired the game. If you still find that hard to stomach, consider this: that Steam copy of your game can be retracted at any time. You’re basically just loaning it even though you’ve paid for it. This has happened before and will happen again. Meanwhile, I can sit back, relax, and laugh, clinging onto all my physical stuff that slowly but surely takes over the house, like a Creature of the Night . Even though that might be a slight exaggeration, there’s another graph that we can easily imagine if we think about value over time as an investment. I know it sounds ridiculous to think of buying games as an investment, and it is, even though many collectors treat it as such. There will be a point when Nintendo Switch games will no longer be produced, and it doesn’t take more than a few months for a price to go up according to websites like pricecharting.com . That is, this graph is the opposite of the above one: your Limited Run Game copy will become more sought after, but the devaluation of money will keep that investment more or less constant—depending on the game, amount of copies, et cetera. Meanwhile, your digital copy will be worth nada simply because you can’t get rid of it as you never really owned it in the first place. To conclude, I wrote another thousand words to confirm what I already said in part II four years ago: Physical games are usually more expensive. And that’s an advantage. Why? Because the more money I spent on a game, the more conscious the decision will be. Oh well. At least the graph is a nice touch, isn’t it? I’m going to pretend Sony PS1/PS2 games and the mass copying of CD-ROMs wasn’t a thing here.  ↩︎ Related topics: / games / collecting / By Wouter Groeneveld on 21 November 2025.  Reply via email . I’m going to pretend Sony PS1/PS2 games and the mass copying of CD-ROMs wasn’t a thing here.  ↩︎

1 views
JSLegendDev 3 weeks ago

Making a Small RPG

I’ve always wanted to try my hand making an RPG but always assumed it would take too much time. However, I didn’t want to give up before trying so I started to think of ways I could still make something compelling in 1-2 months. To help me come up with something, I decided to look into older RPGs as I had a hunch they could teach me a lot about scoping because back in the 80s, games were small because of technical limitations. A game that particularly caught my attention was the first Dragon Quest. This game was very important because it popularized the RPG genre in Japan by simplifying the formula therefore, making it more accessible. It can be considered the father of the JRPG sub-genre. What caught my attention was the simplicity of the game. There were no party members, the battle system was turn based and simple and you were free to just explore around. I was particularly surprised by how the game could give a sense of exploration while the map was technically very small. This was achieved by making the player move on an overworld map with a different scale proportion compared to when navigating towns and points of interest. In the overworld section, the player appeared bigger while the geography was smaller, allowing players to cover large amounts of territory relatively quickly. The advantage of this was that you could switch between biomes quickly without it feeling jarring. You still had the impression of traversing a large world despite being small in reality. This idea of using an overworld map was common in older games but somehow died off as devs had less and less technical limitations and more budget to work with. Seeing its potential, I decided that I would include one in my project even if I didn’t have a clear vision at this point. Playing Dragon Quest 1 also reminded me of how annoying random battle encounters were. You would take a few steps and get assaulted by an enemy of some kind. At the same time, this mechanic was needed, because grinding was necessary to be able to face stronger enemies in further zones of the map. My solution : What if instead of getting assaulted, you were the one doing the assault? As you would move on the map, encounter opportunities signified by a star would appear. Only if you went there and overlapped with one would a battle start. This gave the player agency to determine if they needed to battle or not. This idea seemed so appealing that I knew I needed to include it in my project. While my vision on what I wanted to make started to become clearer, I also started to get a sense of what I didn’t want to make. The idea of including a traditional turn based battle system was unappealing. That wasn’t because I hated this type of gameplay, but ever since I made a 6 hour tutorial on how to build one , I realized how complicated pulling one off is. Sure, you can get something basic quickly, but to actually make it engaging and well balanced is another story. A story that would exceed 1-2 months to deal with. I needed to opt for something more real-time and action based if I wanted to complete this project in a reasonable time frame. Back in 2015, an RPG that would prove to be very influential released and “broke the internet”. It was impossible to avoid seeing the mention of Undertale online. It was absolutely everywhere. The game received praised for a lot of different aspects but what held my attention, was its combat system. It was the first game I was aware of, that included a section of combat dedicated to avoiding projectiles (otherwise known as bullet hell) in a turn based battle system. This made the combat more action oriented which translated into something very engaging and fun. This type of gameplay left a strong impression in my mind and I thought that making something similar would be a better fit for my project as it was simpler to implement. While learning about Dragon Quest 1, I couldn’t help but be reminded me of The Legend of Zelda Breath of The Wild released in 2017. Similarly to Dragon Quest, a lot of freedom was granted to the player in how and when they tackled the game’s objectives. For example, in Breath of The Wild, you could go straight to the final boss after the tutorial section. I wanted to take this aspect of the game and incorporate it into my project. I felt it would be better to have one final boss and every other enemy encounter would be optional preparation you could engage with to get stronger. This felt like something that was achievable in a smaller scope compared to crafting a linear story the player would progress through. Another game that inspired me was Elden Ring, an open world action RPG similar to Breath of The Wild in its world structure but with the DNA of Dark Souls, a trilogy of games made previously by the same developers. What stuck with me regarding Elden Ring, for the purpose of my project, was its unique way it handled experience points. It was the first RPG I played that used them as a currency you could spend to level up different attributes making up your character or to buy items. Taking inspiration from it, I decided that my project would feature individually upgradable stats and that experience points would act as a currency. The idea was that the player would gain an amount of the game’s currency after battle and use that to upgrade different attributes. Like in Elden Ring, if you died in combat you would lose all currency you were currently holding. I needed a system like this for my project to count as an RPG. Since by definition an RPG is stats driven. A system like this would also allow the player to manage difficulty more easily and it would act as the progression system of my game. When I started getting into game development, I quickly came across Pico-8. Pico-8, for those unaware, is a fantasy console with a set of limitations. It’s not a console you buy physically but rather a software program that runs on your computer (or in a web browser) that mimics an older console that never existed. To put it simply, it was like running an emulator for a console that could’ve existed but never actually did. Hence the fantasy aspect of it. Pico-8 includes everything you need to make games. It has a built-in code editor, sprite editor, map editor, sound editor, etc… It uses the approachable Lua programming language which is similar to Python. Since Pico-8 is limited, it’s easier to actually finish making a game rather than being caught in scope creep. One game made in Pico-8 particularly caught my interest. In this game you play as a little character on a grid. Your goal is to fight just one boss. To attack this boss, you need to step on a glowing tile while avoiding taking damage by incoming obstacles and projectiles thrown at you. ( Epilepsy Warning regarding the game footage below due to the usage of flashing bright colors.) This game convinced me to ditch the turned based aspect I envisioned for my project entirely. Rather than having bullet hell sections within a turn based system like in Undertale the whole battle would instead be bullet hell. I could make the player attack without needing to have turns by making attack zones spawn within the battlefield. The player would then need to collide with them for an attack to register. I was now convinced that I had something to stand on. It was now time to see if it would work in practice but I needed to clearly formulate my vision first. The game I had in mind would take place under two main scenes. The first, was the overworld in which the player moved around and could engage in battle encounters, lore encounters, heal or upgrade their stats. The second, being the battle scene, would be were battles would take place. The player would be represented by a cursor and they were expected to move around dodging incoming attacks while seeking to collide with attack zones to deal damage to the enemy. The purpose of the game was to defeat a single final boss named king Donovan who was a tyrant ruling over the land of Hydralia where the game took place. At any point, the player could enter the castle to face the final boss immediately. However, most likely, the boss would be too strong. To prepare, the player would roam around the world engaging in various battle encounters. Depending on where the encounter was triggered, a different enemy would show up that fitted the theme of the location they were in. The enemy’s difficulty and experience reward if beaten would drastically vary depending on the location. Finally, the player could level up and heal in a village. I was now ready to start programming the game and figuring out the details as I went along. For this purpose, I decided to write the game using the JavaScript programming language and the KAPLAY game library. I chose these tools because they were what I was most familiar with. For JavaScript, I knew the language before getting into game dev as I previously worked as a software developer for a company who’s product was a complex web application. While most of the code was in TypeScript, knowing JavaScript was pretty much necessary to work in TypeScript since the language is a superset of JavaScript. As an aside, despite its flaws as a language, JavaScript is an extremely empowering language to know as a solo dev. You can make games, websites, web apps, browser extensions, desktop apps, mobile apps, server side apps, etc… with this one language. It’s like the English of programming languages. Not perfect, but highly useful in today’s world. I’ll just caveat that using JavaScript makes sense for 2D games and light 3D games. For anything more advanced, you’d be better off using Unreal, Unity or Godot. As for the KAPLAY game library, it allows me to make games quickly because it provides a lot of functionality out of the box. It’s also very easy to learn. While it’s relatively easy to package a JavaScript game as an app that can be put on Steam, what about consoles? Well it’s not straightforward at all but at the same time, I don’t really care about consoles unless my game is a smash hit on Steam. If my game does become very successful than it would make sense businesswise to pay a porting company to remake the game for consoles, getting devkits, dealing with optimizations and all the complexity that comes with publishing a game on these platforms. Anyway, to start off the game’s development, I decided to implement the battle scene first with all of its related mechanics as I needed to make sure the battle system I had in mind was fun to play in practice. To also save time later down the line, I figured that I would make the game have a square aspect ratio. This would allow me to save time during asset creation, especially for the map as I wanted the whole map to be visible at once as I wouldn’t use a scrolling camera for this game. After a while, I had a first “bare bones” version of the battle system. You could move around to avoid projectiles and attack the enemy by colliding with red attack zones. Initially, I wanted the player to have many stats they could upgrade. They could upgrade their health (HP), speed, attack power and FP which stood for focus points. However, I had to axe the FP stat as I originally wanted to use it as a way to introduce a cost to using items in battle. However, I gave up on the idea of making items entirely as they would require too much time to create and properly balance. I also had the idea of adding a stamina mechanic similar to the one you see in Elden Ring. Moving around would consume stamina that could only replenish when you stopped moving. I initially though that this would result in fun gameplay as you could upgrade your stamina over time but it ended up being very tedious and useless. Therefore, I also ended up removing it. Now that the battle system was mostly done, I decided to work on the world scene where the player could move around. I first implemented battle encounters that would spawn randomly on the screen as red squares, I then created the upgrade system allowing the player to upgrade between 3 stats : Their health (HP), attack power and speed. In this version of the game, the player could restore their health near where they could upgrade their stats. While working on the world scene was the focus, I also made a tweak to the battle scene. Instead of displaying the current amount of health left as a fraction, I decided a health bar would be necessary because when engaged in a fast paced battle, the player does not have time to interpret fractions to determine the state of their health. A health bar would convey the info faster in this context. However, I quickly noticed an issue with how health was restored in my game. Since the world was constrained to a single screen, it made going back to the center to get healed after every fight the optimal way to play. This resulted in feeling obligated to go back to the center rather than freely roaming around. To fix this issue, I made it so the player needed to pay to heal using the same currency for leveling up. Now you needed to carefully balance between healing or saving your experience currency for an upgrade by continuing to explore/engage in battle. All of this while keeping in mind that you could lose all of your currency if defeated in battle. It’s important to note that you could also heal partially which provided flexibility in how the player managed the currency resource. Now that I was satisfied with the “bare bones” state of the game, I needed to make nice looking graphics. To achieve this, I decided to go with a pixel art style. I could spend a lot of time explaining how to make good pixel art but, I already did so previously. I recommend checking my post on the topic. I started by putting a lot effort drawing the overworld map as the player would spend a lot of time in it. It was a this stage that I decided to make villages the places where you would heal or level up. To make this clearer, I added icons on top of each village to make it obvious what each was for. Now that I was satisfied with how the map turned out, I started designing and implementing the player character. For each distinct zone of the map, I added a collider so that battle encounters could determine which enemy and what background to display during battle. It was at this point that I made encounters appear as flashing stars on the map. Since my work on the overworld was done, I now needed to produce a variety of battle backgrounds to really immerse the player in the world. I sat down and locked in. These were by far one of the most time intensive art assets to make for this project but I’m happy with the results. After finishing making all backgrounds, I implemented the logic to show them in battle according to the zone where the encounter occurred. The next assets to make were enemies. This was another time intensive task but I’m happy with how they turned out. The character at the bottom left is king Donovan the main antagonist of the game. Further Developing The Battle Gameplay While developing the game, I noticed that it took too much time to go from one end of the battle zone to the other. This made the gameplay tedious so I decided to make the battle zone smaller. At this point, I also changed the player cursor to be diamond shaped and red rather than a circle and white. I also decided to use the same flashing star sprite used for encounters on the map but this time, for attack zones. I also decided to change the font used in the game to something better. At this point, the projectiles thrown towards the player didn’t move in a cohesive pattern the player could learn over time. It was also absolutely necessary to create a system in which the attack patterns of the enemy would be progressively shown to the player. This is why I stopped everything to work on the enemy’s attack pattern. I also, by the same token, started to add effects to make the battle more engaging and sprites for the projectiles. While the game was coming along nicely, I started to experience performance issues. I go into more detail in a previous post if you’re interested. To add another layer of depth to my game, I decided that the reward you got from a specific enemy encounter would not only depend on which enemy you were fighting but also how much damage you took. For example, if a basic enemy in the Hydralia field would give you a reward of a 100 after battle, you would actually get less unless you did not take damage during that battle. This was to encourage careful dodging of projectiles and to reward players who learned the enemy pattern thoroughly. This would also add replayability as there was now a purpose to fight the same enemy over and over again. The formula I used to determine the final reward granted can be described as follows : At this point, it wasn’t well communicated to the player how much of the base reward they were granted after battle. That’s why I added the “Excellence” indication. When beating an enemy, if done without taking damage, instead of having the usual “Foe Vanquished” message appearing on the screen, you would get a “Foe Vanquised With Excellence” message in bright Yellow. In addition to being able to enter into battle encounters, I wanted the player to have lore/tips encounters. Using the same system, I would randomly spawn a flashing star of a blueish-white color. If the player overlapped with it, a dialogue box would appear telling them some lore/tips related to the location they were in. Sometimes, these encounters would result in a chest containing exp currency reward. This was to give a reason for the player to pursue these encounters. This is still a work in progress, as I haven’t decided what kind of lore to express through these. One thing I forgot to show earlier was how I revamped the menu to use the new font. That’s all I have to share for now. What do you think? I also think it’s a good time to ask for advice regarding the game’s title. Since the game takes place in a land named Hydralia . I thought about using the same name for the game. However, since your mission is to defeat a tyrant king named Donovan, maybe a title like Hydralia : Donovan’s Demise would be a better fit. If you have any ideas regarding naming, feel free to leave a comment! Anyway, if you want to keep up with the game’s development or are more generally interested in game development, I recommend subscribing to not miss out on future posts. Subscribe now In the meantime, you can read the following :

0 views
Brain Baking 3 weeks ago

2025 Holiday Gift Guide

This post is inspired by Johnny Webber’s 2024 Holiday Gift Guide that serves as a great starting point if you don’t know what to get for your friends & family. Johnny’s list is broad and includes suggestions from tech to food, arts, gaming, books, and even writing material. Making Christmas wish lists seems to become harder and harder as I get older and already have way too much stuff. When we are young, without access to a disposable income, the holiday period somehow felt more exciting. Flipping through toy store ad leaflets, whipping out scissors to cut and paste the things that drew our attention onto a separate colourful piece of paper for Santa to take a good look at. I want this one , and don’t you dare to buy me that cheap alternative! We try to cut our way through the few ads that still land in our mailbox but it doesn’t feel the same any more—a part of the genuine childlike excitement is gone for good. It took me a while to come up with six items that made it to my list. Like Johnny, I’m only recommending things I like. Here’s a collage representing that list: The 2025 Holiday Gift Guide: six suggestions. First, the UFO 50 Nintendo Switch game—specifically the physical version published by Fangamer.eu , obviously. There’s still a lot on my wish list, so any of the following is great as well: Streets of Rage 4 Anniversary Edition , Unicorn Overlord , The Legend of Zelda: Echoes of Wisdom , Monster Boy & The Cursed Kingdom . If you happen to come across a copy of Powerslave Exhumed by Limited Run Games that’s been out of print for a while, that would be very nice too. If you have no idea but want to make sure it’s a good game, check out my Top 100 suggestions . Second, a gift coupon to spent at our local book store GRIM . Although my wife reminded me that we still have two coupons lying around that need to be used. I tried to come up with a concrete book title but my wanted list is a mess and I just bought six books that I haven’t touched yet. Feel free to add your own favourite entry. Third, Sailor’s Manyo Ume fountain pen ink: a dark red/brown colour with a unique sheen (see the Mountain of Ink review ). Or add a tint of Pilot Irushizuku ink, but I’ve never tried Sailor’s before and don’t have a colour that matches this range. Hopefully this will entice me to get back into writing on paper more which is a hobby I’ve been neglecting too much lately. Fourth, the Lord of the Rings: Fate of the Fellowship board game. I mentioned in the SPIEL Essen post that I wanted to grab a copy but ultimately left it for the Christmas list, so here it is. Two equally chunky alternatives might be Tea Garden or Creature Caravan . If you’re looking for a lighter game, perhaps check out my modern trick taking suggestions instead. Fifth, Manet’s Bundle Of Asparagus . The original one, please. Enlist the Ocean’s Eleven crew and send them to the Wallraf-Richartz Museum in Cologne, Germany. Or, if they happen to be busy, order a high quality reproduction, through for example Wahoo Art . I’m unsure about the working conditions and ethical beliefs of that system as I just stumbled on it, but if that’s not an option, just a nice print will do. We’ll have a resin coating added later that makes it look like the real thing. Ever since reading about the painting in Alain de Botton’s Art As Therapy , I’ve wanted to hang a copy in the kitchen. Plus, we’re very fond of asparagus. Lastly, a heavy duty dough mixer, or more specifically, the Italian made Famag Grilletta IM5S . These spiral mixers are not cheap and come in at around so just a donation towards it will suffice. I’ve been kneading by hand for twelve years but with the kids and our increased bread consumption rate it’s getting harder to keep up. Plus, the Grilletta that kneads any dough to windowpane without blinking twice will finally enable me to make smooth buttery dough and up the hydration in the more rustic recipes. The IM5S—contrary to the IM5 model without the S—can be tilted to remove the bowl and more easily clean it. Still unsure? My archives tell me the following things made it to previous Christmas wish lists: Happy holidays! Related topics: / Christmas / By Wouter Groeneveld on 19 November 2025.  Reply via email . WoodWick candles Random Magic: The Gathering boosters An Apple Magic Keyboard I never got and eventually bought myself An authentic Belgian waffle iron (you can’t live without this if you’re living in Belgium) The book Sourdough by Robin Sloan The cookbook Marie Plukt De Dag More Switch games like The Witcher 3 , Dragon Quest XI , and Metroid Dread A GameCube HDMI adapter A lovely pen roll to protect your precious fountain pens on the go A soldering iron

2 views
Brain Baking 3 weeks ago

Why I Don't Need a Steam Machine

For those of you who are living under a rock, Valve announced three new hardware devices joining their Steam Deck line-up: a new controller, a VR headset, and the GameCube—no wait, GabeCube—no wait, Steam Machine. The shiny little cube is undoubtedly Valve’s (second) attempt to break into the console market. This time, it might just work. The hardware is ready to arrive in at your living room spring next year. The biggest question is: will it arrive at our living room? Reading all the hype has certainly enthused me (e.g. Brendon’s The Steam Machine is the Future , PC Gamer’s Valve is all over ARM , Eurogamer’s Steam Machine preview , ResetEra’s Steam Hardware thread ); especially the part where the Machine is just a PC that happens to be tailored towards console gaming. According to Valve, you can install anything you want on it—it’s just SteamOS just like your trusty Deck, meaning you can boot into KDE and totally do your thing. Except that this shiny little cube is six times as powerful. I’m sure Digital Foundry will validate that next year. Valve's newly announced Steam Machine: a mysterious looking sleek black box. However, this post isn’t about specs, expectations, or dreams: it’s about tempering my own enthusiasm. I’d like to tell myself why I don’t really need a Steam Machine. The following list will hopefully make it easier to say no when the buy buttons become available. So you see, I don’t really need a Steam Machine… Fuck it, I’m getting one. Related topics: / steam / games / By Wouter Groeneveld on 16 November 2025.  Reply via email . You’re a retro gamer. You don’t need the power of six Steam Decks. To do what, run DOSBox? Your TV doesn’t support 4K . Again, no need for those 4K 60 FPS. You generally dislike AAA games. With The Steam Machine, you might be able to finally properly run DOOM Eternal and all of the Assassin’s Creed games. That you don’t like playing. You don’t have time to play games anyway. Ouch, that hurts but it’s not untrue. The TV will be occupied anyway. The Steam Machine is not a Switch: you can’t switch to handheld mode. When are you going to play on the Machine if the TV is being used to watch your wife’s favourite shows? You already have too many gaming related hardware pieces. That’ll mean you’ll have to divide your time by an even bigger number to devote an equal amount to playing them. There’s no room for yet another nondescript box under the TV. See above: why don’t you first try to do something with that SNES Mini and PlayStation Mini besides letting it collect dust? You’re a physical gamer. This is Steam. There will be no insertion of cartridges, no blowing of carts, and no staring at game collections on a shelf. It’s Steam, not Good Old Games. Sure it can run GOG games but the Machine is primarily designed to run Steam. You avoid purchasing from Steam like the plague, yet you’re willing to buy a Machine dedicated to it? Are you crazy? The last time you booted Steam was over a year ago. Don’t tell me you’re suddenly interested in running the platform on a dedicated machine. You don’t have time to fiddle with configuration. Button and trackpad mappings to get the controls just right enough to play strategy games designed to be played with keyboard and mouse will only leave you frustrated. Your MacBook can emulate Windows games just fine. You recently bought CrossOver and played Wizordum and older Windows 98/XP stuff on it. It even runs Against The Storm flawlessly. No need for Proton or whatever. In two years, you’ll upgrade your M1 to an M4+: there’s the power upgrade. If CrossOver is struggling to run that particular game you so badly want to play, it’ll be buttery smooth in a few years. You’re going to do the laptop upgrade anyway regardless of the Steam Machine. You already have a huge gaming backlog. Thanks to your buddy Joel you bought too many physical Switch games that are still waiting to be touched. Are you really ready to open up another can of worms? You dislike a digital backlog. It’s easy to have hundreds of games on there: see your GOG purchases. Why don’t you try to count the ones that you actually played, let alone finished. You’re not going to use the Machine to run office software. Your laptop and other retro machines are good enough at handling that task. What are you really going to do with this cube besides gaming? Those cool looking indie games will be released for Switch in due time anyway. Remember Pizza Tower ? It’s out on Switch now. Remember to buy the cart on Fangamer, together with the Anton Blast one. It’s rumoured to cost more than . Save that money for a Switch 2 if the games are starting to become interesting to justify that upgrade, as currently, they’re not. Also, see the backlog point above. All HDMI ports both on the TV and your external monitors are occupied . Unless you’re willing to constantly switch cables, you’ll need to invest in a HDMI switch. Another . You can’t buy this without buying the Steam Controller. That’s easily another you already spent buying the Mobapad controller for your Switch as a replacement for the semi-broken Joy Cons. You can’t buy this as an expense on the company. You’re closing down the company, remember. (More on that later) The cool looking LED and programmable front display don’t justify an expensive purchase. After the initial excitement wears off, the LED will become annoying and you’ll simply turn it off.

0 views
Playtank 4 weeks ago

Maximum Iteration

The quality of your game is directly related to the number of iterations you have time to make. The adage is that game development is an iterative process . We know we should be tweaking and tuning our game until it feels and runs great. To make it the best it can be; greater than the sum of its parts. Early on, to make sure that the features we work on are worth pursuing. An iteration can be as small as an incremented variable or as big as a complete reset of your entire game project. What iterations have in common is that the only way to get more of them is to teach yourselves the right mindset and to continuously remove anything that costs time. For the past few years, this has been at the top of my mind: how to maximise iteration . At the very highest level, you need to remove obstacles, clicks, and tools. The fewer things a developer needs to know and do per iteration, the better. Those three are what this is all about. I’ve come up with five areas where you need to optimise iteration, that I’ve obsessively built into my own pipelines. These five are what the rest of this post elaborates on: Iterating on object and state authoring means creating new objects and states and connecting them to data. A character that can roam, shoot, and take cover, and has MoveSpeed, TurnSpeed, and Morale, perhaps. This is one of those things where many developers will get used to how their first engine does things and forever see it as the norm. But most tools for object authoring are actually quite terrible (in my opinion), and are also highly unlikely to match your specific needs. They are far more likely to present you with hoops to jump through and prevent you from achieving fast iteration. It’s not unusual for getting a new object into a game to take hours and involve multiple people. Particularly if the game’s pipeline has grown organically over several years of production. Where you only had to add a single collision capsule at first, maybe you must now add a full ragdoll, two different sets of hit capsules, IK targets, and a bunch of other things before the new asset works as intended. Some of which has to be created manually. Forget one step, and your game may crash or exhibit weird results. This is a big threat to iteration. Maybe the biggest. So if you can, you should make your own tools for object authoring that are perfectly suited to your needs, require as few steps as possible, and waste as little time as possible. Or use a tool that’s specifically made for exactly the thing you need, if you can find it. I tend to think of objects in systemic design as Characters, Props, and Devices. This is not in any way strict, it’s only what my favorite designs tend to need. If you are working on a grand strategy game, a puzzle game, or something else, the nature of your objects may vary. The key to object authoring is variation. A lamp is not the same thing as a crate or a human, but they should be able to interact in interesting ways. To make them interact, you need to be able to vary them easily and then hand off responsibility to the game’s systems in a predictable way. Something that can’t be stressed enough is to always set working defaults for all of your objects. Make sure that objects work out of the box so iteration can begin immediately. Few things waste more time than “oops, forgot the flag that did the thing.” The most intuitive way to represent objects is to use objects, unsurprisingly. A Character can be expected to do certain things and a Door will do other things. Enemy and Player can now inherit from Character and they may make use of a Gun or a Broom depending on the kind of game you’re making. With this setup, authoring objects is no harder than inheriting from the right class and then tweaking the numbers. This is how Unreal Engine is used by many teams. But this gets cumbersome if you want a character that can fly or to utilise the dialogue system in a character but for something that cannot move. Or maybe the spline following that characters have, but now for a train car. Authoring with object-oriented systems seems intuitive but doesn’t handle exceptions well. Everything now needs to be a character if it wants to access certain things, and designers will have to learn the intricacies of all the objects in the game before they can truly begin iterating. If you want your object to collide with things in a physics simulation, you add a Collider. If you want it to move on a flow field, you add FlowFieldMove. The sum of an object’s components dictates its behavior. This may use many different types of component setups, but the two most common are GameObject/Component (GO/C) and Entity Component System (ECS). Both Unreal and Unity uses the first, but in very different ways. Both Unreal and Unity also provide ways to use the second, but in ways that are mostly incompatible with the first. Conceptually, component-based object authoring is great. In practice, it tends to be a deep rabbit hole of exceptions and flawed component combinations that have grown organically through an engine’s lifetime. Most game engines today are data-driven at some level. You plug data in, it gets compiled into an engine-friendly format, and voila: the engine knows what to do. The data is picked up by a renderer, physics engine, or something else, and things simply happen just the way they are supposed to because the data is clear enough to just chug along. Like feeding coal into a steam engine. With a data-driven approach, you will usually be collecting all that data and bundling it up using authoring tools. Bring in the mesh asset, animate it using animation assets, play some sound assets on cue, etc. The data itself will drive the process. For example in a “target-based” setup, where one piece of data activates another which activates a third, etc., until the game level or other logic has run its course. You need ways to define how something goes from Alive to Dead, or when something should be Idle instead of Moving. This layer of authoring and iteration is very rarely straightforward, and parts of it are almost always deep down in the code for your game. This is bad. So let’s discuss how to make it not bad, and how to open up your game for more direct rules authoring through state transitions. If my use of the word “state” in this post gets confusing, you can look into the state-space prototyping post to see what I mean. This is not standard jargon used by all game developers, but it is a key part in my own framework. A good state authoring tool allows you to list which states an object can be in, where it can collect changes from, and how it behaves in relation to other objects and their state. Just to be clear: this doesn’t have to be complex at all. It can be enough to list the actions an entity can use and then leave it to other systems to actually select actions. Take a look at the An Object-Rich World post if you are curious about other models for working with permissions and restrictions. The most important element of permissions and restrictions is predictability . There are many cases where our games become interconnected in ways that are not immediately visible. For example, when you say that a character’s ability to Move has been restricted due to a state, you may have to manually add this to multiple places. Perhaps the sound, animation, and head-bobbing system also need to be paused separately. This is extremely bad, because it means both that you will get unpredictable results and that you will often have to revisit the same changes. A specific state is only relevant for a particular object. A generic state can be used by any object sharing the same characteristics. Think of the idea of spotting something, for example. A sensor picking up that an object can be seen. If a player is going to spot something, this needs to be specific , since the player’s avatar, unlike a NPC avatar, will generally have a camera attached to it. So to check if the player spots something, we can use the camera’s viewport to determine if the thing is on-screen or not. A generic version of the same thing could instead use the avatar’s forward vector, an arbitrary angle, and perhaps a linecast, to determine if the object can be seen. This could be used by any avatar, player or otherwise, and would probably be accurate enough if your game doesn’t need more granularity. An exclusive state is the only state that can be run at a given time, whereas an inclusive state also allows other state to run alongside it. Parallell states are made to run at the same time as each other and may therefore not poke at the same data, or you could get unpredictable results. A state is conditional if it only activates based on preset conditions. It’s your if-then-else setup. Conditionals will often need considerable tweaking, and if you’re not careful in how you build such systems, they can turn into a tangled mess. Just like nested ifs. Common ways to handle conditional states are predicate functions, tags, flags, and many of the other things brought up in the A State-Rich Simulation post. Preferably, setting or changing conditionals should be just a click or two, and it should respect the type of data separation mentioned earlier. When a game has multiple dynamic sources for conditions, it quickly gets complicated. For this reason, your tools should provide debug settings for visualising where conditions are coming from, and you can also log everything that gets triggered by certain conditions during a session. A state is injected when it’s pushed into an object. This can follow any number of systemic effects , from straightup addition to slightly more granular propagation . Common points in a game simulation for state to get injected are collision events, spawning or destruction, proximity, spotting, and various forms of scripted messaging. This means that having a solid system for defining such injections is a great starting point for how transitions will work in your game. If you have the concept of a Room, for example, this Room may keep track of what’s inside of it and then propagate that knowledge to anyone visiting the room. Objects would then inject their presence into the room, while the room would inject relevant state into the objects in turn. An explicit conditional state is something like the Idle state pushing a Move state onto an internal stack because move vector magnitude is higher than zero. These are the only circumstances where Move will ever happen, making it an explicit transition. A dynamic state would be something like a gunshot killing you by injecting the Dead state. This is a dynamic transition because it can happen at any time, and beyond any restrictions on the injection itself (ammo, aiming, etc.), you won’t be defining anything in advance, and you’re not really waiting for it to happen. It happens when it happens, or it may not happen at all. A state is timed if it remains active for a limited time. It can also loop over a given duration and either bounce back (i.e., from 0 to 1 back to 0) or it can reset and repeat. The current value of the timed state is often referred to simply as T and should be a normalized (0-1) floating point number. This type of state is extremely handy, and you will want to tweak how the T value output gets handled in as many varied ways as possible. You want to be able to use curves, easing functions, and all thinkable different kinds of interpolation. Timed state can be used to achieve anything from a Thief -style AI sense of “smell,” to a menu blend, to an animation system, to reward pizzazz. It’s the perfect type of state for an interstitial and is where you will be able to do much of your polish. A state is interstitial when it’s added between other states without affecting them beyond the delay this may cause. Screenfades, stop frames, and sound triggers, are some examples of this. Objects and states will be defining the game at its highest level. But you will also want to change the rat catcher’s catching range from 2.3 to 2.5 and maybe add an additional key to a curve to make a fade-in smoother. It’s been mentioned before, but may be worth repeating: you should separate data from objects from the very beginning of your project. Every second you can avoid having to navigate the jungle of files in your project is a second gained towards additional iteration. Remember: remove clicks and remove tools. Many games will expect either a database approach (“spreadsheet specific,” in Michael Sellers’ terms), or they will have a hard connection between an object and its data. But a good data authoring tool is either integrated with the game engine or is an established external tool, such as a spreadsheet or database, that has a single-click or dynamic export/import process into the game. Many games still to this day keep data hard-coded into their compiled executables. This can be done for security or obfuscation reasons, out of habit, or because the engine used for a certain game is structured that way. For a small game with simple data, this is rarely an issue. You can make your changes, recompile, and then test, within seconds. But for bigger or more complex projects, it can have a cascading effect on iteration complexity. It also forces you to rely on programmers even for changes that have nothing to do with game logic or code. If you can avoid this, do so. It doesn’t matter if a compile takes five minutes, it’ll be stealing those five minutes over and over again. It will also decrease the number of iterations you can make. Issues with compiled data are not new. One common way to avoid some of them is to use lightweight text files that can be loaded and interpreted at runtime. This can be done in one of two ways. You can construct data this way . The below is a small example of this, where Lua was used to package information about different sectors in a space game. In this case, a sector has details about which other sectors the player can travel to, which pilots are present in the sector, and which stations and colonies can be visited. This is information that could’ve been hardcoded into the client, but this way it’s made available at runtime and much easier to iterate on. You can build logic this way . The next example is also Lua, but is a narrative sequence from the same space game. By exposing gameplay features to Lua, it becomes possible to script these sequences that can be loaded and parsed by the engine on demand. One benefit of this is that you can rewrite the script, make the engine reload the data, and then test within moments of making the change. If there’s such a thing as a standard today, it’s to store your data in a database. This database may live on a proprietary server owned by the developer or publisher, or it can utilise something in the cloud, like Microsoft Azure or Amazon Web Services (AWS). It can also be an offline database that you store with your game client much like a script. A database forces you to decouple data from objects and allows live editing of data (if in the cloud). Most modern live service games do this for some of its data, if not all, as it makes it a lot easier to respond to community feedback and fix data-related issues. Planning how you structure your data before a project begins can save you many headaches. If you want to do MoveSpeed, you could have a MoveSpeed baseline multiplier at 1.0, each object could have a MoveSpeed attribute of maybe 10-20, and gear or other props could then add their own MoveSpeed modifiers on top as additions, multipliers, cumulative multipliers, or some other thing. You’d get something like MoveSpeed = Baseline * (Attribute + Modifier(s)) . If you manage to separate these from their objects you can mix things up for any reason you want without ever touching or even looking for the objects ever again. The amount of time this saves for more iteration can’t be overstated. (Again: remove clicks, remove tools.) Maybe you want to modify Baseline based on difficulty, so that MoveSpeed is 1.5x on Easy, but only 0.75 on Hard. Or go in there and double the MoveSpeed attribute for all enemies that have the Small trait. With this type of separation, all of those things can suddenly be done in seconds. This makes everything from bulk operations to conditional exceptions a lot easier to make and therefore to iterate on. A change set is a collection of changes made to your existing data. You can look at it as a changelist or commit in version control. Bundling variables into change sets is a handy way to keep track of what you are doing and makes it easier to compare one change to another. Change sets really come into their own if you can combine them, turn them on/off, and provide more than one at a time. Over time, these sets can become like a log for your earlier tweaks, creating a kind of tweak history for your game’s design. To know how any iteration works out you need to play it. But it’s not enough to merely play as you usually do. You need to compare changes and report when something doesn’t work out. Even as a solo developer, a solid reporting tool can be the difference between fixing problems and shipping with them. This is where your change sets from before will work their magic. Let’s say you made a “goblin damage debuff” change set where you decreased how much damage the goblin dealt by half, and you now go into your change set tool to activate that change set. Or you tell external playtesters to play once with and once without the change set. You can suddenly talk about balancing the same way you’d talk about feature implementations. I encounted Semantic Versioning during my first mobile game studio experience, at Stardoll Mobile Games. I’ve stuck to it ever since. The summary for Semantic Versioning is so simple, yet so powerful: “Given a version number MAJOR.MINOR.PATCH, increment the: This is a convenient way to plan your assets. The Patch version can be automatically incremented whenever you build your game to identify each change and you can regulate when the Minor and Major version must be incremented. For example, you can plan that you only release a new Major when you are releasing new content and a Minor when features are added or changed. At Calm Island, we used to maintain one Dev and one Stable branch. The latter meant we could always show the game to any external stakeholders, even if it may have been an older build. The stable version was also the one deployed to stores after final validation. The idea to always keep your game playable may sound self-explanatory, but good processes for this are uncommon. Many studios still use a single main branch for everything and when a deadline looms the only way to safeguard its health is to enact some kind of commit/submit stop where no one is allowed to push anything that risks the playability of the build. This often results in a rush of new code and content right after the stop is lifted, that almost always breaks something and may take days or weeks to resolve. A common issue with playtesting is that you need to jump through hoops before you can test the thing you’re actually working on. This can be because you need to launch the game, go through the splash screen, load the right level, noclip or teleport to the right place, etc., before you actually play . If your game is unstable (see Always Playable above), this can be further exacerbated by crashes or bugs that are not yours to fix. To avoid this it’s important to be able to do targeted testing. Using isolated environments, such as a “gym” level for movement testing, and testing exactly the thing you just tweaked or implemented without any distractions. You need to be able to mix and match both systems and change sets in your game, to iterate as much as possible. Play without the enemy AI running, no props spawning, or with that goblin damage debuff or double move speed turned on or off. You can look at this like the layers in Photoshop, where you can turn things on or off so they don’t impact your testing when you need to test something specific. Once you have a modular setup, make sure that you can switch quickly and easily between different modules as well. Make them incerchangeable. If you need to test playing against only a single goblin, but that goblin can’t move, and you have only torches and stale bread; then it should be as few clicks and tools involved as possible to do so. Once the data is separated, you can take it one step further: you can remove entire segments of your game and isolate iteration and testing to retention loops or other longterm systems. Think of a standard game loop. You have some inputs into each session, such as matchmaking settings or difficulty selection. This input affects how the session plays. Once the session completes, you get outputs , such as XP or treasure , that you can then reinvest into progression. This is the template for many standard game loops. Simulated state allows you to pretend that one of these steps happened without actually having to take the time to play them. You can randomise the inputs and then play, or skip the session entirely to only work on the output and investment cycle. Once you reach the modular and interchangeable iteration dream, this is quite possible. The value of this type of testing is high, since longterm systems often don’t get the testing they need simply because you must finish a real session of gameplay to get the “proper” outputs. Being able to compare different iterations to each other and choose which comparisons to make is more of a meta tool than it’s directly testing related. It’s more about comparing the results you gain from testing than the testing itself. Look at the Game Balancing Guide for some inspiration on what kinds of things you could potentially compare. If you find something that’s not great or that you want to revisit, make it easy to take notes or report to a central system; you may even go so far as to generate planning tickets from an in-engine event. Have your testers press some easy to access key combination (on controllers, maybe to hold both triggers and both stick buttons down for one second). Sometimes in a big team, the more technical tasks involved with the build and distribution process are invisible to you. You may hear about porting or signing or compliance, but you never have to deal with any of it. You happily playtest on whatever is easy and available, usually your development computer. Sometimes even inside of your development environment. The reason this happens is because your updating process is not built with iteration in mind. Builds take too long, frequently don’t work, and distributing to local devices is a hassle. Many teams “forget,” or rather downprioritise, testing on their proper target devices. One of the stranger things I’ve run into is developers who not only dislike testing on their current target platform but basically refuse. It’s so much easier to stay in your comfortable development environment indefinitely. Some studios may even resent some of their own target platforms, for example mobile platforms or consoles, because they are allowing personal opinion to affect their professionalism. But there’s really no excuse: you should always test on your target devices. Something that’s easy to overlook is to keep visible and easily copy/pasteable version information on-screen in your game. This is good for a product after launch too, so that players can provide you with more detailed information if they experience bugs or crashes. One of the first things I did in gamedev was to drive cars along a race track’s edges to make sure that the collisions worked like they should. A kind of testing that you can automate relatively easily. In test-driven development , testing and automation is already part of the thinking, and there’s really no need for game development to be different. Automate the right things, however. An automated test can’t tell you about quality. It can’t suggest design changes or warn that a player may not understand the phrasing of a dialogue line. Automate regression testing, compliance testing, integration testing, and the driving along the tracks to test collision. But don’t automate quality testing. Building for all of your platforms without having to do so manually is an essential element of game development. No amount of testing in a development environment compares to testing real builds. Automated builds are often triggered by new commits or version increments. It’s also common to have nightly builds, hourly builds, and build cadences based on testing needs and build duration. What’s important for such a pipeline is that it can clearly say what’s going wrong by posting logs and details to the relevant people. A Slack channel, for example. What you absolutely don’t want is to put developers on fulltime duty to get builds out. Once you have a build, you need to get that build onto the right device for testing. Most devkits and software platforms allow remote connection. You can usually set up jobs to trigger automatically when a build completes and publish your game to your testing platform (or even live) without requiring any work at all. Hopefully, this post provides some food for thought on iteration and what it really means. If not, tell me every way I’m wrong in an e-mail to [email protected] or in a comment. Here’s the list: Remove obstacles . Make the process of iteration as fast as possible, by removing gatekeepers and bottlenecks. Maybe you shouldn’t go through the full approval process for a quality of life improvement, maybe your playtesters should get three separate sets of things to test instead of just one, and maybe a developer can prioritise their own tasks rather than sitting in hours-long meetings or being micromanaged. Remove clicks . I once heard the suggestion that you lose 50% of viewers with every required interaction on a website. More clicks will invite more pain points, more potential human errors, and will also lead to fewer iterations. Just imagine (or remember) not having box selection in a node tool vs having it. Remove tools . You need special skills, licenses, installation time, and more, the more tools you require. Everything in your pipeline that can be either bundled into something else or removed entirely via devops automation should be considered. Not least of all because tools development is itself a deep rabbit hole . Authoring objects and data. Transitioning objects between states. Tweaking and rebalancing data. Testing and comparing iterations. Updating the game for testing and distribution. For object-oriented authoring: clearly visualise what an object can (and can’t) do based on its inheritance; don’t hide logic deep into a dropdown hierarchy. For component-based authoring: make non-destructive tools with opt-in as the default rather than opt-out . Provide good error messaging for when requirements are not met. For data-driven authoring: provide clear debug information and visual representations for where data is coming from, when, and what it allows. Make it clear what data is expected where, so no steps are missed. Make it easy to list states and transitions per object. Provide state transition information with data reporting, so that you can keep track of all the whens and whys. Make states have meaning; if a state says that an object cannot move, this should be definitive. Differentiate between Specific and Generic states, so that you will never accidentally add state to an object that won’t work. Set clear guardrails between Exclusive, Inclusive, and Parallell states. Plan what you need each state to be able to do and where to get its data. Visualise which conditions apply at a given moment and why. Show when conditions are unavailable and why. Log transition changes and which conditions made them change. Show when, how, and from where a state injection occurs. Make it clear which explicit states are running at any given time. When dynamic state is triggered, make all of its relevant overrides predictable and singular: it should always be enough to turn something on or off once . Provide visualisations of start and end positions for timed states. Allow developers to scroll timed states manually to preview them. Allow states to resume after interruption, so that you can use interstitials in a non-destructive way. Separate your data into logical containers, such as Baseline, Attribute, and Modifier. Bundle collections of changes into change sets . E.g., “double move speed.” Identify change sets modularly, so you can test more than one thing at a time. MAJOR version when you make incompatible API changes MINOR version when you add functionality in a backward compatible manner PATCH version when you make backward compatible bug fixes” Maintain clear versioning, even if just for yourself. Make sure that you can always play a recent version of your game. Provide shortcuts and settings that let you avoid time sinks. Make it easy to choose what to test. Make it clear what is being tested. Make your systems modular. Make modules easy to toggle. Allow testers to easily switch out and modify what they are testing: anything with the same output should be able to tie into the correct input. Make it possible to simulate the systems without running them. Show the data; show comparisons. Make it easy to file bug reports and provide feedback without leaving your game. Integrate screenshot tools and video recording. Test on target devices. Test your lowest spec targets. Make version numbers visible in all game builds, including release. Automate functionality testing, but not quality testing. Building the game automatically and get new builds continuously without requiring manual intervention. Remove all obstacles for build distribution: make it a single click (or less) to get a functional build to play on the right device. For object-oriented authoring: clearly visualise what an object can (and can’t) do based on its inheritance; don’t hide logic deep into a dropdown hierarchy. For component-based authoring: make non-destructive tools with opt-in as the default rather than opt-out . Provide good error messaging for when requirements are not met. For data-driven authoring: provide clear debug information and visual representations for where data is coming from, when, and what it allows. Make it clear what data is expected where, so no steps are missed. Make it easy to list states and transitions per object. Provide state transition information with data reporting, so that you can keep track of all the whens and whys. Make states have meaning; if a state says that an object cannot move, this should be definitive. Differentiate between Specific and Generic states, so that you will never accidentally add state to an object that won’t work. Set clear guardrails between Exclusive, Inclusive, and Parallell states. Plan what you need each state to be able to do and where to get its data. Visualise which conditions apply at a given moment and why. Show when conditions are unavailable and why. Log transition changes and which conditions made them change. Show when, how, and from where a state injection occurs. Make it clear which explicit states are running at any given time. When dynamic state is triggered, make all of its relevant overrides predictable and singular: it should always be enough to turn something on or off once. Provide visualisations of start and end positions for timed states. Allow developers to scroll timed states manually to preview them. Allow states to resume after interruption, so that you can use interstitials in a non-destructive way. Separate your data into logical containers, such as Baseline, Attribute, and Modifier. Bundle collections of changes into change sets. E.g., “double move speed.” Identify change sets modularly, so you can test more than one thing at a time. Maintain clear versioning, even if just for yourself. Make sure that you can always play a recent version of your game. Provide shortcuts and settings that let you avoid time sinks. Make it easy to choose what to test. Make it clear what is being tested. Make your systems modular. Make modules easy to toggle. Allow testers to easily switch out and modify what they are testing: anything with the same output should be able to tie into the correct input. Make it possible to simulate systems without running them. Show the data; show comparisons. Make it easy to file bug reports and provide feedback without leaving your game. Integrate screenshot tools and video recording. Always test on target devices: no amount of emulation will ever compensate for real qualitative testing. Have as many diverse target devices available as financially and physically possible. Test on target devices. Test your lowest spec targets. Make version numbers visible in all game builds, including release. Automate functionality testing, but not quality testing. Building the game automatically and get new builds continuously without requiring manual intervention. Remove all obstacles for build distribution: make it a single click (or less) to get a functional build to play on the right device.

0 views
Xe Iaso 4 weeks ago

Valve is about to win the console generation

Today was a big day for gamers as Valve just introduced three products: the Steam Controller, the Steam Machine, and the Steam Frame. When you add this alongside the Steam Deck, I think it's safe to say that Valve is about to win the next console generation. I have basically nothing to say about the Steam Controller. It's the Steam Deck's input but in a controller. There's no way they can really mess it up in a way that isn't recoverable. What else is there to say? The Steam Machine of yore was one of the biggest tech flops in history and led to a lot of the changes that has made Valve hardware so good. Based on what they've announced, the software ecosystem I know and love on SteamOS, and response from developers I talk with, there's a reasonable chance that this new Steam Machine is going to be the most compelling console on the market. TL;DR: The Steam Machine's specs are on par or better with the PS5. It's got 16 GB of ram, a dedicated GPU with 8GB of video ram, and it's about the size of three M1 Mac Minis stacked on top of each other with a slightly bigger footprint than a Nintendo GameCube. I see no real way that this could be a failure in the same way that the last Steam Machine was. If they don't fuck this up, I could pretty confidently say that Valve is going to win this console generation. In retrospect, I think that the failure of the first Steam Machine was probably one of the best things to ever happen to Valve. Proton, Steam Play, and the Steam Deck are the proof that Valve learned all the lessons they needed to in order to make a next generation Steam Machine a viable console. The biggest difference between SteamOS and other console operating systems is that SteamOS is just an immutable image-based fork of Arch Linux with a skin on top. If you can do it with a normal PC, you can do it on SteamOS. Wait, you said that you can do anything you can do on a normal PC, but you also said it's running an immutable OS. What if my definition of "anything" includes "install system packages"? Good point, I'm not worried about that for two main reasons: developers have already found ways to use things like distrobox to give you islands of mutablity in an otherwise immutable system on the Steam Deck, and you can just blow away the OS and install whatever you want (such as Bazzite ) or any normal Linux distribution. You could even put Windows on it if you needed to for some reason. This means that even though Valve will be selling this hardware at a loss, you can still buy one and never purchase anything else from them. You can install any compatible game from any marketplace. In their own words: Yes, Steam Machine is optimized for gaming, but it's still your PC. Install your own apps, or even another operating system. Who are we to tell you how to use your computer? I cannot even imagine the other console manufacturers saying this. I'd easily imagine that it'd have free reign across a majority of the Steam library. By sheer game count alone, this would make it one of the biggest console launch libraries on the market. This isn't even counting the fact that you can install alternative marketplaces like itch.io , GOG, or anything Lutris supports (EG: Epic Games). Valve does nothing and still wins. One of the bigger things that I don't think people really appreciate about the Steam Machine (or even the Steam Deck for that matter) is that the freedom to install whatever program, framework, background service, or OS you want means that every Steam Machine can be used to make games. Some of their promotional images show a Steam Machine in a dual-monitor setup split between Blender and Godot. I don't think you realize how big of a deal this is. By making every Steam Machine also powerful enough to do full on game development, Valve is making it so much easier to become an independent game developer. Just add ideas, skill, and time. Hilariously, this means that the Steam Machine is probably the only console on the market that's fully compliant with the EU's Digital Markets Act. It would be absolutely hilarious if the EU ends up using this as rationale for Nintendo, Microsoft, and Sony to open up their consoles for third party developers. Oh and to top it off, the internal storage is upgradable and can take full-size nvme drives. If you pop your microSD card out of your Steam Deck, you can put it into your Steam Machine and get all your games instantly. Reportedly the ram is user-upgradable too. The only way that they could mess this up is with the pricing. The price will be what determines if this is a PS5 killer or a mid-range home theater PC that can do games decently well. Given the fact that Steam prints so much money, I'd expect the pricing to be super aggressive. Worst case, this would be a great home theatre PC. I'd rock it in my media centre. It's going to run Plex, Twitch, and Youtube just fine. Valve also announced their successor to the Valve Index today, the Steam Frame , a standalone VR headset. It's basically a Meta Quest headset, but also a Steam Deck. They market it as being able to play VR and 2D games effortlessly. The weirdest thing about it is that it's running a 64 bit ARM CPU instead of a conventional AMD APU like the Steam Deck and Steam Machine. This means that SteamOS is going to be cross-architecture for the first time and they're going to use FEX to bridge the gap. The big thing I want to see in practice is their implementation of foveated rendering. This beautiful hack abuses the fact that human eyes have the most sharpness and fidelity at the exact centre of your field of vision, whereas your peripheral vision is abysmal at it. This means that on average you only have to render about 10% of the frame at maximum quality for it to feel like it's running at full resolution all over the screen. This should make the fact that the Frame is using a "weaker" CPU/GPU irrelevant. Games should look fine as long as they render the slice that needs to be in full quality fast enough. Even more fun, they take advantage of the same tricks behind foveated rendering for streaming games from a PC or Steam Machine. This means that you get that same optically perfect quality but with even less latency because less data has to be transferred to hit your eyes. I really want to see what this is like in practice. Reportedly there's no perceptual difference between this setup and rendering games at 100% full quality. The Steam Frame ships with a USB dongle that lets you use the might of your gaming tower for low latency VR gaming. I'll need to see this in practice in order to have opinions. I think that in the worst case it can't possibly be any worse than it was streaming VR games to my Quest 2 over Wi-Fi. That was tolerable and viable for mid-level Beat Saber. I have confidence that it will at least be sufficient for high level Beat Saber gameplay. Remember how I said that it's a Steam Deck in a headset? The Steam Frame runs full SteamOS. You can just boot it into a full KDE desktop and use it as a normal computer. I have no reason to doubt that every Steam Frame is also a development kit in the same way that the Steam Machine is also a development kit. They also claim you can load arbitrary Android apps into the Steam Frame. I need to see this in action before I have opinions about it. It would be exceptionally funny if this meant you could take apps/games made for the Meta Quest and just plop them onto the Steam Frame without modification. I'm not holding my breath, but it would be funny. The only possible flaw I can see is that the strap it ships with doesn't go over the top of your head. If this ends up being an issue in practice, somebody is going to make a third party strap that just fixes this problem. I'm not concerned. Really, the only thing that can go wrong with any of this hardware is the price. I would still be happy if the pricing was the worst part of this lineup. It would be really cool if there was a bundle. I'm at least planning on getting a Steam Machine on day 1 and making a review. What would you like to see in that? Let me know on Bluesky .

0 views
JSLegendDev 1 months ago

What Caused Performance Issues in My Tiny RPG

In a previous post, I mentioned having strange performance issues regarding a tiny RPG I was secretly working on. The crux of the matter was that the game (built using web technologies) would run noticeably less smoothly when wrapped as a desktop app on my machine than when running in Firefox. I initially shared the project’s executables on the KAPLAY Discord server (KAPLAY being the library I used to make the game in JavaScript) and none reported the performance issues I had. Seeing this, I decided to make a Substack post inviting my wider audience to try the game out and report its performance. This led to someone sharing the post on Hacker News which resulted in a large influx of views and feedback. In this post, I would like to explain what went wrong (as best as I understood it myself). First of all, I have mostly fixed the performance of my game. It now runs much more smoothly and I have updated the executables on itch. I would still greatly appreciate feedback regarding how these run on your machines. (Download the ones tagged with -v2) Here’s the link : https://jslegend.itch.io/small-rpg-performance-playtest To build executables for Windows, Mac and Linux, I use either NW.js or GemShell. Similar to Electron but easier to set up. It packages a Chromium instance for rendering. Results in bloated executables but the same rendering engine is used across platforms. Similar to Tauri in how it uses the operating system’s webview to render the app rather than packaging a Chromium instance. This results in leaner executables but different web engines with varying performance differences are used on different platforms. However, contrary to Tauri, GemShell is a one click tool that generate executables for all three platforms. I wrote a post about it recently that delved into more detail. Since I wanted to build executables quickly, I decided to try out GemShell for this project. Executables that I distributed to get feedback were made with this tool. KAPLAY is a library based on the concept of game objects and components. A game object is created from a list of components, many of which, are ready made and offer functionality out of the box. This makes the library very easy to understand and productive. The issue is that it’s by default less performant than other alternatives (Phaser, Excalibur, etc…) I use it because it’s so fast to prototype game ideas in. However, I used it for this project because it was the tool I knew best that would allow me to immediately start working on the game and focus on game design. In hindsight, I should have probably started invested in learning other more performant alternatives to a sufficient level so that I could easily pivot away if the needs of my project demanded it. This was often reported among people for who the game didn’t perform well. In KAPLAY, there is an option to cap the FPS to a maximum amount. It’s used when first initializing the library. The idea behind this option is to enforce a consistent frame rate resulting in more consistently smooth gameplay. However, setting this to 60 in my game resulted in the game eventually slowing down to a crawl all while the debug fps count still displayed 60 fps. I conclude that this happened when the machine running the game wasn’t able to sustain 60fps or more at all times. The fix was simple, remove it. Why did this option behave this way? Probably a bug a in the library. A maintainer is currently working on it. Since GemShell was used to make executables, the underlying web engine used to render the game on a Mac is Webkit and not Chromium. While I knew that Webkit was less performant than Chromium, I didn’t think it would be that noticeable. The apparent solution to this would be to move off of GemShell and use NW.js instead. However, it turns out that MacOS does certain things to not allow Webkit to use its full potential. The dev behind GemShell apparently has a fix for this situation. Below is what they shared on their Discord, which you can join if you’re interested in the tool here . This would be great since it would be nice to have the best of both worlds, more consistent performance across platforms while still having lean executables. Since I’m still not done with the development of the game, I can afford to let the dev cook, as we say! This is the strangest performance issue I experienced. While I could conceive of the game performing better on Firefox VS Safari (since it uses Webkit), I was caught off guard by Chrome performing poorly than Firefox. Chrome is supposed to be more performant due to the Chromium Web engine. The Chrome profiler seemed to indicate that the way I was rendering text in my game probably needed to change. KAPLAY Game Objects and Text Rendering In KAPLAY, if you look at the examples provided in its playground , you’ll find that it’s often shown that to render text you first, create a game object using a text component and then pass the text to that component. However, it turns out that this is inefficient since game objects have a greater cost in terms of performance. For rendering simple text it’s far better to draw it directly in the draw loop. Here’s a simple example. The same logic applies to drawing static images like backgrounds. Instead of doing : I needed to do : Additionally, to not disable batching it was important that all drawSprite calls be placed together in the draw loop before rendering text with drawText calls. Doing this led to better performance on Chrome and Safari. However, there was one last obvious performance improvement I needed to do. In the battle section of my game the player must avoid getting hit by a horde of projectiles thrown at them. A common optimization technique used in this case was to reuse bullets that leave the screen rather than creating new ones. This technique is known as object pooling. I had planned on implementing something like this eventually but didn’t do it since I was developing the game using Firefox as my preview, and the performance was great. There weren’t that many projectiles in the first place so I felt that this would be useful later. However, considering that Chrome and Safari were struggling performance wise probably due to their garbage collector working differently, I resigned myself to implement it now. As expected the game performed much better on both Chrome and Safari. For Chrome, I now had a constant 60fps on my machine (Macbook Air M3, 16 GB RAM) but for Safari it was more around 45-60fps. To stress test my pooling system, I added a bunch of projectiles. Here is footage. I’m happy that I can now resume development and focus more on game design. However, what this adventure taught me is that I should probably invest my time learning other frameworks and game engines. While I eventually ended up fixing the performance issues in my game, I can’t help but think of scenarios where problems could arise later that are unfixable due to limitations of the tools I’m using. In that case, I would have to halt development to learn a new tool at a proficient level on top of having to reimplement the game which would take a lot of time and result in my project getting significantly delayed. If I start learning something else right now, I can at least go faster if I eventually need to reimplement the game. Finally, if you’re interested in keeping up with the game or like technical posts like this one. I recommend subscribing to not miss out when new posts are published. Subscribe now In the meantime, here are few of my previous posts that could interest you!

0 views
Ruslan Osipov 1 months ago

PC Gamer physical edition is good, actually

I spend a lot of time in front of a computer or a phone, even now that I have a kid. Hey - she needs to sleep, and I have some time to kill. Many of my hobbies revolve around a screen too - like playing video games, tinkering with stuff, or writing. It’s unsurprising that I’ve been wanting to take a step away from the screen and find a way to engage with physical media more. I used to read a lot of books - I don’t anymore. I listen to audiobooks sometimes, but it’s been a good year or two since I last sat down and read a book cover to cover. That’s fine - life ebbs and flows, and even though sitting down and reading books used to be a huge part of my life - they aren’t today, and that’s okay. But it’s nice to put down devices and just hold something in your hand. I worked around this limitation though and decided to get more into magazines. Yeah, print media is still alive and kicking. We have two physical publication in our household this year - The New Yorker, and PC Gamer. Two very different magazines, and you can probably tell which subscription appealed to my wife - and which one to me. I’ve been reading both, although I’ll admit that PC Gamer has received more of my attention. Hey - unlike The New Yorker, which oppressively sends you a new issue each week, PC Gamer has been sending me issues monthly. And I don’t need to tell you that The New Yorker is a great publication - it’s got hell of a reputation, and for a good reason. It’s quality journalism, and peak writing, or so I’m told, but it certainly reads that way despite my limited knowledge on the subject. But I do know a thing or two about video games, and one thing I know is that gaming journalism from major publications - PC Gamer included has been steadily declining in quality over the past decade. Between corporate relationships, out of touch and burnt out reviewers, and sanitized, often generic pieces - I have been avoiding mainstream gaming media. There are lots of small independent reviewers who do a wonderful job covering the titles I care about, and I trust those a lot more. I’ve read somewhere that the print edition of PC Gamer is somewhat different. You still have the same people working on the issue, but the time pressure’s different, articles can’t be updated once they go live, and there’s much more fun and creative writing. I’m sure all of that’s available offline too, but I don’t think I would’ve read any of that if the magazine wasn’t already in my hands. Reading editions of PC Gamer feels like stepping a time capsule, in big part due to fairly substantial retro game coverage - you can’t exactly publish breaking news in a monthly print, so the focus is much more on having interesting things to say. Chronicles of Oblivion in-character playthroughs, developer interviews, quirky reviews - there’s lots to love. I’ve heard Edge Magazine is well known for high quality writing and timeless game critique. I think I’ll check that out too - here, I just subscribed.

0 views
JSLegendDev 1 months ago

I'm Making a Tiny RPG and I Need Feedback Regarding Performance

This past month, I’ve been working secretly on a small RPG game. While the game is not ready at all and I didn’t plan on talking about it, I’m now kind of forced to. I’ve been using JavaScript + the KAPLAY game library to make this game but I’ve been experiencing performance issues. However, it seems that others aren’t experiencing them so now I wonder, is it just my machine? I’m using a Macbook Air M3 with 16GB of RAM. Normally, things should be smooth and they are when playing the game in the browser via Firefox. However, since I’m making this game with Steam in mind, it’s especially important that the game performs well when wrapped as a desktop app. For this reason, I decided to reach out to you, my audience, for feedback. I have included a build of the unfinished game for Windows, Mac and Linux. It would be very nice if you could try it out on your machine. Additionally, recording gameplay and sharing the link in the comment section of this post would be greatly appreciated. Here is the link to the game in its unfinished current form : https://jslegend.itch.io/small-rpg-performance-playtest Below is a gameplay video to give you an idea of how the game is supposed to be played. You can move around with arrow keys and enter battle by overlapping with a star in the overworld. Performance issues, if any, occur mostly during battles. Thanks in advance! UPDATE 7/11/2025 : It seems that this post was shared on Hacker News and is getting more attention than usual! If you’re new to my Substack and are potentially interested in updates regarding this project, I recommend subscribing. Subscribe now In the meantime, you can read some of my previous posts!

0 views
ava's blog 1 months ago

my loot drop - what's in my inventory?

You've slain me. On your quest to rise up the Bearblog Trending mountain, you had to go past me. As your final hit rains down on me and my HP bar depletes, my body pulsates on the floor and slowly evaporates. What I leave behind are the following items: Matcha Drink Powdered green tea beverage with a nutty, slightly bitter taste. +5 Energy . Benji Charm Legend says he has provided strength in the most hopeless nights. While holding or keeping the plushie nearby, you gain advantage on saving throws against fear, despair, or stress-related effects. Crystal Ring Ring It hails from the far away fae lands. Forged from living quartz harvested under a moon. +2 Strength . Law Book Spell Book Forged by sages and legislators who believed privacy itself was a form of sacred protection, this tome channels the invisible rules of data protection into tangible wards and bindings. Spell: Right to Be Forgotten Effect: Erases traces of your identity from archives, magical records, and memories weaker than your Intelligence modifier. Enemies who knew you must pass a Wisdom save or simply forget your name. “Knowledge is power, but consent is sacred.” — Preface to the Data Protection Codex, Volume I AirPods Equipment Ancient blacksmiths of the techno-age forged them to fend off the chaos of constant noise. +4 Focus. Drawback: While active, you may miss crucial social cues or warnings. Other players gain advantage on Stealth checks against you, especially when they are of the type "wife". Pirate is hosting the Bearblog Carnival topic this month , inviting us to consider what we have in our inventory. I wanted do it less like a "what's actually in my bag", but more game-oriented. :) Reply via email Published 04 Nov, 2025

1 views
Raph Koster 1 months ago

Game design is simple, actually

So, let’s just walk through the whole thing, end to end. Here’s a twelve-step program for understanding game design. There are a lot of things people call “fun.” But most of them are not useful for getting better at making games, which is usually why people read articles like this . The fun of a bit of confetti exploding in front of you, and the fun of excruciating pain and risk to life and limb as you free climb a cliff are just not usefully paired together. In Theory of Fun I basically asserted that the useful bit for game designers was “mastery of problems.” That means that free climbing a cliff is in bounds even though it is terrifying and painful. Which given what we already said, means that you may or may not find the activity fun at the time! Fun often shows up after an activity. There’s neuropsych and lots more to go with that, and you can go read up on it if you want . Anything that is not about a form of problem-solving is not going to be core to game systems design . That doesn’t mean it’s not useful to game experience design, or not useful in general. Also, in case it isn’t obvious – you can make interactive entertainment that is not meant to be about fun . You can also just find stuff in the world and turn it into a game! You can also look at a game and choose not to treat it as one , and then it might turn into real work (this is often called “training”). This rules out the bit of confetti . A game being made of just throwing confetti around with nothing else palls pretty quick. Bottom line: fun is basically about making progress on prediction. There are a lot of types of problems in the world . It is really important to understand that you have to think about problems games can pose as broadly as possible. A problem is anything you have to work to wrap your head around. A good movie poses problems too, that’s why you end up thinking about it long after. You can go look at theorists as diverse as Nicole Lazzaro, Roger Caillois, or Mark LeBlanc for types of fun. You’ll find they’re mostly types of problems , not types of fun. “I enjoy the types of problems that come from chance” or “I enjoy the types of problems that come from interacting with others” or whatever. This is not a bad thing. This is what makes these lists useful. Your game mechanics are about posing problems, so knowing there’s clumps of problem types is very useful. In the end, though, a problem is built out of a set of constraints. We call those rules, usually . It also, though, has a goal. Usually, if we come across a set of rules with no problem, we just play with it, and call it a toy. Building toys is hard! Arriving at those rules and constraints to define a nice chewy problem is very challenging. You can think of a toy as a problematic object, a problem that invites you to play with it. On the other hand, it’s not hard to turn a toy into a game, and people do it all the time. All you have to do is invent a goal. We shouldn’t forget that players do so routinely. Building a toy is an excellent place to start designing a game. Bottom line: we play with systems that have constraints and movement, and we stick goals on them to test ourselves. Games are machines built around uncertainty . Almost all games end by turning an uncertain outcome into a certain one. There’s a problem facing you, and you don’t know if you can overcome it to reach that goal. Overcoming it is going to be about predicting the future. If there’s one thing that good games and good stories have in common, it’s about being unpredictable as long as possible . (This is also where dopamine comes in, it’s tied to prediction; but it’s complicated and nuanced). If a problem basically has one answer, we often call it a puzzle. There’s not a lot of uncertainty built into a binary structure. You can stack a bunch of puzzles one on top of the other and build a game out of them (which then introduces uncertainty into the whole), but a singular puzzle isn’t likely to be called that by most people. It happens quite often that we used to think something was a game, and it turned out it was actually a puzzle. Mathematicians call that “solving the game.” They did it to Connect Four – and you did it to tic-tac-toe, when you were little. Good problems for games therefore all have the same characteristics : A lot of very good problems seem stupidly simple, but have depths to them . Math ones, like “what’s the best path to cross this yard?” but also story ones like “For sale: baby shoes, never worn.” I recently watched a video that included the statement that “picking up sticks” is not a useful loop. Picture a screen with a single stick in the middle. The problem posed is to move the cursor over it and click it. Once you do it, you get to do it again. Guess what? The original Mac shipped with games that taught you how to move a mouse and click things. Once upon a time, mousing was a skill that was challenging; for all I know, you have grandparents who still have trouble with it. For them, it has uncertainty. For you, probably, it doesn’t. Bottom line: the more uncertainty, indeterminacy, ambiguity in your game, the more depth it will have. Now, imagine that the stick pops to a random location each time. Better, yes? The core of a loop is a problem you encounter over and over again. “How do I get the next one?” But something needs to be pushing back , that’s what makes it an interesting problem and is usually what takes it past being a puzzle. I like to say “in every game, there is an opponent.” Even it’s just physics. People talk about the core loop of a game. But there’s really two types of loops. One is what we might think of as the operational loop . This is the loop between you and the problem, it is how you interact with it. You look at it. You form a hypothesis. You poke the problem. You see a result. Maybe it was success, and you grabbed the stick. Maybe it was failure. Maybe it was partial success. You update your hypothesis so you can decide what to do next. The second loop is really your progression loop but is better thought of as a spiral . It’s what people usually mean when they say “a game loop.” They mean picking up the stick over and over. I say it’s a spiral, because clicking on the same stick in the middle of the screen over and over is not usually how we design games. That would actually be repeatedly doing the same puzzle. Instead, we move the stick on the screen each time, and maybe give you a time limit. Now there’s something you’re pushing against, and there’s a skill to exercise and patterns to try to recognize. Far more people will find this a diverting problem for a while. It’s a better game. It’ll get even better if there are reasons why the stick appears in one place versus another, and the player can figure them out over time. This matters: the verbs are in a loop. “Pick up,” over and over. But the situation isn’t. And you are learning how to reduce uncertainty of the outcome: move the mouse here and click, next move it there . That’s why it is a spiral: it is spiraling to a conclusion. It’ll be fun until it’s predictable. You can think of the operational loop as how you turn the wheel, and the situations as the road you roll over. A spot on the wheel makes a progression spiral as you move. One machine, many situations — we call these rules mechanics for a reason. Bottom line: players need to understand how to use the machine, and the point is to gradually infer how it works by testing it against varied situations. You can’t learn and get better unless you get a whole host of information . There are fancy names for each of these, and you can go learn them all . Everything from “affordance” and “juice,” to terms like “state space” and “perfect information” and very confusing contradictory uses of the words “positive” and “negative” paired with the word “feedback.” Feedback in general can, and should be, delightful. That means it’s where you get to use all those forms of fun that I threw away at the beginning. It can be surprising. It can be a juicy multimedia extravaganza. It can be a deeply affecting tragic cutscene that advances the game story. If you have too little feedback, players cannot go around the interaction loop. Picture Tetris if the piece you drop is invisible until it lands. If you have bad feedback, players cannot go around the learning loop either. Picture Tetris if sometimes your score goes down when you complete a line and sometimes it goes up. You can’t draw any conclusions about what the problem in the way of the goal actually is , in that crappy version of Tetris . Feedback needs to act as a reward to help you draw conclusions. But there’s a third mistake: you can supply a gorgeous and compelling set of feedback and not actually have a real problem under there. At minimum you’re making shallow entertainment. At worst, you are building exploitative entertainment. People will be willing to go along with pretty simple and pretty familiar problems as long as the feedback is great. Bottom line: show what you can do, that you did it, what difference it made, and whether it helped. If you are trying to design and are thinking of a specific problem scenario you are not doing game systems design. You are doing level design. “How to multiply numbers” is a problem. “What is 6 x 9” is not a problem, it’s content . Now consider the game of Snake , or Pac-Man . They are also games where the core loop is picking up a stick. The difference is that something is an obstacle to you picking up the stick: you get longer when you pick up the stick, and can crash into yourself. You have to avoid ghosts as you gather the stick. How long you are in Snake is a different situation . Where the apple to eat is located is a different situation. To be specific, you have the same problem in different topology. Where you are relative to the ghosts, and which dots are left, and what directions you can go in the maze are different situations in Pac-Man . You want the verbs you use in the loop to end up confronting many many situations. If your verb can’t, your core loop is probably bad. Your core problem (aka your core game mechanic) is probably shallow. What you want is to be able to throw increasingly complex situations at the player. That’s how they climb the learning ladder . Ideally, they should arrive at interim solutions (lots of words for that, too: heuristics, strategies) that later stop working . Pac-Man actually got solved, by the way! That’s why Ms. Pac-Man was invented. Sometimes, the way to escalate is to change the rules, and that’s what Ms. Pac-Man did. It did it by adding randomness, and in fact using randomness is one of the biggest (and oldest) ways to create situation variation in games. Bottom line: escalate the situations so that theories can be tested, refined, and abandoned. Since we can put all this this down very much to problem solving and learning and mastery, it means we can steal a whole bunch of knowledge from other fields. People learn best when they can experiment iteratively, which we also call “practicing.” That’s why loops make sense. There’s a lot of science out there about how to train, how to practice (and also a lot of educational theory that overlaps hugely), and your game will be better if it follows some of those guidelines. People learn best when the problem they are tackling is right past the edge of what they can do . If it’s too far past that edge, they may not even be able to perceive the problem in the first place! And if the reverse is true and they see a solution instantly, they’ll either be bored, or they might just do that over and over again and never develop any new strategies and not progress . There’s an optimal pacing shape. It looks just like what you see in your literature textbooks when they diagram tension, or whatever: sort of like a rising sine wave. You start slow, then speed up, hit a peak challenge, then back off a bit, give a breather that falls back but not all the way, then speed up… we have conventions for what to put at those peaks (bosses!). But what matters is the shape of the curve. You need to structure your game so that you push players up. They might need to climb the curve at different paces, which is why you might also have difficulty sliders. They might not be capable of getting all the way to the top, and that’s okay. You also need to pace to allow room for everything that isn’t mastering the problem — such as having fun with friends socially . But at the same time, things to do in the game need to come along at the right pace too! Bottom line: Vary intensity and pressure, give players a chance to practice and moments to be tested . Remember the game about clicking on a stick that appeared at a random location on screen? That’s also a rail shooter. You move the mouse and click on a spot in 2d space. Which is also not that different from an FPS — only now you move the camera, not the cursor. Almost no games are made of only one loop. Instead, we chain loops together – complete loop A, and it probably outputs something that may serve as a tool or constraint on a different loop. An FPS has the problem of moving the camera (instead of the mouse) to click on the stick. It also has a loop around moving around in 3d space. Moving around is actually made of several loops, probably, because it may be made of running and jumping and spatial orientation. Those are all problem types! We speak sometimes of value chains : that’s where one loop outputs something to the next loop. We speak also of game economies , which is what happens when loops connect in non-linear ways, more like a web. This is not the sort of economy where you are simulating money or commerce. Instead it’s a metaphor for stocks and flows and other aspects of actual system dynamics science. In this view, your hit points is a “stock” or, if you like, a “currency” you spend in a fight. Games nest fractally, they web into complex economies, and they unroll chains of linked loops. That’s why they can be diagrammed in a multitude of ways. At heart though, you can decompose them all into those elemental small problems, each with an interaction loop and a learning loop centered on that problem. Bottom line: build small problems into larger webs, and map them so you understand how they connect. The common question is “okay, so how do I design a problem like that?” And that is indeed the unique bit in games, because the other items here are common to lots of other fields. The list of possible problems is, as mentioned, enormous. This is a big rabbit hole. And once you consider that you can stack, web, and otherwise interlink problems, it means that there’s a giant composable universe of games (and game variants ) to create. Just bear in mind that because of varied tastes and experience, the diversity of the set of problems you pose is going to affect who wants to play your game. There are basically a set of categories of problems that we know work, and this is the absolute simplest version of them: These break down into a ton of sub-problems, but there are less than you think, and you can actually find lists of them . The hard part is that often they each seem so small and trivial that we don’t think of them as actually being worth looking at! They are also often in disguise: the problem behind where a tossed ball will land, and the problem of how much fuel you have left in your car if you keep driving at this speed, and the problem of when your hit points will run out given you have a poison status effect on you are the same thing . But the more of them you as a designer have wrapped your head around, the more you can combine. And you’ll find them very plastic and malleable. In fact, you could almost make a YouTube video about each one . So where do you get them? Steal them. Other games, sure, but also, the world is full of systems that pose tough problems. You can grab them and reskin them. Bottom line: not every mechanic has been invented, but a ton have. Build your catalog and workbench. In the end, the feedback layer of a game is everything about how you present it. The setting, the lore, the audio, the story, the art… How you dress up the problems can change everything about how the player learns from it, and how they perceive the problem. The exact same underlying problem can be as different as picking up sticks or shooting someone in the face, or as mentioned, the calculus problem of estimating the trajectory of a variable in a system of rates of change (the ball, the car and its gas, the hit points and poison) might be the same but dressed extraordinarily differently . When you think about how you dress up the problems, you are in the realm of metaphor . You are engaging in painting, poetry, and music composition, and rhetoric, and the bardic tradition, and all that other humanities stuff. This is a giant and deep universe for you as a designer to dive into. A lot of this stuff gets called “game design,” but then again, we also often say that a given game designer is a frustrated moviemaker, too. It is really easy to create an experience that clashes with the underlying problems it is teaching. There are fancy critical terms for this. You also need to be very conscious about whether you are building your game so that you are telling the player a story, or so that the player can tell stories with your game . So the takeaway should be: this stuff is deeply, deeply synergistic with the “game system” stuff that this article is about, but they are not the same thing. And games is not the best place to learn how to do these things. Those other fields have much longer traditions and loads of expertise and lessons. They won’t all apply to the issue of “how do I best dress up this collection of problems” but most of them will. It does not frickin’ matter if you start out wanting to make interesting problems, or if you start out wanting to provide a cool experience . You are going to need to do both to make the game really good . Bottom line: game development is a compound art form. You can go learn those individual arts and the part unique to games. Researchers have done a ton of studying “why people play games.” This gets called “motivations.” Motivations are basically about people’s personal taste for groups of problems and how those problems are presented, and characteristics of those problems and the situations in which you find them. Some people like problems where you destroy stuff. Others like problems where you bond with others. Some have trouble trusting other people. Others want to cooperate. Not everyone likes the same sorts of problems or the same sorts of dressings. Some of this is down to personality types, some of it is down to social dynamics, how they were raised, what their local culture is like, what trauma they have had, and countless other psychological things. That’s why one fancy term for this is psychographics . The big thing is, it’s not enough that the problems need to not be obvious to you, and also not be baffling to you. They also have to be interesting to you. What problems fit in that range is going to depend entirely on who you are, what your life experiences have been, what skills you have, and even what mood you are in. Picking motivations and selecting problems based on them is a great way to design. But motivations are not the same thing as fun. They’re a filter, useful in marketing exercises and in building your game pillars (which is an exercise in focus and scope). Scientists have spent a bunch of time surveying tons of people and have arrived at all sorts of conclusions that map people onto reasons to play and from there onto particular problems. If you start with motivations, then you can go from there to types of problems, types of experience, and even player demographics. And then, if you want problems that are about interacting with people, well, there’s lists of those. If you want problems that are about managing resources, or solving math issues, there’s lists of those too. Bottom line: no game is for everyone, so you will make better games if you know who you are posing problems for. I run into game developers who do not understand the above eleven steps all the time . And understanding all eleven is more valuable than building expertise in just one, because they depend on one another. This is because getting any one of the eleven wrong can break your game. The real issue is that each of these eleven things is often multiple fields of study. And yeah, you do need to become expert in at least one. To pick one example, some of us have been working out the rule set for how you can link loops into a larger network of problems for literally over twenty years. Others have spent their entire career doing nothing but figuring out how best to provide just the affordances part of feedback . So game design is pretty simple. But the devil is in details that are not very far below the surface. It’s fairly easy to explain why something is fun for an given audience. It is much harder to build something new that is fun for an arbitrary person. That said, every single one of those fields has best practices, and they are mostly already written down. It’s just a lot to learn. Put another way — every single paragraph in this essay could be a book. Actually, probably already is several. Bottom line: each of these topics is deep, but you want a smattering of all of them. Some of you may not like this deconstructive view on how games are designed. That’s okay. Personally, I find it best to poke and prod at a problem, like “how do I get better at making games?” and treat it as a game. And that’s what I have done my whole career. The above is just my strategy guide. Someone else will have different strategies, I guarantee it. But I also guarantee that if you get better at the above twelve things, you will get better at making games. This is a pragmatic list. And it will be helpful for making narrative games, puzzle games, boardgames, action games, RPGs, whatever. I breezed through it, but there are very specific tools you can pick up underneath each of these twelve things. It really is that simple, but also that hard, because that’s a frickin’ long list if you want to actually dive into each of the twelve. What that also means is that people designing games fail a lot at it . You might say, “can’t they just do the part they know how to do, and therefore predictably make good games?” No, because players learn along with the designers. If you just make the same game, the one you know how to make, the players get bored because it’s nothing but problems they have seen before and already have their answers to. Sometimes, they get so bored that an entire genre dies. And if you instead make it super-complicated by adding more problems, it might dissolve into noise for most people. Then nobody plays it. And then the genre dies too! Game designers will routinely fail at making something fun. When the game of making games is played right, it is always right outside the edge of what the designers know how to do. That’s where the fun lives, not just for the designer, but also for their audience. That’s it, the whole cheat sheet. That’s it. Hope it helps. They need to have answers that evolve as you dig in more – so they need to have depth to them. Your first answer should only work for a while. There might be many paths to the solution, too. This is why so many games have a score – it helps indicate how big a spread of solutions there are! They need to have uncertain answers. (When you’re little, this universe is a lot larger than it is when you’re older – peek-a-boo is uncertain up to a certain point!). The problem should be something that can show up in a lot of situations. You need to know what actions – we usually call them verbs — are even available to you. There’s a gas pedal. You need to be able to tell you used a verb. You hear the engine growl as you press the pedal. You need to see that the use of the verb affected the state of the problem, and how it changed. The spedometer moved! You need to be told if the state of the problem is better for your goal, or worse. Did you mean to go this fast? Mathematically complex puzzles Figuring out how other humans think Mastering your body and brain

0 views