1
0
mirror of synced 2024-11-27 19:10:48 +01:00

Rework game detection, sorry if I broke anything

This commit is contained in:
Bobby Dilley 2024-01-16 23:11:56 +00:00
parent 5cdd50a16a
commit 94a9f56533
8 changed files with 234 additions and 348 deletions

View File

@ -33,379 +33,281 @@ static char *getNextToken(char *buffer, char *seperator, char **saveptr)
static int detectGame(uint32_t elf_crc) static int detectGame(uint32_t elf_crc)
{ {
if (elf_crc == 0x93ea7e11) switch (elf_crc)
{ {
config.game = SEGABOOT_2_4;
case SEGABOOT_2_4:
{
config.gameTitle = "Segaboot 2.4";
config.gameStatus = WORKING; config.gameStatus = WORKING;
return 0; return 0;
} }
break;
if (elf_crc == 0x3cc635ee) case SEGABOOT_2_4_SYM:
{ {
config.game = SEGABOOT_2_4_SYM; config.gameTitle = "Segaboot 2.4 with symbols";
config.gameStatus = WORKING; config.gameStatus = WORKING;
return 0; return 0;
} }
break;
if (elf_crc == 0xbc0c9ffa) case THE_HOUSE_OF_THE_DEAD_4:
case THE_HOUSE_OF_THE_DEAD_4_TEST:
{ {
config.game = THE_HOUSE_OF_THE_DEAD_4; config.gameTitle = "The House of the Dead 4";
config.gameStatus = WORKING; config.gameStatus = WORKING;
return 0; return 0;
} }
break;
if (elf_crc == 0x5df569f5) case THE_HOUSE_OF_THE_DEAD_4_STRIPPED:
case THE_HOUSE_OF_THE_DEAD_4_STRIPPED_TEST:
{ {
config.game = THE_HOUSE_OF_THE_DEAD_4_STRIPPED; config.gameTitle = "The House of the Dead 4 Rev A";
config.gameStatus = WORKING; config.gameStatus = WORKING;
return 0; return 0;
} }
break;
if (elf_crc == 0xDDECE1E9) case THE_HOUSE_OF_THE_DEAD_4_SPECIAL:
case THE_HOUSE_OF_THE_DEAD_4_SPECIAL_TEST:
{ {
config.game = THE_HOUSE_OF_THE_DEAD_4_STRIPPED_TEST; config.gameTitle = "The House of the Dead 4 Special";
config.emulateRideboard = 1;
config.gameStatus = WORKING; config.gameStatus = WORKING;
return 0; return 0;
} }
break;
case THE_HOUSE_OF_THE_DEAD_EX:
case THE_HOUSE_OF_THE_DEAD_EX_TEST:
if (elf_crc == 0x7235bda8)
{ {
config.game = THE_HOUSE_OF_THE_DEAD_4_TEST; config.gameTitle = "The House of the Dead EX";
config.gameStatus = WORKING; config.gameStatus = WORKING;
return 0; return 0;
} }
break;
if (elf_crc == 0x12266f81) case OUTRUN_2_SP_SDX_REVA:
case OUTRUN_2_SP_SDX_REVA_TEST:
{ {
config.game = THE_HOUSE_OF_THE_DEAD_4_SPECIAL; config.gameTitle = "Outrun 2 SP SDX";
config.gameStatus = WORKING;
return 0;
}
if (elf_crc == 0x83ba3b45)
{
config.game = THE_HOUSE_OF_THE_DEAD_4_SPECIAL_TEST;
config.gameStatus = WORKING;
return 0;
}
if (elf_crc == 0x85c0c22a)
{
config.game = THE_HOUSE_OF_THE_DEAD_EX;
config.gameStatus = WORKING;
return 0;
}
if (elf_crc == 0xb9a166bb)
{
config.game = THE_HOUSE_OF_THE_DEAD_EX_TEST;
config.gameStatus = WORKING;
return 0;
}
if (elf_crc == 0x6d055308)
{
config.game = OUTRUN_2_SP_SDX_REVA;
config.emulateDriveboard = 1; config.emulateDriveboard = 1;
config.emulateMotionboard = 1; config.emulateMotionboard = 1;
config.gameStatus = WORKING; config.gameStatus = WORKING;
return 0; return 0;
} }
break;
if (elf_crc == 0xffdccaaa) case VIRTUA_FIGHTER_5_EXPORT:
{ {
config.game = OUTRUN_2_SP_SDX_REVA_TEST; config.gameTitle = "Virtua Fighter 5 Export";
config.emulateDriveboard = 1; config.gameDVP = "DVP-0043";
config.emulateMotionboard = 1;
config.gameStatus = WORKING; config.gameStatus = WORKING;
return 0; return 0;
} }
break;
if(elf_crc == 0x157B0576) { case LETS_GO_JUNGLE:
config.game = VIRTUA_FIGHTER_5_EXPORT; {
config.gameTitle = "Let's Go Jungle! Lost on the Island of Spice!";
config.gameStatus = WORKING; config.gameStatus = WORKING;
return 0; return 0;
} }
break;
if (elf_crc == 0xd4726d61) case LETS_GO_JUNGLE_SPECIAL:
{ {
config.game = LETS_GO_JUNGLE; config.gameTitle = "Let's Go Jungle! Special!";
config.emulateRideboard = 1;
config.gameStatus = WORKING; config.gameStatus = WORKING;
return 0; return 0;
} }
break;
if (elf_crc == 0xbbabc0e0) case AFTER_BURNER_CLIMAX:
{ {
config.game = LETS_GO_JUNGLE_SPECIAL; config.gameTitle = "After Burner Climax";
config.gameStatus = NOT_WORKING;
return 0;
}
if (elf_crc == 0xcc02de7d)
{
config.game = AFTER_BURNER_CLIMAX;
config.gameStatus = WORKING; config.gameStatus = WORKING;
return 0; return 0;
} }
break;
if (elf_crc == 0x152530dd) case AFTER_BURNER_CLIMAX_REVA:
{ {
config.game = AFTER_BURNER_CLIMAX_REVA; config.gameTitle = "After Burner Climax Rev A";
config.gameStatus = WORKING; config.gameStatus = WORKING;
return 0; return 0;
} }
break;
if (elf_crc == 0x5c18953c) case AFTER_BURNER_CLIMAX_SDX:
{ {
config.game = AFTER_BURNER_CLIMAX_SDX; config.gameTitle = "After Burner Climax SDX";
config.gameStatus = WORKING; config.gameStatus = WORKING;
return 0; return 0;
} }
break;
if (elf_crc == 0x9af7cb29) case AFTER_BURNER_CLIMAX_CE:
{ {
config.game = AFTER_BURNER_CLIMAX_CE; config.gameTitle = "After Burner Climax CE";
config.gameStatus = WORKING; config.gameStatus = WORKING;
return 0; return 0;
} }
break;
if (elf_crc == 0x4e9ccf33) case INITIALD_4:
{ {
config.game = INITIALD_4; config.gameTitle = "Initial D Arcade Stage 4";
config.gameStatus = NOT_WORKING; config.gameStatus = WORKING;
return 0; return 0;
} }
break;
if (elf_crc == 0x7f3f9f0c) case INITIALD_4_REVE:
{ {
config.game = INITIALD_4_REVE; config.gameTitle = "Initial D Arcade Stage 4 Rev E";
config.gameStatus = NOT_WORKING; config.gameStatus = WORKING;
return 0; return 0;
} }
break;
if (elf_crc == 0xfb096f81) case SEGA_RACE_TV:
{ {
config.game = SEGA_RACE_TV; config.gameTitle = "SEGA Race TV";
config.emulateDriveboard = 1;
config.gameStatus = NOT_WORKING;
return 0;
}
if (elf_crc == 0x77ebac34)
{
config.game = RAMBO;
config.gameStatus = NOT_WORKING;
return 0;
}
if (elf_crc == 0xb05d9bbe)
{
config.game = R_TUNED;
config.emulateDriveboard = 1; config.emulateDriveboard = 1;
config.gameStatus = WORKING; config.gameStatus = WORKING;
return 0; return 0;
} }
break;
if (elf_crc == 0x4c768eb4) case RAMBO:
{ {
config.game = TOO_SPICY; config.gameTitle = "Rambo";
config.gameStatus = WORKING; config.gameStatus = WORKING;
return 0; return 0;
} }
break;
if (elf_crc == 0xc4b7e89) case R_TUNED:
{ {
config.game = VIRTUA_TENNIS_3; config.gameTitle = "R Tuned";
config.emulateDriveboard = 1;
config.gameStatus = WORKING; config.gameStatus = WORKING;
return 0; return 0;
} }
break;
if (elf_crc == 0xffe3b0fd) case TOO_SPICY:
{ {
config.game = VIRTUA_TENNIS_3_TEST; config.gameTitle = "Too Spicy";
config.gameStatus = NOT_WORKING;
return 0;
}
if (elf_crc == 0x1bf1b627)
{
config.game = VIRTUA_FIGHTER_5_REVC;
config.gameStatus = WORKING; config.gameStatus = WORKING;
return 0; return 0;
} }
break;
if(elf_crc == 0xC4B05D40) { case VIRTUA_TENNIS_3:
config.game = VIRTUA_FIGHTER_5_REVE; case VIRTUA_TENNIS_3_TEST:
config.gameStatus = NOT_WORKING;
return 0;
}
if (elf_crc == 0x3CC635EE)
{ {
config.game = SEGABOOT_2_4; config.gameTitle = "Virtua Tennis 3";
config.gameStatus = WORKING; config.gameStatus = WORKING;
return 0; return 0;
} }
break;
if (elf_crc == 0xcdbc8069) case VIRTUA_FIGHTER_5_REVC:
{ {
config.game = PRIMEVAL_HUNT; config.gameTitle = "Virtua Fighter 5 Rev C";
config.gameStatus = WORKING;
return 0;
}
break;
case VIRTUA_FIGHTER_5_REVE:
{
config.gameTitle = "Virtua Fighter 5 Rev E";
config.gameStatus = NOT_WORKING; config.gameStatus = NOT_WORKING;
return 0; return 0;
} }
break;
if (elf_crc == 0xe60d8e04) case PRIMEVAL_HUNT:
{ {
config.game = GHOST_SQUAD_EVOLUTION; config.gameTitle = "Primeval Hunt";
config.gameStatus = NOT_WORKING; config.gameStatus = NOT_WORKING;
return 0; return 0;
} }
break;
if (elf_crc == 0x14d1292a) case GHOST_SQUAD_EVOLUTION:
{ {
config.game = INITIALD_5_EXP_20; config.gameTitle = "Ghost Squad Evolution";
config.gameStatus = NOT_WORKING; config.gameStatus = NOT_WORKING;
return 0; return 0;
} }
break;
if (elf_crc == 0x722ebbc4) case INITIALD_5_EXP_20:
{ {
config.game = INITIALD_ARCADE_STAGE_5; config.gameTitle = "Initial D Arcade Stage 5 Export Ver 2.0";
config.gameStatus = NOT_WORKING; config.gameStatus = NOT_WORKING;
return 0; return 0;
} }
break;
if (elf_crc == 0xc85f106a) case INITIALD_ARCADE_STAGE_5:
{ {
config.game = HUMMER_EXTREME; config.gameTitle = "Initial D Arcade Stage 5";
config.gameStatus = NOT_WORKING; config.gameStatus = NOT_WORKING;
return 0; return 0;
} }
break;
if (elf_crc == 0xB6479554) case HUMMER_EXTREME:
{ {
config.game = LETS_GO_JUNGLE_REVA; config.gameTitle = "Hummer Extreme";
config.gameID = "SBST";
config.gameDVP = "DVP-0079";
config.gameType = DRIVING;
config.gameStatus = WORKING;
return 0;
}
break;
case LETS_GO_JUNGLE_REVA:
{
config.gameTitle = "Lets Go Jungle Rev A";
config.gameStatus = NOT_WORKING; config.gameStatus = NOT_WORKING;
return 0; return 0;
} }
break;
default:
{
config.crc32 = UNKNOWN;
}
break;
}
config.game = UNKNOWN;
return 1; return 1;
} }
char *getGameName() char *getGameName()
{ {
char *unknownGameTitle = "Unknown Game"; return config.gameTitle;
switch (config.game)
{
case AFTER_BURNER_CLIMAX:
return "After Burner Climax";
case AFTER_BURNER_CLIMAX_REVA:
return "After Burner Climax Rev A";
case AFTER_BURNER_CLIMAX_REVB:
return "After Burner Climax Rev B";
case AFTER_BURNER_CLIMAX_SDX:
return "After Burner Climax SDX";
case AFTER_BURNER_CLIMAX_SDX_REVA:
return "After Burner Climax SDX Rev A";
case AFTER_BURNER_CLIMAX_CE:
return "After Burner Climax CE2";
case GHOST_SQUAD_EVOLUTION:
return "Ghost Squad Evolution";
case HARLEY_DAVIDSON:
return "Harley Davidson: King of the Road";
case HUMMER:
return "Hummer";
case HUMMER_EXTREME:
return "Hummer Extreme";
case HUMMER_EXTREME_MDX:
return "Hummer Extreme MDX";
case INITIALD_4:
return "Initial D Arcade Stage 4";
case INITIALD_4_REVE:
return "Initial D Arcade Stage 4 EXP Rev E";
case INITIALD_5_EXP_20:
return "Initial D Arcade Stage 5 Ver.2.0";
case INITIALD_ARCADE_STAGE_5:
return "Initial D Arcade Stage 5";
case LETS_GO_JUNGLE_REVA:
return "Let's Go Jungle! Lost on the Island of Spice! Rev A";
case LETS_GO_JUNGLE:
return "Let's Go Jungle! Lost on the Island of Spice!";
case LETS_GO_JUNGLE_SPECIAL:
return "Let's Go Jungle! Special!";
case VIRTUA_FIGHTER_5_EXPORT:
return "Virtua Fighter 5 Export";
case OUTRUN_2_SP_SDX:
return "Outrun 2 SP SDX";
case OUTRUN_2_SP_SDX_REVA:
return "Outrun 2 SP SDX Rev A";
case OUTRUN_2_SP_SDX_REVA_TEST:
return "Outrun 2 SP SDX Rev A Test Mode";
case OUTRUN_2_SP_SDX_TEST:
return "Outrun 2 SP SDX Test Mode";
case PRIMEVAL_HUNT:
return "Primeval Hunt";
case RAMBO:
return "Rambo";
case RAMBO_CHINA:
return "Rambo China Release";
case R_TUNED:
return "R-Tuned Ultimate Street Racing";
case SEGABOOT:
return "Segaboot";
case SEGABOOT_2_4:
return "SEGABOOT 2.4";
case SEGABOOT_2_4_SYM:
return "SEGABOOT 2.4 with Symbols";
case SEGABOOT_2_6:
return "SEGABOOT 2.6";
case SEGA_RACE_TV:
return "SEGA Race TV";
case THE_HOUSE_OF_THE_DEAD_4:
return "The House of the Dead 4";
case THE_HOUSE_OF_THE_DEAD_4_SPECIAL:
return "The House of the Dead 4 Special";
case THE_HOUSE_OF_THE_DEAD_4_SPECIAL_TEST:
return "The House of the Dead 4 Special Test Mode";
case THE_HOUSE_OF_THE_DEAD_4_TEST:
return "The House of the Dead 4 Test Mode";
case THE_HOUSE_OF_THE_DEAD_EX:
return "The House of the Dead Ex";
case TOO_SPICY:
return "2 Step : 2 Spicy";
case UNKNOWN:
return unknownGameTitle;
case VIRTUA_FIGHTER_5:
return "Virtua Fighter 5";
case VIRTUA_FIGHTER_5_FINAL_SHOWDOWN:
return "Virtua Fighter 5 Final Showdown";
case VIRTUA_FIGHTER_5_FINAL_SHOWDOWN_REVA:
return "Virtua Fighter 5 Final Showdown Rev A";
case VIRTUA_FIGHTER_5_R:
return " Virtua Fighter 5 R";
case VIRTUA_FIGHTER_5_REVA:
return "Virtua Fighter 5 Rev A";
case VIRTUA_FIGHTER_5_REVB:
return "Virtua Fighter 5 Rev B";
case VIRTUA_FIGHTER_5_REVC:
return "Virtua Fighter 5 Rev C";
case VIRTUA_FIGHTER_5_REVE:
return "Virtua Fighter 5 Rev E";
case VIRTUA_FIGHTER_5_R_REVD:
return "Virtua Fighter 5 Rev D";
case VIRTUA_TENNIS_3:
return "Virtua Tennis 3";
case VIRTUA_TENNIS_3_TEST:
return "Virtua Tennis 3 Test Mode";
case THE_HOUSE_OF_THE_DEAD_4_STRIPPED:
return "The House of the Dead 4 Rev C";
case THE_HOUSE_OF_THE_DEAD_4_STRIPPED_TEST:
return "The House of the Dead 4 Rev C Test Mode";
default:
return unknownGameTitle;
} }
return unknownGameTitle;
char *getDVPName()
{
return config.gameDVP;
}
char *getGameID()
{
return config.gameID;
} }
int readConfig(FILE *configFile, EmulatorConfig *config) int readConfig(FILE *configFile, EmulatorConfig *config)
@ -514,6 +416,10 @@ int initConfig()
config.region = -1; config.region = -1;
config.freeplay = -1; config.freeplay = -1;
config.showDebugMessages = 0; config.showDebugMessages = 0;
config.gameTitle = "Unknown game";
config.gameID = "XXXX";
config.gameDVP = "DVP-XXXX";
config.gameType = SHOOTING;
if (detectGame(config.crc32) != 0) if (detectGame(config.crc32) != 0)
{ {
printf("Warning: Unsure what game with CRC 0x%X is. Please submit this new game to the GitHub repository: https://github.com/bobbydilley/lindbergh-loader/issues/new?title=Please+add+new+game+0x%X&body=I+tried+to+launch+the+following+game:\n", config.crc32, config.crc32); printf("Warning: Unsure what game with CRC 0x%X is. Please submit this new game to the GitHub repository: https://github.com/bobbydilley/lindbergh-loader/issues/new?title=Please+add+new+game+0x%X&body=I+tried+to+launch+the+following+game:\n", config.crc32, config.crc32);

View File

@ -2,62 +2,59 @@
#define MAX_PATH_LENGTH 1024 #define MAX_PATH_LENGTH 1024
typedef enum #define AFTER_BURNER_CLIMAX 0xcc02de7d
{ #define AFTER_BURNER_CLIMAX_REVA 0x152530dd
AFTER_BURNER_CLIMAX, #define AFTER_BURNER_CLIMAX_REVB 0x0002
AFTER_BURNER_CLIMAX_REVA, #define AFTER_BURNER_CLIMAX_SDX 0x5c18953c
AFTER_BURNER_CLIMAX_REVB, #define AFTER_BURNER_CLIMAX_SDX_REVA 0x0004
AFTER_BURNER_CLIMAX_SDX, #define AFTER_BURNER_CLIMAX_CE 0x9af7cb29
AFTER_BURNER_CLIMAX_SDX_REVA, #define GHOST_SQUAD_EVOLUTION 0xe60d8e04
AFTER_BURNER_CLIMAX_CE, #define HARLEY_DAVIDSON 0x0007
GHOST_SQUAD_EVOLUTION, #define HUMMER 0x0008
HARLEY_DAVIDSON, #define HUMMER_EXTREME 0xc85f106a
HUMMER, #define HUMMER_EXTREME_MDX 0x0010
HUMMER_EXTREME, #define INITIALD_4 0x4e9ccf33
HUMMER_EXTREME_MDX, #define INITIALD_4_REVE 0x7f3f9f0c
INITIALD_4, #define INITIALD_5_EXP_20 0x14d1292a
INITIALD_4_REVE, #define INITIALD_ARCADE_STAGE_5 0x722ebbc4
INITIALD_5_EXP_20, #define LETS_GO_JUNGLE 0xd4726d61
INITIALD_ARCADE_STAGE_5, #define LETS_GO_JUNGLE_REVA 0xB6479554
LETS_GO_JUNGLE, #define LETS_GO_JUNGLE_SPECIAL 0xbbabc0e0
LETS_GO_JUNGLE_REVA, #define OUTRUN_2_SP_SDX 0x0019
LETS_GO_JUNGLE_SPECIAL, #define OUTRUN_2_SP_SDX_REVA 0x6d055308
OUTRUN_2_SP_SDX, #define OUTRUN_2_SP_SDX_REVA_TEST 0xffdccaaa
OUTRUN_2_SP_SDX_REVA, #define OUTRUN_2_SP_SDX_TEST 0x0022
OUTRUN_2_SP_SDX_REVA_TEST, #define PRIMEVAL_HUNT 0xcdbc8069
OUTRUN_2_SP_SDX_TEST, #define RAMBO 0x77ebac34
PRIMEVAL_HUNT, #define RAMBO_CHINA 0x0025
RAMBO, #define R_TUNED 0xb05d9bbe
RAMBO_CHINA, #define SEGABOOT 0x0027
R_TUNED, #define SEGABOOT_2_4 0x93ea7e11
SEGABOOT, #define SEGABOOT_2_4_SYM 0x3cc635ee
SEGABOOT_2_4, #define SEGABOOT_2_6 0x0030
SEGABOOT_2_4_SYM, #define SEGA_RACE_TV 0xfb096f81
SEGABOOT_2_6, #define THE_HOUSE_OF_THE_DEAD_4 0xbc0c9ffa
SEGA_RACE_TV, #define THE_HOUSE_OF_THE_DEAD_4_STRIPPED 0x5df569f5
THE_HOUSE_OF_THE_DEAD_4, #define THE_HOUSE_OF_THE_DEAD_4_STRIPPED_TEST 0xDDECE1E9
THE_HOUSE_OF_THE_DEAD_4_STRIPPED, #define THE_HOUSE_OF_THE_DEAD_4_SPECIAL 0x12266f81
THE_HOUSE_OF_THE_DEAD_4_STRIPPED_TEST, #define THE_HOUSE_OF_THE_DEAD_4_SPECIAL_TEST 0x83ba3b45
THE_HOUSE_OF_THE_DEAD_4_SPECIAL, #define THE_HOUSE_OF_THE_DEAD_4_TEST 0x7235bda8
THE_HOUSE_OF_THE_DEAD_4_SPECIAL_TEST, #define THE_HOUSE_OF_THE_DEAD_EX 0x85c0c22a
THE_HOUSE_OF_THE_DEAD_4_TEST, #define THE_HOUSE_OF_THE_DEAD_EX_TEST 0xb9a166bb
THE_HOUSE_OF_THE_DEAD_EX, #define TOO_SPICY 0x4c768eb4
THE_HOUSE_OF_THE_DEAD_EX_TEST, #define UNKNOWN 0xFFFFFFFF
TOO_SPICY, #define VIRTUA_FIGHTER_5 0x0042
UNKNOWN, #define VIRTUA_FIGHTER_5_FINAL_SHOWDOWN 0x0043
VIRTUA_FIGHTER_5, #define VIRTUA_FIGHTER_5_FINAL_SHOWDOWN_REVA 0x0044
VIRTUA_FIGHTER_5_FINAL_SHOWDOWN, #define VIRTUA_FIGHTER_5_R 0x0045
VIRTUA_FIGHTER_5_FINAL_SHOWDOWN_REVA, #define VIRTUA_FIGHTER_5_REVA 0x0046
VIRTUA_FIGHTER_5_R, #define VIRTUA_FIGHTER_5_REVB 0x0047
VIRTUA_FIGHTER_5_REVA, #define VIRTUA_FIGHTER_5_REVC 0x1bf1b627
VIRTUA_FIGHTER_5_REVB, #define VIRTUA_FIGHTER_5_REVE 0xC4B05D40
VIRTUA_FIGHTER_5_REVC, #define VIRTUA_FIGHTER_5_EXPORT 0x157B0576
VIRTUA_FIGHTER_5_REVE, #define VIRTUA_FIGHTER_5_R_REVD 0x0051
VIRTUA_FIGHTER_5_EXPORT, #define VIRTUA_TENNIS_3 0xc4b7e89
VIRTUA_FIGHTER_5_R_REVD, #define VIRTUA_TENNIS_3_TEST 0xffe3b0fd
VIRTUA_TENNIS_3,
VIRTUA_TENNIS_3_TEST
} Game;
typedef enum typedef enum
{ {
@ -78,6 +75,13 @@ typedef enum
EX EX
} GameRegion; } GameRegion;
typedef enum
{
SHOOTING,
DRIVING,
FIGHTING
} GameType;
typedef struct typedef struct
{ {
int emulateRideboard; int emulateRideboard;
@ -93,15 +97,20 @@ typedef struct
char driveboardPath[MAX_PATH_LENGTH]; char driveboardPath[MAX_PATH_LENGTH];
int width; int width;
int height; int height;
Game game;
Colour lindberghColour; Colour lindberghColour;
GameStatus gameStatus; GameStatus gameStatus;
GameType gameType;
uint32_t crc32; uint32_t crc32;
GameRegion region; GameRegion region;
int freeplay; int freeplay;
int showDebugMessages; int showDebugMessages;
char *gameID;
char *gameTitle;
char* gameDVP;
} EmulatorConfig; } EmulatorConfig;
int initConfig(); int initConfig();
EmulatorConfig *getConfig(); EmulatorConfig *getConfig();
char *getGameName(); char *getGameName();
char *getDVPName();
char *getGameID();

View File

@ -68,7 +68,7 @@ int initEeprom()
setFreeplay(eeprom, getConfig()->freeplay); setFreeplay(eeprom, getConfig()->freeplay);
} }
if ((getConfig()->game == LETS_GO_JUNGLE_SPECIAL) || (getConfig()->game == THE_HOUSE_OF_THE_DEAD_EX) || (getConfig()->game == THE_HOUSE_OF_THE_DEAD_4_SPECIAL)) if ((getConfig()->crc32 == LETS_GO_JUNGLE_SPECIAL) || (getConfig()->crc32 == THE_HOUSE_OF_THE_DEAD_EX) || (getConfig()->crc32 == THE_HOUSE_OF_THE_DEAD_4_SPECIAL))
{ {
if (fixCreditSection(eeprom) != 0) if (fixCreditSection(eeprom) != 0)
{ {

View File

@ -29,7 +29,7 @@ FGAPI int FGAPIENTRY glutEnterGameMode()
glutCreateWindow(gameTitle); glutCreateWindow(gameTitle);
// Outrun doesn't run the glutMainLoop through, so we'll do that here // Outrun doesn't run the glutMainLoop through, so we'll do that here
Game game = getConfig()->game; uint32_t game = getConfig()->crc32;
if (game == OUTRUN_2_SP_SDX || game == OUTRUN_2_SP_SDX_TEST || game == OUTRUN_2_SP_SDX_REVA || game == OUTRUN_2_SP_SDX_REVA_TEST) if (game == OUTRUN_2_SP_SDX || game == OUTRUN_2_SP_SDX_TEST || game == OUTRUN_2_SP_SDX_REVA || game == OUTRUN_2_SP_SDX_REVA_TEST)
{ {
pthread_t glutMainLoopID; pthread_t glutMainLoopID;
@ -107,7 +107,7 @@ Window XCreateWindow(Display *display, Window parent, int x, int y, unsigned int
// attributes->override_redirect = False; // attributes->override_redirect = False;
Window window = _XCreateWindow(display, parent, x, y, width, height, border_width, depth, class, visual, valueMask, attributes); Window window = _XCreateWindow(display, parent, x, y, width, height, border_width, depth, class, visual, valueMask, attributes);
printf("The resolution is %dx%d \n", width, height); printf(" RESOLUTION: %dx%d\n\n", width, height);
if (getConfig()->fullscreen) if (getConfig()->fullscreen)
{ {

View File

@ -136,7 +136,6 @@ static void handleSegfault(int signal, siginfo_t *info, void *ptr)
void __attribute__((constructor)) hook_init() void __attribute__((constructor)) hook_init()
{ {
printf("SEGA Lindbergh Loader\nRobert Dilley 2023\nNot for public consumption\n\n");
// Get offsets of the Game's ELF and calculate CRC32. // Get offsets of the Game's ELF and calculate CRC32.
dl_iterate_phdr(callback, NULL); dl_iterate_phdr(callback, NULL);
@ -184,15 +183,12 @@ void __attribute__((constructor)) hook_init()
securityBoardSetDipResolution(getConfig()->width, getConfig()->height); securityBoardSetDipResolution(getConfig()->width, getConfig()->height);
printf("Now starting \"%s\"", getGameName()); printf("\nSEGA Lindbergh Emulator\nRobert Dilley 2023\n\n");
if (getConfig()->gameStatus == WORKING) printf(" GAME: %s\n", getGameName());
{ printf(" GAME ID: %s\n", getGameID());
printf((", this game is working.\n")); printf(" DVP: %s\n", getDVPName());
} printf(" STATUS: %s\n", getConfig()->gameStatus == WORKING ? "WORKING" : "NOT WORKING");
else
{
printf((", this game is NOT working.\n"));
}
} }
int open(const char *pathname, int flags) int open(const char *pathname, int flags)
@ -326,7 +322,6 @@ FILE *fopen64(const char *pathname, const char *mode)
if (strcmp(pathname, "/proc/sys/kernel/osrelease") == 0) if (strcmp(pathname, "/proc/sys/kernel/osrelease") == 0)
{ {
EmulatorConfig *config = getConfig(); EmulatorConfig *config = getConfig();
config->game = SEGABOOT_2_6;
fileRead[OSRELEASE] = 0; fileRead[OSRELEASE] = 0;
fileHooks[OSRELEASE] = _fopen64(HOOK_FILE_NAME, mode); fileHooks[OSRELEASE] = _fopen64(HOOK_FILE_NAME, mode);
return fileHooks[OSRELEASE]; return fileHooks[OSRELEASE];
@ -708,8 +703,8 @@ char *getenv(const char *name)
{ {
char *(*_getenv)(const char *name) = dlsym(RTLD_NEXT, "getenv"); char *(*_getenv)(const char *name) = dlsym(RTLD_NEXT, "getenv");
if ((strcmp(name, "TEA_DIR") == 0) && ((getConfig()->game == VIRTUA_TENNIS_3) || (getConfig()->game == VIRTUA_TENNIS_3_TEST) || if ((strcmp(name, "TEA_DIR") == 0) && ((getConfig()->crc32 == VIRTUA_TENNIS_3) || (getConfig()->crc32 == VIRTUA_TENNIS_3_TEST) ||
((getConfig()->game == RAMBO)) || (getConfig()->game == TOO_SPICY))) ((getConfig()->crc32 == RAMBO)) || (getConfig()->crc32 == TOO_SPICY)))
{ {
if (getcwd(envpath, 100) == NULL) if (getcwd(envpath, 100) == NULL)
return ""; return "";

View File

@ -15,11 +15,11 @@
#include <pthread.h> #include <pthread.h>
#include <math.h> #include <math.h>
Game game = UNKNOWN; GameType gameType = SHOOTING;
int initInput() int initInput()
{ {
game = getConfig()->game; gameType = getConfig()->gameType;
return 0; return 0;
} }
@ -199,44 +199,14 @@ int XNextEvent(Display *display, XEvent *event_return)
} }
// Select the appropriate input mapping depending on the game // Select the appropriate input mapping depending on the game
switch (game) switch (gameType)
{ {
// Driving games case DRIVING:
case INITIALD_4:
case INITIALD_4_REVE:
case INITIALD_5_EXP_20:
case INITIALD_ARCADE_STAGE_5:
case OUTRUN_2_SP_SDX:
case OUTRUN_2_SP_SDX_TEST:
case OUTRUN_2_SP_SDX_REVA:
case OUTRUN_2_SP_SDX_REVA_TEST:
case SEGA_RACE_TV:
case HUMMER_EXTREME:
case R_TUNED:
return XNextEventDriving(display, event_return, returnValue); return XNextEventDriving(display, event_return, returnValue);
break; break;
// Shooting games case SHOOTING:
case THE_HOUSE_OF_THE_DEAD_4: case FIGHTING:
case THE_HOUSE_OF_THE_DEAD_4_SPECIAL:
case THE_HOUSE_OF_THE_DEAD_4_SPECIAL_TEST:
case THE_HOUSE_OF_THE_DEAD_4_STRIPPED:
case THE_HOUSE_OF_THE_DEAD_4_STRIPPED_TEST:
case THE_HOUSE_OF_THE_DEAD_4_TEST:
case THE_HOUSE_OF_THE_DEAD_EX:
case THE_HOUSE_OF_THE_DEAD_EX_TEST:
case TOO_SPICY:
case PRIMEVAL_HUNT:
case LETS_GO_JUNGLE:
case LETS_GO_JUNGLE_REVA:
case LETS_GO_JUNGLE_SPECIAL:
// Stick games
case VIRTUA_TENNIS_3:
case VIRTUA_TENNIS_3_TEST:
case VIRTUA_FIGHTER_5: // TODO: Add in all the other VFs
case VIRTUA_FIGHTER_5_EXPORT:
default: default:
return XNextEventShooting(display, event_return, returnValue); return XNextEventShooting(display, event_return, returnValue);
break; break;

View File

@ -8,7 +8,7 @@
#define PRELOAD_FILE_NAME "lindbergh.so" #define PRELOAD_FILE_NAME "lindbergh.so"
// List of all lindbergh executables known, not including the test executables // List of all lindbergh executables known, not including the test executables
char *games[] = {"hummer_Master.elf", "drive.elf", "chopperM.elf", "vsg", "Jennifer", "amiM.elf", "abc", "hod4M.elf", "lgj_final", "vt3", "id4.elf", "id5.elf", "lgjsp_app", "gsevo", "vf5", "apacheM.elf", "segaboot", "END"}; char *games[] = {"vt3_Lindbergh", "hummer_Master.elf", "drive.elf", "chopperM.elf", "vsg", "Jennifer", "amiM.elf", "abc", "hod4M.elf", "lgj_final", "vt3", "id4.elf", "id5.elf", "lgjsp_app", "gsevo", "vf5", "apacheM.elf", "segaboot", "END"};
/** /**
* Tests if the game uses a seperate elf for test mode * Tests if the game uses a seperate elf for test mode
@ -37,6 +37,12 @@ void testModePath(char *name)
return; return;
} }
if (strcmp(name, "./vt3_Lindbergh") == 0)
{
strcpy(name, "./vt3_testmode");
return;
}
// Otherwise add the standard -t to the end // Otherwise add the standard -t to the end
strcat(name, " -t"); strcat(name, " -t");
} }
@ -57,7 +63,7 @@ void setEnvironmentVariables()
strcat(libraryPath, ":"); strcat(libraryPath, ":");
} }
strcat(libraryPath, ".:lib"); strcat(libraryPath, ".:lib:../lib");
setenv(LD_LIBRARY_PATH, libraryPath, 1); setenv(LD_LIBRARY_PATH, libraryPath, 1);

View File

@ -125,11 +125,11 @@ int amDongleUpdate()
int amDongleUserInfoEx(int a, int b, char *_arcadeContext) int amDongleUserInfoEx(int a, int b, char *_arcadeContext)
{ {
if (getConfig()->game == INITIALD_4_REVE) if (getConfig()->crc32 == INITIALD_4_REVE)
memcpy(_arcadeContext, "SBNK", 4); memcpy(_arcadeContext, "SBNK", 4);
else if (getConfig()->game == INITIALD_5_EXP_20) else if (getConfig()->crc32 == INITIALD_5_EXP_20)
memcpy(_arcadeContext, "SBPF", 4); memcpy(_arcadeContext, "SBPF", 4);
else if (getConfig()->game == HUMMER_EXTREME) else if (getConfig()->crc32 == HUMMER_EXTREME)
memcpy(_arcadeContext, "SBST", 4); memcpy(_arcadeContext, "SBST", 4);
return 0; return 0;
} }
@ -239,7 +239,7 @@ int initPatch()
{ {
EmulatorConfig *config = getConfig(); EmulatorConfig *config = getConfig();
switch (config->game) switch (config->crc32)
{ {
case R_TUNED: case R_TUNED:
{ {