Browsed by
Category: Programming

Creating The Oregon Trail

Creating The Oregon Trail

Image for post

In 1984 I was given the assignment to help create a completely new version of The Oregon Trail. The text-based version of the game had already been around for more than a decade — but in all that time the game had never been substantially modified, much less redesigned from the ground up. But that was about to change. MECC, the publisher of the game, was ready to replace the aging product with something completely new, and I was selected to be the team leader and lead designer for the project.

Learn how R. Philip Bouchard lead the creation of The Oregon Trail we know today, but also the hunting minigame was made. Fascinating stuff.

https://medium.com/the-philipendium/designing-the-hunting-game-for-the-oregon-trail-257924bdc6ae

Godbolt Compiler Explorer

Godbolt Compiler Explorer

Ever want to see what assembly code your compiler is really generating?

There are a few reasons to want to know this. Firstly is correctness. Sometimes obscure bugs can crop up when you switch from one compiler to another, from one set of optimization settings to another, from debug to release, or even from one compiler version to another.

The second is optimization. What addressing mode(s) are being used, are there data hazards that are slowing things, are simd instructions being used? Game and high performance compute companies still spend time pulling every cycle they can out of a routine.

It used to be you had to compile and then pull the executable into a debugger and examine the code. Now, there’s an online tool that can quickly do the same. Enter the Godbolt compiler explorer.

It allows you to type in C/C++ code, select from a whole host of compilers, enter custom compiler flags, then show you the generated output.

In the case above, I wanted to verify C/C++ short-circuit comparison behavior of a variable against NULL and then dereference in the same conditional. If the compare against NULL doesn’t execute and exit before the dereference, a NULL pointer exception/segfault will result. According to C/C++ rules, there should be an early out after the comparison against NULL – and sure enough – on line 8 and 9 we see the test and exit.

Anyway – it’s a neat online tool you might give a try to learn more about the assembly your C/C++ code turns into.

Beating splosh-kaboom minigame in Legend of Zelda: Wind Waker

Beating splosh-kaboom minigame in Legend of Zelda: Wind Waker

It took them about 10 years to build this speed running tool, but here it is. How it helps you win is even more fascinating than the minigame itself. Random number generators on consoles are notoriously simple and have been exploited for some time – but this takes it to a whole new level.

It’s a beautiful example of how a computer scientist would break down and solve a problem. It’s also a perfect example of why cryptographically secure random number generators are essential to computer security.

I think I might use this question in future interviews…

Unreal engine 5

Unreal engine 5

Simply astounding – really looking forward to reading how they did this.

What if we flipped things on their head and had more triangles than pixels on the screen? How would that engine work…

Balancing a bouncing ball

Balancing a bouncing ball

Electron Dust shows off a nifty machine that can bounce a ping pong ball, while keeping it balanced and centered on its moving platform. It uses combination of open-source image processing software and Arduino-controlled stepper motors to work its magic.

It is an arduino project with 120 FPS OpenCV image processing and smooth stepper motor moves. The machine calculates the ball’s 3D position from the image processing data and uses this information to control the orange ping pong ball.

Uses an e-con Systems superb See3CAM_CU135 camera. Find out more about the camera here: https://www.e-consystems.com/4k-usb-c…

This machine requires the following things to work:

  • 1x Teensy 4.0 Microcontroller
  • 4x StepperOnline DM442S stepper motor drivers
  • 4x Nema 17 Stepper Motors with 5:1 planetary gearbox
  • 1x 48V 8A power supply
  • 1x e-con Systems See3CAM_CU135 camera
  • 1x Windows Computer with OpenCV installed on it –

All the parts defined the Fusion360 project – Custom Windows Application (made with Unity). Read more here: https://electrondust.com/2020/03/02/t… Complete code and Fusion360 data on Github: https://github.com/T-Kuhn/HighPrecisi…

Nightmare fuel

Nightmare fuel

Image result for faith game

While a relatively short game, the indie horror game FAITH has gotten great accolades. It’s available for free on itch.io if you want to give it a try.

One of the more frightening elements of the game are the voices of the encountered creatures. The voices for at least one of the creepy characters was generated using a text-to-speech program called SAM (Software Automatic Mouth) written in 1982 for the Commodore 64.

The C source code is available on github, or you can give some of your own phrases a try here via a clever web interface.

Unreal Engine resource viewer

Unreal Engine resource viewer

This is a really cool tool (UE Viewer/uModel). I have used this several times to explore and export models and resources from various games. You just need to know what version of Unreal the game was developed with.

For example, I extracted a model from Dead by Daylight by pointing this tool at the pak file directory (…\Steam\steamapps\common\Dead by Daylight\DeadByDaylight\Content\Paks) and indicated the game was ‘Unreal Engine 4 version 4.21’.

C# App hangs when BitmapDecoder.CreateAsync is called

C# App hangs when BitmapDecoder.CreateAsync is called

Calling ASync functions from UI event handling routines/the main UI thread in C# turns out to require some basic knowledge to avoid getting into deadlocks. I sort of jumped in without doing much learning, so here were some of my learning resources as I made the inevitable mistakes:

https://stackoverflow.com/questions/12507749/winrt-app-hangs-when-bitmapdecoder-createasyncstream-is-called

https://social.msdn.microsoft.com/Forums/en-US/8bed034e-a8f6-4322-a801-79f014815dd9/bitmapencodercreateasync-never-returns?forum=winappswithcsharp

https://stackoverflow.com/questions/12235085/winrt-loading-static-data-with-getfilefromapplicationuriasync

Debugging tips:

https://medium.com/bynder-tech/c-why-you-should-use-configureawait-false-in-your-library-code-d7837dce3d7f

https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1.result?view=netframework-4.8

C# and Universal Windows App file handling:

https://docs.microsoft.com/en-us/windows/uwp/get-started/fileio-learning-track

https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions

The details of fighting game logic

The details of fighting game logic

Making a button-mashing fighting game like Street Fighter has some surprisingly sophisticated logic when it comes to frame-perfect animation hits and combos. Strange Wire does an awesome job describing the difficulties and some ways to solve them.

What are those difficulties? Problems like checking hit and hurt boxes at the right parts of animation frames. Attaching events at the right parts of the animations can be tricky – especially if animators are still tweaking them. And the ever-present issue of keep the code clean.

Definitely worth a read whether you’re doing 2D to 3D fighters.

https://strangewire.blogspot.com/2019/09/frame-specific-attacks-in-unity.html