﻿<?xml version="1.0" encoding="utf-8"?>
<rss
  version="2.0">
  <channel
    xml:base="https://garry.net/">
    <title>Garry Newman's Blog</title>
    <link>https://garry.net/posts/</link>
    <description>Garry Newman is a video game developer based in the UK. He is best known as the owner of development studio Facepunch and games Garry's Mod and Rust.</description>
    <language>en</language>
    <managingEditor></managingEditor>
    <lastBuildDate>Sat, 04 Apr 2026 21:44:16 Z</lastBuildDate>
    <category>blog</category>
    <category>game development</category>
    <category>programming</category>
    <category>coding</category>
    <category>gamedev</category>
    <category>unity</category>
    <category>source engine</category>
    <category>gmod</category>
    <category>garry's mod</category>
    <category>rust</category>
    <category>steam</category>
    <category>valve</category>
    <category>video games</category>
    <category>games</category>
    <category>sandbox games</category>
    <category>united kingdom</category>
    <category>england</category>
    <generator>garrys-website-1.1</generator>
    <image>
      <url>https://files.facepunch.com/garry/d697bdbb-cfc3-45e1-8f47-04396244a416.png</url>
      <title>Garry Newman's Blog</title>
      <link>https://garry.net/posts/</link>
    </image>
    <ttl>30</ttl>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/e2239419-9ba8-4767-9340-98320d80a5a7</guid>
      <link>https://garry.net/posts/e2239419-9ba8-4767-9340-98320d80a5a7</link>
      <title>Traffic Lights</title>
      <description>&lt;p&gt;A couple of months ago I was driving down a country road and came to a traffic light. It was red. I sat there for a couple of seconds.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;A thought snapped into my mind. Why am I obeying the lights, why are they in control. There is no-one here. I can see for miles, I would know if anyone is coming. So why am I sitting here, obeying the lights? Because I&amp;amp;#39;ve been told and taught that it&amp;amp;#39;s the right thing to do? Or just because I always have? How many human seconds are spent sitting at empty red lights globally?&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;All this went through my mind in a fraction of a second. In a fraction of a second I&amp;amp;#39;d noticed it, evaluated it, weighed it up and decided.&lt;/p&gt;&#xD;
</description>
      <pubDate>Sun, 19 Oct 2025 05:53:23 Z</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/how-do-i-get-into-the-game-industry</guid>
      <link>https://garry.net/posts/how-do-i-get-into-the-game-industry</link>
      <title>How do I get into the Game Industry</title>
      <description>&lt;p&gt;Every now and then someone tells me that their child loves video games and wants to get into the game industry, then asks me how they do it. So here&amp;amp;#39;s a blog that I can paste a link to.&lt;/p&gt;&#xD;
&lt;h2&gt;I don&amp;#39;t know&lt;/h2&gt;&#xD;
&lt;p&gt;I&amp;amp;#39;ve got to say first of all that I don&amp;amp;#39;t know if I ever got into the game industry. It&amp;amp;#39;s my main job but I don&amp;amp;#39;t know how a real game studio works. I&amp;amp;#39;ve never worked in a proper game studio.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;So if you want to work on FIFA or GTA, I have no idea how you get there, sorry.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;But if you just want to make games and not have to get a real job, I can tell you how I would do it.&lt;/p&gt;&#xD;
&lt;h2&gt;Not Programming&lt;/h2&gt;&#xD;
&lt;p&gt;I&amp;amp;#39;m going to focus on the idea that you want to be a programmer.&amp;amp;#160;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Being an artist isn&amp;amp;#39;t a completely different beast. It&amp;amp;#39;s still about getting really interested and really good at what you do, and then doing it. Artists have quite easy entry points in the industry now like making Skins that get sold in Rust - and they can make a good living off that.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;But if you are thinking about being an artist, I would say that you can help yourself by being multi-disciplinary. If you&amp;amp;#39;re a 3d artist who is also a shitty programmer, you&amp;amp;#39;re still better than just a 3d artist. If you can model, rig and animate, you&amp;amp;#39;re more useful than someone who can only animate.&lt;/p&gt;&#xD;
&lt;h2&gt;The 1990s&lt;/h2&gt;&#xD;
&lt;p&gt;When I was trying to learn how to program games it was the 1990s. There wasn&amp;amp;#39;t any internet. I had to get books from the library and read magazines. I had no-one to ask questions to. It was hard.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;When we did get internet, when I was about 16, it was dial up and we had to pay per minute. I had to set it up so I&amp;amp;#39;d dial up, download a whole website to read offline, and then disconnect and read through it.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Even that was hard. The tutorials from websites were written more at my level, but it was still one way. No questions asking, lots of wrong assumptions.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;When I was 16 I went to college.. and while I&amp;amp;#39;m sure it taught me some stuff, I don&amp;amp;#39;t know how actually useful it was.&amp;amp;#160;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Just as an aside, for any Americans reading - I think our college is different to yours. Our college is free and normally vocation targetted. People who leave school usually either get a job, stay on at school for 2 more years, or go to college.&lt;/p&gt;&#xD;
&lt;h2&gt;The Modern World&lt;/h2&gt;&#xD;
&lt;p&gt;Nowadays, it&amp;amp;#39;s a mixed blessing. I&amp;amp;#39;ve got to believe it&amp;amp;#39;s much much easier to learn anything. You have the internet, you have discord, you have youtube, and you have ChatGPT.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;I&amp;amp;#39;ve got to believe that learning to program, or use blender is a million times more easier now we have things like ChatGPT. Not only can you ask it to break down stuff in a way you can understand, but it can know the level you&amp;amp;#39;re at and create a whole customized course for you.&lt;/p&gt;&#xD;
&lt;h2&gt;Expectations&lt;/h2&gt;&#xD;
&lt;p&gt;A lot of people, when they start programming, will be printing Hello World in a command line and be frustrated. When do they start coding the car physics in GTA?&amp;amp;#160;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;It&amp;amp;#39;s going to be hard. You&amp;amp;#39;ll be sitting on your own for hours, looking at a monitor. You need to be the kind of person who gets off on attaining knowledge.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Does that sound like something you want to do? Wouldn&amp;amp;#39;t you rather be a streamer? Or mow grass, outside in the fresh air? Or be a rock star?&amp;lt;br/&amp;gt;&lt;/p&gt;&#xD;
&lt;h2&gt;Going Indie&lt;/h2&gt;&#xD;
&lt;p&gt;You hear about Notch making 2 billion from Minecraft and you think, yeah, that sounds better than the sausage roll factory. But how likely is it that you make Minecraft?&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;In 2024 there were about 19,000 games released on Steam. How many did you buy? How many people will buy your game? Why? How long will it keep selling for?
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;When I released Garry&amp;amp;#39;s Mod, I was living with my parents, and I figured out I needed about &amp;amp;#163;700 a month to be stable, which was how much I took home from the dating website job I got fired from.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;So with that baseline, selling at $20, valve&amp;amp;#39;s 30% and 20% uk tax, I needed 80 sales a month. That&amp;amp;#39;s about 3 sales a day. Some days I might sell 5 copies, so then I&amp;amp;#39;ll only need to sell 1 copy the next day.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Keep your expenses down. You don&amp;amp;#39;t need an office, you don&amp;amp;#39;t need to go to GDC, you don&amp;amp;#39;t need a social media manager.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;It&amp;amp;#39;s a job. Sit at your desk every day from 9-5. Make a list of things you want to do and work through them. Improve your games.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Don&amp;amp;#39;t gamble. Your game sold 1,000 copies in a week. That gives you over a years runway. Are you going to stop working on the game that is released and selling, or will you work on a sequel in secret for a year?&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Build a War Chest. While you&amp;amp;#39;re selling games, build a war chest. If you get to the point where your games stop selling, how long can you survive on your war chest?&amp;lt;br/&amp;gt;
&lt;/p&gt;&#xD;
&lt;h2&gt;New Opportunities&lt;/h2&gt;&#xD;
&lt;p&gt;You can make your own game engine, or use Unity to make your own game and release it on Steam, there are other emerging economies. These usually involve making a game in a bigger platform. The deal here is generally that they&amp;amp;#39;ll bring the players and you make the content. This is generally always a bigger win for the platform, since they get free content and free money, but if you can swallow your pride there, there&amp;amp;#39;s money in it.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Roblox is probably the most obvious. I don&amp;amp;#39;t really know the market, or the engine. I&amp;amp;#39;ve heard developers make as little as 20% from stuff they release on there, but I don&amp;amp;#39;t know how true that is. They&amp;amp;#39;re all coded in Lua. It is said that the top developers earned up to $30m a year.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Fortnite is headed in that direction too, now. Income is based on minutes played, from a global pool. Coding is via a scripting language called Verse, which is probably the worst scripting syntax I&amp;amp;#39;ve ever seen, and it staggers my mind that anyone thought it was a good idea. The top developer earned $20m in a year, I would expect this to grow and maybe surpass Roblox at some point.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;We&amp;amp;#39;re hoping that&amp;amp;#160;s&amp;amp;amp;box&amp;amp;#160;will be worthy to be mentioned in this section one day. We have the Play Fund, which is paid to creators based on minutes played, like fortnite, but we&amp;amp;#39;re not at the $20m level yet. Our top earner is about $1,500 a month in our pre-release test fund. We&amp;amp;#39;re currently working with Valve to let creators release their games made in s&amp;amp;amp;box as standalone games on Steam. It&amp;amp;#39;s Source 2 based, you use GameObject/Components, c#, net9 with hotloading. It&amp;amp;#39;s awesome.&lt;/p&gt;&#xD;
&lt;h2&gt;Getting Hired&lt;/h2&gt;&#xD;
&lt;p&gt;I can&amp;amp;#39;t speak from other companies, but I can tell you what I look at when we get an application.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;You should really see it from my point of view. You want me to pay you? What can you do for me?&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;So when you&amp;amp;#39;re applying for a job, are you treating it like an apprenticeship? Are you expecting the employer to train you up and show you what to do? Or are you telling them, I can do this for you, I can take this weight, I can make this better?&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;If I google your name, am I going to find 8 years of you being an arsehole and endlessly crusading on Twitter? Or will I find 8 years of you being excited and inquisitive about what you&amp;amp;#39;re doing?&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Are you going to make my life harder or easier?&lt;/p&gt;&#xD;
&lt;h2&gt;Recruiters&lt;/h2&gt;&#xD;
&lt;p&gt;I fucking hate recruiters.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;If you really want to work at a particular company, apply directly - and tell them why.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;If you go through a recruiter, you&amp;amp;#39;ll be in the same bucket as the other 20 people they mail-blasted that day. The assumption will be that like those other 20 people, you want ANY job, not THIS job.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;If you&amp;amp;#39;re applying directly you&amp;amp;#39;re showing the company that you know what they do, you know their culture and their history, and you want to be a part of it. It&amp;amp;#39;s a massive shortcut.&amp;lt;br/&amp;gt;&lt;/p&gt;&#xD;
&lt;h2&gt;Your Plan&lt;/h2&gt;&#xD;
&lt;p&gt;So here&amp;amp;#39;s your career plan.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;1. Get good at something&amp;lt;br/&amp;gt;2. Make money from it&amp;lt;br/&amp;gt;3. Make it last as long as possible&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;/p&gt;&#xD;
</description>
      <pubDate>Sun, 11 May 2025 11:18:00 Z</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/in-the-shit</guid>
      <link>https://garry.net/posts/in-the-shit</link>
      <title>In The Shit</title>
      <description>&lt;p&gt;When I was a kid my dad was always doing home improvements. Redecorating, moving a wall, replacing the doors, installing radiators, re-laying a driveway.&amp;amp;#160;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;I remember this phrase he used. He&amp;amp;#39;d have the water off, re-plumb a bunch of radiators, turn the water back on and there were leaks everywhere.. and then my mom would nag him that dinner was ready - and then he&amp;amp;#39;d shout &amp;amp;quot;&amp;lt;strong&amp;gt;I&amp;amp;#39;M IN THE SHIT HERE!&amp;lt;/strong&amp;gt;&amp;amp;quot;.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;To me, what it means is you&amp;amp;#39;ve tried something, it&amp;amp;#39;s backfired and you&amp;amp;#39;re in over your head, you&amp;amp;#39;re drowning, and you&amp;amp;#39;ve got to fight your way back to the surface.&lt;/p&gt;&#xD;
&lt;h2&gt;Garry&amp;#39;s Mod&lt;/h2&gt;&#xD;
&lt;p&gt;I remember multiple times I&amp;amp;#39;ve got myself in the shit. When I first made Garry&amp;amp;#39;s Mod I knew c++, but not well enough. I got myself into a position where it was crashing and I couldn&amp;amp;#39;t figure out why. I didn&amp;amp;#39;t use source control - so I couldn&amp;amp;#39;t just roll back to a version that wasn&amp;amp;#39;t crashing and figure out the delta.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;So I deleted the whole thing, downloaded a fresh copy of the SDK and made it again from scratch. I did this at least twice in the very early versions before I started using source control.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;I ended up adding Lua support as a shield from these crashes. I didn&amp;amp;#39;t understand the C++ code enough to stop it from crashing, but I could be really careful in my Lua implementation to protect against it.&lt;/p&gt;&#xD;
&lt;h2&gt;Rust&lt;/h2&gt;&#xD;
&lt;p&gt;When we released Rust and it got mega popular, we were immediately launched into the shit. The code was all janky and impossible to iterate on. It was basically a proof of concept that we ended up releasing. I didn&amp;amp;#39;t even know C# at that point, so I couldn&amp;amp;#39;t get involved beyond simple UI stuff. The community was HUGE and was desperate for bug fixes and new features.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;So we were right in the shit.&amp;amp;#160;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;We debated what to do. Is the code fucked or are we just idiots that don&amp;amp;#39;t understand it. Eventually we decided that the code was fucked.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;I started rewriting the engine from scratch. I had to learn c# on the job. The community fucking hated the idea. They wanted legacy, but we knew that we had to suffer for a bit right now so we could flourish more later on.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;I didn&amp;amp;#39;t fully know what I was doing, but it was coherent and modular. Eventually it got feasible enough that other people could work on it. And then eventually it got feasible to enough to play.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;People still ask for legacy, but there&amp;amp;#39;s no doubt in my mind that we made the right decision back then.&lt;/p&gt;&#xD;
&lt;h2&gt;The Message&lt;/h2&gt;&#xD;
&lt;p&gt;To grow, to improve and to achieve anything - you have to enjoy getting yourself out of the shit.&amp;amp;#160;You can&amp;amp;#39;t avoid getting in the shit. You have to see a pile of shit and jump in it.&amp;lt;br/&amp;gt;&lt;/p&gt;&#xD;
</description>
      <pubDate>Sun, 06 Apr 2025 09:48:34 Z</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/dead-games</guid>
      <link>https://garry.net/posts/dead-games</link>
      <title>Dead Games</title>
      <description>&lt;p&gt;You know when people spend 2 years making games and when they release, they don&amp;amp;#39;t sell anything, so they stop selling it and throw it all in then bin..&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;What happens to all those sounds and models and animations they made? Do they just go in the bin?&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;I guess there&amp;amp;#39;s reasons they don&amp;amp;#39;t just slap an open license on them and release them for free. Like time, storage, bandwidth, and permission. Maybe they use textures or sounds from a library and can&amp;amp;#39;t redistribute?&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Well, I was just thinking, what a shame it all gets chucked in the bin, when it&amp;amp;#39;d be nice to be able to use those assets in something like gmod/sbox.&amp;amp;#160;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;If your game died and you have some cool assets, email me and tell me what you&amp;amp;#39;ve got and what you want for them.. garrynewman@gmail.com&lt;/p&gt;&#xD;
</description>
      <pubDate>Wed, 29 Jan 2025 16:46:06 Z</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/azure-media-services</guid>
      <link>https://garry.net/posts/azure-media-services</link>
      <title>Azure Media Services</title>
      <description>&lt;p&gt;I spent fucking ages coding a whole cloud workflow to process videos on Azure Media Services. Like, a week or something, making it so when you uploaded a video it got turned into a thumbnail, a thumbnail video, and 3 different sized of video, then uploaded to our CDN.&amp;amp;#160;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;I was really happy to get it working, I was really happy that I could press a button and re-process 300 videos within a few minutes.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Then literally a month after I finished, I got this email&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2024/7/14/7e710de8-cead-4c12-9a42-64ff6e3ce9ee..png" /&gt;&#xD;
&lt;p&gt;Oh nice one. So all I did was made the videos get processed with &amp;lt;a&amp;gt;FFMpegCore&amp;lt;/a&amp;gt;, and although it was slower.. it works and is a much more fool proof system.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;I was hesitant to do this because it&amp;amp;#39;s processing as an Azure function, so the hardware is really low power.. but for now it works.&amp;amp;#160;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;If it gets to be a problem in the future we can probably make a server in the office to work its way through a video processing queue.&lt;/p&gt;&#xD;
</description>
      <pubDate>Sun, 14 Jul 2024 08:33:20 Z</pubDate>
      <image>https://cdn.garry.net/img/uploads/2024/7/14/7e710de8-cead-4c12-9a42-64ff6e3ce9ee..png</image>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/common-math-library</guid>
      <link>https://garry.net/posts/common-math-library</link>
      <title>Common Math Library</title>
      <description>&lt;p&gt;You know what&amp;amp;#39;s weird. We&amp;amp;#39;ve been making games in c for like half a century.. and there&amp;amp;#39;s still no consensus on Vector2, Vector3, Quaternion, Angles. Everyone re-makes these things for their own engine, or their own middleware.&amp;amp;#160;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Then when you use a middleware library for physics, or audio etc, you end up converting between their &amp;lt;strong&amp;gt;Vector3 &amp;lt;/strong&amp;gt;and your &amp;lt;strong&amp;gt;Vector3&amp;lt;/strong&amp;gt;. Loading a model using a middleware library? Here you go, here&amp;amp;#39;s a new &amp;lt;strong&amp;gt;Vector3&amp;lt;/strong&amp;gt; implementation. Using a third-party navmesh generator? Here you go, another &amp;lt;strong&amp;gt;Vector3 &amp;lt;/strong&amp;gt;implementation.&amp;amp;#160;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Why is this like this? Why are we all speaking different languages?&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;I get it. We can&amp;amp;#39;t trust the c++ standard library guys to implement ANYTHING without it being an ordeal with everything over-complicated, templated to fuck. So obviously we shouldn&amp;amp;#39;t trust them.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;But we have the internet now; we have GitHub, we can self-organise. Why hasn&amp;amp;#39;t someone said - hey we&amp;amp;#39;re making a common math library, we&amp;amp;#39;re going to keep it simple, we&amp;amp;#39;re going to accept code, we&amp;amp;#39;re going to do all the simd stuff that you don&amp;amp;#39;t understand, it&amp;amp;#39;s gonna be mit licensed we want everyone to use it. Maybe it&amp;amp;#39;s even all header-based; people love that.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Are we going to keep writing the same 100 functions over and over again, forever?&lt;/p&gt;&#xD;
</description>
      <pubDate>Thu, 11 Jul 2024 06:17:16 Z</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/handshake-game</guid>
      <link>https://garry.net/posts/handshake-game</link>
      <title>Handshake Game</title>
      <description>&lt;p&gt;The handshake game is something that lives in my head as a reminder of how small the world is and how we&amp;amp;#39;re all connected within the brief time we&amp;amp;#39;re on it together.
 &amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;What you do is try to work out how many handshakes you are away from someone. So you pick someone, like King Charles, and then work out how many shakes you are away from them.&amp;lt;br/&amp;gt;&amp;amp;#160;
&amp;lt;br/&amp;gt;For example, I met people at Valve, but never met Gabe. It&amp;amp;#39;s safe to assume that they&amp;amp;#39;ve shaken Gabe&amp;amp;#39;s hand, and Gabe has shaken Bill Gates, Bill Gates has met Charles - so 3 shakes away. Let&amp;amp;#39;s not worry too much about where the Prince Andrew shake takes us.&amp;lt;br/&amp;gt;
&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2024/7/6/efbdac93-d951-4892-891a-b0f72cbafcfa..png" /&gt;&#xD;
&lt;h2&gt;Hello Neighbour&lt;/h2&gt;&#xD;
&lt;p&gt;But wait. I can maybe do better. Before we moved house, my next door neighbour was a nice old guy, he was a retired saddle maker. Years later I saw him in a book about Walsall history - meeting Princess Anne.&amp;amp;#160; &lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2024/7/6/4da30882-4fce-4fbb-9408-4176e95e66ab..png" /&gt;&#xD;
&lt;p&gt;I have shaken his hand - so if he shook Anne&amp;amp;#39;s, and we assume that she has shaken her brother&amp;amp;#39;s hand at some point - that gets me 2 away. I don&amp;amp;#39;t know if handshaking is protocol though, so I always put a question mark on this one.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt; &amp;lt;br/&amp;gt;Either way that gets me an easy route to most people since you can find them shaking hands with pretty much anyone. Maybe Gabe has met Charles, but it&amp;amp;#39;s not documented anywhere. 
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;But two or three shakes from the actual King though, pretty good for an introverted nerd who doesn&amp;amp;#39;t like going places or meeting people. Can&amp;amp;#39;t be mad, and I was prepared to die happy with that.&amp;lt;br/&amp;gt;
&lt;/p&gt;&#xD;
&lt;h2&gt;Game Ruined&lt;/h2&gt;&#xD;
&lt;p&gt;This week Adele visited the Facepunch office, which rendered all the previous working out completely useless..&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2024/7/6/4fb5a2a2-a179-411b-baf2-37505e02a067..png" /&gt;&#xD;
&lt;p&gt;So now only&amp;amp;#160;&amp;lt;strong&amp;gt;one &amp;lt;/strong&amp;gt;shake from Charles.&amp;amp;#160;&lt;/p&gt;&#xD;
&lt;h2&gt;Laurel and Hardy&lt;/h2&gt;&#xD;
&lt;p&gt;This gets more interesting when you think about more historic people. For example, I&amp;amp;#39;m a big Laurel and Hardy fan. So how many handshakes am I away from them?&amp;lt;br/&amp;gt; &amp;lt;br/&amp;gt;A quick google reveals they did a tour of England in the late 40s. One of the shows was attended by King George IV and his daughter (the Queen). Now I can&amp;amp;#39;t find any evidence that they met, but I&amp;amp;#39;m going to assume. I also can&amp;amp;#39;t find any evidence that Adele met the Queen.. but I&amp;amp;#39;m going to assume.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;So based on that I reckon I&amp;amp;#39;m two handshakes from Laurel and Hardy. That&amp;amp;#39;s funny to think about when you consider that they were both born in the late 1800s and they died about 20 years before I was born.&lt;/p&gt;&#xD;
&lt;h2&gt;Charlie Chaplin&lt;/h2&gt;&#xD;
&lt;p&gt;Same logic. Laurel and Hardy definitely met Chaplin. So we have a 3.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;But Chaplin didn&amp;amp;#39;t die until the late 70s, and was knighted by the Queen. So a possible 2.&lt;/p&gt;&#xD;
&lt;h2&gt;Winston Churchill&lt;/h2&gt;&#xD;
&lt;p&gt;Same logic, 2 shakes. Charles (and the Queen) met Churchill.&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2024/7/6/0e1e16a7-7ae2-4def-8de1-25f3b0553392..png" /&gt;&#xD;
&lt;h2&gt;And so on&lt;/h2&gt;&#xD;
&lt;p&gt;If I was smarter I&amp;amp;#39;d try to do proper history. History before TV existed, like Shakespeare or something. But this is as much as I&amp;amp;#39;ve got. I&amp;amp;#39;d like to do Elvis too but haven&amp;amp;#39;t come up with a decent link yet.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;What are your numbers?&amp;amp;#160;&lt;/p&gt;&#xD;
</description>
      <pubDate>Sat, 06 Jul 2024 09:47:03 Z</pubDate>
      <image>https://cdn.garry.net/img/uploads/2024/7/6/efbdac93-d951-4892-891a-b0f72cbafcfa..png</image>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/the-death-of-the-web</guid>
      <link>https://garry.net/posts/the-death-of-the-web</link>
      <title>The Death Of The Web</title>
      <description>&lt;p&gt;When I was in school, in the mid 90s, I got on the internet for the first time. Our school had one computer that had the internet. It was dial up. The computer was a mac, even though every other computer we used was a Windows PC.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;This computer also had Encarta, which was an encyclopedia. We were amazed that it had really obscure things on it. Even though in retrospect those things aren&amp;amp;#39;t that obscure (like local towns).&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;I remember feeling at the time like this was going to change everything. A massive rush of progress. These things are going to accelerate the human race. Everyone is going to be smart, there&amp;amp;#39;s knowledge everywhere.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;I remember the distinct feeling that I was standing at a point in time where I could look back at the past, where people were running around like ants on an ant hill, operating within their own knowledge, in tiny isolated pockets all over the world. And I could look forward to the future, where everyone would be working together, knowledge was shared enabling rapid human progress.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;I remember feeling like there can&amp;amp;#39;t be any more wars. Everything would change from being local, to global. There&amp;amp;#39;d pretty much be no countries, because everyone would be able to interact and share information, and we&amp;amp;#39;d see we&amp;amp;#39;re all the same. The leaders of one country couldn&amp;amp;#39;t brainwash and fool their population, because their population would have access to the internet - so they&amp;amp;#39;d be perfectly enlightened.&lt;/p&gt;&#xD;
&lt;h2&gt;The World Wide Web&lt;/h2&gt;&#xD;
&lt;p&gt;The early web was a wild west of creativity and information. Every website you went to was different. People, individuals, actually made their own websites. They were filled with their thoughts, discoveries, news, interests. They had things like visitor counters and link-backs.&amp;amp;#160;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;I was trying to learn how to program at the time, and the internet was dial-up, so we paid for it by the minute. I had a scraper set up so I could go online, connect to gamedev.net, planethalflife, bluesnews and download all the latest posts on them, then disconnect.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Later on I would aggressively camp the comments of CSNation, reacting to every news post until Rizzuh eventually banned me.&amp;amp;#160;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;To me, I look back on CSNation as the peak of the internet. It was a custom made websites focusing purely on Counter-Strike. It posted news multiple times every day. It had features like pic of the day, where people would post, and comment on a funny/cool screenshot. It had map/weapon strategy guides, frequently asked questions, item information and other documentation to read through. It had guest writers with their own sections and features. It had polls and mailbags.&lt;/p&gt;&#xD;
&lt;h2&gt;Money&lt;/h2&gt;&#xD;
&lt;p&gt;Then the worst thing happened. Real people started using the internet. And there were a lot of them. And that bought money.&amp;amp;#160;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Websites started slither.io&amp;amp;#39;ing. Any moderately popular websites got bought out and swallowed by bigger networks. Their website was thrown away, their content became something to wrap ads around.&amp;amp;#160;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;These networks then grew to a size where the smaller sites they own weren&amp;amp;#39;t worth the effort to run. So they got deleted too, along with all the content.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Traffic moved to fewer and fewer websites, which fought each other aggressively for bigger chunks of that traffic. Some died, some didn&amp;amp;#39;t. Because that&amp;amp;#39;s where the traffic was - that&amp;amp;#39;s where people moved.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Ad revenue dropped. So more ads were added. Ads before the content, ads after the content, ads at the side of the content, ads behind the content, ads in the content, ads in front of the content, ads popping up, ads covering half the screen, ads in your email.&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2024/6/23/43eb9cad-9196-490d-bd3d-00536614f16b..png" /&gt;&#xD;
&lt;p&gt;In the old web this didn&amp;amp;#39;t happen because it would have stopped people from visiting the websites. The website&amp;amp;#39;s owner would have been ashamed that their site was like this.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;But this is a different model. These websites don&amp;amp;#39;t expect an audience. They don&amp;amp;#39;t expect regular loyal visitors. They make their money from people stumbling across the site and accidentally clicking the adverts. So they optimize for that.&lt;/p&gt;&#xD;
&lt;h2&gt;Popups&lt;/h2&gt;&#xD;
&lt;p&gt;Ad companies got that big that they were on every website. This meant that they could effectively track your movement between websites and optimize ads specifically for you based on that movement.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;This is technically a huge invasion of privacy, because that ad company shouldn&amp;amp;#39;t know any of this stuff. So the EU added a bunch of laws and now every time you go to a website you have to click accept or deny on a cookie/privacy warning.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;In the early years popups were a scurge of the web. You would visit a website and it could create a popup (which was a whole other browser window) - in the background. A single website could create infinite popups. A malicious website could create a popup that would open a new one when you closed it. Opening a wrong link meant you had to restart your computer to get rid of it.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;They fixed that. For a few years.&amp;lt;br/&amp;gt;&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2024/6/23/dcab4e2d-5b83-4a06-a003-430a9e06dbde..png" /&gt;&#xD;
&lt;p&gt;The cookie law normalized popups. When you click a link now you expect to close a popup dialog. It&amp;amp;#39;s become part of browsing the web. So much so that now you get multiple popups in a row. Accept cookies? Join mailing list? Make account?
 &amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;The web is now hostile to people trying to browse it. Visiting a website has gone from one click to a chore of checkboxes and close buttons.&lt;/p&gt;&#xD;
&lt;h2&gt;Apps&lt;/h2&gt;&#xD;
&lt;p&gt;The escape from this has become apps. Which are pretty much all just websites.&amp;amp;#160;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;The ideal scenario where you go to a website and like it, so you add it to your phone&amp;amp;#39;s home screen and it acts like an app hasn&amp;amp;#39;t happened. We&amp;amp;#39;ve now got a situation where people wrap websites as an app and have to pay to distribute it in multiple different app stores.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;When they want to update their app, they have to go through this whole process and wait for it to be approved. Instead of just updating their website. And if they want to sell something in that app, they have to pay 30% to the app store owner.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;What a weird fucking situation to opt into when we&amp;amp;#39;ve already got the web. This thing where you code something once and it works on any platform. Where you control 100% of the content. Where you can update it any time you want, as often as you want. Where you can host it any way you want.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Obviously, this isn&amp;amp;#39;t possible for every app. But if you&amp;amp;#39;re selling clothes why should you ever have an app? We all know the answer, but it really shouldn&amp;amp;#39;t be like that.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;The worst of it is when something only has an app. I have to have so many apps that should just be websites. Why can&amp;amp;#39;t my McDonald&amp;amp;#39;s app be a website that I favourite to my home screen? What is eBay doing that it can&amp;amp;#39;t do as a website? Why do my robot lawnmower, robot vacuum cleaner, and robot window cleaner need an app? Why does my watch need an app for the watch and an app for the watchface store? Why have I got a GitHub app? When I&amp;amp;#39;m buying a car on a website why do I need to install the app to pay for it, why can&amp;amp;#39;t I use a website?&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;/p&gt;&#xD;
&lt;h2&gt;The Future&lt;/h2&gt;&#xD;
&lt;p&gt;I don&amp;amp;#39;t see this getting any better. I thought the web would enlighten humanity, but instead, it&amp;amp;#39;s used to watch live-stream paedophile hunts. I thought it would bring people together, but instead, it&amp;amp;#39;s used to find and create new ways in which we can group and hate each other.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;The content wrapped in ads isn&amp;amp;#39;t even created by humans anymore. We&amp;amp;#39;re now fighting ads and popups to read text written by a GPU that thinks a human would have written. We&amp;amp;#39;ve fully automated our own misery.&lt;/p&gt;&#xD;
</description>
      <pubDate>Sun, 23 Jun 2024 13:45:00 Z</pubDate>
      <image>https://cdn.garry.net/img/uploads/2024/6/23/43eb9cad-9196-490d-bd3d-00536614f16b..png</image>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/aaron-peters</guid>
      <link>https://garry.net/posts/aaron-peters</link>
      <title>Aaron Peters</title>
      <description>&lt;p&gt;I thought it would die down, but I&amp;amp;#39;m still getting a ton of dms, voicemails, emails and actual physical hand written letters about this.. so I thought it would be a good idea to present evidence to shut people up.&amp;lt;br/&amp;gt;&lt;/p&gt;&#xD;
&lt;h2&gt;The Domain&lt;/h2&gt;&#xD;
&lt;p&gt;There&amp;amp;#39;s a claim that the DMCA takedowns are fake because the domain isn&amp;amp;#39;t Nintendo&amp;amp;#39;s domain. the &amp;amp;quot;-mm&amp;amp;quot; on the end proves that its fake, because a Nintendo domain wouldn&amp;amp;#39;t have that. It&amp;amp;#39;s an obvious forgery.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;No-one stopped to ask why use a fake domain at all. Why not just be like &amp;amp;quot;aaron.peters@nintendo.com&amp;amp;quot; - it would be more believable. If they did that, would you think it was real? No? So what difference does it make.&lt;/p&gt;&#xD;
&lt;h2&gt;Mark Monitor&lt;/h2&gt;&#xD;
&lt;p&gt;The domain isn&amp;amp;#39;t really owned by Nintendo. It&amp;amp;#39;s most likely owned by the company they subcontract this stuff to. Rather than pay someone in-house to watch the internet and issue takedowns, they subcontract that to another company.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;This company is acting on Nintendo&amp;amp;#39;s behalf, under the instruction of Nintendo.  It makes sense that Nintendo wouldn&amp;amp;#39;t want to give them an official email address on nintendo.com - that is not good practice.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;We know Nintendo use Mark Montior. They talk about it openly and information is available on their official website.&lt;/p&gt;&#xD;
&lt;h2&gt;Aaron Peters&lt;/h2&gt;&#xD;
&lt;p&gt;This guy doesn&amp;amp;#39;t exist. Well, he might, but I don&amp;amp;#39;t think he does.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;If you look at the history of takedowns, you will notice they started as real Nintendo employees. Then they all switched to Aaron. I would guess that this is because the internet is full of crazies.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;So it makes sense that you invent a name to be the target of that stuff. Let the internet shout at an empty chair.&lt;/p&gt;&#xD;
&lt;h2&gt;Confirmation&lt;/h2&gt;&#xD;
&lt;p&gt;The other small nugget of information that people seem to be ignoring is that multiple people have had confirmation from Nintendo themselves. Including us.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;You would think that would kind of trump every other conspiracy theory, but for some reason this ARG won&amp;amp;#39;t die, even after it&amp;amp;#39;s been cremated, and buried.&lt;/p&gt;&#xD;
&lt;h2&gt;Anger&lt;/h2&gt;&#xD;
&lt;p&gt;I don&amp;amp;#39;t really understand the anger people have shown about this stuff. It doesn&amp;amp;#39;t seem logical to me. Maybe I grew up in a different time where IP, trademarks and copyright laws were obvious no brainers.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Maybe because of streaming and Steam this generation grew up without real piracy. Maybe they don&amp;amp;#39;t understand all that because they can post music and videos in their memes on tiktok and no-one gets pissed.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;The attitude shouldn&amp;amp;#39;t be anger and outrage that it is being stopped; it should be surprise and delight that you got away with it for so long.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Companies letting you use their IP like this isn&amp;amp;#39;t the default. When a company lets you get away with using their IP in UGC in another game they&amp;amp;#39;re a cool company. When they don&amp;amp;#39;t, they&amp;amp;#39;re a normal company.&lt;/p&gt;&#xD;
</description>
      <pubDate>Thu, 30 May 2024 08:40:00 Z</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/your-licensing-system-sucks</guid>
      <link>https://garry.net/posts/your-licensing-system-sucks</link>
      <title>Your licensing system sucks</title>
      <description>&lt;p&gt;Something we&amp;amp;#39;ve come across a few times at Facepunch, especially with artists, is that they want to use some software, and it seems useful so we pay for it. It&amp;amp;#39;s always super expensive and is always per user, and that&amp;amp;#39;s fine because it&amp;amp;#39;s worth the price.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;So all the lawyers do their things, you sign the agreements, you&amp;amp;#39;re paying enough to buy a small house for this software for your team, so you&amp;amp;#39;re looking forward to just getting the licenses and putting everyone to work.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Then you get the email with the licenses. You have to install their license manager on your network. Floating licenses. Okay. Fucking hoops to jump through, but okay.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;The license manager isn&amp;amp;#39;t ever something they coded themselves. Because if they had coded it themselves they&amp;amp;#39;d have made it straight forward, they&amp;amp;#39;d have coded it so they have a database of customers and the app just phones home now and then to check its license status. &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;But this isn&amp;amp;#39;t something simple. It&amp;amp;#39;s made by another company. Like Reprise License Manager. You need to install the license server on a machine in your office, using the command line. You need to copy the license into that install, usually with the command line. Then you need to try to configure that to run as a service or something so that when the PC reboots it doesn&amp;amp;#39;t disappear.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;So suddenly, your mission to setup this trendy, modern, up-to-date game dev software feels very outdated. It feels hostile. You&amp;amp;#39;re paying a shitload of money and they&amp;amp;#39;re making your jump through all these hoops. We just sent you loads of fucking money just unlock the app using accounts or a cd key or something. Jesus fuck.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;/p&gt;&#xD;
</description>
      <pubDate>Sat, 27 Jan 2024 18:21:21 Z</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/disposable-action</guid>
      <link>https://garry.net/posts/disposable-action</link>
      <title>Disposable Action</title>
      <description>&lt;p&gt;I like doing scopes in c#. I like that pattern. I always used to write an IDisposable class for each scope.. but then I saw this pattern.&amp;lt;br/&amp;gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;So how this works, is you can do something like this..&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Then in your normal every day code, you can scope push shit.&lt;/p&gt;&#xD;
&#xD;
</description>
      <pubDate>Sun, 05 Nov 2023 10:08:26 Z</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/the-good-guys</guid>
      <link>https://garry.net/posts/the-good-guys</link>
      <title>The Good Guys</title>
      <description />
      <pubDate>Fri, 15 Sep 2023 18:45:00 +0100</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/unity-can-get-fucked</guid>
      <link>https://garry.net/posts/unity-can-get-fucked</link>
      <title>Unity can get fucked</title>
      <description>&lt;p&gt;Yesterday Unity announced that starting next year, all games that use their engine will pay a tax per user install. The tax has a high-profit threshold before it kicks in, which I think they assumed would make it okay.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Over the last 24 hours there have been many reasons pointed out why this is a bad idea. Tracking installs is messy. Piracy, reinstalls, new computers, giveaways, bad actors. There are a lot of reasons why it isn&amp;amp;#39;t feasible.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;It makes you wonder how they could think it&amp;amp;#39;s a good idea. And maybe it is a good idea if you think of Unity as a mobile game engine. If you view it through that lens maybe it makes sense to them. &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Maybe they forgot about PC gaming. Again.&lt;/p&gt;&#xD;
&lt;h2&gt;The Cost&lt;/h2&gt;&#xD;
&lt;p&gt;Let me be clear.. the cost isn&amp;amp;#39;t a big issue to us. If everything worked out, the tracking was flawless and it was 10p per sale, no biggy really. If that&amp;amp;#39;s what it costs, then that&amp;amp;#39;s what it costs.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;But that&amp;amp;#39;s &amp;lt;strong&amp;gt;not &amp;lt;/strong&amp;gt;why we&amp;amp;#39;re furious. It hurts because we didn&amp;amp;#39;t agree to this. We used the engine because you pay up front and then ship your product. We weren&amp;amp;#39;t told this was going to happen. We weren&amp;amp;#39;t warned. We weren&amp;amp;#39;t consulted.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;We have spent 10 years making Rust on Unity&amp;amp;#39;s engine. We&amp;amp;#39;ve paid them every year. And now they changed the rules.&lt;/p&gt;&#xD;
&lt;h2&gt;Broken Trust&lt;/h2&gt;&#xD;
&lt;p&gt;Unity has shown its power. We can see what they can and are willing to do. You can&amp;amp;#39;t un-ring that bell.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;If you&amp;amp;#39;d have asked me last week whether it was in Unity&amp;amp;#39;s power to start charging us PER SALE of our games, I&amp;amp;#39;d have said that was crazy and no. &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Surely that&amp;amp;#39;s not possible. &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;That would be like Adobe charging all users of Photoshop per image view.. and trying to invent a system in which they can track and invoice you every month. And not only the new images, but all the images that you created over the last 20 years. Then automatically invoicing you every month.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;But that&amp;amp;#39;s what happened. And now we know they can do that, and that they&amp;amp;#39;re willing to do that. Unity is the worst company to be in charge of the Unity Engine.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;The trust is gone. &lt;/p&gt;&#xD;
&lt;h2&gt;Retrospect&lt;/h2&gt;&#xD;
&lt;p&gt;It&amp;amp;#39;s our fault. All of our faults. We sleepwalked into it. We had a ton of warnings. We should have been pressing the eject button when Unity IPO&amp;amp;#39;d in 2020. Every single thing they&amp;amp;#39;ve done since then has been the exact opposite of what was good for the engine. &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;We had 10 years to make our own engine and never did. I&amp;amp;#39;m sure a lot of game companies are feeling the same today. &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Let&amp;amp;#39;s not make the same mistake again, Rust 2 definitely won&amp;amp;#39;t be a Unity game.&amp;lt;br/&amp;gt;&lt;/p&gt;&#xD;
</description>
      <pubDate>Wed, 13 Sep 2023 14:23:00 +0100</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/facepunch-birmingham</guid>
      <link>https://garry.net/posts/facepunch-birmingham</link>
      <title>Facepunch Birmingham</title>
      <description>&lt;p&gt;We moved offices this year. It&amp;amp;#39;s been a bit of an adventure. Our &amp;lt;a href=&amp;quot;https://garry.net/posts/facepunch-bloxwich&amp;quot;&amp;gt;old office in Bloxwich&amp;lt;/a&amp;gt; was a convenient thing - it was close to our houses.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;This new office is for the staff. It&amp;amp;#39;s in Birmingham City Center, right by the train station, right by hotels and restaurants and bars, which is all relatively close to an international airport.&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/8/31/8e64431e-72c8-4406-867a-c9b5e8444814..png" /&gt;&#xD;
&lt;p&gt;We had office design firm Oktra fit it out, because they&amp;amp;#39;d already done a bunch of game companies. It was pretty surprising how fast it all came together.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Suprisingly, it was under 6 months to go from an empty shell to a working office.&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/8/31/26f206c3-41d0-44c3-a897-bc88eb1d6a8e..png" /&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/8/31/318cd604-d0ab-4f1a-89c0-0a50b40d58e7..png" /&gt;&#xD;
&lt;p&gt;That&amp;amp;#39;s my office on the left.&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/8/31/8ae5e2e6-4374-4902-a52f-953686b846cc..png" /&gt;&#xD;
&lt;p&gt;This is a wellness corner. Office designers love stuff like this because they get to put the design in for awards. The theory is that if an employee is feeling stressed or upset they can go and sit here and feel better. We call it the crying corner.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;In reality, the only reason anyone goes here is to tell people how we got fooled into adding it.&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/8/31/5d071123-9f7b-454e-b122-5a0439b215f9..png" /&gt;&#xD;
&lt;p&gt;The board room. I don&amp;amp;#39;t know how to use anything in here yet.&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/8/31/84f5a1d3-2573-4677-9e73-eb9ba5513621..png" /&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/8/31/4abb204e-30db-41d0-918f-802e9b0c768b..png" /&gt;&#xD;
&lt;p&gt;We wanted three monitors per desk. I think that&amp;amp;#39;s too much now. I think people are going to have as many monitors as you let them have and we should have drawn the line at two.&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/8/31/dab42484-5994-4e51-aaa0-c037c5416e41..png" /&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/8/31/7e11c5a2-d540-4841-9104-7a17ae56925a..png" /&gt;&#xD;
&lt;p&gt;We have a bar at the center of the office. There&amp;amp;#39;s a TV at the back so we can watch videos of people falling over on youtube while we eat our sandwiches.&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/8/31/2b75b6db-cf9c-4891-89e7-4bb1a625813d..png" /&gt;&#xD;
&lt;p&gt;And we have an office barber - so we had to have a proper place for him to cur our hair.&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/8/31/641a5fc2-7042-4604-820e-cbd623610056..png" /&gt;&#xD;
&lt;p&gt;It&amp;amp;#39;s such a nice office and it cost us so much that you&amp;amp;#39;d think it would be a good idea to force all of our devs to work from here instead of letting them work from home. That&amp;amp;#39;s not the Facepunch way though. My attitude is here&amp;amp;#39;s a nice accessible office if you want it - it&amp;amp;#39;s up to you to find the best way to work. &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;So &amp;lt;a href=&amp;quot;https://facepunch.com/careers&amp;quot;&amp;gt;come join Facepunch&amp;lt;/a&amp;gt; - we&amp;amp;#39;ve got a nice office you don&amp;amp;#39;t have to attend!&amp;lt;br/&amp;gt;&lt;/p&gt;&#xD;
</description>
      <pubDate>Sat, 02 Sep 2023 09:00:00 +0100</pubDate>
      <image>https://cdn.garry.net/img/uploads/2023/8/31/8e64431e-72c8-4406-867a-c9b5e8444814..png</image>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/mexico</guid>
      <link>https://garry.net/posts/mexico</link>
      <title>Mexico</title>
      <description>&lt;p&gt;We just got back from a two week family holiday in Mexico. It was a pretty good break. The resort was Moon Palace, which like 20 minutes away from the airport.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Before we flew out people started telling me how dangerous Mexico is. Linking me to news articles about tourists being murdered and stuffed in wardrobes by hotel staff. It made me wonder whether it was the right place to go.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;But there were 15 of us on the trip, and not a single one of us got murdered.&lt;/p&gt;&#xD;
&lt;h2&gt;Kids&lt;/h2&gt;&#xD;
&lt;p&gt;There was a kids club there and our kids loved it in there. They could stay in there on their own, and there was loads to do.. like mini golf, bumper cars, football simulator, arcade machines, soft play, escape rooms. They even had their own cafe where they could get free pizza and drinks.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;It&amp;amp;#39;s the first time we&amp;amp;#39;ve left them in something like this on their own. When you hear kids club you tend to think of a jail for kids with a hand drawn mickey mouse on the wall.. but it was really good.&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/8/26/72daaf5c-4c4d-4664-bb81-4cddc6819a84..png" /&gt;&#xD;
&lt;p&gt;They had a restaurant called the Circus where everything was &amp;amp;quot;fun&amp;amp;quot;. Onion rings delivered on a juggling pin, clowns running up to your table spinning plates, food in a big shoe. &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Every now and then something would happen on the stage.. like a juggler or gymnast, and everyone would stop eating and turn around and watch. Everyone except for me. I just ate my dinner.&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/8/26/413c1853-1801-425e-bd51-549a00fba0e0..png" /&gt;&#xD;
&lt;p&gt;Outside the kids&amp;amp;#39; club was a water park, with a wave pool, lazy river and slides and stuff. The kids loved that. I liked it a lot more towards the end of the holiday when we realised you could order food to your sunbed.&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/8/26/7761fef7-b445-4810-a1b2-4e2abf3e8ea7..png" /&gt;&#xD;
&lt;p&gt;There was an arcade there called the wired lounge. It fucking stank in there. Popcorn and sugar, horrible. They had a bunch of arcade machines, but they also had a ton of xbox&amp;amp;#39;s and pcs for the kids to play on. Alex kept asking us to get him a keyboard and leave him there, but we resisted.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;The PCs were used primarily for Roblox - which seems like the idea game for a place like that, considering the small download size etc. The XBox&amp;amp;#39;s were a mix of Fifa and Minecraft.&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/8/26/a60947b5-db1f-4f0e-9336-5da32602da47..png" /&gt;&#xD;
&lt;h2&gt;Pirates&lt;/h2&gt;&#xD;
&lt;p&gt;We went on a pirate ship. It was kind of hell for a while. They really pack as many people as possible as they can on the boats. When I say pack, I mean like, packed. You could sit there and see people&amp;amp;#39;s happy faces approaching the boat - then as soon as they saw the amount of people on there, their expression would drop and be replaced by confusion and panic.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;We paid to go upstairs, to a private area.. which I suspect is their plan all along.. just make you suffer until you pay to get out.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;The show itself felt like some kind of inhumane torture. The captain had a mic and was just constantly shouting in two different languages. We didn&amp;amp;#39;t know what was going on. At one point it rained and they put a cover over the boat which made things 100x hotter and more humid.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;It culminated in 3 boats coming together and the pirates from the other boats doing a sword fight while all 3 captains shouted illegibly over the mic, which was kind of cool and left us feeling okay about the whole experience.&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/8/26/78f0a665-5959-4c58-b835-5d2297120b13..png" /&gt;&#xD;
&lt;p&gt;&#xD; &amp;lt;br/&amp;gt;All the varnish on the seats had dyed the back of my shorts brown and it looked like I shit myself. We put them in the bin in the hotel but the maid took them out, probably because it looked like they were covered in shit. I had to sneak them into a public bin to get rid of them.&amp;lt;br/&amp;gt;&lt;/p&gt;&#xD;
&lt;h2&gt;Dolphins&lt;/h2&gt;&#xD;
&lt;p&gt;Some of the family went to swim with dolphins. I didn&amp;amp;#39;t fancy getting up at 6am and travelling for 2 hours so me and Jess stayed home.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Alex loved it, and now he loves dolphins.&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/8/26/4ae16003-8373-4e59-b0dd-0cf6afc04f1b..png" /&gt;&#xD;
&lt;p&gt;I asked him if the dolphins like being in captivity and being forced to do tricks, and he said yeah they get a treat. I told him they probably get tortured like Rocket in Guardians of the Galaxy if they don&amp;amp;#39;t do it and he got upset.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;I liked that, him showing some empathy for the animals, questioning shit in his mind. I told him we&amp;amp;#39;ll watch Free Willy to sort his head out.&lt;/p&gt;&#xD;
&lt;h2&gt;Raccoons&lt;/h2&gt;&#xD;
&lt;p&gt;There were racoons there. We don&amp;amp;#39;t have them in the UK and I&amp;amp;#39;ve never seen them in real life before, so I don&amp;amp;#39;t know what they do or how they think. If you kick one, will it run off or will it fight you?&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;The resort didn&amp;amp;#39;t have doors on the hotel blocks and they just left the room service plates in the hall all night. So the raccoons would come in at 3am and throw them everywhere trying to eat a bit of leftover egg.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;This happened for like the 3rd night in a row, so I thought I&amp;amp;#39;d open the door and scare it off. But when I opened the door it just stood still, looking at me. All I could imagine was it launching itself at my face, so I closed the door.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Then when I was in bed I was drifting in and out of sleep, with weird paranoia, questioning myself like &amp;amp;quot;are you sure one didn&amp;amp;#39;t get in the room when you opened the door&amp;amp;quot;.&lt;/p&gt;&#xD;
&lt;h2&gt;Home Sweet Home&lt;/h2&gt;&#xD;
&lt;p&gt;We probably won&amp;amp;#39;t ever go to Mexico again. It&amp;amp;#39;s just too far to go for a holiday when there are so many closer options, but it was good to try it out.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;The jetlag was so real on this one. The worst jetlag we&amp;amp;#39;ve ever had. I was looking forward to that first sleep so much, we went to bed at 9pm, and we were both up until 3am trying to get to sleep. I can&amp;amp;#39;t ever remember experiencing that before. It took a whole week to get back on schedule.&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/8/26/219470ac-6003-4494-a7cd-da7041103a5a..png" /&gt;&#xD;
</description>
      <pubDate>Sat, 26 Aug 2023 16:56:00 +0100</pubDate>
      <image>https://cdn.garry.net/img/uploads/2023/8/26/72daaf5c-4c4d-4664-bb81-4cddc6819a84..png</image>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/npm</guid>
      <link>https://garry.net/posts/npm</link>
      <title>NPM</title>
      <description>&lt;p&gt;When I was a kid, making websites, you&amp;amp;#39;d find some library that you wanted to use, then you&amp;amp;#39;d either copy the .js file to your website or use a cdn host and add the .js to a &amp;amp;amp;lt;script src&amp;amp;amp;gt;on your webpage and you&amp;amp;#39;d be using it.&lt;/p&gt;&#xD;
&lt;p&gt;It seems like now you find a library that you want to use and the expectation is that you&amp;amp;#39;re using npm.&lt;/p&gt;&#xD;
&lt;p&gt;Now let me just say, I get the point of npm. I get that at a certain point you want to make all your javascript one big bundle to minimize the amount of files that the client downloads etc.. I get that having a package manager makes sense.&lt;/p&gt;&#xD;
&lt;p&gt;But something about it surprises me.. Is everyone using this? Are normal web developers typing command-lines to add packages? Are normal web developers running a command to build the javascript every time? Are they setting up an intricate system to auto re-compile on change? Are normal web developers dealing with multi-second compiles every save?&lt;/p&gt;&#xD;
&lt;p&gt;Is this why no-one makes their own websites anymore?&lt;/p&gt;&#xD;
</description>
      <pubDate>Sat, 13 May 2023 05:55:53 Z</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/facepunch-bloxwich</guid>
      <link>https://garry.net/posts/facepunch-bloxwich</link>
      <title>Facepunch Bloxwich</title>
      <description>&lt;p&gt;We have left out Bloxwich office and moved to Birmingham. We&amp;amp;#39;d been there since about 2012.&lt;/p&gt;&#xD;
&lt;p&gt;We took this office because it was close to our houses. It was convenient.&lt;/p&gt;&#xD;
&lt;p&gt;It was originally a gym or something. They had mirrors on the walls.&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/5/3/9fa0a083-b78f-4f0e-b3b8-f9551571d10a..png" /&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/5/3/c73311ca-61c7-4c41-82d5-c26cad4b81c6..png" /&gt;&#xD;
&lt;p&gt;Then we came in.&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/5/3/708b8e67-390c-4ef8-95bc-ff5bf858d906..png" /&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/5/4/9ef82da6-d6ac-42ac-b81e-4c07776c4114..png" /&gt;&#xD;
&lt;p&gt;And turned it into our office..&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/5/3/8609d515-3831-4d61-9bf6-d3f341a5e00a..png" /&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/5/3/36f451b6-14ae-4084-9a7c-d09cfd0ab7cc..png" /&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/5/4/bf8e329a-8899-483e-abb3-ff7f7170e9d8..png" /&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/5/4/d3200498-f0d4-46e8-a331-e1753391cf8e..png" /&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/5/4/987d699d-76a5-4901-a239-479b068928ae..png" /&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/5/4/da4592ad-35b4-477f-b421-ffaebb3f054a..png" /&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/5/4/6e642b18-13a3-4115-a02c-662d62811b04..png" /&gt;&#xD;
&lt;p&gt;Then came our exit. We got our new office in Birmingham. Over the years we came to realise that while the location of the office was convenient for us, it wasn&amp;amp;#39;t convenient for anyone else. There&amp;amp;#39;s no hotels or anything. &lt;/p&gt;&#xD;
&lt;p&gt;So if staff members wanted to come and work here for a few days it would mean 20 mins taxis to the nearest hotel every morning and night.&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/5/4/a5236132-b5ab-4da6-b5ee-275ea5e68aa4..png" /&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/5/4/49efa571-d3fd-40c1-9391-80adc3914b11..png" /&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/5/4/460029f6-4c67-4a7c-bf0e-8ec068ef2ed4..png" /&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/5/4/9798866a-cb17-4400-9f71-486a74455ef8..png" /&gt;&#xD;
</description>
      <pubDate>Sat, 06 May 2023 09:56:00 +0100</pubDate>
      <image>https://cdn.garry.net/img/uploads/2023/5/3/9fa0a083-b78f-4f0e-b3b8-f9551571d10a..png</image>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/lapland</guid>
      <link>https://garry.net/posts/lapland</link>
      <title>Lapland</title>
      <description>&lt;p&gt;We went to Finland just before Christmas. I meant to post about it a while back but I forgot that I had a blog.&lt;/p&gt;&#xD;
&lt;h2&gt;Why&lt;/h2&gt;&#xD;
&lt;p&gt;Going to Lapland is becoming a thing that brits do. It&amp;amp;#39;s like going to Spain was when I was growing up. It&amp;amp;#39;s turning into a bit of a tourist thing to do in winter, where traditionally you stayed at home.&lt;/p&gt;&#xD;
&lt;p&gt;The real answer is kids. You go to see where Santa is. Because he isn&amp;amp;#39;t already bust enough during this time - he needs people to miether him at home.&lt;/p&gt;&#xD;
&lt;h2&gt;Cold&lt;/h2&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/4/29/e0c0d305-ef56-44c1-a5be-705739327fba..png" /&gt;&#xD;
&lt;p&gt;It&amp;amp;#39;s cold in Finland in December. That&amp;amp;#39;s not a big shock to most people but this is the coldest place I&amp;amp;#39;ve ever been to, so it was a whole new experience. Things like your hair and teeth freezing. One set of gloves not being enough to stop my hands freezing.&lt;/p&gt;&#xD;
&lt;h2&gt;Dark&lt;/h2&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/4/29/ef8e8017-2eb6-4c8e-b642-a46a0cfb5ad4..png" /&gt;&#xD;
&lt;p&gt;The sun doesn&amp;amp;#39;t rise properly in December there. It doesn&amp;amp;#39;t even dip over the horizon.. which means that most of the day things are dimmer. &lt;/p&gt;&#xD;
&lt;p&gt;You don&amp;amp;#39;t appreciate how dim things are though, because your eyes and brain are clever enough to compensate. But every now and then you&amp;amp;#39;ll see something, like a light, and realise that it&amp;amp;#39;s not as bright as you think it is.&lt;/p&gt;&#xD;
&lt;h2&gt;Knackering&lt;/h2&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/4/29/dd445463-3bfa-4be3-8818-71299a5f5564..png" /&gt;&#xD;
&lt;p&gt;Because it&amp;amp;#39;s so cold you have to wear 3 layers of clothes.. and wearing so many clothes makes it so hard to walk. &lt;/p&gt;&#xD;
&lt;p&gt;You want to have a walk in the snow but you get 20 meters down the road and you have to have a rest.. because every time you move your legs they&amp;amp;#39;re elasticed back to where they were.&lt;/p&gt;&#xD;
&lt;h2&gt;Spolit&lt;/h2&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/4/29/8c6203d9-8aa4-448d-9217-7e50a67d9449..png" /&gt;&#xD;
&lt;p&gt;The &amp;lt;a href=&amp;quot;https://vanajanlinna.fi/en/levispirit-home&amp;quot;&amp;gt;place we stopped at was insane&amp;lt;/a&amp;gt;. It was so nice and so big. I get the feeling 2 or 3 families normally pack out one of these villas, but we were in it on our own.&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/4/29/8b54c6e6-1d25-4b75-a0cb-1e4d1b6ab4f2..png" /&gt;&#xD;
&lt;p&gt;We had a chef who came and cooked our meals in the villa. The only real problem with that is we&amp;amp;#39;re beans on toast and jacket potato types of people, so when they give us a menu with no photos that looks like it&amp;amp;#39;s written in french, we get very confused.&lt;/p&gt;&#xD;
&lt;h2&gt;Santa&lt;/h2&gt;&#xD;
&lt;p&gt;We told the kids that Santa was going to visit at the villa. There was some debate from Alex that it won&amp;amp;#39;t be the real one, so I told him that there&amp;amp;#39;s no way we&amp;amp;#39;d fly all the way here just to see a fake Santa.&lt;/p&gt;&#xD;
&lt;p&gt;Then he visited us, and he spoke to the kids and gave them some presents, and we had our photo taken with him.&lt;/p&gt;&#xD;
&lt;p&gt;When he&amp;amp;#39;d gone Alex still didn&amp;amp;#39;t believe he was the real Santa. He said his beard was too white.&lt;/p&gt;&#xD;
&lt;p&gt;But the next day I noticed something weird, in the photos we&amp;amp;#39;d had taken with Santa - there was no Santa. He&amp;amp;#39;d gone. Disappeared. I told Alex and he was slightly stunned.&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/4/29/d4834c7d-3b8f-41e6-a192-518535076577..png" /&gt;&#xD;
&lt;p&gt;When we got back I heard him telling one of his friends on his computer about it, as evidence that it was definitely the real one.&lt;/p&gt;&#xD;
&lt;h2&gt;Reindeer Village&lt;/h2&gt;&#xD;
&lt;p&gt;We went to the reindeer village to see some reindeers. They dragged us around in the dark with one for 15 minutes. It felt sad and cruel, but I guess it wasn&amp;amp;#39;t for me.&lt;/p&gt;&#xD;
&lt;p&gt;Then we fed them. In the dark. While they surrounded us like zombies.&lt;/p&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/4/29/e9afaecd-8572-4737-a3a6-cce008164c76..png" /&gt;&#xD;
&lt;p&gt;We went to the cafe and the owner of the farm told us about it. He was a nice guy. Really softly spoken, but a big guy. The farm had Dwight Schrute feelings to it. The cafe was his Grandad&amp;amp;#39;s house and had family photos all over the wall. The chef in the cafe was his mom.&lt;/p&gt;&#xD;
&lt;p&gt;He told us how there&amp;amp;#39;s no wild reindeer in the country, how they&amp;amp;#39;re really more trouble than they&amp;amp;#39;re worth because they get into farmer&amp;amp;#39;s fields and he has to pay for the crops. About how it&amp;amp;#39;s too hot for most people in the summer when it reaches 20c and a lot of farmers work at night and sleep during the day instead.&lt;/p&gt;&#xD;
&lt;p&gt;That night we went back to the Villa and ate Reindeer.&lt;/p&gt;&#xD;
&lt;h2&gt;Ice Village&lt;/h2&gt;&#xD;
&lt;img src="https://cdn.garry.net/img/uploads/2023/4/29/3c3b8ef6-c154-49a5-9f6a-e51bc5b2a6ed..png" /&gt;&#xD;
&lt;p&gt;I had pretty much no sleep. I ate too much reindeer and my body didn&amp;amp;#39;t like it. We had to pack up all our suitcases because we were going to the ice village on the way to the airport.&lt;/p&gt;&#xD;
&lt;p&gt;I felt like total shit. I was either going to throw up or shit myself. There was a 40 minute ride to the airport. I kept looking out of the window to see where I could run to and do a shit if it suddenly hit me. Everything had 2 foot of snow so it wasn&amp;amp;#39;t going to be good.&lt;/p&gt;&#xD;
&lt;p&gt;When we got to the ice village I headed to the toilet. One tiny cubicle. I squeezed in there with my massive coat on and managed to get it off and put it on the floor in front of me. &lt;/p&gt;&#xD;
&lt;p&gt;The cubicle door was a sideways sliding door and there was no lock on it. I had no choice, I held it shut and tried to get some of the meat out of my body. Some got out. I felt better. I managed to squeeze my coat back on and opened the door.&lt;/p&gt;&#xD;
&lt;p&gt;As I slid the door back it came off the rail and started falling forwards. I caught it and held it up. It had come unattached. I tried to put it back, I couldn&amp;amp;#39;t figure it out. The door opened and someone walked in. &lt;/p&gt;&#xD;
&lt;p&gt;He looked at me, standing there holding this huge wooden door, and I looked at him. I put it down, leaned it up where the door should be.. and left without washing my hands.&lt;/p&gt;&#xD;
</description>
      <pubDate>Sat, 29 Apr 2023 16:19:29 Z</pubDate>
      <image>https://cdn.garry.net/img/uploads/2023/4/29/e0c0d305-ef56-44c1-a5be-705739327fba..png</image>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/mailbag-sausage-men</guid>
      <link>https://garry.net/posts/mailbag-sausage-men</link>
      <title>Mailbag: Sausage Men</title>
      <description>&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I haven't done a mailbag for a long time, but this is a common enough question that I thought I'd explain my thinking here.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;This particular email was fair and level headed and I'm hoping that my posting it as a blog I can redirect future generations here.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:quote --&gt;
&lt;blockquote class="wp-block-quote"&gt;&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Hello,&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I played Garry's Mod for a couple thousand hours and yadda yadda you've heard all that before. Big fan. Just learned about s&amp;amp;box and I'm very excited. We've had a pretty severe lack of games that do the whole "moddable sandbox with hostable custom gamemodes" thing of late - at least, ones that aren't insufferable free kiddie cesspools. Please charge money for s&amp;amp;box.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I gotta say though. The current default character model is so amazingly viscerally unappealing that I legitimately think it's gonna fuck up the game's marketing appeal. The goofy wacky silly sausage people sit on the extreme end of juvenile cartoon humor aesthetic and almost instantly turned me off of the game. Every one of my friends I went and showed it to after agreed. It'd be kind of a problem if the game is less popular due strictly to a much worse surface aesthetic (see: Nidhogg 2) when the game is so focused on creator involvement and UGC.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;"Just change the model if you don't like it!" says everyone on the forums to similar complaints. Guess what? Can't change the splash screens and marketing material. God save me if I have to look at this wacky sausage man every time I boot up the game. "It really grows on you!" say other people on the forums. That means absolutely nothing to marketing appeal.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Give it some thought.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;All the best&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;&lt;cite&gt;Tom&lt;/cite&gt;&lt;/blockquote&gt;
&lt;!-- /wp:quote --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Garry's Mod&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;The default player models in Garry's Mod were from Half-Life 2. They aren't generic humanoids. They were designed and iterated on and refined  by legit artists for years. They come with character built in.. not only in their design but by the experiences we've had with them. They're mostly downtrodden - so we like them. They're good at doing something - so we like them. We can predict a lot of aspects of their characters because we know their personality. That's a lot of shorthand built in.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":2174,"sizeSlug":"full","linkDestination":"none"} --&gt;
&lt;figure class="wp-block-image size-full"&gt;&lt;img src=https://cdn.garry.net/wpi/08/image-7.png alt="" class="wp-image-2174"/&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;As an example of this, GMan with a traffic cone on his head with his eyes crossed is funny to us - because we know his personality. We know he's a serious guy who wouldn't want to be laughed at. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Humans Suck&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Generic humanoids don't come with any of those benefits. In fact, whenever I see generic humanoids in a game I get annoyed. I don't want to play a game filled with trendy hipster 20 somethings.  It's annoying. Everyone so cool, perfect figures, stylish hair.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":2170,"sizeSlug":"large","linkDestination":"none"} --&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;img src=https://cdn.garry.net/wpi/08/image-4-1024x443.png alt="" class="wp-image-2170"/&gt;&lt;figcaption class="wp-element-caption"&gt;Crayta&lt;/figcaption&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:image {"id":2173,"sizeSlug":"large","linkDestination":"none"} --&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;img src=https://cdn.garry.net/wpi/08/image-6-1024x548.png alt="" class="wp-image-2173"/&gt;&lt;figcaption class="wp-element-caption"&gt;Fortnite&lt;/figcaption&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Characters&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;There's a few shortcuts to likability. Let's do some analysis of common likable characters.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:table {"className":"is-style-regular"} --&gt;
&lt;figure class="wp-block-table is-style-regular"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Homer Simpson&lt;/td&gt;&lt;td&gt;Fat, Bald, Stupid&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;s&gt;Alyx Vance&lt;/s&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;No Redeeming Quality&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Marty McFly&lt;/td&gt;&lt;td&gt;Short, Moral, Weak&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;George Costanza&lt;/td&gt;&lt;td&gt;Fat, Bald, Glasses, Loser&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Michael Scott&lt;/td&gt;&lt;td&gt;Idiot, Good at job&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Max Payne&lt;/td&gt;&lt;td&gt;Dead Family&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Wall-E&lt;/td&gt;&lt;td&gt;Idiot, Lonely&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Jason Bourne&lt;/td&gt;&lt;td&gt;Exploited, Amnesia, Good at job&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;!-- /wp:table --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;In s&amp;amp;box we don't have any characters yet. They don't talk, they don't have jobs, they can't be good at things. So right now we have to throw everything away except their appearance.  So our strategy is to try to be less Fortnite and more &lt;a href="https://youtu.be/U5H59DRJ_8k?t=142"&gt;Bullseye&lt;/a&gt;:&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:jetpack/tiled-gallery {"className":"is-style-columns","columnWidths":[["24.96615","37.51692","37.51692"]],"ids":[2178,2180,2181,2182,2184,2185,2186]} --&gt;
&lt;div class="wp-block-jetpack-tiled-gallery aligncenter is-style-columns"&gt;&lt;div class="tiled-gallery__gallery"&gt;&lt;div class="tiled-gallery__row"&gt;&lt;div class="tiled-gallery__col" style="flex-basis:24.96615%"&gt;&lt;figure class="tiled-gallery__item"&gt;&lt;img alt="" data-height="375" data-id="2178" data-link="https://garry.blog/?attachment_id=2178" data-url=https://cdn.garry.net/wpi/08/tumblr_m64nh74apj1r2n2xeo1_500-3144096940.jpg data-width="500" src=https://cdn.garry.net/wpi/08/tumblr_m64nh74apj1r2n2xeo1_500-3144096940.jpg data-amp-layout="responsive"/&gt;&lt;/figure&gt;&lt;figure class="tiled-gallery__item"&gt;&lt;img alt="" data-height="375" data-id="2180" data-link="https://garry.blog/?attachment_id=2180" data-url=https://cdn.garry.net/wpi/08/tumblr_matbkbuhmk1r2n2xeo1_500-1594310883.jpg data-width="500" src=https://cdn.garry.net/wpi/08/tumblr_matbkbuhmk1r2n2xeo1_500-1594310883.jpg data-amp-layout="responsive"/&gt;&lt;/figure&gt;&lt;figure class="tiled-gallery__item"&gt;&lt;img alt="" data-height="375" data-id="2181" data-link="https://garry.blog/?attachment_id=2181" data-url=https://cdn.garry.net/wpi/08/tumblr_lqhmqp6p4z1r2n2xeo1_500.jpg data-width="500" src=https://cdn.garry.net/wpi/08/tumblr_lqhmqp6p4z1r2n2xeo1_500.jpg data-amp-layout="responsive"/&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div class="tiled-gallery__col" style="flex-basis:37.51692%"&gt;&lt;figure class="tiled-gallery__item"&gt;&lt;img alt="" data-height="375" data-id="2182" data-link="https://garry.blog/?attachment_id=2182" data-url=https://cdn.garry.net/wpi/08/tumblr_mneu3styOK1r2n2xeo1_500-1566692325.jpg data-width="500" src=https://cdn.garry.net/wpi/08/tumblr_mneu3styOK1r2n2xeo1_500-1566692325.jpg data-amp-layout="responsive"/&gt;&lt;/figure&gt;&lt;figure class="tiled-gallery__item"&gt;&lt;img alt="" data-height="375" data-id="2184" data-link="https://garry.blog/?attachment_id=2184" data-url=https://cdn.garry.net/wpi/08/tumblr_lqhn5sctqe1r2n2xeo1_500-1914962968.jpg data-width="500" src=https://cdn.garry.net/wpi/08/tumblr_lqhn5sctqe1r2n2xeo1_500-1914962968.jpg data-amp-layout="responsive"/&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div class="tiled-gallery__col" style="flex-basis:37.51692%"&gt;&lt;figure class="tiled-gallery__item"&gt;&lt;img alt="" data-height="375" data-id="2185" data-link="https://garry.blog/?attachment_id=2185" data-url=https://cdn.garry.net/wpi/08/tumblr_lvsrqvjcwb1r2n2xeo1_500-482752061.jpg data-width="500" src=https://cdn.garry.net/wpi/08/tumblr_lvsrqvjcwb1r2n2xeo1_500-482752061.jpg data-amp-layout="responsive"/&gt;&lt;/figure&gt;&lt;figure class="tiled-gallery__item"&gt;&lt;img alt="" data-height="375" data-id="2186" data-link="https://garry.blog/?attachment_id=2186" data-url=https://cdn.garry.net/wpi/08/tumblr_lt4jwcozWu1r2n2xeo1_500-3938528680.jpg data-width="500" src=https://cdn.garry.net/wpi/08/tumblr_lt4jwcozWu1r2n2xeo1_500-3938528680.jpg data-amp-layout="responsive"/&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;!-- /wp:jetpack/tiled-gallery --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I'd much rather hang around with these guys than the characters in the previous section. Real looking mother fuckers. Every one of them is a character. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I tend to think that a lot of people have the general feeling that real looking people are nicer than good looking people. That's why it's always such a surprise when someone good looking isn't a complete arshole, suprising enough to tell people that they aren't an arshole. Because the assumption is that good looking people are arsholes.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;This has a big influence on the media I consume. I can't stand shows like Love Island that seem to revolve around young beautiful people. Can't stand to watch all the good looking young youtubers running around loving life. But yeah I'll watch a fat guy with a mullet mow his grass for 40 minutes. Yeah I'll watch a young Gordon Freeman build a pretend space station on his own for an hour. Yeah I'll watch a chubby bald guy retrobrite old computers over and over for hours on end. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;AK47&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Back when Counter-Strike was released there was a healthy mod scene, which spawned actual websites that used to post news about them. Every mod had an AK47. So there were dozens of games making the same AK47 model.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I feel like a lot of the games that get made now are doing the same thing. Especially in the Sandbox/UGC area we're in. The same player models over and over again.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Sausage People&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;But why sausage people? Why not make ugly humans? To be honest, I don't see a lot of difference. They're not strictly humans, but they're not strictly not humans.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:jetpack/tiled-gallery {"className":"is-style-square","columns":3,"columnWidths":[["53.10049","46.89951"]],"ids":[2192,2194,2198,2196]} --&gt;
&lt;div class="wp-block-jetpack-tiled-gallery aligncenter is-style-square"&gt;&lt;div class="tiled-gallery__gallery"&gt;&lt;div class="tiled-gallery__row columns-1"&gt;&lt;div class="tiled-gallery__col"&gt;&lt;figure class="tiled-gallery__item"&gt;&lt;img alt="" data-height="989" data-id="2192" data-link="https://garry.blog/?attachment_id=2192" data-url=https://cdn.garry.net/wpi/08/image-11-1024x732.png data-width="1384" src=https://cdn.garry.net/wpi/08/image-11-1024x732.png data-amp-layout="responsive"/&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="tiled-gallery__row columns-3"&gt;&lt;div class="tiled-gallery__col"&gt;&lt;figure class="tiled-gallery__item"&gt;&lt;img alt="" data-height="938" data-id="2194" data-link="https://garry.blog/?attachment_id=2194" data-url=https://cdn.garry.net/wpi/08/image-12-1024x615.png data-width="1563" src=https://cdn.garry.net/wpi/08/image-12-1024x615.png data-amp-layout="responsive"/&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div class="tiled-gallery__col"&gt;&lt;figure class="tiled-gallery__item"&gt;&lt;img alt="" data-height="913" data-id="2198" data-link="https://garry.blog/?attachment_id=2198" data-url=https://cdn.garry.net/wpi/08/image-14-1024x602.png data-width="1553" src=https://cdn.garry.net/wpi/08/image-14-1024x602.png data-amp-layout="responsive"/&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div class="tiled-gallery__col"&gt;&lt;figure class="tiled-gallery__item"&gt;&lt;img alt="" data-height="978" data-id="2196" data-link="https://garry.blog/?attachment_id=2196" data-url=https://cdn.garry.net/wpi/08/image-13-1024x648.png data-width="1546" src=https://cdn.garry.net/wpi/08/image-13-1024x648.png data-amp-layout="responsive"/&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;!-- /wp:jetpack/tiled-gallery --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;More important to me is that they're not pretty, or trendy. I haven't seen the exact same models in 4 different games this year.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Kids Game&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I've heard a quite a few people mention that the models are like something out of a children's show. I can accept that and while first impressions are important, I don't totally see it as a negative. I kind of enjoy when things look one way and turn out to be another.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;The world I envision them living in isn't a kids cartoon. There was an old cartoony show in the 90s, it was shown late at night so my dad used to set the video to record it so he could watch it on Sunday morning. It was called &lt;a href="https://www.youtube.com/watch?v=32YNCGKNa1k"&gt;Crapston Villas&lt;/a&gt;. This is the kind of world I imagine these guys live in. Grimey and real.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;All that said, it's totally not our intention to make everything look like a sanitized kids show.  I have been pushing the guys to increase the dirt and grime, to make everything look dated and worn. I don't know how easy it is for an artist to make things look like shit.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Marketing&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;It's probably important to point out that we haven't started marketing the game. We haven't even started finishing the game yet. So any screenshots of the citizens you've seen and thought "omg baby game", those are development shots. Making assumptions based on those would be like looking at a greybox of a map and worrying that there aren't any textures.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;It's also worth noting that our games haven't historically sold well because they look amazing. They sell well because we have a plan and are in it for the long haul, changing the plan as things come up. If s&amp;amp;box fails or succeeds - that won't be because of the citizen models. Games that rely primarily on being visually appealing don't stay popular for 20 years.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Your general sentiment is correct though. There is a shopping list of things we need to do to sell the citizens to the players. Some of those things have already started and some are pending. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Another thing is that the citizens are the thing the most screenshots exist of because they're the most interesting thing to take screenshots of right now. We haven't been posting screenshots and videos of the content created for s&amp;amp;box - which is the bread and butter of what we're doing. That's why people buy GMod, and I expect that's why people will buy s&amp;amp;box.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":2219,"sizeSlug":"large","linkDestination":"media"} --&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;a href=https://cdn.garry.net/wpi/08/image-16.png&gt;&lt;img src=https://cdn.garry.net/wpi/08/image-16-1024x576.png alt="" class="wp-image-2219"/&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:video {"guid":"RodkcX4v","id":2216,"videoPressTracks":[],"videoPressClassNames":"wp-block-embed is-type-video is-provider-videopress","fileForImmediateUpload":{}} --&gt;
&lt;figure class="wp-block-video wp-block-embed is-type-video is-provider-videopress"&gt;&lt;div class="wp-block-embed__wrapper"&gt;
https://videopress.com/v/RodkcX4v?resizeToParent=true&amp;amp;cover=true&amp;amp;preloadContent=metadata&amp;amp;useAverageColor=true
&lt;/div&gt;&lt;/figure&gt;
&lt;!-- /wp:video --&gt;

&lt;!-- wp:video {"guid":"Nssb4tTA","id":2212,"videoPressTracks":[],"videoPressClassNames":"wp-block-embed is-type-video is-provider-videopress","fileForImmediateUpload":{}} --&gt;
&lt;figure class="wp-block-video wp-block-embed is-type-video is-provider-videopress"&gt;&lt;div class="wp-block-embed__wrapper"&gt;
https://videopress.com/v/Nssb4tTA?resizeToParent=true&amp;amp;cover=true&amp;amp;preloadContent=metadata&amp;amp;useAverageColor=true
&lt;/div&gt;&lt;/figure&gt;
&lt;!-- /wp:video --&gt;

&lt;!-- wp:video {"guid":"loF6IqED","id":2209,"videoPressTracks":[],"videoPressClassNames":"wp-block-embed is-type-video is-provider-videopress","fileForImmediateUpload":{}} --&gt;
&lt;figure class="wp-block-video wp-block-embed is-type-video is-provider-videopress"&gt;&lt;div class="wp-block-embed__wrapper"&gt;
https://videopress.com/v/loF6IqED?resizeToParent=true&amp;amp;cover=true&amp;amp;preloadContent=metadata&amp;amp;useAverageColor=true
&lt;/div&gt;&lt;/figure&gt;
&lt;!-- /wp:video --&gt;

&lt;!-- wp:video {"guid":"NxpZKxoQ","id":2207,"videoPressTracks":[],"videoPressClassNames":"wp-block-embed is-type-video is-provider-videopress","fileForImmediateUpload":{}} --&gt;
&lt;figure class="wp-block-video wp-block-embed is-type-video is-provider-videopress"&gt;&lt;div class="wp-block-embed__wrapper"&gt;
https://videopress.com/v/NxpZKxoQ?resizeToParent=true&amp;amp;cover=true&amp;amp;preloadContent=metadata&amp;amp;useAverageColor=true
&lt;/div&gt;&lt;/figure&gt;
&lt;!-- /wp:video --&gt;

&lt;!-- wp:video {"guid":"e2Pzgoql","id":2201,"videoPressTracks":[],"videoPressClassNames":"wp-block-embed is-type-video is-provider-videopress","fileForImmediateUpload":{}} --&gt;
&lt;figure class="wp-block-video wp-block-embed is-type-video is-provider-videopress"&gt;&lt;div class="wp-block-embed__wrapper"&gt;
https://videopress.com/v/e2Pzgoql?resizeToParent=true&amp;amp;cover=true&amp;amp;preloadContent=metadata&amp;amp;useAverageColor=true
&lt;/div&gt;&lt;/figure&gt;
&lt;!-- /wp:video --&gt;

&lt;!-- wp:video {"guid":"kofyYHlR","id":2205,"videoPressTracks":[],"videoPressClassNames":"wp-block-embed is-type-video is-provider-videopress","fileForImmediateUpload":{}} --&gt;
&lt;figure class="wp-block-video wp-block-embed is-type-video is-provider-videopress"&gt;&lt;div class="wp-block-embed__wrapper"&gt;
https://videopress.com/v/kofyYHlR?resizeToParent=true&amp;amp;cover=true&amp;amp;preloadContent=metadata&amp;amp;useAverageColor=true
&lt;/div&gt;&lt;/figure&gt;
&lt;!-- /wp:video --&gt;</description>
      <pubDate>Thu, 25 Aug 2022 15:35:23 +0100</pubDate>
      <image>https://cdn.garry.net/wpi/08/image-7.png</image>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/holiday-gamedev-books</guid>
      <link>https://garry.net/posts/holiday-gamedev-books</link>
      <title>Holiday GameDev Books</title>
      <description>&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I did some reading on holiday. I read three game development related books as cased on &lt;a href="https://twitter.com/garrynewman/status/1553823155122278400"&gt;recommendations from twitter&lt;/a&gt;. Here's some of my favourite quotes.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;&lt;a href="https://www.amazon.com/dp/B091D8Q9GC"&gt;Ask Iwata&lt;/a&gt;&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Not gonna lie, I didn't know who Satoru Iwata was before getting this book. When you're in the game industry a lot of the time it feels like you're expected to know everything about it. I don't know who anyone is. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;The short version is that he was the CEO of Nintendo for over a decade until he died in 2015. He started off as a programmer in the 70's. As far as I can tell the book is a collection of blogs he made. It has a lot of insight, a lot of which extends into general life tips. Here's some of my highlights.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:quote --&gt;
&lt;blockquote class="wp-block-quote"&gt;&lt;!-- wp:paragraph --&gt;
&lt;p&gt;As human beings, unless we have someone to compliment our work and enjoy what we’ve created, we’re not apt to go out on a limb.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;&lt;/blockquote&gt;
&lt;!-- /wp:quote --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;He made this observation when talking about his early game experiments.. showing them to friends and getting a positive feedback loop. . which he credited to pushing him on to continue. I know I'm guilty of only giving negative feedback and looking for things that are wrong, so I think this is good to always keep in mind.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:quote --&gt;
&lt;blockquote class="wp-block-quote"&gt;&lt;!-- wp:paragraph --&gt;
&lt;p&gt;So how do you know when a project is going well? When someone points to a gray area in the initial plan, then asks you “Hey, can I take care of this?” and follows through. Projects where this keeps on happening tend to end up going well.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;&lt;/blockquote&gt;
&lt;!-- /wp:quote --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;100% This is something I saw happen with &lt;a href="https://garry.blog/garrys-mod-is-10-years-old/" data-type="post" data-id="1505"&gt;Garry's Mod&lt;/a&gt;, &lt;a href="https://garry.blog/the-story-of-rust/" data-type="post" data-id="1537"&gt;Rust &lt;/a&gt;and I see it happening with &lt;a href="https://sbox.facepunch.com/news"&gt;S&amp;amp;box&lt;/a&gt;. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:quote --&gt;
&lt;blockquote class="wp-block-quote"&gt;&lt;!-- wp:paragraph --&gt;
&lt;p&gt;“Programmers should never say no.” When you’re making games, if a programmer says, “That’s impossible,” it not only puts the brakes on a valuable idea but makes it harder for the next idea to come. If programmers only focus on things that are easy to program, they’ll never break the mold and come up with fascinating ideas.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;&lt;/blockquote&gt;
&lt;!-- /wp:quote --&gt;

&lt;!-- wp:quote --&gt;
&lt;blockquote class="wp-block-quote"&gt;&lt;!-- wp:paragraph --&gt;
&lt;p&gt;“What would it take to make it possible?” And from there he establishes the necessary conditions. This is about “cornering the opponent and jabbing at the weak points they can’t block.”&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;&lt;/blockquote&gt;
&lt;!-- /wp:quote --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;This is a really good point. Saying shit is impossible or won't work is something I've been guilty of myself. It usually happens when I don't want to try making someone else's idea. I heard Valve have a thing where if you have an idea you have to implement it yourself, not sure how that works out for them. It's worrying if the only ideas that can be implemented are the ones by people who can implement them.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;A good strategy here I've found is to come at it from another angle. If I tell Layla that I don't think it's possible to do something, he'll usually have implemented it by the time I wake up the next day.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:quote --&gt;
&lt;blockquote class="wp-block-quote"&gt;&lt;!-- wp:paragraph --&gt;
&lt;p&gt;One way of defining a genius is “a person who can endlessly continue doing things that other people might dislike or easily grow tired of and be unable to continue.”&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;&lt;/blockquote&gt;
&lt;!-- /wp:quote --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Something I always run into when talking to bank managers, solicitors, investment people etc (real people) is that they always assume that I'm really smart. I think everyone that has seen my twitter knows that isn't that true. I'm really dumb in a lot of ways.. I'm just good at sitting at a computer all day and googling stuff I don't know.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;&lt;a href="https://www.amazon.com/dp/B000FBFNL0"&gt;Masters of Doom&lt;/a&gt;&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Really loved this book. Would totally recommend it. I never comprehended how much we all owe Carmack and Romero before. All the innovations that came out of those early years.. First person shooters, view models, multiplayer deathmatch, multiplayer coop, opengl, graphics cards.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:quote --&gt;
&lt;blockquote class="wp-block-quote"&gt;&lt;!-- wp:paragraph --&gt;
&lt;p&gt;After much arguing in the company, Jay was granted permission to post legal terms for prospective Doom hackers. “Id Software requires no fees or royalties,” he posted online. “You may require user payment for your work; Your utility must not work with the shareware version of Doom; You must represent that your utility is not an id Software product and id Software cannot and will not provide support for your product, nor for Doom after the data has been changed by your product; You may be required to include some legal text in your utility to make our lawyers happy; There may be more or some of the above may not be in the final document.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;&lt;/blockquote&gt;
&lt;!-- /wp:quote --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;It really cannot be understated how much this decision positively changed hundreds of people's lives, over multiple generations. Carmack was militant about letting people hack (mod) the game, and totally opposed to patenting the stuff he came up with. From a business position it made totally no sense to give out a level editor and let people create (AND SELL) their mods. The business move would have been to keep that all locked down and pump out new level packs every month.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:quote --&gt;
&lt;blockquote class="wp-block-quote"&gt;&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Carmack knew well and good what he enjoyed—programming—and was systematically arranging his life to spend the most time possible doing just that.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;&lt;/blockquote&gt;
&lt;!-- /wp:quote --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Hell yeah&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:quote --&gt;
&lt;blockquote class="wp-block-quote"&gt;&lt;!-- wp:paragraph --&gt;
&lt;p&gt;“You have to give yourself the freedom to back away from something when you make a mistake,” Carmack said. “If you pretend you’re infallible and bully ahead on something, even when there are many danger signs that it’s not the right thing, well, that’s a sure way to leave a crater in the ground. You want to always be reevaluating things and say, Okay, it sounded like a good idea but it doesn’t seem to be working out very well and we have this other avenue which is looking like it’s working out better—let’s just do that.”&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;&lt;/blockquote&gt;
&lt;!-- /wp:quote --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Good life advice&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:quote --&gt;
&lt;blockquote class="wp-block-quote"&gt;&lt;!-- wp:paragraph --&gt;
&lt;p&gt;When the first demo of Half-Life came through the doors, many insisted it would do nothing less than fail.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;&lt;/blockquote&gt;
&lt;!-- /wp:quote --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;??&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:quote --&gt;
&lt;blockquote class="wp-block-quote"&gt;&lt;!-- wp:paragraph --&gt;
&lt;p&gt;One of the main sources of distrust among the employees was id’s competitive bonus structure. Every quarter or so the owners would meet to assign a dollar amount to each employee. They would then split up a bonus payment based on those decisions. One quarter someone might get $100,000; the next, $20,000. The owners admitted that it was an arbitrary and imperfect plan, but it was the only one they could surmise.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;&lt;/blockquote&gt;
&lt;!-- /wp:quote --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;This hit home. This is our exact bonus system for Rust. We have been talking about finding a more fair, more transparent way to give bonuses for years.. but have never really found anything better. What do other places do?&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:quote --&gt;
&lt;blockquote class="wp-block-quote"&gt;&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Despite their working in what felt like perpetual crunch mode—twelve-hour days, six days a week—Daikatana was nowhere near being done. Many felt the project was out of control. One guy produced a series of levels that proved unusable. An artist created a graphical icon for an arrow in the game that was a thousand times the appropriate size.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;&lt;/blockquote&gt;
&lt;!-- /wp:quote --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Love that 1000x sized cursor line. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;&lt;a href="https://www.amazon.com/dp/B005WUE6Q2"&gt;The Making of Prince of Persia&lt;/a&gt;&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;This wasn't what I was expecting.. I was pleasantly surprised to find out it was kind of a diary.. so it was really easy to read. The guy had made a popular game but wanted to be a screen writer.. but then started making Prince Of Persia. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:quote --&gt;
&lt;blockquote class="wp-block-quote"&gt;&lt;!-- wp:paragraph --&gt;
&lt;p&gt;The new crop of kids coming up are willing to work harder and cheaper, and don’t have girlfriends or families yet to cut into their working hours.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;&lt;/blockquote&gt;
&lt;!-- /wp:quote --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I have found myself thinking this.. and it's kind of a funny thing to think when you take in the big picture. You are kind of wishing your life didn't exist so you could spend more time working.  Maybe it's a competitive thing, maybe it's human nature.. but it does make you question what life is meant to be.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:quote --&gt;
&lt;blockquote class="wp-block-quote"&gt;&lt;!-- wp:paragraph --&gt;
&lt;p&gt;The PC version is maybe 50% of what it should be. I can’t even tell these guys what to fix… it’s a million little things, and they’re just not up to the hassle. That kind of attention to detail is why the Apple version took me two years. This version is probably the best I’ll ever get out of them. Oddly enough, this makes me more psyched to do the new game. It reminded me why I’m good at this – of what I can do that others can’t, or won’t.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;&lt;/blockquote&gt;
&lt;!-- /wp:quote --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Oof. That feeling when someone makes a shitty port.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:quote --&gt;
&lt;blockquote class="wp-block-quote"&gt;&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Like in the old days. I’m starting to see code patterns floating in my brain as I drift off to sleep at night… and, disturbingly, when I wake up in the morning.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;&lt;/blockquote&gt;
&lt;!-- /wp:quote --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;When he's trying to work code out, I've totally been in this state. Totally consumed by some problem. Like eating a huge meal and feeling your stomach expand - except it's your head.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:quote --&gt;
&lt;blockquote class="wp-block-quote"&gt;&lt;!-- wp:paragraph --&gt;
&lt;p&gt;&lt;strong&gt;May 11, 1989 &lt;/strong&gt;&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Everyone is being nice to me because they think my game is going to be a hit.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;&lt;/blockquote&gt;
&lt;!-- /wp:quote --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;??&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;</description>
      <pubDate>Sun, 21 Aug 2022 10:31:25 +0100</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/office-design</guid>
      <link>https://garry.net/posts/office-design</link>
      <title>Office Design</title>
      <description>&lt;!-- wp:paragraph --&gt;
&lt;p&gt;We're plan to move our office soon. We're going to be moving from Bloxwich to Birmingham.  Right now it's just a big empty shell.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;So we're getting a firm to design and turn it into a real office. I haven't been to many game studio offices. In fact, I think I've only been to one.. and that's Valve's office. Their office design is nice and clean, nice contrast, industrial but warm. So I didn't really have much input on office designs other than copy Valve.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;But then I remembered, I had seen an office design that I really loved. It was a few years back, but Mojang had their office fitted out and had a photo shoot. I really liked it. It was like an ikea crossed with a movie set.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":2041,"sizeSlug":"full","linkDestination":"media"} --&gt;
&lt;figure class="wp-block-image size-full"&gt;&lt;a href=https://cdn.garry.net/wpi/08/m1.jpeg&gt;&lt;img src=https://cdn.garry.net/wpi/08/m1.jpeg alt="" class="wp-image-2041"/&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:image {"id":2044,"sizeSlug":"full","linkDestination":"media"} --&gt;
&lt;figure class="wp-block-image size-full"&gt;&lt;a href=https://cdn.garry.net/wpi/08/m6.jpeg&gt;&lt;img src=https://cdn.garry.net/wpi/08/m6.jpeg alt="" class="wp-image-2044"/&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;But it's not about it looking great, it has to be practical too. People have to actually be able to sit there and work. They have to have desks and computers. We can't just focus on the carpets and leather sofas.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;It's something I hadn't thought about at the time. Had they thought of that? Have they got appropriate desks, with power and ethernet, and somewhere to store the PC?&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":2054,"sizeSlug":"full","linkDestination":"media","className":"is-style-default"} --&gt;
&lt;figure class="wp-block-image size-full is-style-default"&gt;&lt;a href=https://cdn.garry.net/wpi/08/image-2.png&gt;&lt;img src=https://cdn.garry.net/wpi/08/image-2-edited.png alt="" class="wp-image-2054"/&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Yep. They had thought of all that too, and looks like it functions really well.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"align":"center","id":2049,"sizeSlug":"full","linkDestination":"none"} --&gt;
&lt;figure class="wp-block-image aligncenter size-full"&gt;&lt;img src=https://cdn.garry.net/wpi/08/image-3.png alt="" class="wp-image-2049"/&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;We're hoping to have the new office done by the end of the year. It'll be sad to say goodbye to Bloxwich, but at the same time, not that sad.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;</description>
      <pubDate>Mon, 01 Aug 2022 14:39:34 +0100</pubDate>
      <image>https://cdn.garry.net/wpi/08/m1.jpeg</image>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/access-control-in-serverside-blazor</guid>
      <link>https://garry.net/posts/access-control-in-serverside-blazor</link>
      <title>Access control in serverside Blazor</title>
      <description>&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I like Blazor, and I like Razor and ASP stuff. I've been coding stuff in it for a while but I refuse to learn about their built in authorization APIs. I come from the world of PHP where cookie/session management was always really handled manually, so I always feel more comfortable handling all this myself.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;So here's how I do my own access control without using their whole &lt;code&gt;AuthorizeRouteView &lt;/code&gt;stuff, here's an example &lt;code&gt;App.razor&lt;/code&gt;.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:enlighter/codeblock {"language":"csharp","linenumbers":"false"} --&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;@using System.Reflection;

&amp;lt;Router AppAssembly="@typeof(Program).Assembly"&gt;
    &amp;lt;Found Context="routeData"&gt;

        @{
            //
            // If the page has an [AdminOnly], only let them see it if they're an admin
            //
            if (routeData.PageType.GetCustomAttributes&amp;lt;AdminOnlyAttribute&gt;().Any() &amp;amp;&amp;amp; !SessionInfo.IsAdmin )
            {
                &amp;lt;LayoutView Layout="@typeof(MainLayout)"&gt;
                    &amp;lt;h1&gt;404 - not found&amp;lt;/h1&gt;
                    &amp;lt;p&gt;Sorry, there's nothing at this address&amp;lt;/p&gt;
                &amp;lt;/LayoutView&gt;
                return;
            }

            if ( SessionInfo.IsBanned )
            {
                 &amp;lt;LayoutView Layout="@typeof(MainLayout)"&gt;
                    &amp;lt;h1&gt;Ya Banned&amp;lt;/h1&gt;
                    &amp;lt;p&gt;Sorry, you're banned from this site. You must have done something really bad. Or was it your cousin?&amp;lt;/p&gt;
                &amp;lt;/LayoutView&gt;
                return;
            }
        }

        &amp;lt;RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" /&gt;
  
    &amp;lt;/Found&gt;
    &amp;lt;NotFound&gt;
        &amp;lt;LayoutView Layout="@typeof(MainLayout)"&gt;
            &amp;lt;h1&gt;404 - not found&amp;lt;/h1&gt;
            &amp;lt;p&gt;Sorry, there's nothing at this address.&amp;lt;/p&gt;
        &amp;lt;/LayoutView&gt;
    &amp;lt;/NotFound&gt;
&amp;lt;/Router&gt;&lt;/pre&gt;
&lt;!-- /wp:enlighter/codeblock --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;So in the above example &lt;code&gt;SessionInfo &lt;/code&gt;is my custom service for managing user session. What you can see is that routeData contains a PageType. That's the Type of the component it's going to load.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;So you can use that type to check for this. Like in this instance we're checking to see if it has an [AdminOnly] attribute. If it has and the current session isn't an admin, then it throws up a fuck off screen.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;FYI AdminOnly is a custom attribute I added, but you can see that you can put any kind of logic here. Like below I see if the user is banned, and if they are then I show another fuck off screen.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;</description>
      <pubDate>Sun, 24 Jul 2022 17:20:32 +0100</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/the-man-who-fell-to-earth</guid>
      <link>https://garry.net/posts/the-man-who-fell-to-earth</link>
      <title>the man who fell to earth</title>
      <description>&lt;!-- wp:list {"ordered":true} --&gt;
&lt;ol&gt;&lt;li&gt;Why did he need a share in the company to access the patent, aren't they all open and freely available?&lt;/li&gt;&lt;li&gt;How can you be granted a patent that isn't explained in any way?&lt;/li&gt;&lt;li&gt;Was he really controlling atoms with a Casio keyboard wtf&lt;/li&gt;&lt;li&gt;If the first alien has this second powerful company, with people running around doing his bidding, why didn't he offer the scientist woman a job and do it all himself?&lt;/li&gt;&lt;li&gt;Why is he communicating via tornados instead of getting one of his people to talk to him?&lt;/li&gt;&lt;li&gt;If the main alien was so important why land him in the middle of nowhere with no instructions and no help.&lt;/li&gt;&lt;li&gt;If this oil company is all powerful and controls the CIA why is he in the forest with no eyes while some patsy runs his company.&lt;/li&gt;&lt;/ol&gt;
&lt;!-- /wp:list --&gt;</description>
      <pubDate>Thu, 21 Jul 2022 19:05:48 +0100</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/unity-2022</guid>
      <link>https://garry.net/posts/unity-2022</link>
      <title>Unity 2022</title>
      <description>&lt;!-- wp:paragraph --&gt;
&lt;p&gt;You know, I rag on Unity a lot. They've made a lot of mistakes. Deprecating features while the replacement isn't ready. Creating multiple new implementations of features from scratch instead of improving what's there. Abandoning their own features in favour of acquiring community made versions, and then abandoning them. Splitting the whole render system into two incompatible, contrary versions, deprecating the previous render system. Not implementing multiplayer because there's no way to monetise it. Splitting the UI system into two/three and trying to use them all at the same time. Hiring popular twitter users as customer advocates who couldn't find their sofa in their living room.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;But you know, it might seem like I do this because I hate Unity and want it to die. It's really the opposite. I loved my time using Unity and I hated to see it take two steps forward and then three back every time.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;And honestly, these mistakes, I've probably made the exact same mistakes multiple times. I've been putting off posting another Unity blog here for a while. I don't want to be the constant bitter Unity cunt, scoring easy dunks, but I got some backlog here.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Unity Answers&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Recently Unity posted on their forum that they were shutting down Unity Answers and redirecting it to the Unity Forums. They were giving the community two weeks notice that this was going to happen.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Now anyone that has ever used Unity for anything has probably used Unity Answers. Either directly or indirectly. So anyone that has used Unity is acutely aware of its value. You got a question, you type it into google, the answer is probably going to be on Unity Answers. The number one benefit of using Unity is that shared journey of hundreds of thousands of developers has left trails all over the landscape to help you find your way.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;So it's puzzling that the Unity team would suggest that this would be removed. Not archived, not put in read only mode with a warning about information being out of date.. but actually erased. All the links from over the years just redirecting to the Unity Forums.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;The Transition Plan&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;In the announcement they explained their plan.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Answers would go into &lt;strong&gt;read only mode on the 13th&lt;/strong&gt; and go into &lt;strong&gt;redirect mode on the 23rd&lt;/strong&gt;.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;They couldn't commit to any migration. This means that everything was going to go in the bin.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;They accepted that the forums didn't have accepted answer functionality, but offered them up as an alternative. I think &lt;strong&gt;forums generally work well for this kind of stuff&lt;/strong&gt;, if you can avoid the threads getting too long. You need to encourage a question and an answer per thread - rather than "ask dumb questions megathread".&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;They encouraged asking questions in the Official Discord. &lt;strong&gt;Discord is the fucking devil&lt;/strong&gt; for this stuff. Instead of organically creating a database of questions and answers that can be searched to avoid repetition, where one question can help thousands of people, lets do it in a chat room full of memes where one question helps one person.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;They were going to "make some adjustments" to the forums to help with the transition and "share the plans in the following weeks to open them up to feedback". It seems like it'd have been a good idea to &lt;strong&gt;do all this before shutting it down&lt;/strong&gt;.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;They're &lt;strong&gt;deprecating without a replacement&lt;/strong&gt;. Again. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Something worth keeping in mind through all of this is that long term the Unity Forums aren't going to be around. They're &lt;strong&gt;kind of old&lt;/strong&gt;, they're &lt;strong&gt;kind of unsexy&lt;/strong&gt;, at some point someone is going to look at them and jump to whatever the next popular thing is.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Decision Making&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;You know, being the owner of a company I try to think about how decisions get made. You want to give people autonomy but you &lt;strong&gt;probably want to sign off on important stuff&lt;/strong&gt;.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;So I look at the Unity Answers thing and I think.. who made that decision, who was consulted, who signed off on it.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;This is an important question because throughout that decision &lt;strong&gt;none of the people in the room appreciated the value of Unity Answers&lt;/strong&gt;. Which to me means that &lt;strong&gt;no-one in the room knew how people use their product&lt;/strong&gt;. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;So the conclusion I have to draw is that there are people at Unity who have the authority to make these decisions who are &lt;strong&gt;oblivious about their product&lt;/strong&gt;, who uses it, how it's used. They have never used it.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;IPO&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;The IPO was &lt;strong&gt;the worst thing that happened to Unity, the game engine&lt;/strong&gt;.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Unity's business isn't about creating a better experience for game developers. It isn't about making the engine better, faster, stronger. There's a lot of talented people at Unity that are doing that - I'm sure that's still happening. But that's &lt;strong&gt;not their main focus&lt;/strong&gt; anymore.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Their main focus is about growth. &lt;strong&gt;More employees. More subsidiaries&lt;/strong&gt;. There's a magic number now, floating about on the stock market, that they need to try to make go up.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;It's pretty common in this situation that you'd IPO and get a new CEO in place, and give them 5 years to raise the stock price. If they get it to a certain value they'd get a 8 figure bonus and resign. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;At which point they'd put another CEO in place and give them 5 years to raise the stock price with the same deal. Then again. Over and over.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;This is a treadmill of distractions. Clutching at straws. Desperate acquisitions to try to get that number to move. Mass firings when it doesn't. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;This serves stockholders just fine (when it works). It &lt;strong&gt;doesn't serve customers so much&lt;/strong&gt;.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;</description>
      <pubDate>Thu, 30 Jun 2022 10:24:52 +0100</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/3d-printer</guid>
      <link>https://garry.net/posts/3d-printer</link>
      <title>3D Printer</title>
      <description>&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I got a 3D printer. I never saw the point before.. because from what I've seen people mainly use them to print little figurines and whistles off.. and while that's cool.. I always think you might as well just buy them from Amazon.. it's cheaper and easier.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":1966,"sizeSlug":"large","linkDestination":"none"} --&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;img src=https://cdn.garry.net/wpi/06/image-1-1024x576.png alt="" class="wp-image-1966"/&gt;&lt;figcaption&gt;I printed a whistle&lt;/figcaption&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I always liked making stuff. Manufacturing is something I'm always amazed by. The design work and the processes to create things. I've always liked that stuff, but I've never really got anywhere close to it.. apart from a few days work in a bike factory.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":1968,"sizeSlug":"large","linkDestination":"none"} --&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;img src=https://cdn.garry.net/wpi/06/image-2-1024x576.png alt="" class="wp-image-1968"/&gt;&lt;figcaption&gt;A GMan model from Alyx&lt;/figcaption&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;So I printed a few items from the built in sd card, and I figured out how to print obj models off.. then I started learning how to use Fusion 360.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I've never been that great at 3d modelling. It's the art side of thing that hurts me. I can do Hammer or sketchup because the grid and measuring. Proper 3d modelling always seemed a bit like everything was eyeballed to me and I can't live with that.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I really love how Fusion 360 works. The sketches with measurements, turning all the lines black so it's fully constrained.. then extracting and whatever, being able to step back to any of the steps and modify (correct) what you did. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I've really enjoyed learning it.. but the hardest thing is having a reason to use it. But I found one this week. I had a unifi camera mounted to my porch ceiling, but it couldn't look straight forward 90 degrees.. because it bumped itself off the ceiling.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":1975,"sizeSlug":"large","linkDestination":"none"} --&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;img src=https://cdn.garry.net/wpi/06/image-3-1024x576.png alt="" class="wp-image-1975"/&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;So I made this in Fusion and printed it..&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":1976,"sizeSlug":"large","linkDestination":"media"} --&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;a href=https://cdn.garry.net/wpi/06/image-4.png&gt;&lt;img src=https://cdn.garry.net/wpi/06/image-4-1024x576.png alt="" class="wp-image-1976"/&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:image {"id":1978,"sizeSlug":"large","linkDestination":"media"} --&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;a href=https://cdn.garry.net/wpi/06/image-5.png&gt;&lt;img src=https://cdn.garry.net/wpi/06/image-5-1024x448.png alt="" class="wp-image-1978"/&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Problem solved. Kind of. Where the camera attaches is off center by about 2mm because I fucked the screw hole positions up. And I could have hid the screws, or at the very least counter-sank them.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I could have done a lot better. I was really rushing because I'd already taken the camera down and wanted something done by the end of the day. But it totally works. The nice thing about this process is that it's really painless to jump in fusion and fix all those problems and print another one.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I've had the printer a couple of months now and this is the first useful thing I've done. So I'll let you know if I find anything else.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;</description>
      <pubDate>Wed, 22 Jun 2022 16:50:56 +0100</pubDate>
      <image>https://cdn.garry.net/wpi/06/image-1-1024x576.png</image>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/rip-foszor</guid>
      <link>https://garry.net/posts/rip-foszor</link>
      <title>Rip Foszor</title>
      <description>&lt;!-- wp:paragraph --&gt;
&lt;p&gt;You might remember Foszor from the GMod community a while back. Like, 13 years back or something. His game Zinger came second in the fretta game contest we did in about 2010.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":1948,"sizeSlug":"large","linkDestination":"none"} --&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;img src=https://cdn.garry.net/wpi/06/image-1024x640.png alt="" class="wp-image-1948"/&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I was really sad to hear that he'd passed away a couple of months ago. I was even sadder to read that &lt;a href="https://steamcommunity.com/linkfilter/?url=https://www.gofundme.com/f/cvwpu-foszor-fights-brain-cancer"&gt;he leaves behind his wife and two young kids&lt;/a&gt;.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Back during my main development period of Garry's Mod I'd speak to Foszor almost every day about what functions do what, what's missing, what's broken, what's confusing. When you're doing a project like this there's a lot of noise, a lot of confused voices asking for things. Foszor was one of the voices that I'd always pay attention to. I knew that if he wanted something it was actually needed - he knew what he was doing.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I hadn't spoken to him for years so I was happy to find that he had made himself a career in the game industry. His gamemodes were always incredibly polished, I regret that I didn't work harder to keep in touch and work together more. I feel like there are people who can either make things look good, or are good coders, and it's rare to find someone that can do both things.. but he was one of them.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;F ??&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;</description>
      <pubDate>Tue, 07 Jun 2022 20:14:12 +0100</pubDate>
      <image>https://cdn.garry.net/wpi/06/image-1024x640.png</image>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/my-tesla-is-fixed</guid>
      <link>https://garry.net/posts/my-tesla-is-fixed</link>
      <title>My Tesla Is Fixed</title>
      <description>&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Quick follow up to &lt;a href="https://garry.blog/my-tesla-broke/"&gt;My Tesla Broke&lt;/a&gt;. It's now fixed and back at home, so about a month and a half in the end. They changed the HV and the 12v battery.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Spotify&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;A funny thing is that I knew they had started fixing it. My spotify kept stopping, and when I looked into it, it showed that it was playing in my car. This was the first time it'd done that since I sent it in. After that, in the app I could see that the doors were opening and closing.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Pickup&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;The best thing about this whole thing was getting to see how different the service stuff is with Tesla. When you drop it off you don't need to give them a key. You just park it and walk away. When picking it up you don't need a key - you just get in it and drive away. You can do this any time of the day. I picked mine up at 6am before they opened. Didn't have to talk to a single other human.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;That said, when I had a Range Rover they'd pick it up and drop it off, so it's not on that level yet.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;</description>
      <pubDate>Fri, 13 May 2022 07:58:14 +0100</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/my-tesla-broke</guid>
      <link>https://garry.net/posts/my-tesla-broke</link>
      <title>My Tesla Broke</title>
      <description>&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I've had my Model 3 for less than 6 months, and I've put about 500 miles on it. When I came off holiday I got in it at the airport and it had a buttload of errors..&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":1897,"sizeSlug":"large","linkDestination":"none"} --&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;img src=https://cdn.garry.net/wpi/image-21-1024x493.png alt="" class="wp-image-1897"/&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I googled the errors and the common theme seemed to be the whole battery pack replaced.. not something you can reboot the car and fix. So I put it in for service.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;They didn't have any courtesy cars so they arranged for a taxi for me back home. An hour later the driver phoned me to tell me he was on the way to take me back to Tesla. So I got there and they said it's going to be longer than a couple of days so they gave me a courtesy car.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;They've had it for just over a month now.. I am apparently in the queue for a battery and it'll be mid next month. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I'm chill as fuck, and I love Teslas, and I get that this kind of stuff could happen to any car.. but 2 months?&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;</description>
      <pubDate>Mon, 25 Apr 2022 11:14:03 +0100</pubDate>
      <image>https://cdn.garry.net/wpi/image-21-1024x493.png</image>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/what-sucks-about-steam</guid>
      <link>https://garry.net/posts/what-sucks-about-steam</link>
      <title>What sucks about Steam</title>
      <description>&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Having used Steam nearly every day for 19 years, both as a developer and a gamer, there are a few things that annoy me. These things have become more apparent since I've had kids and other game launchers have come out.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Friend Requests&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I'm sure normal people don't have this problem, but people add me to their friends list all the time. So for the last 5 years or so I've regularly gone in and pressed ignore all.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":1857,"sizeSlug":"full","linkDestination":"none"} --&gt;
&lt;figure class="wp-block-image size-full"&gt;&lt;img src=https://cdn.garry.net/wpi/image-6.png alt="" class="wp-image-1857"/&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Is there an option somewhere where you can stop friend requests all together, or make it so people can only add you if they have a friend in common?&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Maybe people should be able to follow a profile instead?&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Slow&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Click the Library tab, and then click the Store tab. Does anyone else get 2 seconds of black when switching between them? What's the deal? Can't this stuff be cached? Can we wait until it's loaded before switching?&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Settings&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;These open exactly the same window.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":1862,"sizeSlug":"full","linkDestination":"none"} --&gt;
&lt;figure class="wp-block-image size-full"&gt;&lt;img src=https://cdn.garry.net/wpi/image-9.png alt="" class="wp-image-1862"/&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Steam suffers from the nerd thing making everything an option. I'm not totally against customizability, but you need to balance that with usage. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;So for example, what percentage of people are going to want to turn shader caching off? Is it going to cause problems for a high percentage of people, so turn it off by default. Is it beneficial to the majority of people? So turn it on by default. Have chrome://flags type deal for all the nerdy stuff - don't expose it to everyone.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"align":"center","id":1881,"sizeSlug":"full","linkDestination":"none"} --&gt;
&lt;figure class="wp-block-image aligncenter size-full"&gt;&lt;img src=https://cdn.garry.net/wpi/image-18.png alt="" class="wp-image-1881"/&gt;&lt;figcaption&gt;It's 2020&lt;/figcaption&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;By hiding the stuff that 99% of people aren't going to want to see you're making the stuff that those people are going to want to see more visible. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"align":"center","id":1882,"width":319,"height":609,"sizeSlug":"full","linkDestination":"none"} --&gt;
&lt;figure class="wp-block-image aligncenter size-full is-resized"&gt;&lt;img src=https://cdn.garry.net/wpi/image-19.png alt="" class="wp-image-1882" width="319" height="609"/&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Lets put all the settings in one place too. Lets get rid of this desktop window and put it in the browser window. Lets try to get Settings, Privacy, Account, Store Preferences, Profile editable in one place, with one stylesheet.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Controller Config&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Why does the controller config run like a game, with its own UI system and everything.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Steam Input is confusing as fuck from a developer point of view. The idea behind it is great.. from a game code point of view it's definitely the way to do things. But getting up and running really breaks it.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;You're uploading files with your game depot and publishing changes on the steamworks site, trying to make everything work. Sometimes it works running the steam build, sometimes it works running the local build but not the steam build, sometimes it works but it's using the wrong config. There's way too many factors affecting it.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Steam VR&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Having this little desktop window pop up every time you play a VR game feels like it's still a developer preview.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;VAC&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Valve Anti Cheat really should be re-branded. For Valve's games it's an anti-cheat. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;For everyone else they're just game bans, created by EAC or another anti cheat system.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Big Picture&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Dog shit waste of time, get rid of it.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Server List&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Who is using this, for anything? Why does it need to be a part of Steam? Get rid.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":1870,"sizeSlug":"large","linkDestination":"media"} --&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;a href=https://cdn.garry.net/wpi/image-13.png&gt;&lt;img src=https://cdn.garry.net/wpi/image-13-1024x560.png alt="" class="wp-image-1870"/&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Steam Overlay&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;The Steam Overlay is a terrible experience. You open it (usually by accident), the friends list is there, in a tiny wrong size window, so you resize it, the UI jitters about at 20fps. Everything you click opens a browser window. Sometimes you click things in game and they need the overlay, but you disabled it because it sucks.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Have you tried the Window Game Overlay? Here's some stuff that is awesome about it:&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:list {"ordered":true} --&gt;
&lt;ol&gt;&lt;li&gt;Widgets + Widget Store&lt;/li&gt;&lt;li&gt;Performance Widgets&lt;/li&gt;&lt;li&gt;Can pin widgets so they're overlayed, even when overlay is closed&lt;/li&gt;&lt;li&gt;Video recording&lt;/li&gt;&lt;li&gt;Opens and closes instantly on Winkey + G&lt;/li&gt;&lt;li&gt;Pretty much impossible to open on accident&lt;/li&gt;&lt;li&gt;Works on desktop&lt;/li&gt;&lt;/ol&gt;
&lt;!-- /wp:list --&gt;

&lt;!-- wp:image {"id":1886,"sizeSlug":"full","linkDestination":"media","ampLightbox":true} --&gt;
&lt;figure class="wp-block-image size-full"&gt;&lt;a href=https://cdn.garry.net/wpi/image-20.png&gt;&lt;img src=https://cdn.garry.net/wpi/image-20.png alt="" class="wp-image-1886"/&gt;&lt;/a&gt;&lt;figcaption&gt;Windows Game Bar&lt;/figcaption&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Music Player&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Get rid&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Steam App&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;The steam app is shit. Why does Steam Guard want us to use this app instead of doing it like ever other 2FA?&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Web Browser&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;No-one wants to use the web using Steam Overlay with no sign ins and no password manager. Who is this for? Get rid.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Screenshots&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Any screenshots I take should be automatically uploaded to the cloud. I should be able to choose whether they're visible by no-one, friends or everyone by default.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Should we be able to record and upload videos by now? I know you can already do this via Windows Game Bar and Geforce Account Required, but it'd be nice to have this built in. Maybe to be able to clip the last 30 seconds or something.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Update&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:image {"align":"center","id":1866,"sizeSlug":"full","linkDestination":"none"} --&gt;
&lt;figure class="wp-block-image aligncenter size-full"&gt;&lt;img src=https://cdn.garry.net/wpi/image-11.png alt="" class="wp-image-1866"/&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I hate this button. It seems simple enough, but it's a change that was made in the UI refresh. Previously it used to be "Update and Play" or something. You'd click on it and it'd download the game and then start it. Now you have to press it, wait for it to download, and then press play.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Broadcasts&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Why do broadcasts exist? So you can let your friends watch you, right?&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Why isn't it more obvious how to use it? I'm sure there's a button somewhere that starts you streaming. I mean, there's a Broadcast settings option, but if you enable it you get this..&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"align":"center","id":1871,"sizeSlug":"full","linkDestination":"none"} --&gt;
&lt;figure class="wp-block-image aligncenter size-full"&gt;&lt;img src=https://cdn.garry.net/wpi/image-14.png alt="" class="wp-image-1871"/&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Closing and opening the settings fixes the control layout, but then what, any game you're playing is broadcast? After enabling it I get this in the corner of my game..&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"align":"center","id":1873,"sizeSlug":"full","linkDestination":"none"} --&gt;
&lt;figure class="wp-block-image aligncenter size-full"&gt;&lt;img src=https://cdn.garry.net/wpi/image-15.png alt="" class="wp-image-1873"/&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;It says LIVE, but the circle is grey, does that mean it is live or isn't? Should it be red? Steam Overlay has nothing about broadcasting, no broadcast status, no on/off controls.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;&lt;strong&gt;Edit&lt;/strong&gt;: I was genuinely curious so I googled it. You have to click on Settings here in the overlay (again we have "Web Browser" and "Music" there but not Broadcasting):&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"align":"center","id":1875,"sizeSlug":"full","linkDestination":"none"} --&gt;
&lt;figure class="wp-block-image aligncenter size-full"&gt;&lt;img src=https://cdn.garry.net/wpi/image-16.png alt="" class="wp-image-1875"/&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Then click the URL to view your own broadcast, then the grey ball turns red. I'm guessing the idea here is that it's not actually broadcasting anything is no-one is watching - hence the grey. When someone watches it turns red.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I am guessing you're meant to click the Broadcasting link here&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"align":"center","id":1877,"sizeSlug":"full","linkDestination":"none"} --&gt;
&lt;figure class="wp-block-image aligncenter size-full"&gt;&lt;img src=https://cdn.garry.net/wpi/image-17.png alt="" class="wp-image-1877"/&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;and open the broadcast page in the steam overlay, then right click the page and go to copy url, then alt tab and send that link to people for them to view your broadcast.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;So not exactly the "start broadcasting", "stop broadcasting", "pause stream" buttons I was looking for.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Force Update&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;When you put an update out for your game it can take a few minutes for the client to sense there's an update and show the "Update" button.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;To get around this when developing I go to right click &gt; Properties, Local Files and Verify Integrity. This seems like it queries Steam's servers for the latest manifest or something, and then you get the update (you can cancel the verification).&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;It's be nice to get a chrome://flags option to enable a "check for updates" menu option, even though this probably only bugs me.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Age Gates&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;My account is 19 years old.. surely I don't need to keep telling you what year I was born?&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;In Summary&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Something you appreciate when making stuff that lasts a long time is that every feature you add creates a burden. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Steam has 20 years of adding to that burden. The agility and maneuverability is gone. New features can be piled on top, certain aspects can be redesigned.. but there's no real prospect of totally overhauling it into something consistent, modern and clean.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Of course Valve is a big company and have a ton of money.. but the worry is that without any bosses or top down strategy/design, who would be motivated and stupid enough to take on the task.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;</description>
      <pubDate>Sat, 23 Apr 2022 11:43:07 +0100</pubDate>
      <image>https://cdn.garry.net/wpi/image-6.png</image>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/making-a-game-2022</guid>
      <link>https://garry.net/posts/making-a-game-2022</link>
      <title>Making A Game 2022</title>
      <description>&lt;!-- wp:paragraph --&gt;
&lt;p&gt;&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Game Idea&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Every game starts with an idea. The best game idea is the one that's popular right now. Get a list of games up, order by the number of concurrent players and make a game like that first one.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Yes, that game was made by 500 people, over the course of 6 years, but they already did that work. They worked out what works and doesn't work. You don't need to do that work again so it's a million times easier for you.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Of course you're not making a clone of that game. That game is fucking shit. Look at the state of the font rendering, it's unplayable. Your game will have much better font rendering - and then everyone will flock to your game instead of that one.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Twitter&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;One of the most important steps is getting your twitter account. This should be one of your first steps for your game idea. What if someone has the same idea as you and they're registering an account right now. What if people are looking to follow a twitter account about the development of a game like the one you're thinking of, and they don't have an account to follow? &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph {"backgroundColor":"bright-blue","textColor":"white"} --&gt;
&lt;p class="has-white-color has-bright-blue-background-color has-text-color has-background"&gt;By default your twitter account will be assumed to be maintained by an actual ww2 nazi. Be sure to decorate it with the most up to date emotes and hashtags to negate that assumption. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;A big part of modern gaming is to reinterpret their content as bigoted and see if you can take down the whole game company using it. Up to date hashtags and emotes will shield you and your games from this very real threat.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Discord&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Websites are out, Discord is in. It's shocking to hear but most gamers don't even have a web browser installed - they live their lives in apps and launchers. So set up a discord and invite everyone you know to join.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;There's a scambot problem with Discord, so you'll want to protect your community from that by making it as hard as possible to join. Have them authenticate their Steam account and fill out an external captcha as a minimum. This is also a good place to throw a survey at them. Bots are smart so make sure it's a long survey with trick questions that they can't skip. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;You really need to keep the toxic element out too, so the best thing to do is have them provide their twitter account and hand approve each applicant. Take a couple of days to approve each member. They'll feel like they're joining an exclusive VIP community.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I could write a book on how to set up your discord, but you need a few different things to get started:&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading {"level":3} --&gt;
&lt;h3&gt;Rules Channel&lt;/h3&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;A channel that is just a big wall of text and emoji. Add rules like "don't be toxic" and "no racism". Without these written down it will be assumed that you can be toxic and racist.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;If you don't write these things down, and you kick someone for being racist - they'll be able to take you to court and they'll definitely win. Protect yourself.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;One of the rules should be "Read And Obey The Rules".&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading {"level":3} --&gt;
&lt;h3&gt;FAQ Channel&lt;/h3&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Any question anyone ever asks has the potential to be frequently asked. So if someone asks you a question you should immediately post it in the FAQ channel. It doesn't need any sorting or brevity or to be up to date, anyone interested in your game will read every question every asked about it.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;If someone asks you a question that you suspect is in the FAQ, or can be interpreted from a question in the FAQ.. tell them to look in the FAQ channel. Even if it's a yes or no answer and it takes longer to tell them to look in the FAQ channel than to tell them the answer. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;You should use this as your default answer on twitter too, to bring more people to your Discord. Release date? Read the FAQ. Where to buy? Read the FAQ.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading {"level":3} --&gt;
&lt;h3&gt;General Channel&lt;/h3&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;These are where your community will post. They'll use this channel to talk with each other about other games they're playing and share memes.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading {"level":3} --&gt;
&lt;h3&gt;Game Channels&lt;/h3&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Create as many game channels as you can think of. Game ideas, game art, modding, fan art, concept art, screenshots, movies, playtests, feedback, lore, sound design. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;You basically want between 20-30 unused game related channels. Your members will post mainly in #general for now, but when your community hits 2-3 million users you'll be glad you did this.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading {"level":3} --&gt;
&lt;h3&gt;Mod Team&lt;/h3&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;You'll want to set up a complicated hierarchy of admins, mega mods, super mods, mods, trainee mods, trusted users, semi-trusted users, users and probation user.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;It's the job of your mod team to do research on anyone that joins or posts on your discord to find out if they're a potential toxic entity. If they posted something toxic on a furry forum 15 years ago, it's the job of your mod team to find that and bring it to light.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;You need to be careful this doesn't turn into toxicity. For each issue you should have long, late night out debates with your moderators on what punishments to hand out. This should go on multiple days and be taken very seriously, with charters and votes and stuff.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading {"level":3} --&gt;
&lt;h3&gt;Bots&lt;/h3&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Keeping your new community engaged is going to be a full time job. You can offload nearly all of this to discord bots. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Your mods don't need to stay up until 4am watching your #general in case someone posts "shit" in the chat. You can get set up a bot that will automatically watch and offer multiple warnings before eventually banning repeat offenders.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Tired of all these idiots that don't read the rules? You could have a bot watch for sentences that end in a question mark and offer advice to look at the FAQ.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;The Engine&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;The choices are Unity or UE.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Choose Unity first. Learn everything about it. Your community will be interested in hearing about how you're learning basic game development things while you're making the game. Spend a minimum of time on the actual game. The game happens naturally. Focus all of your attention on your development environment. Make the tools, the tools will make the game.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:visualizer/chart {"id":1807,"route":"renderChart"} /--&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;After you've learned pretty much everything and got all your tools set up the way you want,  there'll be an annual Unreal Engine event showcasing all the newest features. You should look at the 30 second demo made by dozens of professional developers and artists and attribute all the work to the engine itself. This is when you make the brave but unavoidable choice to switch to UE, for the good of your game.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Don't worry - you won't look like an idiot. You can blame the engine. Explain that the Unity engine is constraining your vision and that despite starting practically from scratch, the game will be finished faster under UE because of blueprints - and will end up much better as a result. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph {"backgroundColor":"bright-blue","textColor":"white"} --&gt;
&lt;p class="has-white-color has-bright-blue-background-color has-text-color has-background"&gt;A bonus of switching to UE is that you can post screenshots of your blueprints on Twitter and Discord. They should be zoomed out and compressed enough to be useless for anything other than displaying the overwhelming and unmanageable complexity of it.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;You should use this time to point out that it was impossible to make this type of game using Unity, and that Unity is really made for mobile and gambling machines. If anyone points out that there are multiple popular releases of this type of game made in Unity, eject them from the Discord for being toxic and quote tweet them with "??????".&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Using Twitter&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Post as much useless garbage as you can. UFO theories, pictures of your pets, constant apologies for not posting as much as you should, polls about what to have for dinner. Crusades against other developers, middleware companies, potential customers and former employers are also popular.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;The general rule is the more tweets you make, the more eyes on your tweets, the more bots will subscribe to you. When people see your game has lots of subscribers, they'll feel like they're missing out and subscribe too. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;If you really want to post about your game, post only unlit low quality screen grabs of funny bugs from the editor view.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Game Exhibition&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;It might sound crazy to spend $1,000 to travel to a game exhibition event with your computer, and spend $2,000 on posters, cutout and business cards, and $800 on a hotel room and food for 4 days, and then spend $2,000 to rent a tiny booth in a sea of tiny booths, just to sit there for 4 days and let less than 50 people play your game for free while you watch them.. but it's the best way to promote your game to those 50 people.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;If each one of those 50 people tells just another 1,000 people about your game, and each of those buys your game, you're talking about $1.5m in your pocket. That's nearly a 300x return on your investment.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Game Pass&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;If one of those 50 people was from Microsoft you and your game are on their radar now. They will want to offer you a lump sum to put your game on Game Pass.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;If your game is like Untitled Goose Game, look it up. SteamSpy says about 1,000,000 owners. Multiply that by the cost of your game. That's your ask, $20,000,000 for gamepass. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;If your game is like Fallguys, SteamSpy estimates 20,000,000 owners. Multiply that by the cost of your game.. $700,000,000 for gamepass. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;If your game has got shooting in it, Call Of Duty sold tons.. $5bn for gamepass.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph {"backgroundColor":"bright-blue","textColor":"white"} --&gt;
&lt;p class="has-white-color has-bright-blue-background-color has-text-color has-background"&gt;It might sound sound silly to ask for $5bn to distribute your indie game, but keep in mind that this is how much it's going to make anyway. And if Microsoft don't pay it - Epic will.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;This is all basic maths. Don't let the big guys take advantage of you.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Steam&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;If none of the big distribution platforms want your game (because it's too risky for them and they don't understand the future of gaming) then consider falling back on Steam, the netscape of game distribution. It's quite quaint by today's standards but it has developed a loyal following of young men into big tittied japenese cat sex games.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;The nice thing about Steam is that it's their responsibility to advertise and sell your game. If your game isn't selling well then it's up to them to bring those numbers up. If the latest Grand Theft Auto is showing up on the front page more than your game, something is definitely wrong with the algorithm. Definitely compare your game to Grand Theft Auto in every conversation with them.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Be aware that if you're going to sell your game on Steam you need to do everything in your power to keep your players playing for longer than 2 hours. If they've played for less than 2 hours they &lt;strong&gt;will &lt;/strong&gt;refund the game, no matter how much they've enjoyed it. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Artificially lengthen load times, unskippable cutscenes, title screens, credits, dialog. When they quit the game, just hide the window - don't actually close the game.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;YouTube &amp;amp; Twitch&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;If you watch a movie for free on tv you don't usually order the DVD so you can watch it again. It's exactly the same scenario with games. Exactly the same.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;There's a recent trend among "content creators" where they'll pirate the game by filming themselves play it, then show that video on the internet for free. Other pirates watch these videos instead of buying the game. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;YouTube and Twitch love this - because they make millions of dollars from every video. Every view on one of these videos is a lost sale. It's $50 out of your pocket and straight into the pocket of a content pirate.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Skip Google and Amazon, report these people directly to the police. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Giving Up&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;So you gave it your best go. You released a game and you're not a multi-millionaire. None of the twitter followers that said "I WOULD BUY THIS" to the bug gifs actually bought it.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;You missed your opportunity, this was your only chance and there's no point reading feedback and releasing updates to try to make things better.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph {"align":"left","backgroundColor":"bright-blue","textColor":"white"} --&gt;
&lt;p class="has-text-align-left has-white-color has-bright-blue-background-color has-text-color has-background"&gt;It's not your fault really, everyone knows PC Gaming is dead. You got fucked by Steam refunds, Steam only cares about GTA, no-one is buying or playing games anymore. Way too much youtube piracy.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;But all hope isn't lost - you gained all that knowledge. You're a game developer now. Maybe consider making a mobile game. That'll be way easier, there's tons of money to be made in mobile games. And Candy Crush is such a simple game, you could knock that out in a couple of weeks, but with way better font rendering.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;</description>
      <pubDate>Tue, 19 Apr 2022 17:16:31 +0100</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/interopgen</guid>
      <link>https://garry.net/posts/interopgen</link>
      <title>InteropGen</title>
      <description>&lt;!-- wp:paragraph --&gt;
&lt;p&gt;A big part of &lt;a href="https://sbox.facepunch.com/news"&gt;s&amp;amp;box&lt;/a&gt; is calling c++ from c#, and calling c# from c++. So while that's easy enough to do manually for a few functions, using DllImport and all that noise, it's not really that feasible with the amount of stuff we want to bind.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Plus there's downsides to DllImport. The automatic marshalling can be really sub-optimal. When doing this stuff with a game engine everything counts.. so you want to be as bare metal as possible.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;InteropGen&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;We made a tool called InteropGen. It allows you to write some c++ looking code, which then creates a translation layer between c++ and c#. A typical def file looks like this.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:enlighter/codeblock {"language":"cpp","linenumbers":"false"} --&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="cpp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;include "filesystem/ifilesystem.h"


native accessor g_pFullFileSystem as NativeEngine.FullFileSystem
{
	string GetSymLink( string pPath, string pathID );
	void AddSymLink( string pPath, string pathID, string realPath );
	void ClearSymLinks();

	void AddAddonsSearchPaths( bool addContentPaths );
}
&lt;/pre&gt;
&lt;!-- /wp:enlighter/codeblock --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;InteropGen will take this and make the global variable &lt;code&gt;g_pFullFileSystem&lt;/code&gt; accessible from c#. Like this.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:enlighter/codeblock {"language":"csharp","linenumbers":"false"} --&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;if ( createSymLink )
{
	NativeEngine.FullFileSystem.AddSymLink( entry.Path, "GAME", fileName );
}&lt;/pre&gt;
&lt;!-- /wp:enlighter/codeblock --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;On the c# side the code generated looks like this..&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:enlighter/codeblock {"language":"csharp","linenumbers":"false"} --&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;		internal static delegate* unmanaged&amp;lt; IntPtr, IntPtr, IntPtr, void &gt; g_pFllFlSystm_AddSymLink;

		internal static void AddSymLink( string pPath, string pathID, string realPath ) 
		{ 
			if ( g_pFllFlSystm_AddSymLink == null ) throw new System.Exception( "Function Pointer Is Null" );
			g_pFllFlSystm_AddSymLink( Sandbox.Interop.GetPointer( pPath ), Sandbox.Interop.GetPointer( pathID ), Sandbox.Interop.GetPointer( realPath ) ); 
		
		}&lt;/pre&gt;
&lt;!-- /wp:enlighter/codeblock --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Where on the c++ side the exported function is as simple as could be..&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:enlighter/codeblock {"language":"cpp","linenumbers":"false"} --&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="cpp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;void g_pFllFlSystm_AddSymLink( const char* pPath, const char* pathID, const char* realPath )
{
	g_pFullFileSystem-&gt;AddSymLink( pPath, pathID, realPath );
}&lt;/pre&gt;
&lt;!-- /wp:enlighter/codeblock --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Function Pointers&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;As you probably noticed, we're using function pointers to exchange functions, rather than some DllImport shit (exporting every function we needed didn't seem like a good idea to me).&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;To do this, on startup we build an array of all the function pointers and send it over to c#, along with a hash etc to verify that it's all correct. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:enlighter/codeblock {"language":"cpp","linenumbers":"false"} --&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="cpp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;				&amp;amp;Exports::RenderTools_DrawScreenQuad,
				&amp;amp;Exports::StmGmSrvr_SetServerName,
				&amp;amp;Exports::StmGmSrvr_SetMapName,
				&amp;amp;Exports::StmGmSrvr_SetGameTags,
				&amp;amp;Exports::WindowsGlue_FindFile,
			};

			
			void* imported[50];
			
			fn_initialize init = (fn_initialize) host-&gt;CreateDelegate( "Sandbox.Engine", "Sandbox.Interop", "CreateInterface");
			
			init( "engine", 44229, exported, structs, imported );
			
			int i = 0;
			
			Imports::SandboxEngine_Bootstrap_PreInit = (int (CC *)( const char*,int,int,int )) imported[i++];
			Imports::SandboxEngine_Bootstrap_Init = (int (CC *)()) imported[i++];
			Imports::Sandbox_EngineLoop_EnterMainMenu = (void (CC *)()) imported[i++];&lt;/pre&gt;
&lt;!-- /wp:enlighter/codeblock --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Here you can see that the init function is exporting c++ function pointers, and importing c# function pointers. We verify that they're all running from the same version of the def files using a hash.. to allow us to shit the bed if the dlls were compiled at different times.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Structs&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;While we're doing this we also send the size of any referenced struct sizes. In our def files we don't define the struct's layout or any of its members. It's redundant, it's just a block of memory. If it's the right size and the members are in the right order, it should just work. So structs are just defined like this.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:enlighter/codeblock {"language":"cpp","linenumbers":"false"} --&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="cpp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;native struct Vector4D is Vector4
native struct QAngle is Angles
native struct Quaternion is Rotation
native struct CTransformUnaligned is Transform
native struct Rect_t is NativeRect
native struct Rect3D_t is Rect3D
native struct AABB_t is BBox
native struct VMatrix is Matrix
native struct RnCapsule_t is Capsule
native struct Vector2D is Vector2&lt;/pre&gt;
&lt;!-- /wp:enlighter/codeblock --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Then in the init code, we send an array of all the struct's sizes. On the c# side we verify that those sizes all match - and shit the bed if they don't.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Inline&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Binding classes 1:1 isn't always possible. There's always something that needs casting, or converting, or that's const for no reason. We could change the underlying code, but we added a feature to our interopgen called inline.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:enlighter/codeblock {"language":"cpp","linenumbers":"false"} --&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="cpp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;#include "hammerapp.h"

native class CHammerApp as NativeHammer.CHammerApp
{
	void OnReloadGameData();
	void RefreshEntitiesGameData();

	inline IMaterial GetCurrentMaterial()
	{
		return this-&gt;GetActiveMaterial().GetResourceHandle();
	}
}
&lt;/pre&gt;
&lt;!-- /wp:enlighter/codeblock --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;This saves so much time and effort.. and means we don't have to try to contort InteropGen with tons of wacky [Attributes] to try to get what we want, which is the route we were going down before we added inline.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Managed Functions&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Defining managed static functions are easy..&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:enlighter/codeblock {"language":"cpp","linenumbers":"false"} --&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="cpp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;managed static class Sandbox.Engine.Bootstrap
{
	static bool PreInit( string gameFolder, bool isDedicatedServer, bool isRetail, bool toolsMode );
	static bool Init();
}&lt;/pre&gt;
&lt;!-- /wp:enlighter/codeblock --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;And calling them from c++ is very easy&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:enlighter/codeblock {"language":"cpp","linenumbers":"false"} --&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="cpp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;//
// Pre-init kicks off logging and sets up some basic things
// we might be better off passing in pAppDict completely eventually
//
if (!Sandbox::Engine::Bootstrap::PreInit( gamePath.Get(), pAppDict-&gt;IsDedicatedServer(), IsRetail(), g_pApplication-&gt;IsInToolsMode() ))
{
	Plat_FatalError( "Bootstrap::PreInit returned false" );
}&lt;/pre&gt;
&lt;!-- /wp:enlighter/codeblock --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;And regular managed classes are just as easy..&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:enlighter/codeblock {"language":"cpp","linenumbers":"false"} --&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="cpp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;managed class ServerList
{
	void OnStarted();
	void OnServerResponded( void* ptr, ulong steamid );
	void OnFinished();
}&lt;/pre&gt;
&lt;!-- /wp:enlighter/codeblock --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;The objects are stored as an int handle in c++.. so they're totally safe and feels nice to use.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:enlighter/codeblock {"language":"cpp"} --&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="cpp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;#pragma once

class ServerList
{
	public:
		ServerList() { m_ObjectId = 0;  }
		ServerList( unsigned int id ) { m_ObjectId = id;  }
		unsigned int m_ObjectId = 0;
		operator unsigned int() const { return m_ObjectId; }
		unsigned int ptr(){ return m_ObjectId; }
		bool HasObject(){ return m_ObjectId &gt; 0; }
		void OnStarted() const;
		void OnServerResponded( void* ptr,uint64 steamid ) const;
		void OnFinished() const;
};
&lt;/pre&gt;
&lt;!-- /wp:enlighter/codeblock --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Reflections&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;The InteropGen code has evolved over time, and is pretty messy and utilitarian.. but it's one of the big things we got right here. We don't really worry about binding stuff any more unless it's under very specific circumstances.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;We could have tried to do fancy things, like using the actual c++ header files and trying to translate those for direct access from c# - but I'm positive that would have been a car crash.. We'd have ended up having to change the c++ headers to work for the interop, instead of the other way around. Plus we don't need to bind everything. The less we bind the better.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;We could have tried to use &lt;a href="https://docs.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/source-generators-overview"&gt;Source Generators&lt;/a&gt; to automatically create all this code in the background based on markup we added to c# classes. That would probably work, and could probably be a good way around doing this stuff. But it's ultimately another layer of bullshit on top of something with a very simple goal.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;</description>
      <pubDate>Mon, 18 Apr 2022 09:59:54 +0100</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/frozen-shoulder</guid>
      <link>https://garry.net/posts/frozen-shoulder</link>
      <title>Frozen Shoulder</title>
      <description>&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I've had a frozen shoulder for about a year. For the longest time I was unable to lift my arm higher than shoulder height. I couldn't put my coat on properly because I couldn't bend my arm backwards enough to get it in the arm hole.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":1763,"sizeSlug":"large","linkDestination":"none"} --&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;img src=https://cdn.garry.net/wpi/image-1-1024x401.png alt="" class="wp-image-1763"/&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Worst of it all is that I did this to myself. Whenever you google what causes frozen shoulders, it always says that no-one knows, it just happens, and it's mostly older women that get them. Here's how I gave myself one.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Bench Press&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I got into weight lifting. Not big time or anything, but every now and them I'd do some bench presses and I was interested to see how much weight I could go up to. This was all good but one time when lifting I felt this pain in the left biceps. Then on the next push it hurt more.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;It wasn't so bad that I had to stop.. but then over the next few days my arm was really weak. If I leaned on it it'd be painful. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Doctor Helk&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;This went on for a couple of months. It didn't seem to be getting any better. I mentioned it to Helk and he said I should try a theragun on it. It was worth a try, so I ordered one and gave it a go.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":1761,"sizeSlug":"large","linkDestination":"none"} --&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;img src=https://cdn.garry.net/wpi/image-1024x515.png alt="" class="wp-image-1761"/&gt;&lt;figcaption&gt;Not me, but exact same biceps shape and size&lt;/figcaption&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I used it all over my left arm and shoulder. It didn't feel any different. But over the next week I got a frozen shoulder. I don't know that it was the theragun that caused it, or whether I used it wrong, but now I'm thinking that I have this frozen shoulder and whatever the original problem was.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Pain&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;The arm isn't just frozen, like trying to bend you knee backwards. It also has a ton of pain when you approach and pass the thresholds. The pain lingers on for about a minute afterwards. I had a couple of events where I was in that much pain that I thought I might pass out.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I was walking up our basement stairs holding a coffee cup on my right hand, and tripped, and had to prevent a faceplant with my left hand/arm. This stretched the shit out of my shoulder, my coffee went everywhere, and it was the worst pain I've ever felt.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"id":1765,"sizeSlug":"large","linkDestination":"none","className":"is-style-default"} --&gt;
&lt;figure class="wp-block-image size-large is-style-default"&gt;&lt;img src=https://cdn.garry.net/wpi/image-2-1024x613.png alt="" class="wp-image-1765"/&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;A few weeks later I was watching alex play the piano, and my chair fell backwards. I reached out with my left hand to grab something to stop my fall, but instead of arm went over the side of the piano, so I was hanging on it with my armpit. My full 200lb body weight dangling on my shoulder. The fucking pain, and I was stuck. I couldn't lift myself up. Eventually my shoulder stretched enough to let me slide off.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Fixing a Frozen Shoulder&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;There's a few ways that a frozen shoulder fixes itself. Either you do nothing and over time it gets better. &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Or you do stretches and over time it gets better.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Or you go under general anesthetic and a couple of doctors bend the fuck out of your arm so it regains some of its movement, and then you do stretches and over time it gets better.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I'm luckily in the #2 category. It's not 100% perfect, but it is definitely getting better. I'm noticing that I can do things that I wasn't able to.. like swimming, or lifting weights. I'm guessing I'm another year until it's a full recovery.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;</description>
      <pubDate>Sat, 16 Apr 2022 13:35:19 +0100</pubDate>
      <image>https://cdn.garry.net/wpi/image-1-1024x401.png</image>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/shitty-holiday-photos</guid>
      <link>https://garry.net/posts/shitty-holiday-photos</link>
      <title>Shitty Holiday Photos</title>
      <description>&lt;p&gt;There&amp;#8217;s something that has started happening over the last few years that annoys the shit out of me.&lt;/p&gt;
&lt;p&gt;We went to Dubai last week on holiday. So while we were there we went up the Burj Kalifa, the tallest building in the world. We went as high as you could go, the 154th floor.&lt;/p&gt;
&lt;p&gt;Up the top there are photographers. You sit down with your family, they say do this with your arms, look suprised, point at this, sit down and put your legs out. Then it&amp;#8217;s all done and you shuffle along.&lt;/p&gt;
&lt;p&gt;The photo they&amp;#8217;re trying to sell you is you and your family at a green screen, with Burj related images in the background.&lt;/p&gt;
&lt;p&gt;&lt;img src=https://cdn.garry.net/wpi/90e511732620b463.jpg /&gt;&lt;/p&gt;
&lt;p&gt;Whats the fucking logic here? Why are they doing this at the top of this tower? Something that can happen on the ground, literally anywhere in the world? Why are people buying these bullshit photos?&lt;/p&gt;
&lt;p&gt;&lt;img src=https://cdn.garry.net/wpi/513657623337c29e.jpg /&gt;&lt;/p&gt;
&lt;p&gt;Look at the state of that. You&amp;#8217;re like 800 meters above the ground, with views for miles. Why are you taking a photo of a greenscreen, pretending you&amp;#8217;re there, when you&amp;#8217;re actually there?&lt;/p&gt;
&lt;p&gt;This happens everywhere now and it makes no sense. It hurts my brain. Stop please.&lt;/p&gt;
</description>
      <pubDate>Wed, 23 Mar 2022 00:00:00 Z</pubDate>
      <image>https://cdn.garry.net/wpi/90e511732620b463.jpg</image>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/your-portfolio-gave-me-diarrhea</guid>
      <link>https://garry.net/posts/your-portfolio-gave-me-diarrhea</link>
      <title>Your Portfolio Gave Me Diarrhea</title>
      <description>&lt;p&gt;When we advertise for jobs we get a lot of applications. It can be frustrating to go through job applications and to be honest I really hate it, but I love finding new talented people to work with so I do it.&lt;/p&gt;
&lt;p&gt;We don&amp;#8217;t have a job application email address now because they are frustrating to go through. It&amp;#8217;s easy to be flippant and annoyed, but each application is a person aspiring to move forward with their life, and then you get their resume and you can immediately see 5 things they&amp;#8217;re doing wrong. And the fact they&amp;#8217;re doing it wrong in this applcation probably means they&amp;#8217;re spending all day applying for jobs, getting it wrong all over the place.&lt;/p&gt;
&lt;p&gt;Ideally we&amp;#8217;d email each person back and let them know where they&amp;#8217;re going wrong. Ideally we&amp;#8217;d at least email back to say hey thanks but your application was unsuccessful, here&amp;#8217;s some ways you can improve your application and please try again in 6 months. But we&amp;#8217;d spend all day replying to emails if we did that. We probably need to hire someone to do it, but who is going to go through the applications for that?&lt;/p&gt;
&lt;p&gt;So here&amp;#8217;s some of the biggest problems I&amp;#8217;ve found when going through applications.&lt;/p&gt;
&lt;h2&gt;Accepting Applications?&lt;/h2&gt;
&lt;p&gt;Don&amp;#8217;t email asking if we&amp;#8217;re accepting applications. Just send your portfolio.&lt;/p&gt;
&lt;h2&gt;Include Nothing&lt;/h2&gt;
&lt;p&gt;You can&amp;#8217;t expect to apply for a job as a 3D Artist with a PDF containing just your home address and the name of your school. Show me what you can do. Show me your art.&lt;/p&gt;
&lt;h2&gt;Two Second Videos&lt;/h2&gt;
&lt;p&gt;Instead of linking me to thirty short videos can you put them all in one big video please.&lt;/p&gt;
&lt;h2&gt;Passwords&lt;/h2&gt;
&lt;p&gt;Please don&amp;#8217;t link to 10 videos and have a password on each one. Don&amp;#8217;t make me copy and paste a password to view a video.&lt;/p&gt;
&lt;p&gt;I appreciate that some of the stuff you&amp;#8217;re linking to is confidential, but isn&amp;#8217;t an unlisted video just as good?&lt;/p&gt;
&lt;h2&gt;Zips&lt;/h2&gt;
&lt;p&gt;Why are you zipping up 4 pictures instead of just attaching them in the email. Why has the zip got a password on it. Why is the password in a pdf.&lt;/p&gt;
&lt;h2&gt;Game Saves&lt;/h2&gt;
&lt;p&gt;I&amp;#8217;m not going to blindly download your game save files, put them in a game, load the game and walk around.&lt;/p&gt;
&lt;p&gt;At least put screenshots of what you created, something to convince me to go to all that effort.&lt;/p&gt;
&lt;h2&gt;Done Nothing&lt;/h2&gt;
&lt;p&gt;If you&amp;#8217;re applying for a job as a modeller I&amp;#8217;d expect your portfolio to be full of models. It&amp;#8217;s your job &amp;#8211; you&amp;#8217;re going to have done it a lot. If you&amp;#8217;re only showing two models I&amp;#8217;m going to wonder how much you like doing this.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re applying for a job as a concept artist you should have more than 2 drawings on your portfolio.&lt;/p&gt;
&lt;p&gt;Maybe you&amp;#8217;re taking your older work down because you have evolved since then and think it looks bad. Keep it up. Make it obvious that it is historical. I like seeing people get better.&lt;/p&gt;
&lt;h2&gt;Photos&lt;/h2&gt;
&lt;p&gt;I don&amp;#8217;t need to know what you look like.&lt;/p&gt;
&lt;h2&gt;Vimeo&lt;/h2&gt;
&lt;p&gt;For some reason Vimeo takes 20 seconds to start a video for me. I&amp;#8217;ve got 1gb internet and it takes 20 seconds to start a video. And even then it stops to buffer. I think this is more of a problem when videos are rarely viewed &amp;#8211; like portfolio videos.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m sure there&amp;#8217;s a good reason people prefer uploading their videos to Vimeo over Youtube but I&amp;#8217;m not convinced. Please upload your videos to YouTube.&lt;/p&gt;
&lt;h2&gt;School Grades&lt;/h2&gt;
&lt;p&gt;I don&amp;#8217;t need to know your school grades. I don&amp;#8217;t need to know that you worked at Aldi when you were 17.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re including a resume I&amp;#8217;m only going to look at it to see what other game studio experience you have. If you don&amp;#8217;t have any then you&amp;#8217;re best off not including it and focusing me on your portfolio.&lt;/p&gt;
&lt;h2&gt;Broken Links&lt;/h2&gt;
&lt;p&gt;Make sure your links work! Click them before you send the email!&lt;/p&gt;
&lt;h2&gt;Copy and Paste&lt;/h2&gt;
&lt;p&gt;If you&amp;#8217;re copying and pasting your application to a bunch of different companies be careful. If you&amp;#8217;re mentioning the company name in the email you&amp;#8217;re probably going to mess up and forget to change it. Don&amp;#8217;t mention it.&lt;/p&gt;
&lt;p&gt;Don&amp;#8217;t send the email to a ton of companies all together &amp;#8211; it looks bad. If you have to just use BCC so it&amp;#8217;s at least less obvious.&lt;/p&gt;
&lt;h2&gt;In Engine&lt;/h2&gt;
&lt;p&gt;If you&amp;#8217;re applying as an animator or 3D artist then I want to see your work in a game engine.&lt;/p&gt;
&lt;p&gt;Your renders are nice and show that you understand how to compose an image, but I also want to know you have a basic understanding of how game engines work &amp;#8211; because that&amp;#8217;s the job.&lt;/p&gt;
&lt;h2&gt;Twitter Baby&lt;/h2&gt;
&lt;p&gt;Don&amp;#8217;t include a link to your twitter if it&amp;#8217;s just arguing with other twitter users over nothing.&lt;/p&gt;
&lt;p&gt;Do link to your twitter if it&amp;#8217;s pages of you showing off your art and skills.&lt;/p&gt;
&lt;h2&gt;Out Of Date&lt;/h2&gt;
&lt;p&gt;Here&amp;#8217;s a link to my portfolio I have done a lot since then just ask if you want to see it.&lt;/p&gt;
&lt;h2&gt;LODs&lt;/h2&gt;
&lt;p&gt;If you&amp;#8217;re applying as a modeller I want to see your ability to made LODs.&lt;/p&gt;
&lt;p&gt;At a minimum I want to know that you know what a LOD is.&lt;/p&gt;
&lt;h2&gt;Overboard&lt;/h2&gt;
&lt;p&gt;Please don&amp;#8217;t make a special personalised website or a personalised video for your application. It&amp;#8217;s really nice that you want to put that much effort into selling yourself.. but it&amp;#8217;s a job application &amp;#8211; not a talent show. The way to sell yourself is to show what you can do.&lt;/p&gt;
&lt;p&gt;It makes us feel terrible when we don&amp;#8217;t hire you.&lt;/p&gt;
&lt;h2&gt;Bad Fit&lt;/h2&gt;
&lt;p&gt;Are we a fit for you? Have you played our games? Do you understand what we do?&lt;/p&gt;
&lt;p&gt;If your portfolio is full of cutesey 2D games but you&amp;#8217;re applying to work on Rust we&amp;#8217;re going to wonder why. Maybe get ahead of that and call it out.&lt;/p&gt;
</description>
      <pubDate>Thu, 30 Sep 2021 23:00:00 +0100</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/motivation</guid>
      <link>https://garry.net/posts/motivation</link>
      <title>Motivation</title>
      <description>&lt;p&gt;Someone asked me a while back where I get my motivation. It&amp;#8217;s spite.&lt;/p&gt;
&lt;h2&gt;Garry&amp;#8217;s Mod&lt;/h2&gt;
&lt;p&gt;I&amp;#8217;d have probably lost interest in Garry&amp;#8217;s Mod within a couple of weeks. There was one thing that drove me forward.&lt;/p&gt;
&lt;p&gt;It was called HL2World. It had a forum full of people that hated me and hated GMod. They were big fans of another mod called JBMod and were pretty militant about it.&lt;/p&gt;
&lt;p&gt;So a lot of my motivation came from lurking their forums. They&amp;#8217;d say Garry&amp;#8217;s Mod was shit because of some reason, then I&amp;#8217;d spend a month fixing that thing. Then I&amp;#8217;d stalk the person that made the post to see if they changed their mind.&lt;/p&gt;
&lt;p&gt;The more they hated me the more motivation I&amp;#8217;d get. People who hate you tell you the truth &amp;#8211; they don&amp;#8217;t make the best of it &amp;#8211; they attack you with every flaw they can find. That&amp;#8217;s useful if you want to fix things in a game. &lt;/p&gt;
&lt;p&gt;The good thing about the HL2World guys was that even though JBMod pretty much immediately ceased development after it hit, they held onto the belief that one day there would be a big update and it&amp;#8217;d stomp Garry&amp;#8217;s Mod.That wasn&amp;#8217;t likely to happen, but it was likely enough to drive me to work hard to make sure it didn&amp;#8217;t.&lt;/p&gt;
&lt;p&gt;Just out of spite.&lt;/p&gt;
&lt;h2&gt;Rust&lt;/h2&gt;
&lt;p&gt;Rust launched in early access and got really popular really fast. Too fast for us. We realised it needed a total rewrite. Huge sections of the code were over-engineered, webs of dependancies for no reason. It was hurting development.&lt;/p&gt;
&lt;p&gt;So we called that version Rust Legacy and I started making a new version along side it. From scratch.&lt;/p&gt;
&lt;p&gt;A lot of people didn&amp;#8217;t like this. They saw what it was, not what it would become. They swore that we were killing Rust and that they&amp;#8217;d never play new Rust and would stick with Rust Legacy forever.&lt;/p&gt;
&lt;p&gt;So I&amp;#8217;d stalk them on reddit and the forums. Any complaints they had I&amp;#8217;d address in a way that not only solved their initial issue but was a million times better than how it worked in Legacy.&lt;/p&gt;
&lt;p&gt;The biggest reward was watching them disband their impossible position and start playing the new version. They thought I was making the game better for money and career, but I was doing it because they pissed me off.&lt;/p&gt;
</description>
      <pubDate>Thu, 23 Sep 2021 23:00:00 +0100</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/we-got-married</guid>
      <link>https://garry.net/posts/we-got-married</link>
      <title>We got married</title>
      <description>&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Me and Sarah got married this year, finally, after 11 years together. I’ve stopped blogging as much as I used to, because it’s hard to believe that anyone gives a fuck, but I’ve documented every other major relationship event here, so I should probably do this too.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:image {"className":"is-style-default"} --&gt;
&lt;figure class="wp-block-image is-style-default"&gt;&lt;img src="https://lh3.googleusercontent.com/cpWZD0KtsAJyGVYuOxZYPd_l1fRzXN5xAqCo7vj5ccraHiACLuqUreospsIroSIAM7JsUk33NjyNCHwX6IxfzASaNuanwg4gRkgo1J521GLyjow9wh094NiReVMc7amucAmL4-p4-LV0kXMQtfydLDXFZ3PnsrAkZc05k6eanTMCI5KcS_9zmbsrgfOhD0xRzzg6j2yAsFjJ-77a9G7DMYHTw6M-piVjhXcO2ftikjlR7y2GQmEY3b4GZPFKGR3BPX_G50l8Hwznldup6qDiUk9FH11e0FzGQx3nxgpm0ktw6iS3jK5okF9HvK1BQxQeqPAQhXbr1MO62j6Lw9AL0suWqPrEsENSwAY0dMHHgG-GoczGJW7Lgbyh_kQLEyG1LQyYT0cGRkLH0mKSSf2LxgeSo3r3l_RqfUb-C5HpvPrWWHYRYZQ10sh5VhQXy8VUMeSlMV0G97BuPvuk1bvbT_K_POHr9eMD63eTJnT1UmlWwBigu4J8V_r6n90JpZK5FjFuVja67136xD9KAtwreDxgsydpB7qU7d2NW1QCGfEQJaXqVysi81cogvbooXx-QNgXoiHc4Zfw_NfwS7IiYNxYlzBNHjjrQhbzcHntgIEcZTH1keFlYE0uXrEiu6p7xJiT916V02HrhHsy2blTZOIfJle_YaP2qJWsiFjYuKrVP5YQ_cQj2lBxgbe_5eZCu1Ql2RiMWnyj9JzQf0dMEKopcw_H_vWdW9fa3upV3W5cdffHtb--WR0YauWsXud1OVLWeeGUerT0BWeXj-aV3eVKE2e7Rm0-PtpITg=w1860-h1240-no?authuser=0" alt=""/&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;I used to be militant against marriage. I find it hard to remember exactly why now. I think it was something about how everyone just does what everyone else does, mixed in with something about how much control over weddings the church and govt have.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;As I’ve got older that all seems a bit stupid. Sarah never really asked to get married, even though it must be shit as fuck to have a different name to your kids. I’d planned to propose for a long time, but really wanted to wait until the kids were old enough to remember the day. We’d waited anyway, so why not wait on purpose.’&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Covid&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;We were meant to get married last year. We’d booked a place, we had the date, I even went to a wedding exhibition.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;We got an email offering refunds from them because of lockdown and stuff. I told them to keep the deposit and hold the date, if it falls though it falls though. Then the guy phoned me and said don’t tell anyone buy they’re going out of business so to definitely take the refund.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;New Place&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;So we found a new place. And it was nicer. It didn’t have a green carpet and we could get married outside. So we were happy that the first one got cancelled.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Sarah really took control of everything, she loved party planning. I’ve got no opinions.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Covid, again&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Covid was still causing issues, so we changed our date even further back, to where it surely would be safe. A couple of months later the govt came out and said they were going to lift all restrictions on a certain date, and that date turned out to be a week before the wedding, so we couldn’t believe our luck.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;But when the time came, they decided to have another two weeks to decide what to do.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;So we were looking at the wedding and thinking about cancelling again. We wouldn’t be allowed to get married outside. Even though it’s outside it has to be under some kind of structure. The structure was 2 meters wide. There had to be 2 registrars and they had to be 2 meters apart, and 2 meters away from us. We couldn’t fit our dinner guests because each guest needs 2 square meters and there wasn’t enough square meters. It was all so stupid.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;So the wedding we were facing was indoors, in a smallish restaurant, with half our guests outside because of limited numbers, and everyone wearing masks – including us. There was a tense call with the wedding planner where half way through Sarah cried and walked off and left me in stunned silence.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Marquee&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;So we started looking at solutions. If you got a marquee and had one side opened that counted as outside. So each guest only needed half a square meter.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Even the govt chipped in and made special exceptions for outside weddings, so that was all solved too. We were happy.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Weather&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;With Covid dealt with, we could start worrying about the weather. If it pissed down we’d be getting married indoors anyway, with half our guests, and all wearing masks.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;As the wedding got closer I was checking the weather on 3 different apps. They all agreed that it was going to rain.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:heading --&gt;
&lt;h2&gt;Big Day&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;The big day came and it didn’t rain. It looked like it could, but it didn’t. It was hot without being too hot. It all worked out great for us really.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;We’d purposely kept it to just family.. so there weren’t any nerves. Everything was nice and relaxed, lets get married, lets eat some food, lets go to sleep. The only thing that really hurt was the first dance. That was the worst 4 minutes of my life.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;A few days after the wedding a bunch of the guests got covid, including Sarah and Alex. So we hadn’t really escaped it at all.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;

&lt;!-- wp:paragraph --&gt;
&lt;p&gt;Let me tell you something though, there’s nothing that will ever beat that feeling of getting into bed on your wedding night, knowing that you don’t have to think about getting married anymore, that it’s done and out the way. Lying there defragging your brain, deleting all the stuff you no longer need to remember. The best feeling ever.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;</description>
      <pubDate>Wed, 15 Sep 2021 23:00:00 +0100</pubDate>
      <image>https://lh3.googleusercontent.com/cpWZD0KtsAJyGVYuOxZYPd_l1fRzXN5xAqCo7vj5ccraHiACLuqUreospsIroSIAM7JsUk33NjyNCHwX6IxfzASaNuanwg4gRkgo1J521GLyjow9wh094NiReVMc7amucAmL4-p4-LV0kXMQtfydLDXFZ3PnsrAkZc05k6eanTMCI5KcS_9zmbsrgfOhD0xRzzg6j2yAsFjJ-77a9G7DMYHTw6M-piVjhXcO2ftikjlR7y2GQmEY3b4GZPFKGR3BPX_G50l8Hwznldup6qDiUk9FH11e0FzGQx3nxgpm0ktw6iS3jK5okF9HvK1BQxQeqPAQhXbr1MO62j6Lw9AL0suWqPrEsENSwAY0dMHHgG-GoczGJW7Lgbyh_kQLEyG1LQyYT0cGRkLH0mKSSf2LxgeSo3r3l_RqfUb-C5HpvPrWWHYRYZQ10sh5VhQXy8VUMeSlMV0G97BuPvuk1bvbT_K_POHr9eMD63eTJnT1UmlWwBigu4J8V_r6n90JpZK5FjFuVja67136xD9KAtwreDxgsydpB7qU7d2NW1QCGfEQJaXqVysi81cogvbooXx-QNgXoiHc4Zfw_NfwS7IiYNxYlzBNHjjrQhbzcHntgIEcZTH1keFlYE0uXrEiu6p7xJiT916V02HrhHsy2blTZOIfJle_YaP2qJWsiFjYuKrVP5YQ_cQj2lBxgbe_5eZCu1Ql2RiMWnyj9JzQf0dMEKopcw_H_vWdW9fa3upV3W5cdffHtb--WR0YauWsXud1OVLWeeGUerT0BWeXj-aV3eVKE2e7Rm0-PtpITg=w1860-h1240-no?authuser=0</image>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/everything-we-watched-in-lockdown</guid>
      <link>https://garry.net/posts/everything-we-watched-in-lockdown</link>
      <title>Everything We Watched In Lockdown</title>
      <description>&lt;h2&gt;Palm Spings&lt;/h2&gt;
&lt;p&gt;Like groundhog day. We liked it a lot.&lt;/p&gt;
&lt;h2&gt;Ted Lasso&lt;/h2&gt;
&lt;p&gt;American guy comes to England to coach a premier league football team. We like it a lot.&lt;/p&gt;
&lt;h2&gt;Future Man&lt;/h2&gt;
&lt;p&gt;Really enjoyed it. Wolf&amp;#8217;s love of cooking makes it.&lt;/p&gt;
&lt;h2&gt;Extra Ordinary&lt;/h2&gt;
&lt;p&gt;Enjoyed, especially when he morphed into his wife.&lt;/p&gt;
&lt;h2&gt;Flipped&lt;/h2&gt;
&lt;p&gt;Watched 3 episodes and had enough.&lt;/p&gt;
&lt;h2&gt;Police Academy&lt;/h2&gt;
&lt;p&gt;Bought to watch with the kids. Way more blowjobs than I remember.&lt;/p&gt;
&lt;h2&gt;Freaks and Geeks&lt;/h2&gt;
&lt;p&gt;Still watching it, but we enjoy it. We watch an episode when we have nothing else to do.&lt;/p&gt;
&lt;h2&gt;Nathan For You&lt;/h2&gt;
&lt;p&gt;I&amp;#8217;d watched all of this except for the last episode where Bill Gates goes looking for his old girlfriend. So I watched that episode. Was alright. Didn&amp;#8217;t know how much was fake so didn&amp;#8217;t know how emotionally invested to be.&lt;/p&gt;
&lt;h2&gt;Homeland&lt;/h2&gt;
&lt;p&gt;We watched from something like season 3 to the end. Got worse and worse as time went on. By the end we were just pushing through to the end because we&amp;#8217;d come so far.&lt;/p&gt;
&lt;p&gt;They went from Carrie figuring out all this shit and being super smart and street wise, to looking shit up on 4chan, getting kidnapped in every episode and fucking up every decision.&lt;/p&gt;
&lt;p&gt;Something that sticks in my memory was the bad guys were looking for Quinn for some reason, and had all this security system and soldiers everywere. Then out of nowhere a soldier runs up to the head soldier with a print out of a cctv of Quinn. He spotted the guy they were looking for, and then printed it, waited for it to print, then carried that to his boss. That out of everything else annoyed me the most because I can&amp;#8217;t get it out of my mind.&lt;/p&gt;
&lt;h2&gt;Dave&lt;/h2&gt;
&lt;p&gt;Awesome&lt;/p&gt;
&lt;h2&gt;Dead Pixels&lt;/h2&gt;
&lt;p&gt;We&amp;#8217;re still watching an episode every now and then. I like it, I don&amp;#8217;t think Sarah likes it as much.&lt;/p&gt;
&lt;h2&gt;What We Do In The Shadows&lt;/h2&gt;
&lt;p&gt;Hit and miss. The episode where Matt Berry became a bar owner was good.&lt;/p&gt;
&lt;h2&gt;Brave New World&lt;/h2&gt;
&lt;p&gt;Too much shagging. Watched one episode.&lt;/p&gt;
&lt;h2&gt;Stath Lets Flats&lt;/h2&gt;
&lt;p&gt;Good.&lt;/p&gt;
&lt;h2&gt;Best In Show&lt;/h2&gt;
&lt;p&gt;Mostly shit, but had some good bits. Whenever the kids are annoying me now I say STOP NAMING NUTS&lt;/p&gt;
&lt;h2&gt;Ant Man And The Wasp&lt;/h2&gt;
&lt;p&gt;Bought to watch with the kids. We watched the first one and enjoyed it, so we were confused when we started watching this one and he was under house arrest for some reason. Turns out we needed to watch another set of films to understand or something.&lt;/p&gt;
&lt;h2&gt;West World&lt;/h2&gt;
&lt;p&gt;This season changed a lot, but it&amp;#8217;s changed enough to be interesting. We enjoyed it.&lt;/p&gt;
&lt;h2&gt;Rick And Morty&lt;/h2&gt;
&lt;p&gt;The Vat Of Acid episode was good, none of the rest were.&lt;/p&gt;
&lt;h2&gt;Friday Night Dinner&lt;/h2&gt;
&lt;p&gt;The kids love watching this so we&amp;#8217;ve seen every episode 3 times now. It&amp;#8217;s not a kids show, but they love Jim.&lt;/p&gt;
&lt;h2&gt;Devs&lt;/h2&gt;
&lt;p&gt;I really liked this but everyone I told about it ended up hating it. &lt;/p&gt;
&lt;h2&gt;Avenue 5&lt;/h2&gt;
&lt;p&gt;Mainly rubbish. It got better as the season went on, but mainly rubbish.&lt;/p&gt;
&lt;h2&gt;Space Force&lt;/h2&gt;
&lt;p&gt;Rubbish&lt;/p&gt;
&lt;h2&gt;The Morning Show&lt;/h2&gt;
&lt;p&gt;Really good. Something that bugs me about this though. In the show they have this apartment, and it&amp;#8217;s really recognisable because they have these black metal and glass stairs coming into the living room, 	and they always shoot the stairs head on. Well it&amp;#8217;s the same apartment that one of the characters has in Westworld. It&amp;#8217;s also in Homeland too. &lt;/p&gt;
&lt;p&gt;This drove us both insane for a while.&lt;/p&gt;
&lt;h2&gt;Mythic Quest&lt;/h2&gt;
&lt;p&gt;Pretty good&lt;/p&gt;
</description>
      <pubDate>Wed, 02 Sep 2020 23:00:00 +0100</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/house-what-id-have-done-different</guid>
      <link>https://garry.net/posts/house-what-id-have-done-different</link>
      <title>House - What I'd Have Done Different</title>
      <description>&lt;p&gt;	About 6 years ago, just before Alex was born we decided that our house wasn&amp;#8217;t big enough. So after looking at a few houses I decided that none of them were really big enough for us and it&amp;#8217;s be better to buy a cheapish one and renovate it.&lt;/p&gt;
&lt;p&gt;	So we bought one that was equidistant to our parents houses (I would have preferred to move in the middle of the countryside with no neighbours for miles &amp;#8211; but Sarah didn&amp;#8217;t like that idea). 	When we got an architect involved he said we might as well knock it down and build a new one. So we ended up doing that.&lt;/p&gt;
&lt;p&gt;	It hasn&amp;#8217;t been smooth sailing. It was over schedule by like a year and a half or something and here&amp;#8217;s a &lt;a href="/house-fuckups"&gt;list of fuckups&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;If you&amp;#8217;re going to care about the end result, care about the process&lt;/h2&gt;
&lt;p&gt;This is something that life seems to have taught me a lot. Whether you&amp;#8217;re hiring people to make prototypes, building a house or porting a game to console.. if you&amp;#8217;re going to care about how it turns out you need to be a constant presence.&lt;/p&gt;
&lt;p&gt;If you tell them what you want then come back 3 years later when it&amp;#8217;s done.. you lose the right to bitch about decisions they made without you. You should have been there at that point to understand why and influence the decisions.&lt;/p&gt;
&lt;h2&gt;If their hair isn&amp;#8217;t grey, stay away&lt;/h2&gt;
&lt;p&gt;A thing I noticed is that any time someone came to fix something and they were under 40, they broke 3 more things before they left. When someone over 40 came to fix something they fixed it for good.&lt;/p&gt;
&lt;h2&gt;Find a local builder&lt;/h2&gt;
&lt;p&gt;The firm that built our house were a 2 hour drive away. My hunch is that if something goes wrong and they need to send someone to fix it, they&amp;#8217;re not going to waste 4 hours of their top guys time travelling to the site. They&amp;#8217;re going to send the guy who has nothing else to do.&lt;/p&gt;
&lt;p&gt;They&amp;#8217;re also either going to hire local tradesmen, who they don&amp;#8217;t know, or people they do know that are going to have the same problem.&lt;/p&gt;
&lt;h2&gt;Don&amp;#8217;t pay on time&lt;/h2&gt;
&lt;p&gt;My dad was a painter so I remember tense times when he wasn&amp;#8217;t getting paid on time. So the first three quarters of the build I made sure that any invoice I got was paid pretty much the same day.&lt;/p&gt;
&lt;p&gt;We had problems where the builder hadn&amp;#8217;t fully paid some subcontractors because they still had snagging to do, so they refused to come and do the snagging.&lt;/p&gt;
&lt;p&gt;So while I was being the good guy and paying the builders on time, I should have been holding that money back to force the builder to resolve these issues.. which is what I ended up having to do later on. The money is the only power you&amp;#8217;ve got so you need to use it right.&lt;/p&gt;
&lt;h2&gt;Think about the garden&lt;/h2&gt;
&lt;p&gt;We should have thought about the garden at the same time. We should have got a design for the garden from someone that knows about gardens.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s not the end of the world because it&amp;#8217;s given us time to see it throughout the seasons and hopefully make better decisions than we would have. But it does mean that we wasted a ton of money on unsuitable white tiles in the back garden for no reason.&lt;/p&gt;
</description>
      <pubDate>Sun, 23 Aug 2020 23:00:00 +0100</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/house-fuckups</guid>
      <link>https://garry.net/posts/house-fuckups</link>
      <title>House - Fuckups</title>
      <description>&lt;p&gt;	Let me preface this by saying that the house is awesome. I&amp;#8217;ve got a special ability to find things that are wrong. I&amp;#8217;m not a big moaner but I was very aware	that we had a limited time to pick up on stuff and get them fixed. Also keep in mind that this is only the stuff I&amp;#8217;m aware of.&lt;/p&gt;
&lt;p&gt;	Here&amp;#8217;s a list of fuckups. &lt;/p&gt;
&lt;h1&gt;BEFORE MOVING IN&lt;/h1&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/2f6c39fc7b2efe69.png /&gt;	Cracked mirror while installing light fitting. The electrician did this 3 times.&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/b73640550d1ea171.png /&gt;	These flushers are meant to be tiled around neatly. The tiler didn&amp;#8217;t get that message though and assumed there was a trim.&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/42f66272794722e7.png /&gt;	They cut the hole massive for these little thermostat thermometers &lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/7cc24095870ad00e.png /&gt;	Tiled over the outside light hole&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/6e598644204b5a66.png /&gt;	This wallpapering&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/b59d0164cbf7bf66.png /&gt;	Put the speakers in the wrong place&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/97bfa90e8507e5a7.png /&gt;	&lt;img src=https://cdn.garry.net/wpi/b11c7656b82eb9fa.png /&gt;	Wrong colour lights&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/dcdc9e5b9369900b.png /&gt;	Terrible plastering&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/658793ee3dd641e6.jpg /&gt;	This is how the home automation people treated the server racks&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/e22c37a71858adae.png /&gt;	This is how they looked after the remote controls&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/ef65e06cb3bfe0e0.png /&gt;	They had to smash this 2m high tile off to adjust the pipework underneath. The plumber had forgot to attach the pipework to the valve, so whenever the water was turned on	for this section of the house, the shower ran with no way to turn it off.&lt;/p&gt;
&lt;h1&gt;AFTER MOVING IN&lt;/h1&gt;
&lt;p&gt;We moved in at this point. It was a few weeks before xmas. From memory, the cinema wasn&amp;#8217;t done, the home automation wasn&amp;#8217;t done (and the guy in charge of it quit his job just before we moved in, leaving a less experienced guy to try to pick up the pieces). I&amp;#8217;m pretty sure we had a wooden block to hold the front gates shut because that wasn&amp;#8217;t working yet.&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/88fe023637d7de84.png /&gt;	Slow leaking pipe behind one of the cupboards&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/cd08abb2201be1d8.png /&gt;	The surface water pump kept making an alarm sound. They had the electrician fuck with it for some reason, he raised the floats. It kept happening. The proper pump guys came out	and knew what they were doing. One of the pumps was actually wired backwards so it was blowing instead of sucking. These guys are &lt;a href="https://allpumpsolutions.com/"&gt;All Pump Solutions&lt;/a&gt; and if you have a pump in your	garden I definitely recommend them, after days of the builders fucking around trying to get the electrian to fix it, they fixed it in 20 minutes. &lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/41662f4f6ec8f0f9.png /&gt;	Missing actuators on the underfloor heating meant that these two zones were always on if one of the other zones was ever on.&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/2fb067c6d4d7f51b.png /&gt;	They fixed the gates, but they keep fucking up.&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/cfc363f12ff61956.png /&gt;	Toilet leaks&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/c236f6a7ede3356.png /&gt;	Home Automation people left the lighting node open and all their rubbish everywhere&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/8f2d1d53870dce53.png /&gt;	The lighting under my sink has a 240v cable taped together feeding it.&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/997cdb1cd8f9ea4.png /&gt;	This is what it looked like when the Home Automation People were finished&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/4c5e744ea60eb567.png /&gt;	They tried to spray the fire surround to match the inner section but gave up after one spray because it looked a right mess. But left it like that anyway.&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/7b0ece9c9635bbf3.png /&gt;	Steam room only sometimes works. This took about 6 months to fix. The temperature sensor wasn&amp;#8217;t connected and there was some hard water thing that wasn&amp;#8217;t connected. This only got fixed after I asked the pool people to take a look at it (the electrician was messing with it before).&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/1c85985009519969.png /&gt;	&lt;/p&gt;
&lt;p&gt;The kitchen sinks weren&amp;#8217;t draining. They came out and rodded the drains but there weren&amp;#8217;t any blockages. A few weeks later they realised that the pipes had never actually been attached to the drain.&lt;/p&gt;
&lt;p&gt;They were just soaking away into the dirt underneath the house.&lt;/p&gt;
&lt;p&gt;They were lucky because they managed to find the pipe and route it to a drain &amp;#8211; or they&amp;#8217;d have had to dig the driveway up to fix it.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/2a72d7770d3c2c0b.png /&gt;	&lt;/p&gt;
&lt;p&gt;The shower valve here kept falling off. They angle grinded the tiles back, causing them to break. Their solution was to stick a bunch of silicone in the hole and call it a day.&lt;/p&gt;
&lt;p&gt;Much later we found that they&amp;#8217;d put all the pipework too deep in this wall and had the entire thing torn out and the pipes bought forward.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/a752d50ce4a304a2.png /&gt;	This fucking wiring. Someone thought this was okay.&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/d0f686f5962e475c.png /&gt;	The NVR in the server rack was making a lot of noise. Look at the state of this.&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/d054a77684db08c8.png /&gt;	The stairs all started fucking up. We had a lot of shrinkage in the wood all over the house. I&amp;#8217;m guessing this means they should have kept the wood warm and dry for a few months in the house to avoid this.	We ended up getting a french polisher that fixed this all pretty good.&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/30d9d03286b6ea1a.png /&gt;	&lt;img src=https://cdn.garry.net/wpi/623848134c82ddc6.png /&gt;	&lt;/p&gt;
&lt;p&gt;Water was leaking out of the wall down the living room window when we opened it. The builder had no idea what was happening. It made a big damp spot on the living room ceiling.&lt;/p&gt;
&lt;p&gt;I did some tests and it turned out it was leaking through a grout line crack in Alex&amp;#8217;s shower. Which shouldn&amp;#8217;t have been possible because it was meant to have been fully tanked.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/548224bf6aba7002.png /&gt;	This shower had the same problem with the threaded rods being too short because the pipework was set too far back.&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/fbdf9b7d64a5d2ef.png /&gt;	&lt;img src=https://cdn.garry.net/wpi/2cbb587473c2d59.png /&gt;	&lt;/p&gt;
&lt;p&gt;There&amp;#8217;d been a terrible shitty smell in the swimming pool room. The plumber couldn&amp;#8217;t find a problem and it was one of those situations where it didn&amp;#8217;t stink like shit any time they came.&lt;/p&gt;
&lt;p&gt;I found that there was an OPEN SOIL PIPE in the plant room, right behind the air handling system. This is a vent pipe so the water can flow out properly and according to the plans it should have been taken all the way up out of the roof. In the end we put an air admittance valve on it and called it a day, problem solved.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/43f93e7c308f4183.png /&gt;	&lt;/p&gt;
&lt;p&gt;Because tiles got cracked, smashed and chipped we ended up with replacement tiles that are from a different batch, so are noticably different.&lt;/p&gt;
&lt;p&gt;Never have white tiles&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/ede0f294757a3129.png /&gt;	&lt;/p&gt;
&lt;p&gt;The basement also occasionally smelt like shit. I found an air admittance valve that had been cable tied open. The plumber obviously found this in his van and stuck it in without checking it. These are meant to be one way, letting fresh air in but closing and not letting air out. I didn&amp;#8217;t trust it anymore so I replaced it with a new one.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/f1c385fe90fce3bd.png /&gt;	&lt;/p&gt;
&lt;p&gt;Some of the LED strip lights kept failing in the pool room. The electrician was replacing them every month.&lt;/p&gt;
&lt;p&gt;It turns out the plumber hadn&amp;#8217;t fitted the overflow in the sink in there, and the drivers were underneath it.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/52f5c161de49ab54.png /&gt;	&lt;/p&gt;
&lt;p&gt;A leak appeared in the kitchen ceiling. Builder/plumber had no idea what it was. It turned out that none of the toilets upstairs were fitted properly &amp;#8211; we only discovered this when we got another builder to take over.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/25cc269ec27e1f1f.png /&gt;	&lt;img src=https://cdn.garry.net/wpi/a7a97d59914dfbf7.png /&gt;	&lt;/p&gt;
&lt;p&gt;A leak in the downstairs toilet. The condensate pipe from the air conditioner wasn&amp;#8217;t connected properly &amp;#8211; the air con guy fixed it pretty quickly.&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/622a1bd72c65f384.png /&gt;	&lt;/p&gt;
&lt;p&gt;It turned out that when they&amp;#8217;d drilled the pillars of the gates to put extra reinforcing plates on, they&amp;#8217;d also drilled through all the wiring.&lt;/p&gt;
&lt;p&gt;This is why they were so inconsistent. This was diagnosed and fully fixed once they&amp;#8217;d got a real gate guy who knew what he was doing out to look at them.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/4390eeee3b28b6f4.png /&gt;	&lt;img src=https://cdn.garry.net/wpi/c7459d3abe59b0fa.png /&gt;	&lt;/p&gt;
&lt;p&gt;This fucking pool tv. So the waterproof tv guys delivered the TV, started installing it, and got it in. Then they left and the home automation guy tried to install the mirror by himself.&lt;/p&gt;
&lt;p&gt;He dropped it and it smashed everywhere, scratching the TV. So then the pool tv people are saying that the home automation people need to replace the tv &amp;#8211; because they fucked it. The home automation people are saying nah, you should have stayed and helped.&lt;/p&gt;
&lt;p&gt;In the end the home automation people have to pay for it on their insurance.. but they hold the TV ransom and refuse to deliver it until the builder has paid them everything they&amp;#8217;re owed.. but they obviously have a ton of snagging left to do.&lt;/p&gt;
&lt;p&gt;So in the end I&amp;#8217;m like, fuck this, I&amp;#8217;ve already paid for it and I&amp;#8217;m the only one getting fucked, so I&amp;#8217;m going to order a new TV and you can keep that one.&lt;/p&gt;
&lt;p&gt;In the end they hand over the TV but refuse to install it &amp;#8211; which is fine because the guys a bit of a cunt and we didn&amp;#8217;t want to deal with them anymore.&lt;/p&gt;
&lt;p&gt;And after all that the TV is a load of shit. I should have just put a sony bravia in there and only watched it at night.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/4005dd58dc934514.png /&gt;	&lt;img src=https://cdn.garry.net/wpi/db2afee22e63dc64.png /&gt;	&lt;/p&gt;
&lt;p&gt;When it rains there&amp;#8217;s a drip sound behind the fireplace in the living room.&lt;/p&gt;
&lt;p&gt;This pipe thing on top of the chimney was siliconed in and it&amp;#8217;s failed.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/d609397a59e596ad.png /&gt;	The pipe coming from the extractor fan in the pool toilet is too long and ripped. Condensation is forming and leaking out into the ceiling. I ended up fixing this myself and put a hatch in the ceiling so I can keep an eye on it.&lt;/p&gt;
&lt;p&gt;	&lt;img src=https://cdn.garry.net/wpi/98db1474bcab4876.png /&gt;	&lt;/p&gt;
&lt;p&gt;They hadn&amp;#8217;t sealed the bottom of the gate control box properly. A slug got in and fried itself and the circuit board. I &lt;a href="https://twitter.com/garrynewman/status/1276524223121457162"&gt;managed to fix this myself&lt;/a&gt;.&lt;/p&gt;
&lt;/p&gt;
&lt;h2&gt;NOW&lt;/h2&gt;
&lt;p&gt;We&amp;#8217;re pretty happy now. There aren&amp;#8217;t any big unresolved issues anymore. Lockdown has been good because I&amp;#8217;ve spent time going through smaller things and fixing them.&lt;/p&gt;
&lt;p&gt;One of the issues for me was that the old builders/electricians/plumbers fucked things up and you have to give them a chance to make it right. But we gave them that chance and half the time they made things worse.&lt;/p&gt;
&lt;p&gt;So what we decided to do is fuck them off as soon as possible and get it all fixed ourselves. To be fair to them &amp;#8211; they played ball and knocked the money off to pay for that, and we&amp;#8217;ve been really happy with the new builders.&lt;/p&gt;
&lt;p&gt;The work the builders did themselves is pretty good.. the issues seem to have come from their ability to keep tabs on and understand what the subcontractors were doing.. and that was a big part of their job too.&lt;/p&gt;
&lt;p&gt;&lt;a href="/house-what-i-would-have-done-different"&gt;Lessons learned&lt;/a&gt;.&lt;/p&gt;
</description>
      <pubDate>Sun, 23 Aug 2020 23:00:00 +0100</pubDate>
      <image>https://cdn.garry.net/wpi/2f6c39fc7b2efe69.png</image>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/receiver-broken</guid>
      <link>https://garry.net/posts/receiver-broken</link>
      <title>Receiver Broken</title>
      <description>&lt;p&gt;A couple of times we&amp;#8217;ve been watching a movie in my cinema and the sound has cut out.&lt;/p&gt;
&lt;p&gt; The first time this happened was during a pivotal scene in The Martian, when the sound was really loud. We kept watching because we thought it was an artistic decision in the movie, to just drop it to completely silent to ramp up the tension.&lt;/p&gt;
&lt;p&gt;	I set a PC up to play games in there a few weeks back. I noticed a couple of days ago that when I played sound just through the back right speaker the amp just turned itself off.&lt;/p&gt;
&lt;p&gt;	So I googled it, found nothing. Messed with the settings, found nothing. Messed with the connections, found nothing. I swapped the cables over and the sound for that channel played fine though another speaker, so I started to think that speaker was fucked.&lt;/p&gt;
&lt;p&gt;	I got my multimeter on the speaker wires from the amp. The resistance on all of the speaker was something like 0.5, but the resistance on the right back speaker was 0. So this made me think that the speaker had blew up or something.&lt;/p&gt;
&lt;p&gt;	So I managed to get it out of the wall and it looked fine. So I tested the wire with it disconnected and it still had continuity.. which could only mean one thing. It&amp;#8217;d got fucked somewhere.&lt;/p&gt;
&lt;p&gt;	&lt;a href=https://cdn.garry.net/wpi/a86aece93d4df33e.png&gt;&lt;img src=https://cdn.garry.net/wpi/a86aece93d4df33e.png /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;	I could see the wire went up and to the right slightly instead of straight up. It had metal shielding but not until it&amp;#8217;d reached a certain point. You an see the picture above the wooden plank that goes over the top, that had a couple of drill holes in it just aboive and to the right.&lt;/p&gt;
&lt;p&gt;	So I cut a hole. It didn&amp;#8217;t matter because it&amp;#8217;s all covered anyway. And sure enough..&lt;/p&gt;
&lt;p&gt;	&lt;a href=https://cdn.garry.net/wpi/2960e3d043136d82.png&gt;&lt;img src=https://cdn.garry.net/wpi/2960e3d043136d82.png /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;	The wire was actually stuck in the dot and dab adhesive they stick the plaster boards on with, but I managed to saw it out and pull it out a bit more. You can see the hole here that peirced it.&lt;/p&gt;
&lt;p&gt;	&lt;a href=https://cdn.garry.net/wpi/b1925cd5267adf7a.png&gt;&lt;img src=https://cdn.garry.net/wpi/b1925cd5267adf7a.png /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;	I got it all back connected. I&amp;#8217;d have liked to have crimped these wires together properly instead of using a connector but I don&amp;#8217;t know how to do that properly yet.&lt;/p&gt;
&lt;p&gt;	&lt;a href=https://cdn.garry.net/wpi/1ed71153a9bc7afe.png&gt;&lt;img src=https://cdn.garry.net/wpi/1ed71153a9bc7afe.png /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;	At this point Sarah came home and walked in on me. She saw the wall all off, the speaker off, plasterboard dust all over the floor and extra holes in the wall. She bought her hands up to her head and said &amp;#8220;Oh god, what are you doing now?&amp;#8221;.&lt;/p&gt;
&lt;p&gt;	&lt;a href=https://cdn.garry.net/wpi/80bc967f45eb8ef8.png&gt;&lt;img src=https://cdn.garry.net/wpi/80bc967f45eb8ef8.png /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;	The problem was fixed though, and the wall went back on and you could hardly tell I&amp;#8217;d fucked around.&lt;/p&gt;
&lt;p&gt;	So who&amp;#8217;s fault was this? You can&amp;#8217;t really blame the guy who put the wall panels on because he&amp;#8217;d done what you would do, which is assume the wires go straight up or straight down. Sure he could have tested.. would a stud finder have found the cable with no voltage going through it?&lt;/p&gt;
&lt;p&gt;	The speaker cable was obviously going to the wrong spot and they&amp;#8217;d had to move the hole a foot to the left. You can see how it would have been impossible to protect the cable from there, because it was stuck in the adhesive.&lt;/p&gt;
&lt;p&gt;	So I&amp;#8217;m going to give a verdict of no blame. One of those things. It gave me the opportunity to fuck around and fix something so no big harm.&lt;/p&gt;
</description>
      <pubDate>Fri, 21 Aug 2020 23:00:00 +0100</pubDate>
      <image>https://cdn.garry.net/wpi/a86aece93d4df33e.png</image>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/my-feet-are-fucked</guid>
      <link>https://garry.net/posts/my-feet-are-fucked</link>
      <title>My Feet Are Fucked</title>
      <description>&lt;p&gt;They hurt when I stand up after sitting down for a while or when I get out of bed. After a minute they stretched out and are like normal feet.&lt;/p&gt;
&lt;p&gt;I only realised recently how fucked they are, before that I thought it was something that affected everyone. I think they&amp;#8217;ve slowly got worse over the last few years and now they&amp;#8217;re to the point where the doorbell goes and I&amp;#8217;m struggling to get to the door in time. I think it&amp;#8217;s a snowball effect too, like I&amp;#8217;ll ask one of the kids to fetch me the remote so I don&amp;#8217;t have to get up and have my feet hurt.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m guessing it&amp;#8217;s a combination of being a fat prick and sitting on my arse all day. I&amp;#8217;ve been trying to stretch them out whenever I remember about it, but I think it&amp;#8217;s doing more harm than good and should probably be freezing them or heating them instead.&lt;/p&gt;
</description>
      <pubDate>Thu, 30 Jul 2020 23:00:00 +0100</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/unity-2020</guid>
      <link>https://garry.net/posts/unity-2020</link>
      <title>What Unity Is Getting Wrong</title>
      <description>&lt;h2&gt;Developer QOL&lt;/h2&gt;
When I added Lua to Garry’s Mod my intention wasn’t primarily to make things moddable. I wanted to make things easier for myself. By wrapping a few functions and coding	in Lua I could iterate a million times faster. I didn’t have to close, compile and re-open every time, while also hiding all the bullshit and hard stuff.

Unity was about that when we first started with it. They hid all the hard stuff in c++ so we didn’t have to think about it. The more time has gone on, the more	bullshit has crept to the forefront. The’ve gone from hiding the hard stuff to moving more and more stuff into C#.

So while other engines have been trying to catch Unity up in terms of developer friendliness, Unity has been going the other way by making itself more unfriendly.
&lt;h2&gt;Render Pipeline&lt;/h2&gt;
Switch to one of the new render pipelines they’ll tell you. They’re faster, they’ve got more features. The old pipeline won’t be updated any more.

So you’ve got two choices URP or HDRP. Both are incompatible with each other. Switching is a one way destructive operation. You can’t press a button and try it and decide you want to change back a month later. You’re converting every material in your project.

This is a good example of something that could have been hidden in the backend. Choose one pipeline and make it the default. Don’t have an unsupported render pipeline as your main, default pipeline for 2 years. Sure have low and high pipelines, have low as the default, but come up with a pipeline/shader agnostic material system first so we can switch between them – or even ship both.
&lt;h2&gt;UI&lt;/h2&gt;
There’s nothing fundementally wrong with the Unity UI system. Sure it uses transforms so it uses more memory than it should.

But no improvements, no new controls, because they’re planning to replace it with UIElements (in a couple of years).

There’s a lot they could have done to improve Unity UI. It has bugs. It has a lot of problems with Layouts performing badly (lots of GetComponents in the layouts). It could be rendering faster.	It could have a stylesheet system. It could have been gradually improved.

The font system that Unity UI uses could have been improved. But they bought TextMeshPro, packaged it up and you’re advised to use that instead. The nice thing would have been to have improved the font system in the backend so everyone automatically benefitted from it. As it is, if you want to use TMP you need to manually update every UI prefab in your game – which again, is one way and destructive.
&lt;h2&gt;Multiplayer&lt;/h2&gt;
I don’t even know what’s happening with multiplayer. UNet has been deprecated for 4 years. Every page in the multiplayer documentation has this warning. They had a HLAPI and LLAPI being developed a couple of years ago – has that been released, should people be using it?

My nagging feeling is that they’re working on something else. Something to lock you into paying for their multiplay services.

They point to the &lt;a href="https://github.com/Unity-Technologies/FPSSample"&gt;FPSSample&lt;/a&gt; to see an example of how to use the network code. The glaring thing about this is that it uses Unity 2018.3.8f1.. and this:
&lt;blockquote&gt;The first time you open the project you need patience! It takes a while to import all the assets.

NOTE: Due to a bug in Unity 2018.3, you have to take the following step right after the initial import: 1 Search for Firstperson_Projection in the Project search field. Select the 4 shaders, right click and reimport them. 2 If you have script compile errors related to entities, you need to remove and re-install the entities package.&lt;/blockquote&gt;
Which brings us to another point..

&lt;b&gt;Update:&lt;/b&gt; These are apparently also deprecated.
&lt;blockquote&gt;the HLAPI and LLAPI are the old, deprecated things. The replacement they’re working on is at least 6 months late, still in alpha, unnecessarily tied to DOTS, and performs badly.&lt;/blockquote&gt;
&lt;h2&gt;Demos&lt;/h2&gt;
Unity’s demos have always been fire and forget. I’m sure this is hell for anyone coming to the engine fresh, trying to Run a demo that is 2 years old and being in upgrade hell.

This FPSSample should be running on the latest non beta version of Unity. It shouldn’t have warnings about import times because they should have solved that. It shouldn’t have instructions for working around editor bugs, because they should be fixed. It shouldn’t warn you that the multiplayer component shouldn’t be used in production environments – because that’s what your demo should be selling.

The short movie demos aren’t impressive. It’s embarassing when half your keynote is a group of artists explaining how they spent 6 months re-writing half the engine to render something that they could made in Maya in a week.

Show me a 100 player PUBG type game running at solid 60fps on a current gen console or mobile. We already know you can render a GTA3 cutscene.
&lt;h2&gt;DOTS&lt;/h2&gt;
Want your game to run better? Recode the entire thing using DOTS. Another one way destructive change.

I can see the benefits of DOTS from a data point of view. I get why it uses less memory, I get that if you’re starting a game from scratch you might consider it, I get that it’s a work in progress.

I don’t get why it speeds rendering up. I don’t get why those improvements to rendering couldn’t happen in the engine code.

I don’t understand why it’s being pushed as a solution to everything when it’s a solution to such a specific problem and robs Unity of its simplicity and user friendliness. It gets to a point where you just might as well use UE.
&lt;h2&gt;Instability&lt;/h2&gt;
The instability leads to wider problems. Five years ago when you searched for a problem you found someone with the same problem and underneath a solution.

With the fragmentation and the 60 versions of Unity available that’s a lot less likely. If you’re searching how to do something, the first 5 answers you find are going to be out of date – and they’re usually from Unity’s own documentation.
&lt;h2&gt;Services&lt;/h2&gt;
So they have a bunch of services. Analytics, crash reporting, cloud build, live ops stuff. They need to make money, that’s fair enough.

There’s an issue with all the services though – they’re all dog shit.
&lt;h2&gt;In Summary&lt;/h2&gt;
An engine works best when it’s used as a foundation that can be improved without all the houses built on top of it having to be rebuilt.

There’s no doubt that Unity are improving things, but it’s like living in a house that is continually being renovated. You’ve got comfortable in a room, installed all your fitted furniture, decorated all the walls, and then Unity come in and tell you they need to take the floor up again.

Hopefully this is just a bad period for Unity and there will come a time where they stop ripping the floors up.</description>
      <pubDate>Thu, 21 May 2020 23:00:00 +0100</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/lockdown-kicks-ass</guid>
      <link>https://garry.net/posts/lockdown-kicks-ass</link>
      <title>Lockdown Kicks Ass</title>
      <description>&lt;p&gt;It&amp;#8217;s weird seeing people struggle with being home all the time. Climbing the walls, bored out of their head, willing to risk the lives of their loved ones just to be in the presence of other humans.&lt;/p&gt;
&lt;p&gt;This is my dream existence. I don&amp;#8217;t have to go anywhere, I don&amp;#8217;t have to see anyone, delivery guys leave stuff on the doorstep and walk away.&lt;/p&gt;
&lt;h2&gt;Cancellations&lt;/h2&gt;
&lt;p&gt;Every few days something pops up in my calendar. A party, a meal, a meeting, Sarah&amp;#8217;s nails appointment, Sarah&amp;#8217;s hair appointment. Every time I get a little ping of relief that it isn&amp;#8217;t happening, I&amp;#8217;ve got out of it without doing anything.&lt;/p&gt;
&lt;p&gt;Our wedding got cancelled. We were getting married in mid-August. Even that getting cancelled is a good thing. We don&amp;#8217;t have to worry that it&amp;#8217;s going to get cancelled &amp;#8211; we already know. We have more time to prepare for next year. I was having stress dreams about the horrible green carpet at the venue.&lt;/p&gt;
&lt;p&gt;We were lucky. It got cancelled and we got our deposit back. I&amp;#8217;m sure there&amp;#8217;s thousands of people that were getting married around now that have got really fucked over by it. We didn&amp;#8217;t lose much apart from the time planning, but even that&amp;#8217;s a plus because we can treat it as a test run.&lt;/p&gt;
&lt;h2&gt;Facepunch&lt;/h2&gt;
&lt;p&gt;Even wierder is how it affects tech companies. You make all your staff go to the same place every day? When the internet exists?&lt;/p&gt;
&lt;p&gt;This is how we&amp;#8217;ve always worked. There&amp;#8217;s only a handful of us that regularly work from the office &amp;#8211; and everyone is capable of working remotely (apart from cleaners, receptionist).&lt;/p&gt;
&lt;p&gt;I told people that obviously their safety and the safety of their families comes first &amp;#8211; so not to sacrafice those things for work &amp;#8211; they&amp;#8217;re going to get paid either way &amp;#8211; but that&amp;#8217;s always been the case.&lt;/p&gt;
&lt;h2&gt;Charmed&lt;/h2&gt;
&lt;p&gt;I understand I live a charmed existence. I have a nice house with a nice garden, I have an air conditioned office, I have an alive spose who takes care of our kids and cooks our meals. Not everyone is so lucky.&lt;/p&gt;
&lt;p&gt;But I also understand that this could all turn to shit at any time.&lt;/p&gt;
&lt;p&gt;My point is that if I&amp;#8217;ve got a computer with the internet, the air is a reasonable temperature, and I am left alone for long periods of time &amp;#8211; I am the happiest man on earth.&lt;/p&gt;
</description>
      <pubDate>Sat, 11 Apr 2020 23:00:00 +0100</pubDate>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/half-lifealyx-is-a-masterpiece</guid>
      <link>https://garry.net/posts/half-lifealyx-is-a-masterpiece</link>
      <title>Half-Life:Alyx is a Masterpiece</title>
      <description>So I haven’t finished HLA yet. According to Steam I’ve played it for 6 hours so far, so here’s what I think.
&lt;h2&gt;Fan Boy&lt;/h2&gt;
Despite making Garry’s Mod and knowing pretty much everything about Half-Life 2, I wouldn’t consider myself a Half-Life universe fanboy. I enjoyed the story less as it went on. There are things that interest me, mostly the human side, the displaced and downtrodden people. The holocausty aspect of it. The grim discoveries, like the piles of burn corpses on the coast.

Alyx as a character is totally flawless – and that’s a bad thing. You like Kleiner because he’s dizzy and he has a pet. You like Mossman because she’s a slut. You even like Breen because even though he’s getting it wrong, he’s doing what he thinks is the right thing.

I didn’t really enjoy the Half-Life Episodes, I put that down to being too close to the Engine. I was running around looking for new entities and models to exploit in GMod. I didn’t care about the story progression, I barely remember what happened at the end of Half-Life 2.
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;img src="https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fi.ytimg.com%2Fvi%2F78EkL_lSezU%2Fmaxresdefault.jpg&amp;amp;f=1&amp;amp;nofb=1" alt="Half Life Alyx - Chapter 5 Northern Star: Hotel Stairs and ..." /&gt;

Alyx blows me away. I just think like, how the fuck can humans make something like this. The detail, the physics, the framerate, the graphics, the gameplay, it’s just insanity.

It’s a legit work of art.

It reminds me of when we were knocked out by the Source 2, from the scans of magazine HL2 screenshots. Not being able to believe it could be a computer game.
&lt;h2&gt;Detail&lt;/h2&gt;
The detail is immense. You really can tell that every room had people slave over it, they thought about how it was used, the kind of person that lived there, what happened to make them leave.

It’s the kind of detail where after a while you stop looking, because you know it’s there. Like in real life. You don’t pick up and read everything you come across because you know it’s a bullshit waste of your time.

The infested areas are amazing. When we saw Xen in HL1 it was just angled blocks with different textures. Now it’s a living thing, they’ve thought about how it consumed its surroundings. There are bits that light up, bits that pulsate, drippy bits, bits that look like balls, bits that look like crossed vaginas. It’s total art.

When I first saw the detail I thought to myself.. okay, this is going to be a short game. But it keeps going. There’s some obvious prop repetition but you find that in every new area there’s new props and textures that you didn’t see in the last one. I saw a hairbrush in a bathroom and I’ve made a conscious effort to see if it was used somewhere else – so far it hasn’t.
&lt;h2&gt;Lighting&lt;/h2&gt;
&lt;img src="https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fsteamcdn-a.akamaihd.net%2Fsteam%2Fapps%2F546560%2Fss_4912f4c3d259a472e9898f0a7b1f819a533d2c1e.1920x1080.jpg%3Ft%3D1588704198&amp;amp;f=1&amp;amp;nofb=1" alt="Half-Life: Alyx on Steam" /&gt;

What the fuck is going on with the lighting. How does it look so amazing. Is it just VR thing that makes it look so good?

There’s some volumetrics going on here – is that what’s making it look so real? They really nailed the lighting.

The normals and reflections on objects when you hold them to the light is insane. I can’t really work out whether that’s an amazing Valve Art Guys thing or if it’s because it’s in VR.. because the Rust guns look unexpectedly good in Rust VR too.

I really can’t emphasise this enough. They really nailed the fuck out of the lighting.
&lt;h2&gt;Gameplay&lt;/h2&gt;
I’m playing the game on Normal and it seems really well balanced. It’s challenging but not impossible. I have enough ammo but always feel like I don’t.

I started off feeling like the zombies took too many hits. One bullet through the headcrab should surely be enough. I think it’s like this to warrant using the later weapons though.

There’s no cheap shots. I always expect something to trigger something else to give a jump scare. Like okay – I’m going to open this door and something is gonna jump at me. I’m gonna pull this switch and that door will open and 10 zombies will charge though. There’s going to be a headcrab in this cupboard. None of that though.

The game progresses enough that once you start getting bored of doing a certain thing, it’ll introduce something new. The old Valve rules of 3 (see, practice, do) isn’t so plainly obvious as it was in the episodic stuff.

It feels a lot less hand-holdy than the episodes.
&lt;h2&gt;VR&lt;/h2&gt;
&lt;img src="https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fmedia.rawg.io%2Fmedia%2Fuser_images%2Fc95%2Fc955bc7272c1a50efa8e850b44ab3ca4.jpg&amp;amp;f=1&amp;amp;nofb=1" alt="Half-Life: Alyx ??? ?????????? ?? ????, ????, ???? ?????? ..." /&gt;

So what does this do to VR gaming? Are we excited for more VR titles?

Well, it’s worth playing standing up and having your face sweat and ache for a couple of hours at a time, and that’s a big step to get over. It’s an experience that any PC gamer should be getting if they don’t already have a VR system.

It’s a shame Valve aren’t on the catching end of that though. That they don’t have their own VR console and that their VR hardware isn’t readily available. It’s a shame people are going to end up giving all their money to Facebook to be able to play.

It almost feels like it was made out of VR philanthropy, like they know they’re not going to make money from it – but it doesn’t matter. When everyone said they were finished as game developers, they’ve once again proven that they can cement their place at the top of the industry for another 10 years.</description>
      <pubDate>Wed, 25 Mar 2020 00:00:00 Z</pubDate>
      <image>https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fi.ytimg.com%2Fvi%2F78EkL_lSezU%2Fmaxresdefault.jpg&amp;amp;f=1&amp;amp;nofb=1</image>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/open-a-30gb-unity-log-on-windows</guid>
      <link>https://garry.net/posts/open-a-30gb-unity-log-on-windows</link>
      <title>Open a 30gb Unity Log on Windows</title>
      <description>&lt;p&gt;    We&amp;#8217;re having a problem with our Rust HDRP branch where it imports forever. We had log files on our build server that were 30gb.&lt;/p&gt;
&lt;p&gt;    The problem comes when you want to find out why they&amp;#8217;re so massive. You can search for an app to install to do it, but surely Windows should be able to do this itself? It&amp;#8217;s 2020.&lt;/p&gt;
&lt;h2&gt;Log Folder&lt;/h2&gt;
&lt;p&gt;&lt;img src=https://cdn.garry.net/wpi/eb5a7792bd39c1ce.png /&gt;Your editor log folder is probably in {0d2ea9d8d397d6ae549d7a28eabdef52cc52010845161897a8736269cd0593be}appdata{0d2ea9d8d397d6ae549d7a28eabdef52cc52010845161897a8736269cd0593be}/Local/Unity/Editor&lt;/p&gt;
&lt;h2&gt;Powershell&lt;/h2&gt;
&lt;p&gt;I&amp;#8217;ve never properly used powershell. I don&amp;#8217;t know what it is, I don&amp;#8217;t know how to use it, I don&amp;#8217;t know why it appear instead of the regular Command Prompt.&lt;/p&gt;
&lt;p&gt;But I did find a useful command for this situation.&lt;/p&gt;
&lt;pre&gt;&lt;a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-content?view=powershell-7"&gt;Get-Content&lt;/a&gt; Editor.log -tail 5000&lt;/pre&gt;
&lt;p&gt;This will print out the last 5000 lines of the file. So we can redirect that to another file like so:&lt;/p&gt;
&lt;pre&gt;&lt;a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-content?view=powershell-7"&gt;Get-Content&lt;/a&gt; Editor.log -tail 5000 &gt; tail.log&lt;/pre&gt;
&lt;p&gt;This is the first PowerShell command that I am committing to memory because it seems like it&amp;#8217;ll come in useful in the future.&lt;/p&gt;
&lt;h2&gt;Done&lt;/h2&gt;
&lt;p&gt;&lt;img src=https://cdn.garry.net/wpi/b48d38dc8658498e.png /&gt;&lt;/p&gt;
&lt;p&gt;Now you&amp;#8217;ve got a smaller file that you can open and see what&amp;#8217;s up.&lt;/p&gt;
&lt;p&gt;&lt;img src=https://cdn.garry.net/wpi/c9a6b4b7e59e25d6.png /&gt;&lt;/p&gt;
&lt;p&gt;Now you can send this bug to Unity. They&amp;#8217;ll ask you to send your 80gb project file. You&amp;#8217;ll say it&amp;#8217;s 80gb and that&amp;#8217;s crazy. They&amp;#8217;ll ask you to create a small reproduction project. Over 8 long emails they&amp;#8217;ll accept that this is impossible.&lt;/p&gt;
&lt;p&gt;Years later your grand-kids will get an email saying the bug is fixed in the next release. But the next release brings many new incompatibilities with your project and you died a long time ago.&lt;/p&gt;
</description>
      <pubDate>Wed, 11 Mar 2020 00:00:00 Z</pubDate>
      <image>https://cdn.garry.net/wpi/eb5a7792bd39c1ce.png</image>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/alex-the-gamer</guid>
      <link>https://garry.net/posts/alex-the-gamer</link>
      <title>Alex The Gamer</title>
      <description>&lt;p&gt;    Alex is 6 years old. His birth (which I documented &lt;a href="/child-birth"&gt;here&lt;/a&gt;) feels way longer ago than 6 years. He&amp;#8217;s old enough now that he has his own special interests.&lt;/p&gt;
&lt;p&gt;    He loves video games. Any time he comes in my office to tell me something, he stops mid-sentence and gawps with his mouth open at my monitor before asking me what I&amp;#8217;m doing.&lt;/p&gt;
&lt;p&gt;    Recently he&amp;#8217;s got into Minecraft. Hugely into it. To the point where we&amp;#8217;re worried that it&amp;#8217;s making him autistic. The first thing out of his mouth when he wakes up in the morning is a Minecraft fact. At night he watches Stampy, plays Minecraft on his iPad and then goes to sleep thinking about both of them.&lt;/p&gt;
&lt;p&gt;&lt;img src=https://cdn.garry.net/wpi/c5d60edaff0ea514.png /&gt;&lt;/p&gt;
&lt;p&gt;    We are sick to death of hearing about how awesome Stampy is. How funny he is, how good he is at Minecraft. Stampy said, Stampy said, Stampy said.&lt;/p&gt;
&lt;p&gt;He even makes posters for Stampy&lt;/p&gt;
&lt;p&gt;&lt;img src=https://cdn.garry.net/wpi/27d15c3f63cd1fe0.png /&gt;&lt;/p&gt;
&lt;p&gt;    Sarah would prefer to limit it. I know from experience when I was a kid that by limiting it you&amp;#8217;re making it more precious. So I prefer to give him full access and let him get bored of it &amp;#8211; because he&amp;#8217;s got to eventually &amp;#8211; right?&lt;/p&gt;
&lt;p&gt;    Plus it&amp;#8217;s got its benefits. Since he&amp;#8217;s starting playing his reading has got immensely better. He&amp;#8217;s gained the ability to quickly see, recognise and read words within a fraction of a second, down from about 3 seconds a word.&lt;/p&gt;
&lt;h2&gt;Alex The Streamer&lt;/h2&gt;
&lt;p&gt;    We&amp;#8217;ve got a cinema in our house (big woop). One day I let him play Minecraft on it. When he saw it on the big screen he said it was perfect because then he could record it with a camera like Stampy. This made me laugh, the idea that streamers need a huge screen to be able to record while they play, but I explained to him how they do it.&lt;/p&gt;
&lt;p&gt;    So then I showed him how to record the screen on his iPad. When he saw it work he did that dance that kids do, where it&amp;#8217;s like they really need the toilet.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s the result of the first time he did it. I wasn&amp;#8217;t involved in this at all &amp;#8211; I just took it off his iPad and uploaded it to my youtube.&lt;/p&gt;
&lt;p&gt;&lt;iframe loading="lazy" width="560" height="315" src="https://www.youtube-nocookie.com/embed/XNxGwvw8B4w" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s so funny to me how he mimics a Stampy&amp;#8217;s inflection. The phrases he wouldn&amp;#8217;t say in real life &amp;#8211; like &amp;#8220;welcome&amp;#8221; or &amp;#8220;this episode&amp;#8221;. The fake upbeatness of it all. There must be millions of young kids around the world right now that are stream-capable without even thinking about it.&lt;/p&gt;
&lt;p&gt;The day after I uploaded it I told him it&amp;#8217;d had 6 views. He was blown away &amp;#8211; it had exploded and gone viral on him. He&amp;#8217;s a superstar. He wanted to get right to work on a new video. I told him that real streamers only make one video a week.&lt;/p&gt;
</description>
      <pubDate>Thu, 05 Mar 2020 00:00:00 Z</pubDate>
      <image>https://cdn.garry.net/wpi/c5d60edaff0ea514.png</image>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/blazor-aint-ready</guid>
      <link>https://garry.net/posts/blazor-aint-ready</link>
      <title>Blazor Ain't Ready</title>
      <description>&lt;p&gt;    I love the idea of &lt;a href="https://dotnet.microsoft.com/apps/aspnet/web-apps/blazor"&gt;Blazor&lt;/a&gt;. Getting rid of Javascript and using C# for everything, what&amp;#8217;s not to love.&lt;/p&gt;
&lt;p&gt;    Well after trying it for a couple of projects, here&amp;#8217;s everything that is wrong right now.&lt;/p&gt;
&lt;h1&gt;1. Google&lt;/h1&gt;
&lt;p&gt;Google doesn&amp;#8217;t index Blazor sites. It doesn&amp;#8217;t load the webassembly. It only parses what&amp;#8217;s on the page before the webassembly loads.&lt;/p&gt;
&lt;p&gt;You could liken this to sites running VueJs &amp;#8211; but you shouldn&amp;#8217;t because Google parses Javascript and indexes those fine.&lt;/p&gt;
&lt;p&gt;The suggested solution to this is to also generate the page serverside as a placeholder. If you&amp;#8217;re doing that you might as well make the whole site serverside imo.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m sure if enough sites go webassembly that Google will have to eventually start loading them up and indexing them properly &amp;#8211; but it ain&amp;#8217;t happening yet.&lt;/p&gt;
&lt;h1&gt;2. Javascript&lt;/h1&gt;
&lt;p&gt;Unfortunately you still can&amp;#8217;t escape Javascript.&lt;/p&gt;
&lt;p&gt;First of all there&amp;#8217;s the startup javascript. I&amp;#8217;d have thought loading a webassembly would be like including an image, but it&amp;#8217;s apparently more complicated than that, requiring just under 100kb of javascript before it loads its first wasm.&lt;/p&gt;
&lt;p&gt;Then apparently it can&amp;#8217;t do certain things, like set the page title, or search the page and manipulate certain elements, or draw to a canvas, or play a sound, or get the window size. So you end up having to write &lt;a href="https://docs.microsoft.com/en-us/aspnet/core/blazor/call-javascript-from-dotnet?view=aspnetcore-3.1"&gt;shitty javascript interop functions&lt;/a&gt; to be able to do what you want. So now you&amp;#8217;re not only writing javascript, you&amp;#8217;re writing shitty javascript. You can&amp;#8217;t help but feel that any performance benefits of using web assembly are flushed down the bog because everything goes though a layer of javascript anyway.&lt;/p&gt;
&lt;h1&gt;3. Source Code&lt;/h1&gt;
&lt;p&gt;You&amp;#8217;d think since you&amp;#8217;re compiling to webassembly your code would all be jumbled up assembly that no-one can download and understand? Right?&lt;/p&gt;
&lt;p&gt;&lt;img src=https://cdn.garry.net/wpi/437af45ab42b2a13.png /&gt;&lt;/p&gt;
&lt;p&gt;Nope. It&amp;#8217;s legit c# dlls. You can download them and decompile to view the contents like any other .net dll.&lt;/p&gt;
&lt;h1&gt;4. Download Size&lt;/h1&gt;
&lt;p&gt;Maybe since they&amp;#8217;re all common Dlls they&amp;#8217;re versioned and downloaded and cached from a microsoft cdn, so once you&amp;#8217;ve visited a blazor site you already have 90{0d2ea9d8d397d6ae549d7a28eabdef52cc52010845161897a8736269cd0593be} of the content cached?&lt;/p&gt;
&lt;p&gt;Nope. Hope you like downloading 5mb to view a single page with the words &amp;#8220;Hello World&amp;#8221;&lt;/p&gt;
&lt;h1&gt;Summary&lt;/h1&gt;
&lt;p&gt;I love c#, I love doing web stuff, I don&amp;#8217;t love javascript. Blazor is the answer to my prayers in a lot of ways.&lt;/p&gt;
&lt;p&gt;This is all new, so I&amp;#8217;m sure all this stuff will get better over time, but for me right now it isn&amp;#8217;t ready to replace anything that needs indexing that gets casual viewers.&lt;/p&gt;
</description>
      <pubDate>Tue, 03 Mar 2020 00:00:00 Z</pubDate>
      <image>https://cdn.garry.net/wpi/437af45ab42b2a13.png</image>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/jailbreaking-control4</guid>
      <link>https://garry.net/posts/jailbreaking-control4</link>
      <title>Jailbreaking Control4</title>
      <description>&lt;p&gt;In a &lt;a href="/control4"&gt;previous post I talked about Control4&lt;/a&gt; and mentioned that you can jailbreak it. This lets you do things like add/delete/rename rooms and add/delete/rename devices. Things you&amp;#8217;d probably expect to be able to do anyway.&lt;/p&gt;
&lt;p&gt;That process was kind of hard and there was a lot of misinformation when you searched, which made it even harder.&lt;/p&gt;
&lt;p&gt;So I took a few hours to find out how it all worked, then a few more to write a tool to make it all much easier.&lt;/p&gt;
&lt;h2&gt;The Old Way&lt;/h2&gt;
&lt;p&gt;This post describes &lt;a href="http://www.davidsonfamily.ca/discussion-board/topic/definitive-install-guide/"&gt;the old way to do it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href=https://cdn.garry.net/wpi/9521bf608eef1efc.png rel="noopener"&gt;&lt;img height="400" src=https://cdn.garry.net/wpi/9521bf608eef1efc.png&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;The New Way&lt;/h2&gt;
&lt;p&gt;I put the tool on github, you &lt;a href="https://github.com/garrynewman/Control4.Jailbreak"&gt;can find it here&lt;/a&gt;. I feel like it&amp;#8217;s pretty self explanatory and tries to explain what&amp;#8217;s happening so you don&amp;#8217;t get too scared when using it.&lt;/p&gt;
&lt;p&gt;For those that are confused, you start it up and press this button&lt;/p&gt;
&lt;p&gt;&lt;img src=https://cdn.garry.net/wpi/6210b501da939918.png&gt;&lt;/p&gt;
&lt;p&gt;It works on v3.1.0 right now &amp;#8211; I haven&amp;#8217;t updated to v3.1.1 yet (which has made jailbreaking a tad harder).&lt;/p&gt;
&lt;h2&gt;How it works&lt;/h2&gt;
&lt;p&gt;The director has a list of public keys that are allowed to connect to it. We generate one and add it to the list.&lt;/p&gt;
&lt;p&gt;On the composer side the normal thing is that when a dealer logs in it connects to Control4&amp;#8217;s servers and downloads a certificate that matches up with an existing one on the server. We&amp;#8217;re skipping that step by generating matching certificates ourselves.&lt;/p&gt;
&lt;p&gt;The composer has some restrictions on the key, the password needs to be &amp;#8220;R8lvpqtgYiAeyO8j8Pyd&amp;#8221; and the subject needs to start with &amp;#8220;Composer_&amp;#8221;. Once those conditions are satisfied you&amp;#8217;re free.&lt;/p&gt;
&lt;h2&gt;Restrictions&lt;/h2&gt;
&lt;p&gt;You can do everything a dealer can do now.. apart from spend money buying hardware and buying thirdparty drivers. If you want to give Control4 more money you need to do it via a dealer.&lt;/p&gt;
</description>
      <pubDate>Thu, 02 Jan 2020 00:00:00 Z</pubDate>
      <image>https://cdn.garry.net/wpi/9521bf608eef1efc.png</image>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/benchmarking-rust</guid>
      <link>https://garry.net/posts/benchmarking-rust</link>
      <title>Benchmarking Rust</title>
      <description>&lt;p&gt;We have a pretty neat system for Benchmarking Rust. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Every commit triggers an automated build&lt;/li&gt;
&lt;li&gt;The build is uploaded to Steam&lt;/li&gt;
&lt;li&gt;Our benchmark PCs constantly update from Steam&lt;/li&gt;
&lt;li&gt;..and run a bunch of benchmark tests&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This means that for most changesets in our source control we have a benchmark that ran. The big idea being that we can track performance between changesets automatically.&lt;/p&gt;
&lt;h2&gt;Results View&lt;/h2&gt;
&lt;p&gt;I made a front end for displaying the results in Blazor. The TLDR on Blazor is VueJs in C#. The site is at &lt;a href="https://stats.facepunch.com"&gt;stats.facepunch.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=https://cdn.garry.net/wpi/9b67e7c6db192427.png&gt;&lt;img src=https://cdn.garry.net/wpi/9b67e7c6db192427.png /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can select the test in the panel on the bottom left, the graph shows the results per changeset. If you click on a column you can see the changeset comment along with the previous ones.&lt;/p&gt;
&lt;p&gt;This lets us see historically where performance was affected. For example, using this tool diogo noticed a frame drop from &lt;a href="https://stats.facepunch.com/testresult/avgfps/high/main/90/43894"&gt;this commit&lt;/a&gt;, and fixed it in &lt;a href="https://stats.facepunch.com/testresult/avgfps/high/main/90/44488"&gt;this commit&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Data Interpretation&lt;/h2&gt;
&lt;p&gt;It isn&amp;#8217;t as straight forward as see a spike and reverse that commit. There&amp;#8217;s other factors.&lt;/p&gt;
&lt;p&gt;For example, some hardware might have fucked up on the test machine and we had to replace it. There might have been some other Windows bullshit taking resources, or somehow two versions of Rust were running. We might have fucked up a commit where nothing was renderered &amp;#8211; so performance would be super high but obviously irrelevant.&lt;/p&gt;
&lt;p&gt;So what I&amp;#8217;m saying is it needs to be taken with a pinch of salt. Adding events/comments to it would probably be a good idea.&lt;/p&gt;
&lt;h2&gt;Improvements&lt;/h2&gt;
&lt;p&gt;We should probably add more test machines, and they should be near identical. This would mean more runs per changeset.&lt;/p&gt;
&lt;p&gt;Our Low machine is so slow at loading that they can miss running changesets. In an ideal world we&amp;#8217;d queue up each changeset for 10 runs or something, to make sure everything gets a turn.&lt;/p&gt;
&lt;p&gt;I haven&amp;#8217;t put that much work into the running procedure here. It&amp;#8217;s just a bat file in a loop that downloads and runs as much as it can. It would be ideal if steamcmd let us download a specific version based on the changeset number, right now we only grab the latest version.&lt;/p&gt;
&lt;p&gt;Our Medium machine keeps freezing up, so there&amp;#8217;s really limit data there.&lt;/p&gt;
&lt;h2&gt;Blazor&lt;/h2&gt;
&lt;p&gt;I love Blazor. It&amp;#8217;s so much nicer to be able to use Linq and all the .net string manipulation functions instead of trying to re-remember javascript for it all.&lt;/p&gt;
&lt;p&gt;For the graph I started looking at the existing solutions. I tried syncfusion&amp;#8217;s stuff but it was way too slow. It seems that almost every chart solution interops to an existing javascript charting library. It seemed like a waste of time using Blazor and Webassembly if we were going to do that.&lt;/p&gt;
&lt;p&gt;Making charts is pretty easy with the svg elements so I made a custom thing. This worked out especially good because I could be really specific in what I wanted to happen.&lt;/p&gt;
&lt;p&gt;But it was still kind of slow. When there&amp;#8217;s a callback Blazor&amp;#8217;s default behaviour is to re-render the whole component. So doing MouseOver on the bars on the chart was recreating the chart every mouseover. I&amp;#8217;m guessing this isn&amp;#8217;t usually a problem but with 300 changesets it performed terribly.&lt;/p&gt;
&lt;p&gt;Luckily I found that Blazor components have a ShouldRender method you can override. So I made a new component for everything I didn&amp;#8217;t want to redraw on events and made ShouldRender only return true if it was really dirty.&lt;/p&gt;
</description>
      <pubDate>Sun, 15 Dec 2019 00:00:00 Z</pubDate>
      <image>https://cdn.garry.net/wpi/9b67e7c6db192427.png</image>
    </item>
    <item>
      <guid
        isPermaLink="true">https://garry.net/posts/600-remote</guid>
      <link>https://garry.net/posts/600-remote</link>
      <title>£600 Remote</title>
      <description>&lt;p&gt;Control4 came out with a new modern looking remote..&lt;/p&gt;
&lt;h2&gt;Compared&lt;/h2&gt;
&lt;p&gt;&lt;a href=https://cdn.garry.net/wpi/15242457f6792fb0.jpg target="_blank" rel="noopener"&gt;&lt;img src=https://cdn.garry.net/wpi/15242457f6792fb0.jpg /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Compared to the older one it&amp;#8217;s much lighter and smaller. It feels nice to hold, lot more modern.&lt;/p&gt;
&lt;p&gt;&lt;a href=https://cdn.garry.net/wpi/fe8a4951de651b8.jpg target="_blank" rel="noopener"&gt;&lt;img src=https://cdn.garry.net/wpi/fe8a4951de651b8.jpg&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I didn&amp;#8217;t really realise how massive the old one was until I got this one. I remember feeling that way the first time I got it &amp;#8211; like what is this big black 80s brick. But I&amp;#8217;d got used to it.&lt;/p&gt;
&lt;h2&gt;Setup&lt;/h2&gt;
&lt;p&gt;You don&amp;#8217;t need a dealer to install it for you. You just take it out of the package and log into your wifi network, it finds the controller and you assign it to a room.&lt;/p&gt;
&lt;p&gt;There are some more advanced settings in composer though. I&amp;#8217;m guessing you can tweak these with Composer HE too.&lt;/p&gt;
&lt;p&gt;&lt;a href=https://cdn.garry.net/wpi/16d10cd2b7be07c0.png target="_blank" rel="noopener"&gt;&lt;img src=https://cdn.garry.net/wpi/16d10cd2b7be07c0.png /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Screen&lt;/h2&gt;
&lt;p&gt;The touch screen isn&amp;#8217;t an iPhone. It isn&amp;#8217;t nice to use. It misses presses, you have to be deliberate with it. It runs at about 20fps.&lt;/p&gt;
&lt;p&gt;You can adjust the layout of the touchscreen tiles &amp;#8211; but not on the control itself. You need to do it via the phone app or a touchscreen.&lt;/p&gt;
&lt;h2&gt;Usage&lt;/h2&gt;
&lt;p&gt;I&amp;#8217;d say if all you do is watch something like Apple TV where you just need the arrows you&amp;#8217;re going to get along fine.&lt;/p&gt;
&lt;p&gt;If you use Freeview/Cable/Sky, where you remember the channel numbers and want to pop the TV guide up &amp;#8211; it can get a bit exhausting. The numpad and the guide button are on the touchscreen, you can&amp;#8217;t really develop muscle memory and automatically press them while looking at the TV. The guide and numpad are on different screens so you have to swipe around to try to find the button you want to press.&lt;/p&gt;
&lt;p&gt;As ugly as the default Control4 remote is you learn to love the number of buttons on it. Especially once you start programming them.&lt;/p&gt;
&lt;p&gt;My living room remote is programmed so a single button press can open/close the curtains, toggle the lights, switch to appletv/freeview/cameras. You learn where these are and can press them without looking. You lose all that with the new remote&lt;/p&gt;
&lt;p&gt;That said &amp;#8211; if you have a partner who doesn&amp;#8217;t really know how to do all that then the touch screen might be a bit easier for them.&lt;/p&gt;
&lt;h2&gt;Price&lt;/h2&gt;
&lt;p&gt;£600. For a remote control.&lt;/p&gt;
&lt;p&gt;To be fair to them, it feels premium. The charger is really heavy and magnetic so the remote just snaps to it really nicely.&lt;/p&gt;
&lt;h2&gt;Worth It?&lt;/h2&gt;
&lt;p&gt;I find myself reaching for the regular remote more than this one. It sucks, but it&amp;#8217;s just much more straight forward to use.&lt;/p&gt;
&lt;p&gt;Maybe the next version will have more physical buttons or voice controls &amp;#8211; but for now don&amp;#8217;t bother.&lt;/p&gt;
</description>
      <pubDate>Fri, 13 Dec 2019 00:00:00 Z</pubDate>
      <image>https://cdn.garry.net/wpi/15242457f6792fb0.jpg</image>
    </item>
  </channel>
</rss>