GNU social JP
  • FAQ
  • Login
GNU social JPは日本のGNU socialサーバーです。
Usage/ToS/admin/test/Pleroma FE
  • Public

    • Public
    • Network
    • Groups
    • Featured
    • Popular
    • People

Conversation

Notices

  1. Embed this notice
    Tom Forsyth (tomf@mastodon.gamedev.place)'s status on Saturday, 22-Nov-2025 08:18:47 JST Tom Forsyth Tom Forsyth

    Recent discussion about the perils of doors in gamedev reminded me of a bug caused by a door in a game you may have heard of called "Half Life 2". Are you sitting comfortably? Then I shall begin.

    In conversation about a month ago from mastodon.gamedev.place permalink

    Attachments


    1. https://cdn.masto.host/mastodongamedevplace/media_attachments/files/115/589/872/869/803/006/original/811512981f638d11.png
    • Embed this notice
      Tom Forsyth (tomf@mastodon.gamedev.place)'s status on Saturday, 22-Nov-2025 08:23:37 JST Tom Forsyth Tom Forsyth
      in reply to

      If you watch the video, when the door unlocks and then opens, there's a second guard standing inside the room to the left of the opening door. That guard is actually standing very slightly too close - the very corner of his bounding box intersects the door's path as it opens. So what's happening is the door starts to open, slightly nudges into the guard's toe, bounces back, closes, and then automatically locks. And because there's no script to deal with this and re-open the door, you're stuck.

      In conversation about a month ago permalink
    • Embed this notice
      Tom Forsyth (tomf@mastodon.gamedev.place)'s status on Saturday, 22-Nov-2025 08:23:38 JST Tom Forsyth Tom Forsyth
      in reply to

      After about a day remembering how to use the debugging and replay tools, someone smart (sorry, I don't remember who) figured out what was going wrong.

      In conversation about a month ago permalink
      GreenSkyOverMe (Monika) repeated this.
    • Embed this notice
      Tom Forsyth (tomf@mastodon.gamedev.place)'s status on Saturday, 22-Nov-2025 08:23:39 JST Tom Forsyth Tom Forsyth
      in reply to

      Someone even goes back in the source history and compiles the original game as it shipped - nope, that original version is also broken. How can this possibly be? At this point people are freaking out - this isn't a normal bug - it appears to have traveled backwards in time and infected the original!

      In conversation about a month ago permalink
      Haelwenn /элвэн/ :triskell: likes this.
    • Embed this notice
      Tom Forsyth (tomf@mastodon.gamedev.place)'s status on Saturday, 22-Nov-2025 08:23:41 JST Tom Forsyth Tom Forsyth
      in reply to

      Oh dear. We can't ship this. I get some other folks, including some folks who worked on HL2 originally, and yep - it's broken. And it's broken when you're not in VR either - so it's not something Joe and I broke. But nobody knows why - none of the relevant code has changed.

      In conversation about a month ago permalink
    • Embed this notice
      Tom Forsyth (tomf@mastodon.gamedev.place)'s status on Saturday, 22-Nov-2025 08:23:42 JST Tom Forsyth Tom Forsyth
      in reply to

      I checked a video online, wondering if my memory was faulty - nope, the door's meant to open automatically, and you walk in. https://www.youtube.com/watch?v=y_3vMUOayyc&t=215s (at 3:40). But... now it doesn't!

      In conversation about a month ago permalink

      Attachments

      1. Half Life 2 opening scene, first 5 minutes - in Full HD
        from Beyond Brit Vegas Ventures
        Half Life 2, first ~ 5 minutes, recorded with Fraps in Full HD (1920X1080 resolution, 30fps).
    • Embed this notice
      Tom Forsyth (tomf@mastodon.gamedev.place)'s status on Saturday, 22-Nov-2025 08:23:43 JST Tom Forsyth Tom Forsyth
      in reply to

      What is meant to happen is a guard (spoiler alert - it's actually Barney in disguise) bangs on a door, the door opens, he says "get in", and then the game waits for you to enter the room before the script proceeds.

      But in this case the door sort of rattled, but didn't open, and then locked shut again. So you can't get in the room, and the gate closed behind you, so you can't go do anything else. The guard waits forever, pointing at the locked door, and you're stuck.

      In conversation about a month ago permalink
    • Embed this notice
      Tom Forsyth (tomf@mastodon.gamedev.place)'s status on Saturday, 22-Nov-2025 08:23:44 JST Tom Forsyth Tom Forsyth
      in reply to

      So I started it up, selected new game, played the intro section. It's a fairly well-known section - you arrive at the train station with a message from Breen, a guard makes you pick up a can, and then you have to go into a room and... uh... I got stuck. I wasn't dead, I just couldn't go anywhere. I was stuck in a corridor with a guard, and nowhere to go. Bizarre.

      In conversation about a month ago permalink
      Haelwenn /элвэн/ :triskell: likes this.
    • Embed this notice
      Tom Forsyth (tomf@mastodon.gamedev.place)'s status on Saturday, 22-Nov-2025 08:23:45 JST Tom Forsyth Tom Forsyth
      in reply to

      Of course we've played a bunch of HL2 by this point, testing all the VR stuff works. But we just skipped to the relevant chapters - we never actually played through from the start. And I hadn't played it through in a while, so I thought I'd do that in VR, start to finish. If I discovered anything that still didn't work, I could at least document it in the release notes.

      In conversation about a month ago permalink
    • Embed this notice
      Tom Forsyth (tomf@mastodon.gamedev.place)'s status on Saturday, 22-Nov-2025 08:23:46 JST Tom Forsyth Tom Forsyth
      in reply to

      Luckily, there was some other excuse to reissue HL2 anyway (see https://developer.valvesoftware.com/wiki/Source_2013) and the VR version worked pretty well, so we put the VR support on a command-line, labelled it "beta", rebuilt the whole of HL2 and prepared to ship it.

      In conversation about a month ago permalink

      Attachments

      1. Domain not in remote thumbnail source whitelist: developer.valvesoftware.com
        Source 2013 - Valve Developer Community
    • Embed this notice
      Tom Forsyth (tomf@mastodon.gamedev.place)'s status on Saturday, 22-Nov-2025 08:23:47 JST Tom Forsyth Tom Forsyth
      in reply to

      But HL2 did actually work pretty well. Joe spent a lot of time making the boat sequences work in a reasonable way.

      There's a sequence of stacking boxes near the start that is somewhat infuriating in the original - the stack keeps falling over - but in VR it's really easy to place them well.

      Also, whacking the manhacks with your crowbar goes from being a panicked flailing in flatscreen, to being an elegant one-swing home-run hit in VR.

      In conversation about a month ago permalink

      Attachments


      1. https://cdn.masto.host/mastodongamedevplace/media_attachments/files/115/589/883/071/542/137/original/502e91e6547dfe2e.png
      Haelwenn /элвэн/ :triskell: likes this.
    • Embed this notice
      Tom Forsyth (tomf@mastodon.gamedev.place)'s status on Saturday, 22-Nov-2025 08:23:48 JST Tom Forsyth Tom Forsyth
      in reply to

      We picked Team Fortress 2 as the game - the reason why is a whole different story I won't go into here. TF2 used the Source 1 engine, and as it happened two Valve games also using that same version of the engine were Half Life 2 and Portal 1. So as a side-effect they also got to work in VR.

      Well, Portal 1 "worked" - but all the tricks with perspective when you went through a portal were of course a nauseating disaster - it was pretty unplayable.

      In conversation about a month ago permalink
      Haelwenn /элвэн/ :triskell: likes this.
    • Embed this notice
      Tom Forsyth (tomf@mastodon.gamedev.place)'s status on Saturday, 22-Nov-2025 08:23:49 JST Tom Forsyth Tom Forsyth
      in reply to

      Once upon a time, I worked at Valve on virtual reality. This was in 2013 around the time the Oculus DK1 emerged, and Joe Ludwig and I decided that the best way to figure out how VR would work in a real game context was to port a real game to it and see what happened.

      In conversation about a month ago permalink
    • Embed this notice
      Tom Forsyth (tomf@mastodon.gamedev.place)'s status on Saturday, 22-Nov-2025 09:56:02 JST Tom Forsyth Tom Forsyth
      in reply to

      Once we'd figured this out, the fix was simple - move the guard back about a millimeter. Easy. But it took a lot of work to find because people had to dust off old memories of how the debugging tools worked, etc.

      In conversation about a month ago permalink

      Attachments


      1. https://cdn.masto.host/mastodongamedevplace/media_attachments/files/115/589/902/660/984/567/original/d4ca2934ca559c5d.png
      Haelwenn /элвэн/ :triskell: likes this.
    • Embed this notice
      Tom Forsyth (tomf@mastodon.gamedev.place)'s status on Saturday, 22-Nov-2025 09:58:23 JST Tom Forsyth Tom Forsyth
      in reply to

      On both versions, the door has just enough momentum to rotate the guard very slightly. The guard's friction on the floor is not quite enough to oppose this, and he rotates a tiny fraction of a degree. On the x87 version, this tiny rotation is enough to move his toe out of the way, the collision is resolved, and the door continues to swing open. All is well.

      In conversation about a month ago permalink
      Haelwenn /элвэн/ :triskell: likes this.
    • Embed this notice
      Tom Forsyth (tomf@mastodon.gamedev.place)'s status on Saturday, 22-Nov-2025 09:58:24 JST Tom Forsyth Tom Forsyth
      in reply to

      This collision is actually properly modelled - a big innovation of HL2 was the extensive use of a real physics engine. The door and the guard are both physical objects, both have momentum, they impart an impulse on each other, and although the door hinge is frictionless, the guard's boots have some amount of friction with the floor.

      In conversation about a month ago permalink
    • Embed this notice
      Tom Forsyth (tomf@mastodon.gamedev.place)'s status on Saturday, 22-Nov-2025 09:58:25 JST Tom Forsyth Tom Forsyth
      in reply to

      So problem solved, right? 80 bits of precision means the collision didn't happen, but in 32 bits of precision it does, and that's your problem, more bits better, QED, right? Well not quite.

      The guard's toe overlaps in both cases - a few millimeters is still significantly larger than ANY of the possible precisions. In both the SSE and x87 versions, the door hits the guard's toe. So far, both agree.

      In conversation about a month ago permalink
    • Embed this notice
      Tom Forsyth (tomf@mastodon.gamedev.place)'s status on Saturday, 22-Nov-2025 09:58:27 JST Tom Forsyth Tom Forsyth
      in reply to

      But ten years later in 2013, SSE had been standard in all x86 CPUs for a while - the OS depended on it being there, so you could rely on it. So of course by default the compilers use it - in fact you have to go out of your way to make them emit the old (slightly slower) x87 code. SSE uses a much more well-defined precision of either 32 or 64 bit according to what the code asks for - it's much more predictable.

      In conversation about a month ago permalink
    • Embed this notice
      Tom Forsyth (tomf@mastodon.gamedev.place)'s status on Saturday, 22-Nov-2025 09:58:28 JST Tom Forsyth Tom Forsyth
      in reply to

      So this kicked off an even longer bug-hunt. The answer was (as with so many of my stories) good old floating point. Half Life 2 was originally shipped in 2004, and although the SSE instruction set existed, it wasn't yet ubiquitous, so most of HL2 was compiled to use the older 8087 or x87 maths instruction set. That has a wacky grab-bag of precisions - some things are 32-bit, some are 64-bit, some are 80-bit, and exactly which precision you get in which bits of code is somewhat arcane.

      In conversation about a month ago permalink
    • Embed this notice
      Tom Forsyth (tomf@mastodon.gamedev.place)'s status on Saturday, 22-Nov-2025 09:58:29 JST Tom Forsyth Tom Forsyth
      in reply to

      OK cool now we can ship the game phew. But why did this EVER work? The guard's toe was in the way in the original version as well. As I say, we went back in time and compiled the original as-shipped source code - and the bug happened there as well. It's always been there. Why didn't the door slam closed again? How did this ever ship in the first place?

      In conversation about a month ago permalink
    • Embed this notice
      Tom Forsyth (tomf@mastodon.gamedev.place)'s status on Saturday, 22-Nov-2025 09:58:50 JST Tom Forsyth Tom Forsyth
      in reply to

      And there you have it. The two biggest bug-farms in gamedev - doors and floating point - contrived to make a simple NPC placement bug into quite the time-travelling palaver. /end

      In conversation about a month ago permalink

      Attachments


      1. https://cdn.masto.host/mastodongamedevplace/media_attachments/files/115/589/924/206/267/299/original/fb3b7275787a8988.png
      Haelwenn /элвэн/ :triskell: likes this.
      Haelwenn /элвэн/ :triskell: repeated this.
    • Embed this notice
      Tom Forsyth (tomf@mastodon.gamedev.place)'s status on Saturday, 22-Nov-2025 09:58:51 JST Tom Forsyth Tom Forsyth
      in reply to

      And that's why the bug went "back in time" - because yes it's the old code, but we were using a newer compiler with new default settings. In the original build, the compiler defaulted to x87, but in the newer compilers the default is SSE. It's not that one is "better" - the fundamental bug is that the guard was too close to the door, and that had always been there. But in the original the problem "self corrected" and so was never spotted, whereas in the newer compile it became a showstopper.

      In conversation about a month ago permalink
    • Embed this notice
      Tom Forsyth (tomf@mastodon.gamedev.place)'s status on Saturday, 22-Nov-2025 09:58:52 JST Tom Forsyth Tom Forsyth
      in reply to

      So on the next frame of simulation, his toe is still in the way of the door. The door isn't allowed to just pass through his toe, so it does the only other option - it bounces back. I think by default it's set to do so completely elastically, so the door bounces back with exactly the speed it came in at, slams shut, and locks again. And you're stuck.

      In conversation about a month ago permalink
      GreenSkyOverMe (Monika) repeated this.
    • Embed this notice
      Tom Forsyth (tomf@mastodon.gamedev.place)'s status on Saturday, 22-Nov-2025 09:58:53 JST Tom Forsyth Tom Forsyth
      in reply to

      But on the SSE version, a whole bunch of tiny precisions are very slightly different, and a combination of the friction on the floor and the mass of the objects means the guard still rotates from the collision, but now he rotates very slightly less far.

      In conversation about a month ago permalink
    • Embed this notice
      abadidea (0xabad1dea@infosec.exchange)'s status on Saturday, 22-Nov-2025 16:41:23 JST abadidea abadidea
      in reply to

      @TomF

      it’s floating point
      it’s always floating point
      100.0000001% it was floating point

      In conversation about a month ago permalink
      Haelwenn /элвэн/ :triskell: likes this.
    • Embed this notice
      Mauricio Teixeira 🇧🇷🇺🇲 (badnetmask@hachyderm.io)'s status on Monday, 24-Nov-2025 00:21:23 JST Mauricio Teixeira 🇧🇷🇺🇲 Mauricio Teixeira 🇧🇷🇺🇲
      in reply to

      @TomF
      Amazing story! Thanks for sharing!

      In conversation about 24 days ago permalink

Feeds

  • Activity Streams
  • RSS 2.0
  • Atom
  • Help
  • About
  • FAQ
  • TOS
  • Privacy
  • Source
  • Version
  • Contact

GNU social JP is a social network, courtesy of GNU social JP管理人. It runs on GNU social, version 2.0.2-dev, available under the GNU Affero General Public License.

Creative Commons Attribution 3.0 All GNU social JP content and data are available under the Creative Commons Attribution 3.0 license.