I haven't figured out how this game stores gender, but I'm gonna go out on a limb and say it's like this:
male: 0
female: 4
=> More informations about this toot | More toots from foone@digipres.club
why? because they have strings like:
char* HE="He\0\0She\0"
char* HIS="His\0Hers\0";
char* HIM="Him\0Her\0";
so they can do like:
printf("Follow %s to %s lair, and capture %s alive!", badguy->name, HIS+badguy->gender, HIM+badguy->gender);
=> More informations about this toot | More toots from foone@digipres.club
I like how the game only asks your name, not your gender.
Player's don't have genders. Only thieves have genders.
=> More informations about this toot | More toots from foone@digipres.club
It's a prequel to Disco Elysium, and your gender is set to COP
=> More informations about this toot | More toots from foone@digipres.club
why does ghidra's "search by instruction pattern" default to BINARY?
what kind of a freak remembers the machine code for INT 21 on x86 in BINARY?
it's CD21h, not 1100110100100001!
what are you, some kind of nerd?
=> More informations about this toot | More toots from foone@digipres.club
I love reversing a string and it's:
void printString(char* str, int length);
and I go look what calls it, reverse that function, and it's:
void printStringSimple(char *str){
printString(str, strlen(str));
}
=> More informations about this toot | More toots from foone@digipres.club
it's like "aww, did someone have second thoughts about making PRINT always take a length, and got tired of having to manually calculate lengths so you just wrapped it?
and your compiler didn't inline SHIT?
=> More informations about this toot | More toots from foone@digipres.club
oh those poor people of Bamako! Someone stole their.
=> More informations about this toot | More toots from foone@digipres.club
okay so when you start a game (well, technically when you restart), the game rolls 3 dice:
0-31: where the shit was stolen from
0-2: which item it is from that location
0-8: whodunnit
=> More informations about this toot | More toots from foone@digipres.club
like if you roll 0 on the first, you get Athens.
For the second one, it's:
0: mask of Priam
1: Achilles's heel
2: sibyl's secret.
=> More informations about this toot | More toots from foone@digipres.club
The last die is used as a lookup table into the dossier's list.
It's got 1 added to it so you won't get Carmen Sandiego, as a rookie at least.
=> More informations about this toot | More toots from foone@digipres.club
so the game uses a pattern like this:
char * RANKS="Rookie\0Sleuth\0Private Eye\0Investigator\0Ace Detective\0"
and then latter they do:
char* your_rank = select_string(RANKS, player->rank);
and select_string is a confusing function to reverse engineer, but knowing the name I gave it gives it away: it advances through the list until it's on the nth string and returns it
=> More informations about this toot | More toots from foone@digipres.club
there is no check for going past the end.
=> More informations about this toot | More toots from foone@digipres.club
so probably it uses the same trick for pronouns. The string I'm seeing is probably like: "He\0Him\0She\0Her\0"
=> More informations about this toot | More toots from foone@digipres.club
Ghidra is officially sexist. It'll automatically detect the word "Female" and mark it as a string, but not the word "Male"!
Why? SEXISM!
or the fact the default minimum length for strings is 5 characters, so "female" is long enough but "male" isn't.
=> More informations about this toot | More toots from foone@digipres.club
correction: there IS a check for going over the end, it's just not used in every place select_string is called. so it's sometimes-safe
=> More informations about this toot | More toots from foone@digipres.club
they have invented a Pronoun Markup Language.
It's \x80 for He/She
It's \x81 for he/she
It's \x82 for his/her
so a string will be "\x80 mentioned \x81 liked seafood and offered me a ride in \x82 motorcycle"
and it'll fill it out based on the pronouns of the suspect
=> More informations about this toot | More toots from foone@digipres.club
BOOOOOOOOOOOOO
=> More informations about this toot | More toots from foone@digipres.club
in trying to hack myself into the game, it glitched and said I had "Hobby: Male"
no... I haven't done that in ages!
=> More informations about this toot | More toots from foone@digipres.club
I'm in the game now
=> More informations about this toot | More toots from foone@digipres.club
I modified the game's NUM_GENDERS and found where it stores the database of criminals, so now you can find me if you search SEX=NB.
=> More informations about this toot | More toots from foone@digipres.club
so in addition to the 5 listed attributes (and their name), the game tracks one hidden attribute:
food preference.
There are only two options:
00=Mexican
01=Seafood
what an odd binary
=> More informations about this toot | More toots from foone@digipres.club
I'm thinking I might do a "full"(ish) disassembly of this game. I've thought for a long while (basically ever since I knew Where In North Dakota is Carmen Sandiego? existed) that there should be an SDK for making your own version of this game, for whatever arbitrary geographical area you want.
=> More informations about this toot | More toots from foone@digipres.club
and of course there's no reason you would have to limit yourself to reality.
You could always do, like, "Where in Middle Earth is Carmen Sandiego?"
=> More informations about this toot | More toots from foone@digipres.club
you go to Rivendell and talk to an Elf who says the perp was talking about how he wanted to collect "his precious"
=> More informations about this toot | More toots from foone@digipres.club
I say "full" in quotes because I don't think I need to reverse the whole game to make it customizable, just enough to let you customize the locations, bad guys, hints, search types, etc.
=> More informations about this toot | More toots from foone@digipres.club
sadly they didn't design the game as a completely empty husk that just loads datafiles. That would have been the smart thing to do, since they could then trivially make new versions.
=> More informations about this toot | More toots from foone@digipres.club
maybe instead of fully decompiling it, I just hack it to grab data from external files, then make a tool for making those files
=> More informations about this toot | More toots from foone@digipres.club
ahh, the PC. No one else ever thought XORing your VRAM was a good idea
=> More informations about this toot | More toots from foone@digipres.club
turns out this version of the game has impressive support for older video cards. Here's Hercules support, which looks horrible without aspect ratio correction!
=> More informations about this toot | More toots from foone@digipres.club
wow, this is actually the first game I've seen actually use the VGA bios call to set the VGA palette. (int 10h, AX=1012h)
=> More informations about this toot | More toots from foone@digipres.club
everyone else just programs the VGA card directly.
=> More informations about this toot | More toots from foone@digipres.club
so when the game starts, it loads:
ACME.DAT
CARMEN.DAT
MIDISND.DAT
DIGISND.DAT
CITIES.DAT
Interestingly, it uses the same code to load the last three, suggesting they're some kind of basic container format
=> More informations about this toot | More toots from foone@digipres.club
starting writing code to generate a JSON file of all the various switchable info in the EXE. Things like hobbies, hair colors, locations, etc.
=> More informations about this toot | More toots from foone@digipres.club
this blit function seems to take a useless first argument, a second argument that's the height, a third argument that's the width, and a fourth argument that doesn't seem to do anything.
notice anything missing? like... a lot of things?
=> More informations about this toot | More toots from foone@digipres.club
I think this game might be doing something weird where blit-source positions and destination positions are all globals, for some fucking reason
=> More informations about this toot | More toots from foone@digipres.club
I think it stores them inside the VGA driver? huh
=> More informations about this toot | More toots from foone@digipres.club
the game internally has 5 drivers (as of 2.2, I have other versions here and they're different): CGA, Hercules, EGA, Tandy, VGA.
=> More informations about this toot | More toots from foone@digipres.club
WHY ARE THERE TWO STRCATS
=> More informations about this toot | More toots from foone@digipres.club
@foone
=> More informations about this toot | More toots from cadey@pony.social
@cadey redundant strcats
=> More informations about this toot | More toots from foone@digipres.club
text/gemini
This content has been proxied by September (3851b).