<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Andrew Peterson's Blog</title>
    <description>Andrew Peterson's Blog</description>
    <link>https://andrewp2.github.io</link>
    <atom:link href="https://andrewp2.github.io/feed.xml" rel="self" type="application/rss+xml" />
    <author>
      <name>Andrew Peterson</name>
      <email>andrewpetersongamedev@gmail.com</email>
      <uri>https://andrewp2.github.io</uri>
    </author>
    
      <item>
        <title>No one wants to go to the moon</title>
        <description>&lt;p&gt;Today, I had this hypothetical pop into my head while thinking about space
tourism.&lt;/p&gt;

&lt;p&gt;Imagine that you could go online right now, and buy a ticket to go to the moon.
The ticket in its entirety costs $100USD, and there are no other significant
costs associated with travelling to the rocket. If you want, you can imagine
that the company will bring a rocket to your backyard. There are no
environmental concerns or safety risks associated with the trip, and it will
only take 8 hours of your time, so you can easily fit it into your schedule on a
weekend.&lt;/p&gt;

&lt;p&gt;The question is, how many times would you take the trip? Obviously, everyone I
have ever known or will ever know would take the trip at least once. However, I
can’t come up with any conceivable reason why a normal person would go more than
ten times. Of course, there are a certain subset of space fanatics who might
take the trip every single day that they could, becaues they love the idea of
being off-world. Perhaps there would be researchers who would like to go to the
moon to do research - even then, I’m not sure there is actually much to learn
from being on the moon. The moon &lt;em&gt;really is&lt;/em&gt; a boring place. It is an object in
the sky that is essentially defined by having nothing going on with it. Once
you’ve taken a sufficient number of rock samples, you’ve essentially learned
everything there is to learn about what the moon is.&lt;/p&gt;

&lt;p&gt;I think one response might be to wonder about moon mining operations, i.e. there
are energy-rich ores on the moon, and it could be cost-efficient compared to the
ticket cost to mine those ores and bring them back to Earth. Of course, all this
does is highlight the absurdity of the hypothetical - a ticket to the moon will
never cost as little as $100. We would be lucky to get it below a cost of
$10,000. There would always be safety risks, and a reasonable space tourism
industry would likely incur massive environmental damage. Furthermore, the
fastest manned flight to the moon (Apollo 8) took 69 hours, so you would have to
take an entire week off of work just to get there and back.&lt;/p&gt;

&lt;p&gt;I know this likely won’t convince anyone who is already space-tourism-pilled. I
guess I just want a blog article to point to in the rare case I get into this
argument, so I have a pre-prepared argument.&lt;/p&gt;
</description>
        <pubDate>Tue, 20 Jun 2023 00:00:00 +0000</pubDate>
        <link>https://andrewp2.github.io//2023/06/20/no_one_wants_to_go_to_the_moon.html</link>
        <link href="https://andrewp2.github.io/2023/06/20/no_one_wants_to_go_to_the_moon.html"/>
        <guid isPermaLink="true">https://andrewp2.github.io/2023/06/20/no_one_wants_to_go_to_the_moon.html</guid>
      </item>
    
      <item>
        <title>Macro for checking tuple of options</title>
        <description>&lt;p&gt;Today, I was programming and ran into a little issue. Before, I was using this
macro (from &lt;a href=&quot;https://stackoverflow.com/a/40986547/10516390&quot;&gt;here&lt;/a&gt;):&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;#[macro_export]&lt;/span&gt;
&lt;span class=&quot;nd&quot;&gt;macro_rules!&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;all_or_nothing&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$opt:expr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(||&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$opt&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.is_none&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;nb&quot;&gt;None&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;nf&quot;&gt;Some&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$opt&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.expect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;should never fail&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}};&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;to check a tuple of options to see if they were all available. I used it as
follows:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;pub&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;create_bind_group&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;pipeline&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Option&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RaytracingPipeline&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;raytracing_image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Option&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RaytracingImage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;uniforms&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Option&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RaytracingUniforms&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;bvh&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Option&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RaytracingBVH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;tris&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Option&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RaytracingTriangles&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;lights&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Option&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RaytracingLights&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;image_collection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Option&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ImageCollection&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;textures&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Option&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DisneyTextures&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;cm&quot;&gt;/* more parameters that are non-optional */&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Some&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;pipeline&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;raytracing_image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;uniforms&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;bvh&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;tris&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;lights&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;image_collection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;textures&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nd&quot;&gt;all_or_nothing!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;pipeline&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;raytracing_image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;uniforms&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;bvh&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;tris&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;lights&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;image_collection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;textures&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;cm&quot;&gt;/* 
            do things on a gpu
        */&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note that all the types inside the options are different, so I can’t just
iterate over a vector or array. I think I could box them and iterate over them
as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Box&amp;lt;dyn Option&amp;gt;&lt;/code&gt; or something similar but that sounded painful.&lt;/p&gt;

&lt;p&gt;The problem is now I don’t know which variables are &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Some&lt;/code&gt; and which are &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;None&lt;/code&gt;.
So I wrote this little macro:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;#[macro_export]&lt;/span&gt;
&lt;span class=&quot;nd&quot;&gt;macro_rules!&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;check_for_none&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$var:ident&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{{&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$var&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.is_none&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;nd&quot;&gt;println!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;{} is none&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nd&quot;&gt;stringify!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}};&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and I can just use it as follows:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;check_for_none!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;pipeline&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;raytracing_image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;uniforms&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;bvh&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;tris&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;lights&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;image_collection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;textures&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Decided I’d put this on the blog because I would need 15 reptuation to answer my
own question on Stack Overflow (and I really don’t feel like having to appease a
bunch of random people online just to have the “&quot;”privilege””” of putting it on
someone else’s website.)&lt;/p&gt;

&lt;p&gt;Hopefully you find this useful!&lt;/p&gt;
</description>
        <pubDate>Fri, 25 Nov 2022 00:00:00 +0000</pubDate>
        <link>https://andrewp2.github.io//2022/11/25/macro_for_checking_tuple_of_options.html</link>
        <link href="https://andrewp2.github.io/2022/11/25/macro_for_checking_tuple_of_options.html"/>
        <guid isPermaLink="true">https://andrewp2.github.io/2022/11/25/macro_for_checking_tuple_of_options.html</guid>
      </item>
    
      <item>
        <title>The Vibe Manifesto</title>
        <description>&lt;p&gt;Recently, I saw a
&lt;a href=&quot;https://twitter.com/FreyaHolmer/status/1592811135832854529&quot;&gt;tweet&lt;/a&gt;, and I have
to say, I vibed with it a lot. I’ve read (well, at least parts of) many books on
game design, and over and over again I see the same structure. First we have to
talk about why games are so culturally important, and then we have to define
“games” while making reference to the other hundred game design books that also
define what it means to be a “game”, and finally we start categorizing and
classifying games, usually with some implicit bias that some
games&lt;a href=&quot;#[1]&quot;&gt;&lt;sup&gt;[1]&lt;/sup&gt;&lt;/a&gt; either aren’t valuable or aren’t “games”.&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;one day I&amp;#39;ll write a book on game design or programming that is purely vibes-based&lt;br /&gt;&lt;br /&gt;no opinions presented as facts. no pretense. no pseudoscience. no cherry picked success stories or stats. just literally whatever I personally vibe with&lt;/p&gt;&amp;mdash; Freya Holmér (@FreyaHolmer) &lt;a href=&quot;https://twitter.com/FreyaHolmer/status/1592811135832854529?ref_src=twsrc%5Etfw&quot;&gt;November 16, 2022&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;p&gt;So, here are a list of things I vibe with:&lt;/p&gt;

&lt;h3 id=&quot;1-emergence--simulation&quot;&gt;1. Emergence + Simulation&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;Emergence through the simulation of simple rules (navier-stokes, rendering
equation, game of life, etc) is super dope.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;2-player-has-between-3-7-choices-for-any-meaningful-decision&quot;&gt;2. Player has between 3-7 choices for any meaningful decision&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;If you have 1 choice, it’s not a decision. 2 is too simple, too binary. 8 and
above are too many for someone to consider at once.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;3-strategy-over-reflexes2&quot;&gt;3. Strategy over reflexes&lt;a href=&quot;#[2]&quot;&gt;&lt;sup&gt;[2]&lt;/sup&gt;&lt;/a&gt;&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;I like to think that I will continue playing and enjoying video games for the
rest of my life. It would suck to build kick-ass games, only to be able to
really enjoy them for the next 5-10 years because your reflexes are just
slightly too slow now to be good at the games you made. It’s not inclusive to
build games that heavily rely on reflexes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;4-games-have-meanings---they-say-things&quot;&gt;4. Games have meanings - they say things&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;Seems like an obvious thing to say, but games are a form of communication.
Games that are aware of what they’re communicating are much more exciting and
interesting than those that just use mechanics for fun. Ultimately, games are
capable of so many more emotions than the raw feel of fun, and it’s about time
game designers started exploring that larger space.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;5-photorealism-is-bad&quot;&gt;5. Photorealism is bad&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;Photorealism is a bad style for a video game. The first issue with
photorealism is that it doesn’t clarify which objects are interactable and which
ones aren’t. Time and time again I have tried to open a door that was just a texture
or to break a wooden object that isn’t breakable. Games that use stylistic rendering
are less restricted in their use of visual design to guide players.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;The second issue is that photorealistic games can’t use powerful techniques to
control emotion, like color grading.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Overall, photorealism is a trap for game developers/studios/engines, and it isn’t a target
worth aiming for in the first place.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;6-procedural-generation-is-not-enough&quot;&gt;6. Procedural generation is not enough&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;You cannot make a game interesting by &lt;em&gt;just&lt;/em&gt; adding procedural generation. A
lot of indies are using procedural generation extensively because it seems to
add a lot of potential for new content, but I’m not super impressed. Maybe
this is a little hypocritical of me because many of my favorite games
(Minecraft, Factorio, Spelunky, the Civilization series, etc.) feature
procedural generation prominently. I just think it’s overused and that gamers will
appreciate good level design if you give it to them. Even in games that have a lot
of procedural generation, the most memorable parts of the experience aren’t
the randomly generated ones.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;7-games-arent-meant-to-be-played-forever&quot;&gt;7. Games aren’t meant to be played forever&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;Partially based off the 6th item, this strange fascination with “forever
games” needs to stop. This includes roguelike indies, but also the much more
insidious “live-service” games that are a stain on the industry.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Forever games can never have a satisfying conclusion, because they aren’t
designed to conclude. There’s no moral, and no place for reflection. Their
stories are unchanging and boring, because if the story did fundamentally
change you would open yourself to the possibility of the game ending. Forever
games don’t care about the player and their life. They are vampires that
continually steal time (and money) from their player’s life, making them
weaker in the real world. As they become weaker and weaker (less social, less
physically fit, poorer) they spend more and more time in the game world rather
than in the real world, further perpetuating the cycle.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Good games are designed to be put down, and for the player to return back to
the tasks they need to do in the real world. Whether that’s working a job,
socializing with friends and family, exercising, and all of the other things
that are required to live a full life. Good video games actually &lt;em&gt;enhance&lt;/em&gt;
those outside activities, because of the lessons taught within the game.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;8-get-your-players-consent&quot;&gt;8. Get your players consent&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;Good games get their players consent. Most games I see do this well for the
large things (content warnings and the like) but sometimes they miss it on
small things. For example,
&lt;a href=&quot;https://www.reddit.com/r/pcgaming/comments/pq3mq7/developers_please_stop_skipping_the_main_menu_on/&quot;&gt;why do so many games start with a cutscene&lt;/a&gt;,
before I’ve had the chance to change the settings to my liking? Now I’m
sitting here watching this cutscene but all I’m thinking about is how I need
to turn motion blur off before it gives me a headache.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;9-design-with-and-for-interactivity&quot;&gt;9. Design &lt;em&gt;with&lt;/em&gt; and &lt;em&gt;for&lt;/em&gt; interactivity&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;Talking about &lt;em&gt;with&lt;/em&gt; first, with interactivity means using development tools
that allow you to be interactive with the game as it’s running. I really value
REPLs and other tools that allow you to modify the game as it’s running. I’ve
been looking into adding a LISP interpreter in my game for exactly this
reason.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;For&lt;/em&gt; interactivity comes back to “Emergence + Simulation”, that is I want
games to be interaction focused, and not choose-your-own-adventure books.
Games are interesting as a medium because of interactivity.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;a id=&quot;[1]&quot;&gt;[1]&lt;/a&gt; The biggest issue I see with many game definitions is that
they exclude “walking-sim” type games like &lt;em&gt;What remains of Edith Finch&lt;/em&gt;.
The problem is not necessarily that I want to label these interactive
experiences with the label of “game”, but more that as a game designer I am
interested in the storytelling and mechanics used in this software. In other
words, if &lt;em&gt;What remains of Edith Finch&lt;/em&gt; isn’t a game then I don’t want to
just be a &lt;strong&gt;game&lt;/strong&gt; designer, I want to be an &lt;strong&gt;interactive experience&lt;/strong&gt;
designer, which includes and subsumes games. Now, I may exclusively make
interactive experiences that also happen to be games, but when studying the art
of making games I am still very much interested in interactive experiences that
aren’t games, and therefore walking-sims are still part of my game design
curriculum.&lt;/p&gt;

&lt;p&gt;&lt;a id=&quot;[2]&quot;&gt;[2]&lt;/a&gt; Fast games aren’t necessarily reflex heavy - it depends on
what is required. Older people can play piano because it doesn’t require
reflexes, just a level of mobility that (with good health) can be maintained
even into old age. It’s more of the “peek around a corner and instantly spot the
pixels that constitute the enemy and click on them” sort of reflex that I don’t
like.&lt;/p&gt;
</description>
        <pubDate>Mon, 21 Nov 2022 00:00:00 +0000</pubDate>
        <link>https://andrewp2.github.io//2022/11/21/the_vibe_manifesto.html</link>
        <link href="https://andrewp2.github.io/2022/11/21/the_vibe_manifesto.html"/>
        <guid isPermaLink="true">https://andrewp2.github.io/2022/11/21/the_vibe_manifesto.html</guid>
      </item>
    
      <item>
        <title>What raytracing will change for indies</title>
        <description>&lt;p&gt;Over the past year, I’ve been watching the development of raytracing technology.
With the latest graphics cards from Nvidia, AMD, and even Intel, it’s looking
more and more likely that real-time raytracing could become the new standard in
terms of graphics technology. I think this news has some people dishearted -
there are several reasons why it’s frustrating.&lt;/p&gt;

&lt;p&gt;First of all, these new graphics cards were developed at the same time as the
pandemic, and at a time where Ethereum was still using PoW. Not only were the
graphics cards expensive due to supply chain issues, but scalpers bought cards
en-masse and crypto miners wanted a massive number of them too.&lt;/p&gt;

&lt;p&gt;Secondly, even with the pandemic becoming less important over time, these
graphics cards are still very expensive. An incomplete list can be found below:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Graphics Card&lt;/th&gt;
      &lt;th&gt;Retail Price&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;RTX 3090 Ti&lt;/td&gt;
      &lt;td&gt;$1,100&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RTX 3090&lt;/td&gt;
      &lt;td&gt;$950&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RTX 3080&lt;/td&gt;
      &lt;td&gt;$730&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RTX 3070&lt;/td&gt;
      &lt;td&gt;$520&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RTX 3060&lt;/td&gt;
      &lt;td&gt;$369&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Radeon RX 6950 XT&lt;/td&gt;
      &lt;td&gt;$950&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Radeon RX 6900 XT&lt;/td&gt;
      &lt;td&gt;$700&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Radeon RX 6800 XT&lt;/td&gt;
      &lt;td&gt;$600&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Radeon RX 6700 XT&lt;/td&gt;
      &lt;td&gt;$420&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Standard wisdom says that a graphics card should cost around 40% of your overall
budget in a gaming PC. $1000 is a normal price for a gaming PC, so the average
consumer can only afford a $400 graphics card. Almost all of these cards rise
above that, and the next generation cards (RTX 40 series and RDNA 3) are even
more expensive. According to the
&lt;a href=&quot;https://store.steampowered.com/hwsurvey/Steam-Hardware-Software-Survey-Welcome-to-Steam&quot;&gt;Steam Hardware &amp;amp; Software Survey (October 2022)&lt;/a&gt;
the most popular video card is a GTX 1060, which is over 6 years old.&lt;/p&gt;

&lt;p&gt;Thirdly, consumers have a number of false assumptions about game development.
They think that when a game is graphically impressive, that the developer(s)
could’ve spent more time on the game’s design or story, as if there was just a
knob that you could turn to spend more time on one or the other. In reality,
everything is interlinked, and it’s impossible to determine the value of any
specific aspect of a game on it’s own. A classic example is that of “juice”,
that is, special effects that help to liven a game up. Without things like sound
effects, camera shake, particle effects, etc. it’s hard for the human brain to
grasp the impact of an action. If you can’t grasp the impact of an action, it is
very hard to determine if doing that action is fun or not, or if the overall
game is fun.&lt;/p&gt;

&lt;p&gt;As an example, imagine watching a Disney movie, but all of the music has been
taken out. Would you know if the movie is good or not? You could still try to
evaluate its plot or themes but if you are missing the music you are missing
something essential to the movie. That’s why I think some of the discussion
around
“&lt;a href=&quot;https://www.youtube.com/watch?v=8xTBsVyT4lQ&quot;&gt;is the story more important than gameplay&lt;/a&gt;”
or “how graphics isn’t important compared to gameplay” is just kind of silly.
They’re all important to the overall experience.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../../images/elsa.jpg&quot; alt=&quot;A picture of Elsa from Frozen, using ice magic with her right hand&quot; title=&quot;Imagine watching the Let it Go sequence without any music. It would be very hard to determine what emotions are supposed to be happening just from visuals alone.&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Game designers struggle with some of the same assumptions about human cognition
that the gamers do. A game designer might think that lighting isn’t that
important to the gameplay, because you could theoretically replace all of that
with the simplest rasterized rendering and the game would play the same. But as
soon as you understand that the core emotional experience of playing a video
game comes from the fusion of many different artistic fields, and that that
experience is allowed to be much much more than “having fun”, then you can begin
to understand why raytracing can be a transformative technology in the hands of
game designers.&lt;/p&gt;

&lt;p&gt;It’s likely clear to the reader at this point that while I can sympathize with
the issues, ultimately I think raytracing will end up being very powerful. Being
able to ignore the painful and slow process of shadow/reflection mapping, and
allowing for fully dynamic environments will eventually allow for indies to make
3D games that match the level of quality that AAA studios can produce today.
Furthermore, indies don’t have to follow the trend of using raytracing as just a
tool to enhance photorealism - indies can embrace entirely new visual styles
(PS1 era textures, for example) while using raytracing to create entirely new
games.&lt;/p&gt;
</description>
        <pubDate>Sat, 12 Nov 2022 00:00:00 +0000</pubDate>
        <link>https://andrewp2.github.io//2022/11/12/raytracing_indies.html</link>
        <link href="https://andrewp2.github.io/2022/11/12/raytracing_indies.html"/>
        <guid isPermaLink="true">https://andrewp2.github.io/2022/11/12/raytracing_indies.html</guid>
      </item>
    
  </channel>
</rss>