So far, we’ve only really touched on some of the fundamentals of reverse engineering with one game example, but this time we’re looking at something a bit different.
Shenmue (1999) is widely known for its pursuit of realism and has remained an influential series to this day, with its third game releasing in 2019. This pursuit of realism wasn’t unintentional, but one of the key design choices they made early on in development. With 2 cult classic hits on the SEGA Dreamcast, in this post, we’ll look at some code in the game which reveals a mystery and how reverse engineering can be used to understand exactly how the game attempts to capture the essence of realism, and maybe even the original developers intentions..
Logic
Generally speaking, the concepts behind reverse engineering actual logic remains roughly the same. We have to reason with the code we see and try to apply that reasoning to the code. Machines don’t execute C code, they read and execute machine code, of which was generated during the lossy process of compilation itself. This creates something of an interesting place for reverse engineers and interested developers alike, as the skill of being able to reverse engineer some code, or data, even a bug, ultimately builds your skillset as a developer and thus can lead you into different career paths. An obvious example is security: malware reverse engineering and other areas of the cybersecurity field have an inherent desire to be able to identify exactly what a piece of code is doing.
Functions are transformed from their C source code into “machine code”, which is the assembled form of assembly instructions. This process, of C source code being transformed into assembly and then assembled into machine code, is a lossy process inherently. Thus, while attempting to reverse engineer logic, we often find that the underlying code has been slightly altered from its original form, in an effort to make the code more performant.
With this in mind, depending on the original source code, the compiler and toolchain being used, and some other factors, it can be challenging to truly understand the developers original intentions, especially since all variable, function names and comments are usually always removed as part of compilation and we must recreate these as much as we can ourselves. This is the most complex form of reverse engineering and a lot of time, effort and patience are what pay off the most.
The Mystery
In real life, the Earth’s axial tilt plays a crucial role in determining the suns position at any given time of the year.

In Shenmue, simulating everything would be a tall ord
9 Comments
yoyohello13
Man I loved this game so much as a kid. I remember being enthralled by opening the drawers, lol. I basically played it once a year every year from ages 9 – 16. Some of the enchantment was lost when I played the remaster recently, but still such a great world they built.
AdmiralAsshat
Reminds me of a similar story about Blast Corps, specifically how they implemented logic to correctly display apparent retrograde motion vis-a-vis the orbit of Venus from the perspective of Earth…all just for what basically amounts to a background animation. [0]
[0] https://www.youtube.com/watch?v=FZ6eNJi02Qk
wk_end
The tl;dr (though you should read!) of the "oversight" is that there's a constant used to adjust the sun's position that's seemingly based on latitude; in the first Shenmue, it's set to 22, and in Shenmue II – which uses much of the same code – it's set to 35. This is odd, because Shenmue I takes place at latitude 35°, and Shenmue II at 22° – precisely the other way around.
If that's what's going on, it's sort of hard for me to wrap my brain around how that might've happened. I could see them "fixing" the Shenmue I code base and then forgetting to "unfix" it for Shenmue II, but I can't – even knowing that there were already plans for where the sequel would be set – come up with a story for how they would've accidentally used Shenmue II's latitude for the original game.
bbayles
Fantastic game!
The same development studio, Sega AM2, recently had a developer reveal that he had put an Easter egg into Fighters Megamix for Saturn. However, he mistakenly introduced a crash bug in it.
This set me off looking for the Easter egg. After a couple days of reverse engineering, I finally found it [0]! I love looking for this stuff.
[0] https://32bits.substack.com/p/bonus-fighters-megamix
kowlo
What a game. Lost hours to QTE Title (one of the games within the game) https://www.youtube.com/watch?v=drdFhBKDvIQ
chiffre01
Playing through Shenmue 1, they did a really good job capturing the vibe of the area. Looking at random points in Yokosuka just feel like Shenmue.
https://www.google.com/maps/@35.2781594,139.677597,3a,75y,27…
bitbasher
Ok, but do they know who Lan Di is?
TapamN
Shenmue is one of my favorite games. I did a bunch of Ghidra reversing on the Dreamcast version last year, since I wanted to add improvements to it. Like adding bilinear filtering on the sky background, making time run a bit (faster so you can see time specific events like Christmas/New Year more easily,) getting the game to run without disc swapping on an ODE, and adding antialiasing (which would require mipmaps to improve rendering performance, which would require higher texture compression levels to get them to fit, which would require a different texture format that supports that…) I never got around to actually implementing any of that, outside of doing some experiments, like forcing bilinear on all 2D elements.
I don't think I found the sun/moon code (or more likely I did, but didn't realize what exactly it was doing, Ghidra SH4 has serious problems with floating point instructions making following anything that uses them almost impossible) but I did find most of the other time related code for updating the clock/calendar.
One weird thing I found while doing that is about the in-game watch. You always have a watch in your inventory, so you'd think it would be hard coded in, but it's treated like any other item. The game also has code to check if the watch is missing and add it back in anyways. But the code that draws the on-screen clock also checks if you don't have the watch, and won't draw the clock if you don't have it (or at least part of the UI clock logic is disabled, I haven't actually tried seeing what happens if you don't have a watch to verify if my interpretation is correct).
On the PAL version, the code that checks for a missing watch is at 0x0c180dc6 (that's where the code is loaded into memory, subtract 0xc010000 to get the address in 1ST_READ.BIN), and I think the code for drawing the clock (or at maybe it was just updating the hands of the clock?) is at 0x0c18290a.
Dreamcast Shenmue has code to support other video modes, like alternate resolutions (320x240p!), antialiasing, and 24/32 bit color. They're a bit bugged, like when using antialiasing, the 2D elements being squashed into the left half of the screen, and some strange issue with the screen position for the RAMDAC being setting incorrectly, causing the screen to vibrate left/right by a pixel or two, but the 3D models were drawn correctly.
24-bit color worked surprisingly well (even if the flag intended to enable it didn't seem to work, and I had to force it elsewhere.) I would have thought that having less video RAM free would have caused serious problems, but the game just loaded fewer NPCs. It was strange playing without dithering.
NooneAtAll3
I wish the article spent 2 sentences introducing wtf Shenmue is