Warnings
I need to start off with two warnings. There's a long-winded background on why I started this guide after this warning section so you won't run into these two things until you scroll down.
First, a trigger warning... the game J.B. Harold Murder Club contains references to sexual assault. It was released before game ratings were a thing so let's say the content is in the ballpark of a Law & Order SVU episode. It is not the main story of the game but is an unavoidable side story. I am not going to discuss it in this guide except for where investigating it is required to advance the story.
The second is a spoiler warning... this guide has complete disregard when it comes to plot spoilers. I'll probably end-up listing the solution very early on.
Background
J.B. Harold Murder Club is the oldest game in my backlog. Not in terms of age, there are much older games I learned about recently that I want to try. I mean in terms of when it went on my backlog. It may even be my first backlog game.
Video game backlogs aren't a problem when you're young. You'd save up money for a game, buy it, and then that's all you have to play for a while. Hmm... I should rephrase that. Video game backlogs weren't a problem when people reading this were young. Our kids have 200-300 99¢ games on their phone or Switch. Not us though, we saved up $60 to buy a game and played it until we stumbled into cash again.
Despite not having money I amassed a large backlog in the early 1990s. I worked at an Electronics Boutique when TurboGrafx-16 CD games went for fire sale prices. When Electronics Boutique was done with a system they were done and everything was marked down to $5. As the person holding the price sticker gun I got first dibs on the best deals. One fateful day I went home with a dozen or so clearance TurboGrafx-16 CD games.
I worked my way through all of them, even Shape Shifter, except for one. There was this mystery game called J.B. Harold Murder Club that I kept putting off. I can't explain why it was the outcast. It seemed like the type of game I'd enjoy. Maybe I was saving it for a dark fall night. Whatever the case it got buried on a shelf for nearly 30 years.
Then in 2020 the world kind of stopped for a while. I was fortunate to still have a job, also fortunate to get back an hour of commute time each day. That extra hour knocked-down some long backlog games like Trails in the Sky the 3rd. I knew I was wasting a lot of time in the car each day, this year made it clear just how bad it was.
I thought this would be over in October, we all did. October is usually a festive month for me. Every weekend is packed with some fall or Halloween related plans. 2020 though.. I'm mostly trying to ignore everything. With so many plans postponed I decided to try a mystery game to fill the vacant time. It didn't take long for me to remember this backlog item.
I ripped my copy of J.B. Harold Murder Club and fired-up an emulator. Even in quarantine I don't have the patience for 1990s CD drive speeds. It was going well until I got completely stuck. I reached a point where I knew who the killer was but the game simply wouldn't allow me to move on. I had a choice: quit or figure out what's going on. Normally I'd choose the former but with another free weekend ahead of me...
The Basics
J.B. Harold Murder Club is a typical mystery story. A young businessman, Bill Robbins, is found stabbed to death. He had many enemies and mistresses with a motive to kill him. To solve his murder you have to unravel another mystery from two decades earlier. In the end nearly everyone in town is guilty of something.
Let's start with a review of how the game works. This will make the save RAM easier to understand. This is not a tutorial on how to play the game.
After an initial briefing J.B. exits the police station and is greeted with a map. There are just a couple locations open at the beginning. New locations are unlocked when someone mentions them to J.B. A big chunk of the game involves trying to hear keywords that unlock locations or other events.
Entering a location usually initiates a conversation with someone there. J.B. likes to ask people about all kinds of personal details. As we'll see later on these are almost completely unnecessary to advance the story. They may contain clues that help the player solve the mystery though.
The interesting thing about J.B. Harold Murder Club is how it makes a linear story seem non-linear. There is only one ending but many ways to get there. Since it turns out there are multiple crimes occurring in this town the player can follow many different branches to reach the ending.
J.B. can also ask everyone "Do you know" about most other characters. Like the map locations, new names are learned through these interviews. There are roughly 30 characters in the game and these questions get monotonous after a while. Not all the characters know each other so working through every permutation isn't necessary.
Responses to these questions will change as the plot advances. It is often required to go back and re-ask about a character once some internal evidence counter threshold has been met.
There is also the "What about" menu where J.B. can ask about keywords learned through interviews and evidence gathering. These questions generally advance the story. Newly learned keywords generally only appear for characters that have something to say about them.
Responses to these questions will also change as the plot advances.
After obtaining a certain amount of evidence, J.B. is able to request a search warrant for a location. In most cases these are unlocked if the person in that location gives an alibi that is later contradicted.
The flow typically goes like this... (1) ask a character about their alibi (2) they say they were with person X (3) ask person X about alibi (4) if they give contradictory information then a search warrant is obtainable. Finding an item adds it as a keyword and advances the story.
One of the harder concepts to grasp is that items don't appear in locations right away. It is often required to go back and re-search places after some events.
Once an item is found it needs to be taken back to the station for analysis. This also advances the story.
Once a certain threshold of information & evidence is gathered about a person they can be arrested. Really they're being brought in for questioning and from a legal standpoint they should be able to leave. Every character in this game would benefit from watching "Don't Talk to the Police". Regardless, this is the most repetitive part of the game. It involves repeatedly showing each character pieces of evidence and asking the same four questions over & over. It's like a more boring version of L.A. Noire which is already boring enough.
After many rounds of this the character's background may turn green which means their interrogation is done. This typically happens in pairs, where characters A & B give confessions that support each others story. For example, Ralph Carrington and Shelly McDonald are one such pair.
One very important thing... once a character is arrested they no longer appear in their original location. This means the "Do you know" and "What about" menus are gone too. Also the "Do you know" responses for other characters will change too. For example, after arresting Simon Randle asking someone about him may prompt them to comment on his arrest. Arresting a character too early can potentially lockout mandatory events tied to these questions. It seems like the developers took great caution to make this difficult but from what I can tell it is possible.
Getting Stuck
As I was just teasing, I think it is possible to get the game into an unwinnable state. Since the player can conduct interviews and arrests in almost any order it would be daunting to test every possible flow. In my first playthrough I reached a point where three characters identified the killer but I couldn't advance to his confession.
The game progress was stuck at this point no matter what I did. According to this screen I collected every piece of evidence, completed every mandatory interview, and gathered all required information. I could not advance the interrogation meter because I was missing an entire character from the interrogation screen. To recap, interrogating a character means they were arrested. There's a threshold of information & evidence needed to arrest each character. According to the game I collected all of it.
As I would soon learn... I did not collect all the information. I missed an arbitrary piece required to arrest a character but the algorithm to build these totals didn't include it. I was 100% stuck at this level of progress.
At some point I cranked-up the frameskip so I could re-try every dialog with every non-arrested character (twice). I also went through every interrogation question & evidence at least that many times. Nothing at all would work.
It turns out I needed to still arrest and interrogate Janet Robbins (the widow). The problem was.. I couldn't.
The game definitely steers the player toward suspecting Janet Robbins early on. She's one of the first characters that can be interviewed. J.B. quickly learns that her deceased husband had many affairs. In her home J.B. finds a bloody knife. She took out a life insurance policy on her husband days before his murder. The doctor who performed the autopsy tells J.B. the stab wounds were shallow and were likely caused by a woman. Only later does J.B. learn the doctor is intentionally deceiving him.
She is the most obvious first person to arrest.. which is why I didn't look into her story until last. It seemed too obvious. This was originally a $40-$50 game, no way was it solvable the first time in 10 minutes. So I investigated all the other threads and arrested a few people that are probably supposed to be arrested much later. By the end of the game Janet was completely ruled out as a suspect, again three characters identified the killer by name.
The problem is the game won't advance to the killer's confession unless all other suspects have been cleared. Since one couldn't even be arrested that was it for this playthrough. I assume most people would quit here, or make an angry YouTube video. Not me, I decided I'm going to break this thing down and figure out how to solve this game the hard way.
Save RAM Analysis
This is going to be a highish-level recap. Here is the detailed spreadsheet with all the save RAM values.
Two semi-important notes:
1) From this point forward all numbers are hexadecimal.
2) This is an analysis of the save RAM not a save state. This means the findings should be portable across all TurboGrafx-16/PC Engine emulators. I can confirm it works for two different Mednafen derivatives. I have not tested with MagicEngine but believe it stores save RAM in the same format. Also the save RAM is just easier to sort through than a save state which may have intermediate values to figure out. The RAM is a nice little 0x0200 byte list of values the game cares about (fewer are used though).
Before the analysis... here's a program I wrote to help compare save RAM files in case you're curious about that sort of thing:
import java.io.File;
import java.nio.file.Files;
//this was written in 10 minutes and isn't remotely optimized
public class ByteComparer{
//base file
private final static String file1Path="{path-to-save-file}";
//file that changed
private final static String file2Path="{path-to-save-file}";
public static void main(String[] args){
try{
byte[] f1=Files.readAllBytes((new File(file1Path)).toPath());
byte[] f2=Files.readAllBytes((new File(file2Path)).toPath());
int f1i=31;
if(f1.length!=f2.length){throw(new Exception("files are different length"));}
while(f1i<f1.length){
if(f1[f1i]!=f2[f1i]){
System.out.println("Difference at 0x"+Integer.toHexString(f1i));
System.out.println("File 1=0x"+Integer.toHexString(f1[f1i]));
System.out.println("File 2=0x"+Integer.toHexString(f2[f1i]));
System.out.println("");
}
f1i++;
}
System.out.println("whatevs");
}catch(Exception x){
x.printStackTrace();
}
}
}
As for how I did this - I started a new game and saved frequently. It's really nothing fancier than that. After a while it was pretty easy to figure out how this game worked. Let's start at the beginning...
0x0020-0x0036=location data
This section tracks which locations the player has visited and which they have a warrant for. 0x0020 is the Robbins Company, 0x0021 is HH Company, and so on until the Parking Lot at 0x0036. A value of 0x20 means the location has been visited, a value of 0xA0 means the player has a warrant for the location.
There there's a block of unused space followed by...
0x0059-0x0078=location data
This works like the previous section. Each byte represents one person. 0x10 means the player talked to the character once while 0x11 means the player has a warrant for the character.
After some more unused space we have...
0x00B5-0x00C6=evidence
This is also similar to the previous two sections. Each byte represents an item. 0x00 means the item hasn't been found yet, 0x08 means the item was found but not taken, 0x04 means the item was taken, and 0x02 means the item was analyzed.
Now we'll be skipping around a little...
0x00D0-0x00DD,0x0192-0x0195=events that unlock map locations
These all start as 0x00 and flip to 0x01 when the player does some action that adds a new map location. For example, asking Fred Robbins about his Occupation flips 0x00D0 to 0x01. When that happens, the HH Company is available on the map.
0x0121-0x013B=events that add menu items
Same as previous for for events that add new keywords to the "What about" menu.
0x0115-0x0120=events that make people arrestable or unlock items
For each character that can be arrested there is a meter, for lack of a better term, that has to be filled. This is done by flipping bits in the byte for each suspect until they reach 0x07, 0x0F, or 0x1F depending on the character. For example, there are three events to make Fred Robbins arrestable (0x07) vs 5 for Suzie McNally (0x1F). The spreadsheet details the events.
0x00DE-0x00FC,0x013C-0x0167=information & interview progress
I jammed these together because they kind of serve the same purpose. These work like the previous section where individual bits of bytes are updated when the player takes a specific action. The events are mostly grouped together into similar actions. For example, 0x0162 has three bits set throughout the game. Each one is set by asking a person about the stolen car. Sometimes one of these counters has to be at its max value to trigger another event in the game. Again, see the spreadsheet for details.
0x00FD-0x0108=interrogation events
This section is similar to the previous one except it tracks events that occur during interrogations. The first bit is typically set by asking for a confession and the remaining bits are typically get by showing a suspect a piece of evidence. There is overlap with the next section....
0x0168-0x0179=tracks evidence shown in interrogations
These bytes are tracking whether the player has shown an item to all the people who need to see it during interrogations. This probably could have been done in the previous section but I'm sure this duplication made life a litter easier for the developers.
For example, the counter for the earrings is at 0x0168. Showing them to Fred Robbins sets bit 0, showing them to Suzie McNally sets bit 1, Janet Robbins bit 2, and Shelly McDonald bit 3. Once 0x0168 has 0x0F the player never needs to ask anyone about the earrings again.
0x010A-0x0114=Confession/Questioning progress (for lack of a better description)
These next two sections are difficult for me to explain. Together they track how many "cycles" (my term for it) the player has gone through in the interrogation for each suspect. The interrogation part is really boring, really boring. Each suspect has to be questioned multiple times. After a certain threshold for each character their final confession is shown. Again, everyone in this game is guilty of something. Suspects have between 2 and 5 cycles of this nonsense to go though.
0x017A-0x0191=Questioning progress
This is tracking the progress of questioning within a cycle. Bit 0 is set when the suspect has been asked about "Murderer?", bit 1 when asked about "Murder Motive" and so on. Once 0x0F is reached this cycle can advance, although it still may be dependent on showing evidence or closing an interview with another suspect.
0x019C-0x01A7=set after Questioning is complete for a suspect
Each byte represents one suspect. Once the player has reached their final confession (when the character portrait background turns green) their byte is set to 0x01.
Without any hacking, the second time through I got to the ending. I found two things I was missing.. 0x0115 needs to be 0x1F to arrest Janet Robbins. There are 5 events required: ask her about Alibi, ask her about the Knife after analyzing it, ask her about Marriage, ask her about her Father, and ask her about the Policy. Well, not exactly.. you have to ask about the Policy after address 0x015A has reached 0x3. There are two events that set bits in 0x015A. Bit 0 is set by asking Harrison Turner about the Policy. Bit 1 is set by... by...
Bit 1 is set by asking Nick Goodman, the teen at the burger place, about Simon Randle. He replies "No, I don't know him." and on the next save bit 1 of 0x015A is set. I believe him, he doesn't know Simon Randle and even if he did it doesn't relate to the other bit about the Policy. I tested this out 3 times to be sure. I am positive this is a bug. There's no other explanation. Perhaps in some early iteration of the game he gives information about Simon that somehow implicates Janet in the murder? That seems far-fetched.
In my first playthrough I arrested Simon Randle before even unlocking Big Burger as a location. When I go back to that save no amount of questioning gets this flag to be set. I think this is due to the aforementioned response branching for arrested characters. The response text from Nick Goodman doesn't change before or after Simon Randle is arrested but a different code path is taken. In one path bit 1 of 0x015A is set, in another it is not. I am completely convinced this is a game-breaking bug.
So I'm relieved to learn my first failed attempt was most likely due to a bug. With everything we've learned from investigating the save state, let's see if we can piece together a quick way to get through this game.
Towards an Optimal Path
As of whenever I posted this, there are no speedruns for J.B. Harold Murder Club. This means if you are a fledgling speedrunner looking for a quick 1st place on your resume this is your big chance. You will have no competition now, or maybe ever. I have zero interest in speedrunning games myself but I am happy to help plan an optimal path for this game.
Note: this is probably not the fastest path through the game and I reserve the right to update it later. It covers what I understand to be the minimum actions required to finish the game. Someone who is interested in speedrunning it would likely find improvements shuffling around the order of these.
Good luck and congratulations on capturing the speedrun title for this game if you're the first/only person to try.
Bonus: Figuring out the save RAM checksum
I don't know if it's the case for every TurboGrafx-16 CD game, but J.B. Harold Murder Club stores a checksum as part of the save game. I assume this was done to address corruption. I doubt it was easy to hack the TurboGrafx-16 CD RAM in like 1991 and protecting against that seems pointless anyway. If the player has an unfortunate hardware issue, it's better to inform them of that rather than loading a janky save game.
In the save RAM there's one value that looks like a checksum right away. Here's a save from the start of the game, before doing any events other than saving. There are similar values for the first and second save slot (I saved all four to compare). Can you spot a clue about the checksum algorithm in here?
I'll add highlights to make it easier. Do you see it now?
The checksum for save game 1 looks to be 0x20FD while the checksum for save game 2 looks to be 0x1FFD. The data for the save games are the same. The only difference is the name stored in the save RAM. Those are different by just 1 byte. The checksums are also different by just 1 byte.
This hints that the checksum is based on all the bytes in the save game including the name. I've seen other games sum all the bytes in the save to generate a checksum. That's a pretty standard implementation for the time. Interestingly, the 2nd checksum is lower so I suspect this algorithm is subtracting all the bytes instead.
Comparing the Japanese save RAM to the US version makes it obvious. You see it immediately right?
If not, do you see it now?
The US checksum is 0x20FD while the Japanese checksum is 0x32FD. That's a difference of 0x12 (18 in decimal). The Japanese save game is spelled "HALOLD". 'R' is 0x52 and 'L' is 0x4C, that's a difference of 0x06. Meanwhile, the US save game ends with a 0x0C while the Japanese save game ends with just 0x00. 0x0C+0x06=0x12, the difference noticed earlier.
This also points to a simple subtraction being used for the checksum. Easy enough to prove - take the US checksum (0x20FD - little-endian), then add the bytes in the save:
0xFD20+0x4A+0x42+0x2D+0x48+0x41+0x52+0x4F+0x4C+0x44+0x31+0x10+0x20+0x0C=0x10000
Bang-bang. It's a nice round number. This is quite simple really.
So the checksum starts with 0x0000 and subtracts all the bytes in the save game. Let's test this out, first with a negative example:
Alright, the first event was marked as complete and the checksum was left untouched. As expected, that caused an error when loading the save game.
This time, let's subtract the 0x20 added to the save game from the checksum.
This is a sign of success. The save game loads and we can see the investigation score in the game advanced.
This is about as far as I'm interested in going though. If you want a user-friendly save RAM editor for J.B. Harold Murder Club then you better get to work on it. I would probably do it if Visual Basic 6 was still a supported platform, it's not so I'm taking a pass.
Overall this was a fun little distraction. I don't think I will ever look at this game again but maybe, just maybe, I'll explore the save RAM for a different TurboGrafx-16 CD game one day...
Related