1
0
mirror of synced 2024-11-24 02:00:09 +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)
{
if (elf_crc == 0x93ea7e11)
switch (elf_crc)
{
config.game = SEGABOOT_2_4;
case SEGABOOT_2_4:
{
config.gameTitle = "Segaboot 2.4";
config.gameStatus = WORKING;
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;
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;
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;
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;
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;
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.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.gameTitle = "Outrun 2 SP SDX";
config.emulateDriveboard = 1;
config.emulateMotionboard = 1;
config.gameStatus = WORKING;
return 0;
}
break;
if (elf_crc == 0xffdccaaa)
case VIRTUA_FIGHTER_5_EXPORT:
{
config.game = OUTRUN_2_SP_SDX_REVA_TEST;
config.emulateDriveboard = 1;
config.emulateMotionboard = 1;
config.gameTitle = "Virtua Fighter 5 Export";
config.gameDVP = "DVP-0043";
config.gameStatus = WORKING;
return 0;
}
break;
if(elf_crc == 0x157B0576) {
config.game = VIRTUA_FIGHTER_5_EXPORT;
case LETS_GO_JUNGLE:
{
config.gameTitle = "Let's Go Jungle! Lost on the Island of Spice!";
config.gameStatus = WORKING;
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;
return 0;
}
break;
if (elf_crc == 0xbbabc0e0)
case AFTER_BURNER_CLIMAX:
{
config.game = LETS_GO_JUNGLE_SPECIAL;
config.gameStatus = NOT_WORKING;
return 0;
}
if (elf_crc == 0xcc02de7d)
{
config.game = AFTER_BURNER_CLIMAX;
config.gameTitle = "After Burner Climax";
config.gameStatus = WORKING;
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;
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;
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;
return 0;
}
break;
if (elf_crc == 0x4e9ccf33)
case INITIALD_4:
{
config.game = INITIALD_4;
config.gameStatus = NOT_WORKING;
config.gameTitle = "Initial D Arcade Stage 4";
config.gameStatus = WORKING;
return 0;
}
break;
if (elf_crc == 0x7f3f9f0c)
case INITIALD_4_REVE:
{
config.game = INITIALD_4_REVE;
config.gameStatus = NOT_WORKING;
config.gameTitle = "Initial D Arcade Stage 4 Rev E";
config.gameStatus = WORKING;
return 0;
}
break;
if (elf_crc == 0xfb096f81)
case SEGA_RACE_TV:
{
config.game = 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.gameTitle = "SEGA Race TV";
config.emulateDriveboard = 1;
config.gameStatus = WORKING;
return 0;
}
break;
if (elf_crc == 0x4c768eb4)
case RAMBO:
{
config.game = TOO_SPICY;
config.gameTitle = "Rambo";
config.gameStatus = WORKING;
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;
return 0;
}
break;
if (elf_crc == 0xffe3b0fd)
case TOO_SPICY:
{
config.game = VIRTUA_TENNIS_3_TEST;
config.gameStatus = NOT_WORKING;
return 0;
}
if (elf_crc == 0x1bf1b627)
{
config.game = VIRTUA_FIGHTER_5_REVC;
config.gameTitle = "Too Spicy";
config.gameStatus = WORKING;
return 0;
}
break;
if(elf_crc == 0xC4B05D40) {
config.game = VIRTUA_FIGHTER_5_REVE;
config.gameStatus = NOT_WORKING;
return 0;
}
if (elf_crc == 0x3CC635EE)
case VIRTUA_TENNIS_3:
case VIRTUA_TENNIS_3_TEST:
{
config.game = SEGABOOT_2_4;
config.gameTitle = "Virtua Tennis 3";
config.gameStatus = WORKING;
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;
return 0;
}
break;
if (elf_crc == 0xe60d8e04)
case PRIMEVAL_HUNT:
{
config.game = GHOST_SQUAD_EVOLUTION;
config.gameTitle = "Primeval Hunt";
config.gameStatus = NOT_WORKING;
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;
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;
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;
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;
return 0;
}
break;
default:
{
config.crc32 = UNKNOWN;
}
break;
}
config.game = UNKNOWN;
return 1;
}
char *getGameName()
{
char *unknownGameTitle = "Unknown Game";
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;
return config.gameTitle;
}
char *getDVPName()
{
return config.gameDVP;
}
char *getGameID()
{
return config.gameID;
}
int readConfig(FILE *configFile, EmulatorConfig *config)
@ -514,6 +416,10 @@ int initConfig()
config.region = -1;
config.freeplay = -1;
config.showDebugMessages = 0;
config.gameTitle = "Unknown game";
config.gameID = "XXXX";
config.gameDVP = "DVP-XXXX";
config.gameType = SHOOTING;
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);

View File

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

View File

@ -68,7 +68,7 @@ int initEeprom()
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)
{

View File

@ -29,7 +29,7 @@ FGAPI int FGAPIENTRY glutEnterGameMode()
glutCreateWindow(gameTitle);
// 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)
{
pthread_t glutMainLoopID;
@ -107,7 +107,7 @@ Window XCreateWindow(Display *display, Window parent, int x, int y, unsigned int
// attributes->override_redirect = False;
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)
{

View File

@ -136,7 +136,6 @@ static void handleSegfault(int signal, siginfo_t *info, void *ptr)
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.
dl_iterate_phdr(callback, NULL);
@ -184,15 +183,12 @@ void __attribute__((constructor)) hook_init()
securityBoardSetDipResolution(getConfig()->width, getConfig()->height);
printf("Now starting \"%s\"", getGameName());
if (getConfig()->gameStatus == WORKING)
{
printf((", this game is working.\n"));
}
else
{
printf((", this game is NOT working.\n"));
}
printf("\nSEGA Lindbergh Emulator\nRobert Dilley 2023\n\n");
printf(" GAME: %s\n", getGameName());
printf(" GAME ID: %s\n", getGameID());
printf(" DVP: %s\n", getDVPName());
printf(" STATUS: %s\n", getConfig()->gameStatus == WORKING ? "WORKING" : "NOT WORKING");
}
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)
{
EmulatorConfig *config = getConfig();
config->game = SEGABOOT_2_6;
fileRead[OSRELEASE] = 0;
fileHooks[OSRELEASE] = _fopen64(HOOK_FILE_NAME, mode);
return fileHooks[OSRELEASE];
@ -708,8 +703,8 @@ char *getenv(const char *name)
{
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) ||
((getConfig()->game == RAMBO)) || (getConfig()->game == TOO_SPICY)))
if ((strcmp(name, "TEA_DIR") == 0) && ((getConfig()->crc32 == VIRTUA_TENNIS_3) || (getConfig()->crc32 == VIRTUA_TENNIS_3_TEST) ||
((getConfig()->crc32 == RAMBO)) || (getConfig()->crc32 == TOO_SPICY)))
{
if (getcwd(envpath, 100) == NULL)
return "";

View File

@ -15,11 +15,11 @@
#include <pthread.h>
#include <math.h>
Game game = UNKNOWN;
GameType gameType = SHOOTING;
int initInput()
{
game = getConfig()->game;
gameType = getConfig()->gameType;
return 0;
}
@ -199,44 +199,14 @@ int XNextEvent(Display *display, XEvent *event_return)
}
// Select the appropriate input mapping depending on the game
switch (game)
switch (gameType)
{
// Driving games
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:
case DRIVING:
return XNextEventDriving(display, event_return, returnValue);
break;
// Shooting games
case THE_HOUSE_OF_THE_DEAD_4:
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:
case SHOOTING:
case FIGHTING:
default:
return XNextEventShooting(display, event_return, returnValue);
break;

View File

@ -8,7 +8,7 @@
#define PRELOAD_FILE_NAME "lindbergh.so"
// 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
@ -37,6 +37,12 @@ void testModePath(char *name)
return;
}
if (strcmp(name, "./vt3_Lindbergh") == 0)
{
strcpy(name, "./vt3_testmode");
return;
}
// Otherwise add the standard -t to the end
strcat(name, " -t");
}
@ -57,7 +63,7 @@ void setEnvironmentVariables()
strcat(libraryPath, ":");
}
strcat(libraryPath, ".:lib");
strcat(libraryPath, ".:lib:../lib");
setenv(LD_LIBRARY_PATH, libraryPath, 1);

View File

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