Games by Mason Blog
https://gamesbymason.com/blog
The Games by Mason BlogZine -- https://zine-ssg.ioen-usTue, 17 Feb 2026 00:04:12 +0000Sat, 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">"print"</span>)<span class="delimiter">;</span>
<span class="constant variable function">lua_pushstring</span>(<span class="constant variable">ctx</span>, <span class="string">"Hello, World!"</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">"print"</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">"Hello, World!"</span>)<span class="delimiter">;</span> <span class="comment">// [print, "Hello, World!"]</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"><</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"><</span>(<span class="punctuation_bracket">)</span><span class="punctuation_delimiter">,</span> <span class="type">Panic</span><span class="punctuation_bracket">></span><span class="punctuation_bracket">></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">"std"</span><span class="punctuation_delimiter">,</span> <span class="string">"print"</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">&</span><span class="keyword">mut</span> <span class="constructor constant">vm</span><span class="punctuation_delimiter">,</span> <span class="string">"Hello, world!"</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">&</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">"C"</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">"Hello, world!"</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>