Games by Mason Blog https://gamesbymason.com/blog The Games by Mason Blog Zine -- https://zine-ssg.io en-us Tue, 17 Feb 2026 00:04:12 +0000 Sat, 07 Feb 2026 00:00:00 +0000 https://gamesbymason.com/blog/2026/vulkan/ https://gamesbymason.com/blog/2026/vulkan/ šŸ‘€ It's Not About the API - Fast, Flexible, and Simple Rendering in Vulkan <div id="intro"><p>Many programmers consider Vulkan to be overly complex–maybe not even worth engaging with as an indie. It’s easy to see why people feel this way.</p><p>If this is how you view Vulkan or modern graphics APIs in general, the goal of this talk is to change your mind.</p><p> <iframe style="aspect-ratio: 16/9" width="100%" src="https://www.youtube.com/embed/7bSzp-QildA" title="It's Not About The API - Fast, Flexible, and Simple Rendering in Vulkan" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen ></iframe> </p> </div></p><p><a href=https://gamesbymason.com/blog/2026/vulkan/ >Read more...</a></p> Sun, 18 Jan 2026 00:00:00 +0000 https://gamesbymason.com/blog/2026/microsoft/ https://gamesbymason.com/blog/2026/microsoft/ 🪟 Prediction: Microsoft Is Going To Do The Funniest Thing Imaginable <div id="intro"><p><img src="https://gamesbymason.com/blog/2026/microsoft/ms-danger.jpg" alt="i'm in danger meme with the windows logo"></p><p>When you think Microsoft you probably don’t think sense of humor. And yet, I’m convinced that Microsoft is going to do a very specific <em>very</em> funny thing within our lifetimes.</p><p>In 2017 I predicted that most programmers would lose their employer <-> employee bargaining power in the next 15-25 years. This was a pretty controversial take at the time, and I never wrote about it publicly, so it’s hard to claim too much credit for being right.</p><p>This time I want the credit, so I’m posting my prediction publicly while everyone still thinks it’s ridiculous:</p><p><strong>I predict that within 15 years Microsoft will discontinue Windows in favor of a Windows themed Linux distribution.</strong></p><p>Sound crazy? Hear me out.</p></div></p><p><a href=https://gamesbymason.com/blog/2026/microsoft/ >Read more...</a></p> Wed, 31 Dec 2025 00:00:00 +0000 https://gamesbymason.com/blog/2025/statically-linking-pipewire/ https://gamesbymason.com/blog/2025/statically-linking-pipewire/ šŸ”‰ Statically Linking PipeWire <div id="intro"><p><img src="https://gamesbymason.com/blog/2025/statically-linking-pipewire/mac.png" alt="webcam demo with ldd showing 'not a dynamic executable'"></p><p>I recently helped <a href="https://tuple.app/" target="_blank">Tuple</a> solve an interesting problem. They’re working on a Linux version of their pair programming tool, and they want to make it a fully static executable so that they can ship the same build everywhere.</p><p>Alright no big deal, just link any dependencies statically and use <a href="https://musl.libc.org/" target="_blank">musl</a>. Easy, right?</p><p>Unfortunately, it’s not quite that easy. Tuple needs to talk to <a href="https://www.pipewire.org/" target="_blank">PipeWire</a> for screen capture, and PipeWire makes heavy use of <a href="https://www.man7.org/linux/man-pages/man3/dlopen.3.html" target="_blank"><code>dlopen</code></a>, so statically linking it isn’t an option…or is it?</p><p>I’ve open sourced a <code>build.zig</code> configuration that generates a static build of PipeWire <a href="https://github.com/allyourcodebase/pipewire" target="_blank">here</a>. The rest of this post elaborates on why this is challenging, why solving it is possible, and how my solution works.</p><div class="block"><h1>Quick Disclaimer</h1><p>The build works, and you can use it today! However, depending on your use case, you may need to add more plugins to the library table. See <a href="https://github.com/allyourcodebase/pipewire?tab=readme-ov-file#status" target="_blank">the README</a> for more info.</p></div></div></p><p><a href=https://gamesbymason.com/blog/2025/statically-linking-pipewire/ >Read more...</a></p> Thu, 04 Sep 2025 00:00:00 +0000 https://gamesbymason.com/blog/2025/stop-shipping-pngs/ https://gamesbymason.com/blog/2025/stop-shipping-pngs/ šŸ–¼ļø Stop Shipping PNGs In Your Games <div id="intro"><p>Are you shipping textures to players as PNGs? The goal of this post is to convince you that this is suboptimal, and walk you through a better approach.</p><p>I’ll also share <a href="https://codeberg.org/Games-by-Mason/mr_texture" target="_blank">my implementation</a> of the suggested approach, but if you’d rather do it yourself I’ll provide you with the information you need to get started.</p><p><em>If you’re using a game engine, it is almost certainly doing what this post suggests automatically, but it doesn’t hurt to double check!</em></p></div></p><p><a href=https://gamesbymason.com/blog/2025/stop-shipping-pngs/ >Read more...</a></p> Tue, 06 May 2025 00:00:00 +0000 https://gamesbymason.com/blog/2025/staying-inside/ https://gamesbymason.com/blog/2025/staying-inside/ 🌓 What I Learned from Staying Inside <div id="intro"><p><a href="https://www.progamemarketing.com/p/inside-conference-2025" target="_blank"><figure><img src="https://gamesbymason.com/blog/2025/staying-inside/inside-conf.jpg"> <figcaption>Conference Site</figcaption></figure></a></p><p>Okay, not literally staying inside. Every year <a href="https://howtomarketagame.com/" target="_blank">Chris Zukowski</a> puts on an online conference called <em>Staying Inside</em> about marketing indie games.</p><p>I technically watched some of the recordings while <em>outside</em> because the weather’s been great in Portland, but <em>What I Learned From Watching Staying Inside While Occasionally Technically Outside Because The Weather’s Been Great in Portland</em> was too long of a title.</p><p>I’m not going to write up a transcript of the entire conference, but I took notes on bits that were relevant to me and figured they were worth sharing.</p><p>To kick things off, multiple speakers touched on a big shift in indie game funding that may be of interest even if you aren’t looking for funding.</p></div></p><p><a href=https://gamesbymason.com/blog/2025/staying-inside/ >Read more...</a></p> Fri, 11 Apr 2025 00:00:00 +0000 https://gamesbymason.com/blog/2025/zcs/ https://gamesbymason.com/blog/2025/zcs/ ZCS — An Entity Component System in Zig <div id="intro"><p>I’m writing a new game engine in <a href="https://ziglang.org/" target="_blank">Zig</a>, and I’m <a href="https://codeberg.org/Games-by-Mason" target="_blank">open sourcing</a> each module as I write it.</p><p>Today I released the beta version of my entity component system <a href="https://codeberg.org/games-by-Mason/mr_ecs" target="_blank">ZCS</a>, I’ll consider it a beta until I’ve shipped my next <a href="https://store.steampowered.com/developer/games-by-mason/" target="_blank">Steam</a> game using it. You can find the documentation <a href="https://docs.gamesbymason.com/mr_ecs/" target="_blank">here</a>.</p><p>I’ve written a number of ECSs in the past including the one used by <a href="https://magicposer.com/" target="_blank">Magic Poser</a>. Going through this process a few times has given me a chance to hone in on what I want out of an ECS and I’m really happy with how this one turned out.</p><p>This post walks through some of the main ideas behind my implementation. If you enjoy this kind of writing, consider signing up for my <a href="https://gamesbymason.com/newsletter/">newsletter</a>.</p></div></p><p><a href=https://gamesbymason.com/blog/2025/zcs/ >Read more...</a></p> Wed, 26 Feb 2025 00:00:00 +0000 https://gamesbymason.com/blog/2025/tweening-in-zig/ https://gamesbymason.com/blog/2025/tweening-in-zig/ Tweening in Zig <div id="intro"><p>Lerp, or <a href="https://en.wikipedia.org/wiki/Linear_interpolation" target="_blank">linear interpolation</a>, is a convenient way to animate stuff in games without having to store much state:</p><pre><code class="zig"><span class="keyword">const</span> <span class="constant variable_builtin type variable">position</span> <span class="operator">=</span> <span class="constant variable_builtin function_call variable type">lerp</span><span class="punctuation_bracket">(</span><span class="constant variable_builtin type variable">start</span><span class="punctuation_delimiter">,</span> <span class="constant variable_builtin type variable">end</span><span class="punctuation_delimiter">,</span> <span class="constant variable_builtin type variable">time</span><span class="punctuation_bracket">)</span><span class="punctuation_delimiter">;</span> </code></pre> <p>This will move <code>position</code> linearly from <code>start</code> to <code>end</code> as time moves from <code>0</code> to <code>1</code>.</p><p>Unfortunately, linear motion often appears robotic and unnatural. In fact–even a cartoony robot should overshoot and rattle a bit, right?</p><p>Thankfully there’s an easy fix. You don’t have to give up lerp, you can just play with the <code>t</code> value that you pass in:</p><p><video loop autoplay muted controls> <source src="https://gamesbymason.com/blog/2025/tweening-in-zig/recording.mp4"> </video> <em>This isn’t actually game 2, it’s a side project. Not quite ready to announce game 2 yet sorry. :P</em></p><p>The pictured asteroid <em>is</em> being linearly interpolated, but the <code>t</code> value is being modified by an <a href="https://easings.net/#easeOutElastic" target="_blank">elastic easing function</a> causing it to act like a spring:</p><pre><code class="zig"><span class="keyword">const</span> <span class="constant variable_builtin type variable">position</span> <span class="operator">=</span> <span class="constant variable_builtin function_call variable type">lerp</span><span class="punctuation_bracket">(</span><span class="constant variable_builtin type variable">start</span><span class="punctuation_delimiter">,</span> <span class="constant variable_builtin type variable">end</span><span class="punctuation_delimiter">,</span> <span class="constant variable_builtin function_call variable type">elasticOut</span><span class="punctuation_bracket">(</span><span class="constant variable_builtin type variable">t</span><span class="punctuation_delimiter">,</span> <span class="punctuation_delimiter">.</span><span class="punctuation_bracket">{</span><span class="punctuation_bracket">}</span><span class="punctuation_bracket">)</span><span class="punctuation_bracket">)</span><span class="punctuation_delimiter">;</span> </code></pre> <p>Pretty nifty for a one liner, right?</p><p>Functions that play with a lerp’s <code>t</code> value are called ā€œeasing functionsā€, you can find visualizations for many commonly used easing functions on <a href="https://easings.net" target="_blank">easings.net</a>.</p><p>It’s nice to have a bunch of these on hand to pick from, so I’ve published <a href="https://codeberg.org/Games-by-Mason/mr_tween" target="_blank">a Zig library of all the popular ones</a>. The rest of this post is a brief description of the contents of the library at the time of writing.</p></div></p><p><a href=https://gamesbymason.com/blog/2025/tweening-in-zig/ >Read more...</a></p> Thu, 13 Feb 2025 00:00:00 +0000 https://gamesbymason.com/blog/2025/zine/ https://gamesbymason.com/blog/2025/zine/ Powered by Z[ig|ine] <div id="intro"><p><a href="https://store.steampowered.com/app/1110620/Way_of_Rhea/?snr=1_5_1100__1100&utm_source=website" target="_blank"><img src="https://gamesbymason.com/blog/2025/zine/wor.png"></a></p><p>Since shipping <a href="https://store.steampowered.com/app/1110620/Way_of_Rhea/?snr=1_5_1100__1100&utm_source=website" target="_blank">Way of Rhea</a> last year I’ve been hard at work on game two, but I haven’t been writing as much as I’d like.</p><p>Every time I sit down to write a blog post in Jekyll, my Ruby dependencies are somehow broken again. Any time spent trying to sort this out feels like time that could be better spent elsewhere.</p><p>As of today, I’m saying goodbye to Ruby! This site is now powered by <a href="https://zine-ssg.io/" target="_blank">Zine</a>, a static site generator written in Zig by <a href="https://kristoff.it/" target="_blank">Loris Cro</a>.</p><p><a href="https://zine-ssg.io/" target="_blank"><img src="https://gamesbymason.com/blog/2025/zine/zine.png" alt="ZINE: Fast, scalable, and flexible static site generator"></a></p><p>Working with Zine has been a blast. It’s alpha software, but it’s worth checking out.</p><p>I’ve also used Zine to setup a <a href="https://gamesbymason.com/devlog/">devlog</a> as a replacement for Twitter. I’ll continue mirroring my posts to social media, but I think we’re all better off not actively engaging with those sites. I personally replaced my time spent browsing social media with an <a href="https://miniflux.app/" target="_blank">RSS reader</a> about a year ago and I can’t imagine going back.</p>Expect more writing soon, I already have a few drafts queued up. If you want to get notified when I post, follow my <a href="/newsletter">newsletter</a> or <a href="/feed.xml">RSS feed</a>! </div></p><p><a href=https://gamesbymason.com/blog/2025/zine/ >Read more...</a></p> Sat, 01 Jun 2024 00:00:00 +0000 https://gamesbymason.com/blog/2024/6-years-in-rust-ama/ https://gamesbymason.com/blog/2024/6-years-in-rust-ama/ Highlights from "I spent 6 years developing a game in Rust and it just shipped, AMA" <div id="intro"><p>I recently released <a href="https://store.steampowered.com/widget/1110620/?utm_campaign=ama" target="_blank">Way of Rhea</a>, a puzzle game that I’ve been working on in Rust since 2018. If you like games like Braid, Talos Principle, or Portal you’d probably enjoy it:</p><iframe src="https://store.steampowered.com/widget/1110620/?utm_campaign=ama" class="steam-widget" ></iframe> <p>After launch I posted an AMA on <a href="https://www.reddit.com/r/rust_gamedev/comments/1cwqcfl/i_spent_6_years_developing_a_puzzle_game_in_rust/" target="_blank">r/rust_gamedev</a>, and people asked a lot of great questions!</p><p>This write up contains curated highlights from the AMA, with some additional editing for clarity.</p></div></p><p><a href=https://gamesbymason.com/blog/2024/6-years-in-rust-ama/ >Read more...</a></p> Wed, 22 May 2024 00:00:00 +0000 https://gamesbymason.com/blog/2024/wor-thank-you/ https://gamesbymason.com/blog/2024/wor-thank-you/ Thank you, & the Cerebral Puzzle Showcase <div id="intro"><p> <video loop autoplay muted controls> <source src="https://gamesbymason.com/blog/2024/wor-thank-you/thank-you.mp4"> </video></p><p>Hey everyone–thanks so much for a great launch day. After having worked on this game for so long, it’s an amazing feeling seeing so many folks enjoy it. :)</p><p>We hit 10 reviews on day 1, and at the time of writing are at 24 positive reviews: <img src="https://gamesbymason.com/blog/2024/wor-thank-you/reviews.png"></p><p>My new goal is to get to 50 reviews so we can be labeled ā€œVery Positive.ā€</p><p>I’m not going to share Steam stats today, but I can tell you that getting 10 reviews increased our visibility by an order of magnitude. Thank you again.</p><h1>Cerebral Puzzle Showcase</h1><p> <a href="https://www.cerebralpuzzleshowcase.com/" target="_blank"> <img src="twitter-promo.png" alt="Way of Rhea - Cerebral Puzzle Showcase"> </a> </p> <p>I also wanted to announce that Way of Rhea is getting featured in the <a href="https://www.cerebralpuzzleshowcase.com/" target="_blank">Cerebral Puzzle Showcase</a>! The festival runs on Steam from May 23rd to May 30th.</p><p>If you haven’t picked up the game yet, I’m extending the 20% launch discount to cover the entire festival:</p><iframe src="https://store.steampowered.com/widget/1110620/?utm_source=website" class="steam-widget" ></iframe> <p>If you’ve already picked up WoR, there are gonna be a lot of other great puzzle and puzzle-adjacent games on discount or with free demos. I’m looking forward to trying out the latest demo of our friends’ game, <a href="https://store.steampowered.com/app/1414030/Valley_of_Shadow/" target="_blank">Valley of Shadow</a>, in particular.</p><p>If I manage to get away from launch stuff long enough to try out some of the games, I’ll share any cool finds in <a href="https://discord.gg/JGeVt5XwPP" target="_blank">our Discord</a> in the <code>#gaming</code> channel. If you find anything cool, definitely share it with us!</p></div></p><p><a href=https://gamesbymason.com/blog/2024/wor-thank-you/ >Read more...</a></p> Mon, 20 May 2024 00:00:00 +0000 https://gamesbymason.com/blog/2024/wor-releases-in-0-days/ https://gamesbymason.com/blog/2024/wor-releases-in-0-days/ Way of Rhea Out Now! <div id="intro"><p>A heartfelt thank you to everyone who’s helped make this happen in any way, this is the culmination of years of hard work–I don’t even wanna say how many years it’s been here, if you know you know.</p><p>As of now, <a href="https://store.steampowered.com/app/1110620?utm_source=manual" target="_blank"><strong>Way of Rhea is out on Steam!</strong></a> I hope you all enjoy playing it as much as I enjoyed making it.</p><iframe src="https://store.steampowered.com/widget/1110620/?utm_source=website" class="steam-widget" ></iframe> <p>If you want to support me, the best thing you can do is purchase a copy of the game, and then leave a review. <strong>My goal is to hit 10 reviews today</strong>–Steam will show my game to more people when I do.</p><p>In the meantime, I’ll continue to patch Way of Rhea, and get started on Game 2.</p><p>If you wanna keep up to date with what I do next, here are some ways to stay in touch:</p><ul><li><a href="https://gamesbymason.com/newsletter/">Sign up for my newsletter</a></li><li><a href="https://store.steampowered.com/developer/games-by-mason" target="_blank">Follow my Steam Developer page</a></li><li><a href="https://discord.gg/JGeVt5XwPP" target="_blank">Join my Discord server</a></li></ul></div></p><p><a href=https://gamesbymason.com/blog/2024/wor-releases-in-0-days/ >Read more...</a></p> Sun, 19 May 2024 00:00:00 +0000 https://gamesbymason.com/blog/2024/wor-releases-in-1-day-end-game/ https://gamesbymason.com/blog/2024/wor-releases-in-1-day-end-game/ Way of Rhea releases tomorrow! - The End Game <div id="intro"><p>Way of Rhea is <a href="https://store.steampowered.com/app/1110620?utm_source=manual" target="_blank">coming to Steam <strong>TOMORROW</strong>!</a></p><iframe src="https://store.steampowered.com/widget/1110620/?utm_source=website" class="steam-widget" ></iframe> <p>This blog series walks through some of the mechanics featured in the game. Be warned: mild spoilers ahead! This post covers The End Game.</p><p><video loop autoplay muted controls> <source src="https://gamesbymason.com/blog/2024/wor-releases-in-1-day-end-game/hub.mp4"> </video></p><p>For many players, the biomes up until this point will be sufficiently challenging, and some players may be happy to solve most of those puzzles and stop.</p><p>However for avid puzzle gamers, everything we’ve seen so far is just set up for the real challenge: the end game.</p><p>The end game combines everything we’ve learned so far into 4 levels of very challenging puzzles.</p></div></p><p><a href=https://gamesbymason.com/blog/2024/wor-releases-in-1-day-end-game/ >Read more...</a></p> Sat, 18 May 2024 00:00:00 +0000 https://gamesbymason.com/blog/2024/wor-releases-in-2-days-professors-biome/ https://gamesbymason.com/blog/2024/wor-releases-in-2-days-professors-biome/ Way of Rhea releases in 2 days! - The Professor's Biome <div id="intro"><p>Way of Rhea is <a href="https://store.steampowered.com/app/1110620?utm_source=manual" target="_blank">coming to Steam</a> in <strong>2 days</strong>!</p><iframe src="https://store.steampowered.com/widget/1110620/?utm_source=website" class="steam-widget" ></iframe> <p>This blog series walks through some of the mechanics featured in the game. Be warned: mild spoilers ahead! This post covers The Professor’s Biome.</p><p><figure><video loop autoplay muted controls> <source src="https://gamesbymason.com/blog/2024/wor-releases-in-2-days-professors-biome/dialogue.mp4"> </video> <figcaption>The professor is kind of a jerk.</figcaption></figure></p><p>This area introduces The Professor, and a new way to change colors using staves.</p></div></p><p><a href=https://gamesbymason.com/blog/2024/wor-releases-in-2-days-professors-biome/ >Read more...</a></p> Fri, 17 May 2024 00:00:00 +0000 https://gamesbymason.com/blog/2024/wor-releases-in-3-days-rheas-biome/ https://gamesbymason.com/blog/2024/wor-releases-in-3-days-rheas-biome/ Way of Rhea releases in 3 days! - Rhea's Biome <div id="intro"><p>Way of Rhea is <a href="https://store.steampowered.com/app/1110620?utm_source=manual" target="_blank">coming to Steam</a> in 3 days!</p><iframe src="https://store.steampowered.com/widget/1110620/?utm_source=website" class="steam-widget" ></iframe> <p>This blog series walks through some of the mechanics featured in the game. Be warned: mild spoilers ahead! This post covers Rhea’s Biome.</p><p><video loop autoplay muted controls> <source src="https://gamesbymason.com/blog/2024/wor-releases-in-3-days-rheas-biome/dialogue.mp4"> </video></p><p>This area introduces Rhea, and color circuits.</p></div></p><p><a href=https://gamesbymason.com/blog/2024/wor-releases-in-3-days-rheas-biome/ >Read more...</a></p> Thu, 16 May 2024 00:00:00 +0000 https://gamesbymason.com/blog/2024/wor-releases-in-4-days-overworld/ https://gamesbymason.com/blog/2024/wor-releases-in-4-days-overworld/ Way of Rhea releases in 4 days! - The Overworld <div id="intro"><p>Way of Rhea is <a href="https://store.steampowered.com/app/1110620?utm_source=manual" target="_blank">coming to Steam</a> in 4 days!</p><iframe src="https://store.steampowered.com/widget/1110620/?utm_source=website" class="steam-widget" ></iframe> <p>This blog series walks through some of the mechanics featured in the game. Be warned: mild spoilers ahead! This post covers The Overworld.</p><p><video loop autoplay muted controls> <source src="https://gamesbymason.com/blog/2024/wor-releases-in-4-days-overworld/center.mp4"> </video></p></div></p><p><a href=https://gamesbymason.com/blog/2024/wor-releases-in-4-days-overworld/ >Read more...</a></p> Wed, 15 May 2024 00:00:00 +0000 https://gamesbymason.com/blog/2024/wor-releases-in-5-days-snow-crabs-biome/ https://gamesbymason.com/blog/2024/wor-releases-in-5-days-snow-crabs-biome/ Way of Rhea releases in 5 days! - Snow Crab's Biome <div id="intro"><p>Way of Rhea is <a href="https://store.steampowered.com/app/1110620?utm_source=manual" target="_blank">coming to Steam</a> in 5 days!</p><iframe src="https://store.steampowered.com/widget/1110620/?utm_source=website" class="steam-widget" ></iframe> <p>This blog series walks through some of the mechanics featured in the game. Be warned: mild spoilers ahead! This post covers the second area in the game, Snow Crab’s Biome.</p><p><figure><video loop autoplay muted controls> <source src="https://gamesbymason.com/blog/2024/wor-releases-in-5-days-snow-crabs-biome/dialogue.mp4"> </video> <figcaption>Hermie got lost in the Ice Caves trying to help his dad, you need to save him!</figcaption></figure></p><p>This area introduces Snow Crab, and how you can use his behavior patterns to solve puzzles.</p></div></p><p><a href=https://gamesbymason.com/blog/2024/wor-releases-in-5-days-snow-crabs-biome/ >Read more...</a></p> Tue, 14 May 2024 00:00:00 +0000 https://gamesbymason.com/blog/2024/wor-releases-in-6-days-shrews-biome/ https://gamesbymason.com/blog/2024/wor-releases-in-6-days-shrews-biome/ Way of Rhea releases in 6 days! - Shrew's Biome <div id="intro"><p>In celebration of Way of Rhea <a href="https://store.steampowered.com/app/1110620?utm_source=manual" target="_blank">releasing on Steam</a> in 6 days, I’m making a post a day about a different aspect of the game.</p><p>Let’s look at the first area of the game: Shrew’s Biome.</p><p>Be warned–this blog series features mild spoilers!</p><iframe src="https://store.steampowered.com/widget/1110620/?utm_source=website" class="steam-widget" ></iframe> <p><figure><video loop autoplay muted controls> <source src="https://gamesbymason.com/blog/2024/wor-releases-in-6-days-shrews-biome/dialogue.mp4"> </video> <figcaption>Shrew is your excitable friend who’s very invested in you solving the forest puzzles tonight for some reason.</figcaption></figure></p></div></p><p><a href=https://gamesbymason.com/blog/2024/wor-releases-in-6-days-shrews-biome/ >Read more...</a></p> Mon, 13 May 2024 00:00:00 +0000 https://gamesbymason.com/blog/2024/wor-releases-in-7-days/ https://gamesbymason.com/blog/2024/wor-releases-in-7-days/ Way of Rhea releases in 7 days! <div id="intro"><p><img src="https://gamesbymason.com/blog/2024/wor-releases-in-7-days/thumb.png" alt="7 days to release"></p><p>Way of Rhea <a href="https://store.steampowered.com/app/1110620?utm_source=manual" target="_blank">releases on Steam</a> in 7 days! In celebration, starting tomorrow I’m making a post a day, each about a new aspect of the game.</p><iframe src="https://store.steampowered.com/widget/1110620/?utm_source=website" class="steam-widget" ></iframe> </div></p><p><a href=https://gamesbymason.com/blog/2024/wor-releases-in-7-days/ >Read more...</a></p> Mon, 22 Apr 2024 00:00:00 +0000 https://gamesbymason.com/blog/2024/wor-release-date/ https://gamesbymason.com/blog/2024/wor-release-date/ Way of Rhea - Release Date Announcement <div id="intro"><iframe style="aspect-ratio: 16/9" width="100%" src="https://www.youtube-nocookie.com/embed/vFsO436r2Pw?si=myRRsM3810IVTxCd" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen ></iframe> <p>Today I’m excited to announce: Way of Rhea is coming to Steam on <strong>May 20th, 2024!</strong></p><p>I want to thank everyone who’ve been patiently waiting for the game to come out–your support means a lot. If you’re excited for the game, the best way to help is:</p><ol><li>Wishlist Way of Rhea on <a href="https://store.steampowered.com/app/1110620?utm_source=rdt" target="_blank">Steam</a></li><li>Share <a href="https://youtu.be/vFsO436r2Pw" target="_blank">the release date trailer</a> with people, communities, or influencers that enjoy puzzle games</li></ol><p>I can’t wait for everyone to get their hands on the game. :)</p></div></p><p><a href=https://gamesbymason.com/blog/2024/wor-release-date/ >Read more...</a></p> Mon, 19 Feb 2024 00:00:00 +0000 https://gamesbymason.com/blog/2024/wor-closed-beta/ https://gamesbymason.com/blog/2024/wor-closed-beta/ Announcing the Way of Rhea Closed Beta! <div id="intro"><p><img src="https://gamesbymason.com/blog/2024/wor-closed-beta/cover.png" alt="closed beta"></p><p>Exciting news–we’re starting the closed beta of Way of Rhea!</p><p>I’m going to be running it through our <a href="https://discord.gg/JGeVt5XwPP" target="_blank">Discord</a>. I’m only adding a couple people at a time so that I have time to address feedback between participants–if you want me to add you to the list, ping me there!</p><h2>v0.1.0 Release Notes</h2><ul><li>All levels now have unique music</li><li>Marked areas navigable by crabs with crystals</li><li>Improved speed controls, speed controls (optionally) affect music</li><li>Improved biome progress visuals</li><li>Shows controls on screen in more cases</li><li>Fixed performance problem with inactive NPCs</li><li>Resolved issues connections between some puzzles in the end-game, polished end game puzzles</li><li>Fixed problem where if you move slow enough you wouldn’t trigger gates</li><li>Added accel/decl to character controllers</li><li>Adds more background art to various areas</li><li>Makes paths in forest biome more visually readable</li><li>Added input buffering</li><li>Displays song titles in game</li><li>Stops messing with Windows power schemes</li><li>Warn instead of erroring when keys can’t be mapped</li><li>Improves music transitions and looping</li><li>Hub world now less cramped</li><li>Implemented all achievements and secrets</li><li>Don’t repeatedly warn on save point mismatches Makes first ice puzzle clearer. Previously it was possible to solve it by accident, and it would appear as if the outcome was ā€œrandomā€ since the important interaction was happening off screen. Also causes the crab to walk right instead of left carrying the orb, making it visually clearer that they have picked * up since it is sorted in front of them.</li><li>Named all levels</li><li>Removes some puzzles from the forest biome that were redundant and/or didn’t fit with the spirit of the game</li><li>Starts adding character voices (gibberish)</li><li>Improves undo/redo further, especially in crab levels</li><li>Fixes problem where elevator visuals didn’t align with interactivity</li><li>Fixed minor dialogue glitches, improved dialogue</li><li>Implements credits</li></ul><h2>v0.2.0 Release Notes</h2><ul><li>Ships debug symbols on Windows</li><li>Fixed inadvertent red herring in second ice level, crystals now always indicate a path a crab could take</li><li>Made navigable areas more visually consistent in the ice biome</li><li>Fixed case sensitivity issue that lead to some missing textures on Linux and Steam Deck</li><li>Fixed weather related performance issue</li><li>Added graphics options to allow for toggling weather and distortion effects</li><li>Fixed issue where the first puzzle in the last forest level could be bypassed</li><li>Fixed issue where cloud saves wouldn’t sync cross platform</li></ul><p><em>Future beta release notes will be posted to <a href="https://steamcommunity.com/games/1110620/announcements/detail/7665759271877780610?snr=2___" target="_blank">Steam</a> and <a href="https://discord.gg/JGeVt5XwPP" target="_blank">Discord</a>.</em></p></div></p><p><a href=https://gamesbymason.com/blog/2024/wor-closed-beta/ >Read more...</a></p> Fri, 03 Nov 2023 00:00:00 +0000 https://gamesbymason.com/blog/2023/uniques/ https://gamesbymason.com/blog/2023/uniques/ Generating unique values for IMGUI IDs <div id="intro"><p><figure><a href="https://gamesbymason.com/blog/2023/uniques/level-editor.jpeg"><img src="https://gamesbymason.com/blog/2023/uniques/level-editor.jpeg" alt="An IMGUI."></a> <figcaption>An IMGUI.</figcaption></figure></p><p>Sometimes, you just want some unique bits to use as an ID. Maybe you’re working with an <a href="https://www.youtube.com/watch?v=Z1qyvQsjK5Y" target="_blank">immediate mode GUI</a>, or need to generate IDs for <a href="https://twitter.com/masonremaley/status/1708350679247646780" target="_blank">cancellable sounds.</a></p><p>In many cases you could technically get away with manually enumerating the various unique IDs in a header somewhere, but this is very inconvenient–especially in the case of IMGUIs: if you do this, every time you add or remove a UI element, you need to make a secondary change elsewhere in the codebase. You won’t be able to freely copy paste UI code.</p></div></p><p><a href=https://gamesbymason.com/blog/2023/uniques/ >Read more...</a></p> Sat, 23 Sep 2023 00:00:00 +0000 https://gamesbymason.com/blog/2023/art-tools-comments/ https://gamesbymason.com/blog/2023/art-tools-comments/ Replying to YouTube Comments on my SYCL Talk <div id="intro"><iframe style="aspect-ratio: 16/9" width="100%" src="https://www.youtube-nocookie.com/embed/89bLKVvF85M?si=-WcbW7CUiTG2HHvC" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen ></iframe> <p>If there’s one thing I’ve learned from 29 years of internet, it’s not to reply to YouTube comments.</p><p>Let’s do it anyway!</p><hr><p>I gave a talk at Software You Can Love (<a href="http://softwareyoucan.love/" target="_blank">SYCL</a>) titled <a href="https://gamesbymason.com/blog/2023/game-engines-are-art-tools/"><em>It’s Not About The Technology - Game Engines are Art Tools.</em></a> The <a href="https://youtu.be/89bLKVvF85M" target="_blank">YouTube recording</a> premiered on Monday, and there was a lot of high quality discussion in the comments.</p></div></p><p><a href=https://gamesbymason.com/blog/2023/art-tools-comments/ >Read more...</a></p> Mon, 18 Sep 2023 00:00:00 +0000 https://gamesbymason.com/blog/2023/lucid-kickstarter/ https://gamesbymason.com/blog/2023/lucid-kickstarter/ LUCID Kickstarter Goes Live! <div id="intro"><p> <a href="https://www.kickstarter.com/projects/matteblackstudio/lucid-2" target="_blank"><img src="https://gamesbymason.com/blog/2023/lucid-kickstarter/lucid.gif" alt="LUCID"></a></p><p>A game I do some programming for, LUCID, just went live with <a href="https://www.kickstarter.com/projects/matteblackstudio/lucid-2" target="_blank">its Kickstarter</a>!</p><p>I’m sure Eric would appreciate your support. Don’t worry—I’m still hard at work on Way of Rhea—I typically have a few projects in the oven at a time. :)</p></div></p><p><a href=https://gamesbymason.com/blog/2023/lucid-kickstarter/ >Read more...</a></p> Mon, 18 Sep 2023 00:00:00 +0000 https://gamesbymason.com/blog/2023/game-engines-are-art-tools/ https://gamesbymason.com/blog/2023/game-engines-are-art-tools/ It's Not About the Technology - Game Engines are Art Tools <div id="intro"><p>In June, I gave a talk at <a href="https://softwareyoucan.love/" target="_blank">Software You Can Love</a> titled <em>It’s Not About The Technology - Game Engines are Art Tools</em>. The intended audience was systems programmers, but there are lessons here for people evaluating off the shelf systems as well.</p><p>This is a part two to my talk from Handmade Seattle last year, <a href="https://gamesbymason.com/blog/2022/survivorship-bias/">It’s Not Survivorship Bias - On Successful Software Endeavors</a>.</p><p>Please note that I’m playing a little joke at the beginning that may not work as well without a captive audience considering <a href="https://gamesbymason.com/blog/2023/make-your-own-game-engine/">the recent Unity BS</a>, so please watch the whole thing before yelling at me.</p><p>See my replies to comments <a href="https://gamesbymason.com/blog/2023/art-tools-comments/">here</a>.</p><p><strong><a href="https://www.youtube.com/watch?v=89bLKVvF85M" target="_blank">Recording (premieres at 12pm PST)</a></strong></p><iframe style="aspect-ratio: 16/9" width="100%" src="https://www.youtube-nocookie.com/embed/89bLKVvF85M?si=-WcbW7CUiTG2HHvC" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen ></iframe> <p><strong><a href="https://docs.google.com/presentation/d/1UKe5AuEIWIg1kzyw3AwSBYSF0J6FyrqEQ-jK81W-_a0/" target="_blank">Slides</a></strong></p><iframe style="aspect-ratio: 16/9.7" width="100%" src="https://docs.google.com/presentation/d/e/2PACX-1vTKIFZRhwQtBsIsGPZ7NRyuxwQZ9JapW34eOXs9PUcOqtWSfAH0Im3aiIa4UMJarooqWbbbAm1V8klH/embed?start=false&loop=false&delayms=60000" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true" ></iframe> </div></p><p><a href=https://gamesbymason.com/blog/2023/game-engines-are-art-tools/ >Read more...</a></p> Wed, 13 Sep 2023 00:00:00 +0000 https://gamesbymason.com/blog/2023/make-your-own-game-engine/ https://gamesbymason.com/blog/2023/make-your-own-game-engine/ Make Your Own Game Engine <div id="intro"><p><img src="https://gamesbymason.com/blog/2023/make-your-own-game-engine/unity.png" alt="unity logo wearing a top hat and monocle"></p><p><a href="https://www.axios.com/2023/09/13/unity-runtime-fee-policy-marc-whitten" target="_blank">Recent events</a> have a lot of studios <a href="https://twitter.com/megacrit/status/1702077576209207611?s=46&t=Vk6MuilKkI8SdxRKjM_YXQ" target="_blank">thinking about their choice of game engine</a>, and at first glance, options appear to be limited. But things don’t have to be this way.</p><p>For most studios, the optimal short term strategy is to wait and see if Unity is forced to back down. Retroactively altering the engine license for shipped games certainly doesn’t <em>sound</em> legal.</p><p>While waiting it out may be pragmatic for existing projects, it doesn’t save you from the nightmare of having your entire business beholden to the whims of Unity Technologiesā„¢.</p><p>You could decide to switch engines for future games. Many people will go to Unreal. I trust Epic more than I trust Unity, in particular because they give everyone source access, but if you’re switching anyway I recommend looking into the free and open source engine <a href="https://godotengine.org/" target="_blank">Godot</a> which is MIT licensed. Info on console support <a href="https://docs.godotengine.org/en/stable/tutorials/platform/consoles.html" target="_blank">here.</a></p><p>There is, however, another option. The <em>nuclear option.</em></p><p>You could write your own game engine.</p></div></p><p><a href=https://gamesbymason.com/blog/2023/make-your-own-game-engine/ >Read more...</a></p> Mon, 21 Aug 2023 00:00:00 +0000 https://gamesbymason.com/blog/2023/way-of-rhea-linux/ https://gamesbymason.com/blog/2023/way-of-rhea-linux/ Way of Rhea - Linux and Steamdeck Support! <div id="intro"><p><img src="https://gamesbymason.com/blog/2023/way-of-rhea-linux/rendering.jpg" alt="Way of Rhea running natively on Steam Deck"></p><p>My puzzle game Way of Rhea now runs natively on Linux, and Steam Deck! This is in addition to the existing Windows support.</p><p>The new demo also has some quality of life improvements–namely the ability to pause and fast-forward time.</p><p>You can <a href="https://store.steampowered.com/app/1110620?utm_source=linux-post" target="_blank">give the free demo a try here</a>, if you run into any issues please <a href="mailto:[email protected]" target="_blank">let me know</a>. :) <strong>Please note that if you’ve ever run the game through Proton, Steam will default to Proton despite the presence of a native build. The UI does not always reflect this correctly, you need to toggle Proton on and back off.</strong></p><p>The rest of this post covers some technical details for those interested in the porting process, and unfortunately, announces that I’m dropping the planned macOS support.</p><p><em>If you work at Valve and want to review the build so we can be part of Steam Deck Verified, that would be much appreciated! I’m also happy to help you repro the bugs I worked around if they aren’t known issues, <a href="mailto:[email protected]" target="_blank">shoot me an email</a>.</em></p></div></p><p><a href=https://gamesbymason.com/blog/2023/way-of-rhea-linux/ >Read more...</a></p> Mon, 01 May 2023 00:00:00 +0000 https://gamesbymason.com/blog/2023/thoughts-from-gdc-23/ https://gamesbymason.com/blog/2023/thoughts-from-gdc-23/ Thoughts from GDC '23 <div id="intro"><p><img src="https://gamesbymason.com/blog/2023/thoughts-from-gdc-23/bus-cropped.jpg" alt="'GDC discounts for big bus. I worked at GameStop for 7 years and miss all your wonderful faces. Please drop by and say hi!!!'"></p><p>Posting this a little late, but I had a great time at GDC this year! I got to catch up with a lot of people I don’t get to see very often, and meet a lot of new folks.</p><p>On top of that, a member of <a href="https://gumbonyc.org/" target="_blank">GUMBO</a> won the IGF Grand Prize, <em>and</em> the Nuovo award, with his game <a href="https://store.steampowered.com/app/1885750/Betrayal_At_Club_Low/" target="_blank">Betrayal At Club Low</a>. You should play it–Cosmo makes great games, and you don’t have to take my word for it this time what with the whole winning the IGF thing.</p><p>I’ve written up my personal takeaways from some of the talks I attended below.</p></div></p><p><a href=https://gamesbymason.com/blog/2023/thoughts-from-gdc-23/ >Read more...</a></p> Fri, 23 Dec 2022 00:00:00 +0000 https://gamesbymason.com/blog/2022/survivorship-bias/ https://gamesbymason.com/blog/2022/survivorship-bias/ It's Not Survivorship Bias (Talk) <div id="intro"><p>Hey everyone! I recently gave a talk at <a href="https://handmade-seattle.com/" target="_blank">Handmade Seattle</a> titled <em>It’s Not Survivorship Bias - On Successful Software Endeavours</em> on why some software projects find an audience and others don’t, with a focus on independent games.</p><p>I’m working on converting this talk into a blog post, in the meantime here are the recordings & slides!</p><iframe src="https://player.vimeo.com/video/783465506?h=6992c02a02&color=ff0179" width="100%" style="aspect-ratio: 16/9;" allow="fullscreen; picture-in-picture" allowfullscreen ></iframe> <p><a href="https://guide.handmade-seattle.com/c/2022/its-not-survivorship-bias/" target="_blank">Talk Annotations @ The Handmade Guide</a></p><iframe src="https://player.vimeo.com/video/783467957?h=38989500df&color=ff0179" width="100%" style="aspect-ratio: 16/9;" allow="fullscreen; picture-in-picture" allowfullscreen ></iframe> <p><a href="https://guide.handmade-seattle.com/c/2022/its-not-survivorship-bias-qa/" target="_blank">Q&A Annotations @ The Handmade Guide</a></p><iframe src="https://docs.google.com/presentation/d/e/2PACX-1vRwMKGJQCRMORqO4sSrx5zFnqHOlYVmK2V7gKTwOKS1ghtFxbGQ6qo3BO67rr-WwI8QMaomH_Axkn5A/embed?start=false&loop=false&delayms=3000" width="100%" style="aspect-ratio: 16/9;" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true" ></iframe> <hr><p>If you enjoyed this post and want to be notified about future posts, you can <a href="https://gamesbymason.com/newsletter/signup/tech">sign up for my mailing list</a> or <a href="/feed.xml">follow my RSS feed</a>).</p> <p>Sharing this post on your social platform of choice is always much appreciated.</p></div></p><p><a href=https://gamesbymason.com/blog/2022/survivorship-bias/ >Read more...</a></p> Thu, 13 Jan 2022 00:00:00 +0000 https://gamesbymason.com/blog/2022/asking-windows-nicely/ https://gamesbymason.com/blog/2022/asking-windows-nicely/ Making Your Game Go Fast by Asking Windows Nicely <div id="intro"><p><figure><img src="https://gamesbymason.com/blog/2022/asking-windows-nicely/speed-limit.jpg" alt="a speed limit sign that says '45 fps'"> <figcaption>original: https://www.publicdomainpictures.net/en/view-image.php?image=197252&picture=speed-limit-45</figcaption></figure></p><p>Normally, to make your software go faster, it has to do less work.</p><p>This usually involves improving your algorithms, skipping work the user won’t see, <a href="https://vimeo.com/649009599" target="_blank">factoring your target hardware into the design process</a>, or modifying your game’s content.</p><p>We’re not talking about any of that today. This post is a list of ways to make your game run faster on Windows–without making any major changes to your game’s content, code, or algorithms.</p><p>I employ these optimizations in <a href="https://store.steampowered.com/app/1110620/Way_of_Rhea/?utm_campaign=blog&utm_source=website&utm_content=asking-nicely" target="_blank">Way of Rhea</a>, a puzzle adventure written in a mix of <a href="https://www.rust-lang.org/" target="_blank">Rust</a> and a custom Rust scripting language. While this project is written in Rust, all the optimizations listed here are language independent–where the translation isn’t straightforward I’ve provided both Rust and C++ examples.</p></div></p><p><a href=https://gamesbymason.com/blog/2022/asking-windows-nicely/ >Read more...</a></p> Fri, 25 Jun 2021 00:00:00 +0000 https://gamesbymason.com/blog/2021/when-to-rewrite/ https://gamesbymason.com/blog/2021/when-to-rewrite/ When To Rewrite <div id="intro"><p><img id="half-width" src="https://gamesbymason.com/blog/2021/when-to-rewrite/header.jpg" alt="text message quote: damn this is a great rant, IMO you could make an entire blog post out of this"></p><p>Alright, why not. :)</p></div></p><p><a href=https://gamesbymason.com/blog/2021/when-to-rewrite/ >Read more...</a></p> Fri, 05 Mar 2021 00:00:00 +0000 https://gamesbymason.com/blog/2021/merge-conflicts/ https://gamesbymason.com/blog/2021/merge-conflicts/ Merge Conflicts: Avoiding Them, Making Them Less Painful <div id="intro"><p><img src="https://gamesbymason.com/blog/2021/merge-conflicts/conflict.jpg" alt="a merge conflict"></p><blockquote><p>Hey Mason could you explain to me a safe way to use github with multiple users for a Unity project? I know a little about github, and I’ve set up the project with the Brackeys’ tutorial. That all went great. I even have the other people pulling the project onto their machines successfully. And I can successfully do a push from mine. My concern is what if they make changes, and want to push. Do I need to do a push first before they do or do they need to do a pull before they do a push? I’m a bit confused on the sequence, and in 120 the git got all screwed up and that has me concerned!</p></blockquote><p>Normally, I reserve this blog for updates on <a href="https://gamesbymason.com/way-of-rhea/">Way of Rhea</a>, or <a href="https://gamesbymason.com/blog/2021/fullscreen-exclusive-is-a-lie/">low level engine work</a>. This post is a little different.</p>Way of Rhea is entirely self funded. Some of that funding comes from savings from when I worked full time as a programmer, some of it comes from freelance work <sup><a href="#1" id="^1">1</a></sup>, and the rest comes from teaching grad and undergrad students game dev. <p>Regardless of whether I’m currently teaching grad or undergrad, Unity or engine dev, general C++ or graphics programming, there’s one key programming skill that nobody seems to ever teach my students before they get to my class: version control.</p><p>I’m not sure why this is. I suppose everyone hopes someone else will talk to them about it. Regardless, I always make a point to spend a little class time on version control, because I can’t in good conscience watch my students struggle through multi-week assignments without a VCS.</p><p>Today, I got the really great question above from a student. I spent a few minutes writing up an answer, and then realized, I should probably <em>save</em> this answer somewhere so I can point future students to it.</p><p>So, that’s what this post is! A public note to myself for later. My answer follows.</p><p>Hey everyone! @Rob mentioned having issues with merge conflicts in git, and I realized I never talked about these. If you’re not using git, this may not be relevant to you, but if you are it’s probably worth reading on!</p></div></p><p><a href=https://gamesbymason.com/blog/2021/merge-conflicts/ >Read more...</a></p> Fri, 05 Mar 2021 00:00:00 +0000 https://gamesbymason.com/blog/2021/how-to-write-a-crash-reporter/ https://gamesbymason.com/blog/2021/how-to-write-a-crash-reporter/ How To Write a Crash Reporter <div id="intro"><p><img src="https://gamesbymason.com/blog/2021/how-to-write-a-crash-reporter/additional-info.jpg" alt="a crash reporter UI"></p><p>So. Up until last week, <a href="https://store.steampowered.com/app/1110620?utm_campaign=blog&utm_content=crash-reporter" target="_blank">Way of Rhea</a> did not have a crash reporter. This is kind of a problem!</p><p>We’re a small, self-funded team. Our initial reviews could have a big impact on sales. The last thing we need is for an easily fixable crash to mess up our day one reviews!</p><p>I’ve <a href="https://gamesbymason.com/blog/2021/fullscreen-exclusive-is-a-lie/">tested the various aspects of the game on a large variety of setups</a>, but there’s always a configuration you’ve yet to test. I’ve <a href="https://east.paxsite.com/" target="_blank">participated</a> <a href="https://indiemakersyndicate.com/" target="_blank">in</a> <a href="https://www.eventbrite.com/e/bostonfig-fest-virtual-tickets-129017660295" target="_blank">lots</a> <a href="https://www.play-nyc.com/" target="_blank">of</a> <a href="https://store.steampowered.com/news/group/4/view/4534507336203365605" target="_blank">events</a> with test builds, but I doubt most players will bother to report when a free demo crashes unless they’re already very invested, or reporting it is very easy.</p><p>So. Let’s make it easy!</p></div></p><p><a href=https://gamesbymason.com/blog/2021/how-to-write-a-crash-reporter/ >Read more...</a></p> Sat, 20 Feb 2021 00:00:00 +0000 https://gamesbymason.com/blog/2021/fullscreen-exclusive-is-a-lie/ https://gamesbymason.com/blog/2021/fullscreen-exclusive-is-a-lie/ Fullscreen Exclusive Is A Lie (...sort of) <div id="intro"><p><img src="https://gamesbymason.com/blog/2021/fullscreen-exclusive-is-a-lie/settings.jpg" alt="way of rhea video settings"></p><p>Fullscreen exclusive is a real thing your computer can decide to grant a window, but, as of yet I haven’t been able to find a single game where the fullscreen exclusive vs borderless window settings consistently do what you’d expect them to.</p><p>If you’re an expert in this topic and believe this post is incorrect in any way, definitely <a href="mailto:[email protected]" target="_blank">email me</a> or <a class="strike-link " href="https://twitter.com/masonremaley">DM me on Twitter</a> and I’ll issue a correction!</p><p>If you’re interested in jumping to the conclusion, see <a href="#testing-fullscreen-exclusivity-in-other-games">Testing Fullscreen Exclusivity in Other Games</a> and <a href="#takeaways">Takeaways</a>. If you’re interested in my methodology, read on.</p></div></p><p><a href=https://gamesbymason.com/blog/2021/fullscreen-exclusive-is-a-lie/ >Read more...</a></p> Tue, 05 Jan 2021 00:00:00 +0000 https://gamesbymason.com/blog/2021/setting-a-rust-windows-exe-icon/ https://gamesbymason.com/blog/2021/setting-a-rust-windows-exe-icon/ Setting a Rust Executable's Icon in Windows <div id="intro"><p>This morning, I decided it was long overdue that <a href="https://gamesbymason.com/way-of-rhea/">Way of Rhea</a> get its own icon.</p><p><img src="https://gamesbymason.com/blog/2021/setting-a-rust-windows-exe-icon/icon.png" alt="way of rhea icon"></p><p>I believe that if you’re building a project in Visual Studio there’s a UI through which you can change your exe’s icon–but I’m not a Visual Studio user. It took me quite a while to figure out how to set an exe’s icon from the command line, so I figured I’d document what I learned here in the hopes of saving someone else some time.</p><p>It’s possible to dynamically load and set a <em>window</em> icon via code, but for the icon to show up in the file explorer it actually needs to be baked into the executable. This makes sense–<code>explorer.exe</code> shouldn’t have to have to run an executable to determine its icon!</p><p>The rest of this post will walk you through how to do this. The only Rust specific bit is the syntax by which I pass arguments to the linker.</p></div></p><p><a href=https://gamesbymason.com/blog/2021/setting-a-rust-windows-exe-icon/ >Read more...</a></p> Sun, 04 Oct 2020 00:00:00 +0000 https://gamesbymason.com/blog/2020/qa-sessions-with-steam/ https://gamesbymason.com/blog/2020/qa-sessions-with-steam/ Notes from the Q&A Sessions with Steam <div id="intro"><p>I recently attended the <a href="https://www.eventbrite.ca/e/qa-session-with-steam-tickets-117008295963" target="_blank">Steam Q&A</a> hosted by <a href="https://gameplayspace.com/" target="_blank">GamePlay Space</a>, and I took a bunch of notes for myself. A few friends asked about the event, so I figured I’d just upload my notes somewhere I can share.</p><p>If you’d prefer to read a summary over the raw notes, Chris Zukowski put together some takeaways in his article <em><a href="http://howtomarketagame.com/2020/09/20/what-steam-says-you-should-do/" target="_blank">ā€œWhat does Valve say you should do to sell your game on Steam?ā€</a></em>, and Simon Carless wrote some of his thoughts up in <em><a href="https://gamediscoverability.substack.com/p/the-mysterious-steam-algorithm-not" target="_blank">ā€œThe ā€˜mysterious’ Steam algorithm - not that scary?ā€</a></em>.</p></div></p><p><a href=https://gamesbymason.com/blog/2020/qa-sessions-with-steam/ >Read more...</a></p> Mon, 30 Mar 2020 00:00:00 +0000 https://gamesbymason.com/blog/2020/symmetric-matrices/ https://gamesbymason.com/blog/2020/symmetric-matrices/ Symmetric Matrices & Triangle Numbers <div id="intro"><style> table { width: 100%; } table, th, td { border: 1px solid; border-collapse: collapse; } th, td { padding: 0.5em; } th { background: rgba(255.0, 255.0, 255.0, 0.1); } td { background: rgba(0.0, 0.0, 0.0, 0.5); } </style> <p>With Santa Cruz officially in lockdown due to COVID-19, I’ve been at home a lot working on <a href="https://gamesbymason.com/way-of-rhea/">Way of Rhea</a>. Since I’m left without any excuse for not posting, here’s a neat proof I happened across while working on some new puzzles. :)</p></div></p><p><a href=https://gamesbymason.com/blog/2020/symmetric-matrices/ >Read more...</a></p> Wed, 05 Jun 2019 00:00:00 +0000 https://gamesbymason.com/blog/2019/entity-systems/ https://gamesbymason.com/blog/2019/entity-systems/ Way of Rhea's Entity System <div id="intro"><p>I posted <a href="https://twitter.com/masonremaley/status/1135083247598047232" target="_blank">this poll</a> on Twitter few weeks ago:</p><p><img src="https://gamesbymason.com/blog/2019/entity-systems/poll.png" alt="twitter poll screenshot"></p><p>Entity systems won by a long shot, so that’s what I’m going to be writing about today.</p>In particular, I'm going to outline the process that lead me to <a href="/way-of-rhea">Way of Rhea</a>'s current entity system. <i>Way of Rhea</i> is being built in a <a href="/blog/tags/#tech">custom engine</a> and <a href="/blog/2018/scripting-language-apis">scripting language</a> written in <a href="https://www.rust-lang.org/" target="_blank">Rust</a>, but the ideas described should still be applicable elsewhere. Hopefully this writeup will be found helpful, or at least interesting. :) </div></p><p><a href=https://gamesbymason.com/blog/2019/entity-systems/ >Read more...</a></p> Sat, 30 Jun 2018 00:00:02 +0000 https://gamesbymason.com/blog/2018/artists-alley-2/ https://gamesbymason.com/blog/2018/artists-alley-2/ Artists' Alley #2: Inspiration and Learning from Others <div id="intro"><p>These past two weeks I have been drawing inspiration from other side scroller games in order to develop a style unique to <a href="https://gamesbymason.com/way-of-rhea/">[Way of Rhea]</a>!</p><p>I have found Braid to be a particularly good source of guidance because it is a successful game with an inspiring art style. The art for Braid is both as encapsulating as it is functional. Additionally, this is the first serious game I’ve worked on, so it helps that Braid’s artist, David Hellman has a <a href="http://www.davidhellman.net/blog/the-art-of-braid-index" target="_blank">SUPER amazing process blog of his own out</a>. I’ve been using this blog as guidance for how to approach our project here at [Games by Mason LLC].</p><p>One of the steps Hellman used to create Braid’s art was tracing. He traced scenes from games such as Mario, re-making them in possible Braid styles. I’ve traced a few levels from Braid and other side scrollers with focus on incorporating the color schemes from last post into more functional and stylized ā€œscreenshotā€ scenes.</p><p>Through this exercise, I’ve stumbled upon things I would like to incorporate into the game:</p><ul><li>Angular ā€œrocksā€ (which can easily change to suit new color schemes and make variable puzzle pieces</li><li>Foliage which can be easily made into variable puzzle pieces.</li><li>A brighter foreground and a dimmer non-interactive area</li><li>The use of water as an obstacle (I would like to imagine the Sprites would melt on contact!)</li></ul><p>This tracing exercise has also made it apparent there are some things I need to correct/ think more about as the journey of creation continues:</p><ul><li>While I like the jaggy rocks, I’ll have to make sure the ā€œwalkableā€ areas need are obvious and completely intuitive.</li><li>The pools are a really fun and aesthetically pleasing. But I’ll need to do some soul- searching and peer review to make sure they are not too distracting.</li><li>The interactive pieces (gates, teleporters, etc..) need to look a bit more detailed.</li><li>I think I’m on the right path, but the non-interactive background needs to be developed a bit more!</li></ul><p>Below are some ā€œtracedā€ pieces and the original screenshots:</p><style> .traced { width: 50%; } </style> <p><figure><img src="https://gamesbymason.com/blog/2018/artists-alley-2/1-ms.jpg" alt="traced screenshot"> <figcaption>My art</figcaption></figure> <figure><img class="traced " src="https://gamesbymason.com/blog/2018/artists-alley-2/2-braid.png" alt="original braid screenshot 1"> <figcaption>Braid</figcaption></figure> <figure><img class="traced " src="https://gamesbymason.com/blog/2018/artists-alley-2/3-braid.png" alt="original braid screenshot 2"> <figcaption>Braid</figcaption></figure> <figure><img src="https://gamesbymason.com/blog/2018/artists-alley-2/4-ms.jpg" alt="traced screenshot"> <figcaption>My art</figcaption></figure> <figure><img src="https://gamesbymason.com/blog/2018/artists-alley-2/5-ms.jpg" alt="traced screenshot"> <figcaption>My art</figcaption></figure> <figure><img class="traced " src="https://gamesbymason.com/blog/2018/artists-alley-2/6-aa.png" alt="orignal screenshot 1"> <figcaption>Traced screenshot 1</figcaption></figure> <figure><img src="https://gamesbymason.com/blog/2018/artists-alley-2/7-s.png" alt="orignal screenshot 1"> <figcaption>Traced screenshot 2</figcaption></figure></p></div></p><p><a href=https://gamesbymason.com/blog/2018/artists-alley-2/ >Read more...</a></p> Sat, 30 Jun 2018 00:00:01 +0000 https://gamesbymason.com/blog/2018/scripting-language-apis/ https://gamesbymason.com/blog/2018/scripting-language-apis/ Scripting Language APIs <div id="intro"><h1>Stack Based API</h1><p>The first API I came across for talking to a scripting language from engine code was Lua’s stack based C API. Here’s hello world executed in Lua, from a C program:</p><pre><code class="c"><span class="constant variable function">lua_getglobal</span>(<span class="constant variable">ctx</span>, <span class="string">&quot;print&quot;</span>)<span class="delimiter">;</span> <span class="constant variable function">lua_pushstring</span>(<span class="constant variable">ctx</span>, <span class="string">&quot;Hello, World!&quot;</span>)<span class="delimiter">;</span> <span class="constant variable function">lua_call</span>(<span class="constant variable">ctx</span>, <span class="number">1</span>, <span class="number">0</span>)<span class="delimiter">;</span> </code></pre> <p>Let’s break that down. First, we push the function we want to call onto the stack:</p><pre><code class="c"><span class="constant variable function">lua_getglobal</span>(<span class="constant variable">ctx</span>, <span class="string">&quot;print&quot;</span>)<span class="delimiter">;</span> <span class="comment">// [print]</span> </code></pre> <p>Next, we push any arguments that we want to pass to the function:</p><pre><code class="c"><span class="constant variable function">lua_pushstring</span>(<span class="constant variable">ctx</span>, <span class="string">&quot;Hello, World!&quot;</span>)<span class="delimiter">;</span> <span class="comment">// [print, &quot;Hello, World!&quot;]</span> </code></pre> <p>Lastly, we call the function, and specify the number of argumetns we have and return results we expect:</p><pre><code class="c"><span class="constant variable function">lua_call</span>(<span class="constant variable">ctx</span>, <span class="number">1</span>, <span class="number">0</span>)<span class="delimiter">;</span> <span class="comment">// []</span> </code></pre> <p>On one hand, this is a lot of boiler plate, and you can get it wrong for example by pushing the wrong number of arguments.</p><p>On the other hand, this is very flexible. You’re directly talking to the interpreter, so you don’t need some common subset to exist between the two languages to make things work, and you’re not limited by what template magic was able to accomplish.</p><h1>Higher Level APIs</h1><p>When I started designing my language, I figured I could do better than this. I’d heard about people using template metaprogramming in C++ to reduce the boiler plate it takes to call Lua, and figured I’d just build my language to support that kind of API in Rust to begin with.</p><p>I ended up with this:</p><pre><code class="rust"><span class="keyword">let</span> <span class="constructor constant">print</span><span class="punctuation_delimiter">:</span> <span class="type">Fun</span><span class="punctuation_bracket">&lt;</span>(<span class="type">ScriptString</span><span class="punctuation_delimiter">,</span><span class="punctuation_bracket">)</span><span class="punctuation_delimiter">,</span> <span class="type">Result</span><span class="punctuation_bracket">&lt;</span>(<span class="punctuation_bracket">)</span><span class="punctuation_delimiter">,</span> <span class="type">Panic</span><span class="punctuation_bracket">&gt;</span><span class="punctuation_bracket">&gt;</span> = <span class="constructor constant">vm</span><span class="punctuation_delimiter">.</span><span class="property function_method">lookup</span><span class="punctuation_bracket">(</span><span class="string">&quot;std&quot;</span><span class="punctuation_delimiter">,</span> <span class="string">&quot;print&quot;</span><span class="punctuation_bracket">)</span><span class="punctuation_delimiter">.</span><span class="property function_method">unwrap</span><span class="punctuation_bracket">(</span><span class="punctuation_bracket">)</span><span class="punctuation_delimiter">;</span> <span class="keyword">let</span> <span class="constructor constant">message</span> = <span class="constructor constant type">ScriptString</span><span class="punctuation_delimiter">::</span><span class="constructor constant function">new</span><span class="punctuation_bracket">(</span><span class="operator">&amp;</span><span class="keyword">mut</span> <span class="constructor constant">vm</span><span class="punctuation_delimiter">,</span> <span class="string">&quot;Hello, world!&quot;</span><span class="punctuation_bracket">)</span><span class="punctuation_delimiter">;</span> <span class="constructor constant">print</span><span class="punctuation_delimiter">.</span><span class="property function_method">call</span><span class="punctuation_bracket">(</span><span class="operator">&amp;</span><span class="keyword">mut</span> <span class="constructor constant">vm</span><span class="punctuation_delimiter">,</span> <span class="constructor constant">message</span><span class="punctuation_bracket">)</span><span class="punctuation_delimiter">;</span> </code></pre> <p>Alright well it turns out it’s not actually less code, but it <em>is</em> statically typed. Through lots of crazy generics and some codegen I’m able to pass (opaque) struct pointers from the scripting language to Rust as well.</p><p>The problem with this approach is simply that the implementation is super complicated, and it assumes that features in one language necessarily translate to features in another. I think if you’re gonna go this route, you should define a common subset of each language that are easy to expose to the other from the start–I didn’t, I started with the goal over <em>everything</em> being available to this interface, and as time went on and I added more features to the language, found that some features either realistically didn’t translate well or weren’t worth the time it would take to implement.</p><h1>extern ā€œCā€</h1><p>So, where does that leave us?</p><p>Well, the higher level approach suffices for now. It’s not ideal, but it’s not worth changing for the time being either because it’s getting the job done. I think if I was tasked with improving the situation without making any other changes to the language, I’d probably look for a compromise. Maybe the latter API style is built on top of the former, or maybe I go with the higher level API but just set a very small subset of the language that gets expose that way from the beginning.</p><p>I’m not planning on doing either of those things, because I’m planning on making a bigger change to the language that allows for another approach–</p><p>After I ship <a href="https://gamesbymason.com/way-of-rhea/">Way of Rhea</a>, I’m going to try my hand at writing an x64 backend for my game. I originally targeted a <a href="http://craftinginterpreters.com/a-bytecode-virtual-machine.html" target="_blank">bytecode</a> because the conventional wisdom says that that’s what you do to be platform independent. Maybe that was true in the past, but…</p><p>Most of my players are on Windows, and everyone on Windows is on x64 nowadays. I don’t even have to care about executable format for non-Windows users who are still on x64–the game will just compile all the code at runtime, and then jump into the compiled code.</p><p>What does this look like from an API standpoint? Well, we just need both languages to support the C ABI and we’re ready to go. I haven’t written this yet, but I imagine it’d look something like this:</p><pre><code class="rust"><span class="keyword">extern</span> <span class="string">&quot;C&quot;</span> <span class="punctuation_bracket">{</span> <span class="keyword">fn</span> <span class="constructor constant function">print</span><span class="punctuation_bracket">(</span>_<span class="punctuation_delimiter">:</span> <span class="operator">*</span><span class="keyword">const</span> <span class="type">c_char</span><span class="punctuation_bracket">)</span><span class="punctuation_delimiter">;</span> <span class="punctuation_bracket">}</span> <span class="keyword">let</span> <span class="constructor constant">message</span> = <span class="constructor constant type">CString</span><span class="punctuation_delimiter">::</span><span class="constructor constant function">new</span><span class="punctuation_bracket">(</span><span class="string">&quot;Hello, world!&quot;</span><span class="punctuation_bracket">)</span><span class="punctuation_delimiter">.</span><span class="property function_method">unwrap</span><span class="punctuation_bracket">(</span><span class="punctuation_bracket">)</span><span class="punctuation_delimiter">;</span> <span class="keyword">unsafe</span> <span class="punctuation_bracket">{</span> <span class="constructor constant function">hello</span><span class="punctuation_bracket">(</span><span class="constructor constant">message</span><span class="punctuation_delimiter">.</span><span class="property function_method">as_ptr</span><span class="punctuation_bracket">(</span><span class="punctuation_bracket">)</span><span class="punctuation_delimiter">;</span> <span class="punctuation_bracket">}</span> </code></pre> <p>It’s as if we implemented option 2 for a subset of the language, but:</p><ul><li>It requires very little implementation effort (assuming we’re already targeting x64 and using a superset of the C ABI)</li><li>We can now talk to <em>any</em> language that supports the C ABI</li></ul></div></p><p><a href=https://gamesbymason.com/blog/2018/scripting-language-apis/ >Read more...</a></p> Sat, 30 Jun 2018 00:00:00 +0000 https://gamesbymason.com/blog/2018/artists-alley-1/ https://gamesbymason.com/blog/2018/artists-alley-1/ Artists' Alley #1: Abstract Palettes and Environment <div id="intro"><p>Artists Alley is a segment which provides a behind the scenes glance into the artistic process for <a href="https://gamesbymason.com/way-of-rhea/">[Way of Rhea (WoR)]</a>.</p><p>This segment is essentially a journal that helps me keep organized and focused. Additionally, I hope these updates will provide insight to other newbie gaming artists, game developers who are working with artists, and curious individuals.</p><p>That said, I am beyond excited about this project! And I hope you all will join me on this journey full of magic, whimsy, and learning <];{D></p><p>So far, I am happy about the existing color palette for <a href="https://gamesbymason.com/way-of-rhea/">[WoR]</a>. I have been exploring how this palette can be manipulated to create different environments and moods. This can be done by changing weight on different colors within the palette.</p><p>For instance, when pale pink is the most prominent color, the world becomes a bit bubble-gummy and light.</p><p><img src="https://gamesbymason.com/blog/2018/artists-alley-1/0.5.jpg" alt="abstract bubbly concept art"> <img src="https://gamesbymason.com/blog/2018/artists-alley-1/1.png" alt="bubble gummy level concept art"></p><p>While oranges, and deep purple dominating the scene brings to mind more mysterious deep feelings.</p><p><img src="https://gamesbymason.com/blog/2018/artists-alley-1/2.png" alt="abstract rocky concept art"> <img src="https://gamesbymason.com/blog/2018/artists-alley-1/2.5.jpg" alt="abstract rocky concept art with puzzle pieces"></p><p>Aesthetics I want to achieve, when I get a better feel for setting include: A sense of curiosity, mystery, a pinch of fun, and a color scheme that can be variable for different moods.</p><p>As the game progresses and the plot unfolds, the background will reflect intended emotions. Some levels will be a bit darker, and should feel a bit scary. While other levels should be light and whimsical. In addition to color, terrain make up is important for game design. Different terrains can lead to different obstacles (water, vines, gaps, etc…)</p><p><img src="https://gamesbymason.com/blog/2018/artists-alley-1/3.png" alt="nature concept art"></p><p>Another factor to explore through environment is physics. What is the gravity of the environment? Are there any special ā€˜rules’? [WoR] is a puzzle game. So if for instance, the terrain is mirrored, the character you are controlling can have a reflection plane which mimics the players moves. To make things interesting, there could be some ā€˜inconsistencies’ between these planes, and the player can switch planes to solve puzzles and overcome obstacles.</p><p><img src="https://gamesbymason.com/blog/2018/artists-alley-1/4.png" alt="manmade concept art 1"> <img src="https://gamesbymason.com/blog/2018/artists-alley-1/5.png" alt="manmade concept art 2"></p></div></p><p><a href=https://gamesbymason.com/blog/2018/artists-alley-1/ >Read more...</a></p>