mirror of
https://github.com/lindbergh-loader/lindbergh-loader.git
synced 2026-10-14 01:49:12 +03:00
Compare commits
15
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cc500aa7ef | ||
|
|
cafd6276c3 | ||
|
|
a2dbf1cbda | ||
|
|
74d61985ec | ||
|
|
4d0996b905 | ||
|
|
52cb3eaf6b | ||
|
|
8b6604efc5 | ||
|
|
7b426f0d11 | ||
|
|
442d03b144 | ||
|
|
50a1a35f7f | ||
|
|
728c308835 | ||
|
|
543ebe4817 | ||
|
|
1f20a51aba | ||
|
|
8347b61468 | ||
|
|
3642e2392b |
@@ -1,7 +1,8 @@
|
||||
CC = gcc -m32 -pthread
|
||||
CFLAGS = -g -fPIC -m32 -Wall -Werror -Wno-misleading-indentation -Wno-unused-but-set-variable -Wno-unused-variable -Wno-unused-function -D_GNU_SOURCE -Wno-char-subscripts
|
||||
LD = g++ -m32
|
||||
LDFLAGS = -Wl,-z,defs -rdynamic -static-libgcc -lc -ldl -lGL -lglut -lX11 -lSDL2 -lm -lpthread -shared -nostdlib -lasound -L./src/libxdiff -lxdiff
|
||||
CC ?= gcc
|
||||
CFLAGS = -g -fPIC -m32 -pthread -Wall -Werror -Wno-misleading-indentation -Wno-unused-but-set-variable -Wno-unused-variable -Wno-unused-function -D_GNU_SOURCE -Wno-char-subscripts
|
||||
CXX ?= g++
|
||||
LD = $(CXX)
|
||||
LDFLAGS = -m32 -Wl,-z,defs -rdynamic -static-libgcc -lc -ldl -lGL -lglut -lX11 -lXcursor -lSDL2 -lm -lpthread -shared -nostdlib -lasound -L./src/libxdiff -lxdiff -L/app/lib32
|
||||
|
||||
BUILD = build
|
||||
|
||||
@@ -17,14 +18,14 @@ all: lindbergh libxdiff.a lindbergh.so libsegaapi.so libkswapapi.so libposixtime
|
||||
|
||||
lindbergh: src/lindbergh/lindbergh.c src/lindbergh/log.c src/lindbergh/log.h src/lindbergh/jvs.c src/lindbergh/jvs.h src/lindbergh/config.h src/lindbergh/config.c src/lindbergh/evdevinput.h src/lindbergh/evdevinput.c
|
||||
mkdir -p $(BUILD)
|
||||
$(CC) src/lindbergh/lindbergh.c src/lindbergh/log.h src/lindbergh/log.c src/lindbergh/jvs.h src/lindbergh/jvs.c src/lindbergh/config.h src/lindbergh/config.c src/lindbergh/evdevinput.c src/lindbergh/evdevinput.h -o $(BUILD)/lindbergh -lm
|
||||
$(CC) -m32 src/lindbergh/lindbergh.c src/lindbergh/log.h src/lindbergh/log.c src/lindbergh/jvs.h src/lindbergh/jvs.c src/lindbergh/config.h src/lindbergh/config.c src/lindbergh/evdevinput.c src/lindbergh/evdevinput.h -o $(BUILD)/lindbergh -lm
|
||||
|
||||
libxdiff.a: $(XDIFF_OBJS)
|
||||
mkdir -p $(BUILD)
|
||||
ar rcs src/libxdiff/libxdiff.a $(XDIFF_OBJS)
|
||||
|
||||
src/libxdiff/xdiff/%.o: src/libxdiff/xdiff/%.c
|
||||
$(CC) -DHAVE_CONFIG_H -fPIC -c $< -o $@
|
||||
$(CC) -m32 -DHAVE_CONFIG_H -fPIC -c $< -o $@
|
||||
|
||||
lindbergh.so: $(OBJS)
|
||||
mkdir -p $(BUILD)
|
||||
@@ -34,13 +35,13 @@ lindbergh.so: $(OBJS)
|
||||
$(CC) $(CFLAGS) -c $< -o $@
|
||||
|
||||
libsegaapi.so: src/libsegaapi/libsegaapi.o
|
||||
gcc -m32 -O0 -g src/libsegaapi/libsegaapi.c -lFAudio -fPIC -shared -o $(BUILD)/libsegaapi.so
|
||||
$(CC) -m32 -O0 -g src/libsegaapi/libsegaapi.c -lFAudio -L/app/lib32 -fPIC -shared -o $(BUILD)/libsegaapi.so
|
||||
|
||||
libkswapapi.so: src/libkswapapi/libkswapapi.o
|
||||
$(CC) src/libkswapapi/libkswapapi.o -fPIC -shared -o $(BUILD)/libkswapapi.so
|
||||
$(CC) -m32 src/libkswapapi/libkswapapi.o -fPIC -shared -o $(BUILD)/libkswapapi.so
|
||||
|
||||
libposixtime.so:
|
||||
$(CC) src/libposixtime/libposixtime.c src/libposixtime/libposixtime.h -m32 -shared -o $(BUILD)/libposixtime.so
|
||||
$(CC) -m32 src/libposixtime/libposixtime.c src/libposixtime/libposixtime.h -m32 -shared -o $(BUILD)/libposixtime.so
|
||||
ln -s -f libposixtime.so $(BUILD)/libposixtime.so.1
|
||||
ln -s -f libposixtime.so $(BUILD)/libposixtime.so.2.4
|
||||
|
||||
|
||||
@@ -1339,6 +1339,8 @@ int readConfig(FILE *configFile, EmulatorConfig *config)
|
||||
strncpy(config->arcadeInputs.player1_button_9, getNextToken(NULL, " ", &saveptr), INPUT_STRING_LENGTH - 1);
|
||||
else if (strcmp(command, "PLAYER_1_BUTTON_10") == 0)
|
||||
strncpy(config->arcadeInputs.player1_button_10, getNextToken(NULL, " ", &saveptr), INPUT_STRING_LENGTH - 1);
|
||||
else if (strcmp(command, "PLAYER_1_COIN") == 0)
|
||||
strncpy(config->arcadeInputs.player1_coin, getNextToken(NULL, " ", &saveptr), INPUT_STRING_LENGTH - 1);
|
||||
|
||||
// Player 2 controls
|
||||
else if (strcmp(command, "PLAYER_2_BUTTON_START") == 0)
|
||||
|
||||
@@ -183,6 +183,7 @@ typedef struct {
|
||||
char player1_button_8[INPUT_STRING_LENGTH];
|
||||
char player1_button_9[INPUT_STRING_LENGTH];
|
||||
char player1_button_10[INPUT_STRING_LENGTH];
|
||||
char player1_coin[INPUT_STRING_LENGTH];
|
||||
|
||||
// Player 2 controls
|
||||
char player2_button_start[INPUT_STRING_LENGTH];
|
||||
|
||||
+138
-20
@@ -41,6 +41,7 @@ ArcadeInput arcadeInputs[] = {{"TEST_BUTTON", 0, BUTTON_TEST, 1},
|
||||
{"PLAYER_1_BUTTON_8", 1, BUTTON_8, 1},
|
||||
{"PLAYER_1_BUTTON_9", 1, BUTTON_9, 1},
|
||||
{"PLAYER_1_BUTTON_10", 1, BUTTON_10, 1},
|
||||
{"PLAYER_1_COIN", 1, COIN, 1},
|
||||
|
||||
{"PLAYER_2_BUTTON_START", 2, BUTTON_START, 1},
|
||||
{"PLAYER_2_BUTTON_SERVICE", 2, BUTTON_SERVICE, 1},
|
||||
@@ -920,14 +921,18 @@ static ControllerStatus listControllers(Controllers *controllers)
|
||||
strcat(controllerInput->inputName, "_");
|
||||
strcat(controllerInput->inputName, codename(EV_KEY, code));
|
||||
normaliseName(controllerInput->inputName);
|
||||
if(snprintf(controllerInput->inputTechName, SIZE, "%s:KEY:%i", controllers->controller[i].path, code) >= 1024) {
|
||||
// hum ok, truncated value
|
||||
}
|
||||
strcpy(controllerInput->inputTechNegName, "-"); // unassignable value (not "" while some conf are empty)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (test_bit(EV_ABS, bit[0]))
|
||||
{
|
||||
ioctl(controller, EVIOCGBIT(EV_ABS, KEY_MAX), bit[EV_ABS]);
|
||||
for (int code = 0; code < KEY_MAX; code++)
|
||||
ioctl(controller, EVIOCGBIT(EV_ABS, ABS_MAX), bit[EV_ABS]);
|
||||
for (int code = 0; code < ABS_MAX; code++)
|
||||
{
|
||||
if (test_bit(code, bit[EV_ABS]))
|
||||
{
|
||||
@@ -941,6 +946,12 @@ static ControllerStatus listControllers(Controllers *controllers)
|
||||
strcat(controllerInput->inputName, "_");
|
||||
strcat(controllerInput->inputName, codename(EV_ABS, code));
|
||||
normaliseName(controllerInput->inputName);
|
||||
if(snprintf(controllerInput->inputTechName, SIZE, "%s:ABS:%i", controllers->controller[i].path, code) >= 1024) {
|
||||
// hum ok, truncated value
|
||||
}
|
||||
if(snprintf(controllerInput->inputTechNegName, SIZE, "%s:ABS_NEG:%i", controllers->controller[i].path, code) >= 1024) {
|
||||
// hum ok, truncated value
|
||||
}
|
||||
|
||||
ControllerInput *minControllerInput =
|
||||
&controllers->controller[i].inputs[controllers->controller[i].inputCount++];
|
||||
@@ -949,6 +960,12 @@ static ControllerStatus listControllers(Controllers *controllers)
|
||||
minControllerInput->specialFunction = ANALOGUE_TO_DIGITAL_MIN;
|
||||
strcpy(minControllerInput->inputName, controllerInput->inputName);
|
||||
strcat(minControllerInput->inputName, "_MIN");
|
||||
if(snprintf(minControllerInput->inputTechName, SIZE, "%s:ABS:%i:MIN", controllers->controller[i].path, code) >= 1024) {
|
||||
// hum ok, truncated value
|
||||
}
|
||||
if(snprintf(minControllerInput->inputTechNegName, SIZE, "%s:ABS_NEG:%i:MIN", controllers->controller[i].path, code) >= 1024) {
|
||||
// hum ok, truncated value
|
||||
}
|
||||
|
||||
ControllerInput *maxControllerInput =
|
||||
&controllers->controller[i].inputs[controllers->controller[i].inputCount++];
|
||||
@@ -957,6 +974,23 @@ static ControllerStatus listControllers(Controllers *controllers)
|
||||
maxControllerInput->specialFunction = ANALOGUE_TO_DIGITAL_MAX;
|
||||
strcpy(maxControllerInput->inputName, controllerInput->inputName);
|
||||
strcat(maxControllerInput->inputName, "_MAX");
|
||||
if(snprintf(maxControllerInput->inputTechName, SIZE, "%s:ABS:%i:MAX", controllers->controller[i].path, code) >= 1024) {
|
||||
// hum ok, truncated value
|
||||
}
|
||||
if(snprintf(maxControllerInput->inputTechNegName, SIZE, "%s:ABS_NEG:%i:MAX", controllers->controller[i].path, code) >= 1024) {
|
||||
// hum ok, truncated value
|
||||
}
|
||||
|
||||
ControllerInput *shakeControllerInput =
|
||||
&controllers->controller[i].inputs[controllers->controller[i].inputCount++];
|
||||
shakeControllerInput->evType = EV_ABS;
|
||||
shakeControllerInput->evCode = code;
|
||||
shakeControllerInput->specialFunction = ANALOGUE_SHAKE;
|
||||
strcpy(shakeControllerInput->inputName, controllerInput->inputName);
|
||||
strcat(shakeControllerInput->inputName, "_SHAKE");
|
||||
if(snprintf(shakeControllerInput->inputTechName, SIZE, "%s:ABS:%i:SHAKE", controllers->controller[i].path, code) >= 1024) {
|
||||
// hum ok, truncated value
|
||||
}
|
||||
|
||||
struct input_absinfo absoluteFeatures;
|
||||
ioctl(controller, EVIOCGABS(code), &absoluteFeatures);
|
||||
@@ -1048,8 +1082,13 @@ void *controllerThread(void *_args)
|
||||
continue;
|
||||
}
|
||||
|
||||
setSwitch(args->controller->keyTriggers[event.code].player,
|
||||
args->controller->keyTriggers[event.code].channel, event.value == 0 ? 0 : 1);
|
||||
if(args->controller->keyTriggers[event.code].isCoin == 1) {
|
||||
if(event.value == 1)
|
||||
incrementCoin(args->controller->keyTriggers[event.code].player, 1);
|
||||
} else
|
||||
setSwitch(args->controller->keyTriggers[event.code].player,
|
||||
args->controller->keyTriggers[event.code].channel, event.value == 0 ? 0 : 1);
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1059,31 +1098,67 @@ void *controllerThread(void *_args)
|
||||
((double)event.value - (double)args->controller->absMin[event.code]) /
|
||||
((double)args->controller->absMax[event.code] - (double)args->controller->absMin[event.code]);
|
||||
|
||||
if(args->controller->absTriggers[event.code].isNeg == 1) {
|
||||
scaled = 1.0 - scaled;
|
||||
}
|
||||
|
||||
if (args->controller->absTriggers[event.code].enabled)
|
||||
{
|
||||
int channel = args->controller->absTriggers[event.code].channel;
|
||||
// Deadzone handling
|
||||
if (scaled < analogue_deadzones[channel].start_max)
|
||||
|
||||
if (args->controller->absTriggers[event.code].isAnalogue) {
|
||||
// Deadzone handling
|
||||
if (scaled < analogue_deadzones[channel].start_max)
|
||||
scaled = 0.0;
|
||||
if (scaled > analogue_deadzones[channel].middle_min && scaled < analogue_deadzones[channel].middle_max)
|
||||
if (scaled > analogue_deadzones[channel].middle_min && scaled < analogue_deadzones[channel].middle_max)
|
||||
scaled = 0.5;
|
||||
if (scaled > analogue_deadzones[channel].end_min)
|
||||
if (scaled > analogue_deadzones[channel].end_min)
|
||||
scaled = 1.0;
|
||||
|
||||
setAnalogue(channel, scaled * (pow(2, jvsBits) - 1));
|
||||
setAnalogue(channel, scaled * (pow(2, jvsBits) - 1));
|
||||
} else {
|
||||
setSwitch(args->controller->absTriggers[event.code].player,
|
||||
args->controller->absTriggers[event.code].channel, scaled < 0.8 ? 0 : 1);
|
||||
}
|
||||
}
|
||||
|
||||
if (args->controller->absTriggers[event.code].minEnabled)
|
||||
{
|
||||
setSwitch(args->controller->absTriggers[event.code].minPlayer,
|
||||
args->controller->absTriggers[event.code].minChannel, scaled < 0.2);
|
||||
if(event.value <= ((args->controller->absMin[event.code] + args->controller->absMax[event.code]) / 2)) {
|
||||
if (args->controller->absTriggers[event.code].minEnabled)
|
||||
{
|
||||
int channel = args->controller->absTriggers[event.code].minChannel;
|
||||
|
||||
if (args->controller->absTriggers[event.code].isAnalogue) {
|
||||
setAnalogue(channel, scaled < 0.2 ? 0.0 : pow(2, jvsBits) * 1.0);
|
||||
} else {
|
||||
setSwitch(args->controller->absTriggers[event.code].minPlayer,
|
||||
args->controller->absTriggers[event.code].minChannel, scaled < 0.2 ? 1 : 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (args->controller->absTriggers[event.code].maxEnabled)
|
||||
{
|
||||
setSwitch(args->controller->absTriggers[event.code].maxPlayer,
|
||||
args->controller->absTriggers[event.code].maxChannel, scaled > 0.8);
|
||||
if(event.value >= ((args->controller->absMin[event.code] + args->controller->absMax[event.code]) / 2)) {
|
||||
if (args->controller->absTriggers[event.code].maxEnabled)
|
||||
{
|
||||
int channel = args->controller->absTriggers[event.code].maxChannel;
|
||||
|
||||
if (args->controller->absTriggers[event.code].isAnalogue) {
|
||||
setAnalogue(channel, scaled > 0.8 ? pow(2, jvsBits) : 0.0);
|
||||
} else {
|
||||
setSwitch(args->controller->absTriggers[event.code].maxPlayer,
|
||||
args->controller->absTriggers[event.code].maxChannel, scaled > 0.8 ? 1 : 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (args->controller->absTriggers[event.code].shakeEnabled)
|
||||
{
|
||||
int channel = args->controller->absTriggers[event.code].shakeChannel;
|
||||
if( (scaled > args->controller->absTriggers[event.code].shakePreviousScaled && scaled - args->controller->absTriggers[event.code].shakePreviousScaled > 0.1) ||
|
||||
(scaled < args->controller->absTriggers[event.code].shakePreviousScaled && -scaled + args->controller->absTriggers[event.code].shakePreviousScaled > 0.1)) {
|
||||
setAnalogue(channel, 0);
|
||||
} else {
|
||||
setAnalogue(channel, pow(2, jvsBits) / 2);
|
||||
}
|
||||
args->controller->absTriggers[event.code].shakePreviousScaled = scaled;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1106,6 +1181,8 @@ char *getMapping(char *mapping)
|
||||
// Test button
|
||||
if (strcmp(mapping, config->arcadeInputs.test) == 0)
|
||||
return "TEST_BUTTON";
|
||||
if (strcmp(mapping, config->arcadeInputs.player1_coin) == 0)
|
||||
return "PLAYER_1_COIN";
|
||||
|
||||
// Player 1 controls
|
||||
if (strcmp(mapping, config->arcadeInputs.player1_button_start) == 0)
|
||||
@@ -1232,19 +1309,35 @@ ControllerStatus startControllerThreads(Controllers *controllers)
|
||||
controllers->controller[i].absTriggers[j].enabled = 0;
|
||||
controllers->controller[i].absTriggers[j].minEnabled = 0;
|
||||
controllers->controller[i].absTriggers[j].maxEnabled = 0;
|
||||
controllers->controller[i].absTriggers[j].shakeEnabled = 0;
|
||||
controllers->controller[i].absTriggers[j].isNeg = 0;
|
||||
controllers->controller[i].absTriggers[j].isAnalogue = 1;
|
||||
}
|
||||
|
||||
for (int j = 0; j < KEY_MAX; j++)
|
||||
{
|
||||
controllers->controller[i].keyTriggers[j].enabled = 0;
|
||||
controllers->controller[i].keyTriggers[j].isAnalogue = 0;
|
||||
controllers->controller[i].keyTriggers[j].isCoin = 0;
|
||||
}
|
||||
|
||||
for (int j = 0; j < controllers->controller[i].inputCount; j++)
|
||||
{
|
||||
char *mapping = getMapping(controllers->controller[i].inputs[j].inputName);
|
||||
if (mapping == NULL)
|
||||
continue;
|
||||
int negabs = 0;
|
||||
|
||||
if (mapping == NULL) {
|
||||
// give a 2nd chance with a techninal mapping
|
||||
mapping = getMapping(controllers->controller[i].inputs[j].inputTechName);
|
||||
if (mapping == NULL) {
|
||||
// give a 3rd change with negativ technical mapping
|
||||
mapping = getMapping(controllers->controller[i].inputs[j].inputTechNegName);
|
||||
negabs = 1;
|
||||
if (mapping == NULL) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ArcadeInput input = {0};
|
||||
ControllerStatus status = getArcadeInputByName(mapping, &input);
|
||||
@@ -1269,6 +1362,9 @@ ControllerStatus startControllerThreads(Controllers *controllers)
|
||||
input.name);
|
||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].player =
|
||||
input.player;
|
||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].isNeg = negabs;
|
||||
if (strstr(input.name, "ANALOGUE") == NULL)
|
||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].isAnalogue = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1281,6 +1377,9 @@ ControllerStatus startControllerThreads(Controllers *controllers)
|
||||
input.name);
|
||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].maxPlayer =
|
||||
input.player;
|
||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].isNeg = negabs;
|
||||
if (strstr(input.name, "ANALOGUE") == NULL)
|
||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].isAnalogue = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1293,6 +1392,21 @@ ControllerStatus startControllerThreads(Controllers *controllers)
|
||||
input.name);
|
||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].minPlayer =
|
||||
input.player;
|
||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].isNeg = negabs;
|
||||
if (strstr(input.name, "ANALOGUE") == NULL)
|
||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].isAnalogue = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case ANALOGUE_SHAKE:
|
||||
{
|
||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].shakeEnabled = 1;
|
||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].shakeChannel =
|
||||
input.channel;
|
||||
strcpy(controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].shakeName,
|
||||
input.name);
|
||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].shakePlayer =
|
||||
input.player;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1314,6 +1428,10 @@ ControllerStatus startControllerThreads(Controllers *controllers)
|
||||
|
||||
if (strstr(input.name, "ANALOGUE") != NULL)
|
||||
controllers->controller[i].keyTriggers[controllers->controller[i].inputs[j].evCode].isAnalogue = 1;
|
||||
|
||||
if (strcmp(input.name, "PLAYER_1_COIN") == 0) {
|
||||
controllers->controller[i].keyTriggers[controllers->controller[i].inputs[j].evCode].isCoin = 1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
@@ -31,6 +31,15 @@ typedef struct
|
||||
int maxEnabled;
|
||||
|
||||
int isAnalogue;
|
||||
int isNeg; // reversed axis
|
||||
|
||||
char shakeName[SIZE];
|
||||
int shakeChannel;
|
||||
int shakeEnabled;
|
||||
int shakePlayer;
|
||||
double shakePreviousScaled;
|
||||
|
||||
int isCoin;
|
||||
} ArcadeInput;
|
||||
|
||||
typedef enum
|
||||
@@ -43,12 +52,15 @@ typedef enum {
|
||||
NO_SPECIAL_FUNCTION = 0,
|
||||
ANALOGUE_TO_DIGITAL_MAX,
|
||||
ANALOGUE_TO_DIGITAL_MIN,
|
||||
DIGITAL_TO_ANALOGUE
|
||||
DIGITAL_TO_ANALOGUE,
|
||||
ANALOGUE_SHAKE
|
||||
} SpecialFunction;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char inputName[SIZE];
|
||||
char inputTechName[SIZE];
|
||||
char inputTechNegName[SIZE];
|
||||
int evType;
|
||||
int evCode;
|
||||
SpecialFunction specialFunction;
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#define LD_LIBRARY_PATH "LD_LIBRARY_PATH"
|
||||
#define LD_PRELOAD "LD_PRELOAD"
|
||||
#define PRELOAD_FILE_NAME "lindbergh.so"
|
||||
#define PRELOAD_FILE_FLATPAK "/app/lib32/lindbergh.so"
|
||||
#define TEAM "bobbydilley, retrofan, dkeruza-neo, doozer, francesco, rolel, caviar-x"
|
||||
#define LINDBERGH_CONFIG_PATH "LINDBERGH_CONFIG_PATH"
|
||||
|
||||
@@ -232,7 +233,7 @@ void testModePath(char *name)
|
||||
* Makes sure the environment variables are set correctly
|
||||
* to run the game.
|
||||
*/
|
||||
void setEnvironmentVariables()
|
||||
void setEnvironmentVariables(int isFlatpak, int zink)
|
||||
{
|
||||
// Ensure the library path is set correctly
|
||||
char libraryPath[128] = {0};
|
||||
@@ -249,7 +250,13 @@ void setEnvironmentVariables()
|
||||
setenv(LD_LIBRARY_PATH, libraryPath, 1);
|
||||
|
||||
// Ensure the preload path is set correctly
|
||||
setenv(LD_PRELOAD, PRELOAD_FILE_NAME, 1);
|
||||
if (!isFlatpak)
|
||||
setenv(LD_PRELOAD, PRELOAD_FILE_NAME, 1);
|
||||
else
|
||||
setenv(LD_PRELOAD, PRELOAD_FILE_FLATPAK, 1);
|
||||
|
||||
if(zink)
|
||||
setenv("MESA_LOADER_DRIVER_OVERRIDE", "zink", 1);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -316,9 +323,6 @@ void printVersion() {
|
||||
*/
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
// Ensure environment variables are set correctly
|
||||
setEnvironmentVariables();
|
||||
|
||||
// Check for --version before directory operations
|
||||
if (argc > 1 && strcmp(argv[1], "--version") == 0) {
|
||||
printVersion();
|
||||
@@ -338,6 +342,7 @@ int main(int argc, char *argv[])
|
||||
char *game = NULL;
|
||||
|
||||
int lindberghSharedObjectFound = 0;
|
||||
int isFlatpak = 0;
|
||||
|
||||
while ((ent = readdir(dir)) != NULL)
|
||||
{
|
||||
@@ -385,14 +390,24 @@ int main(int argc, char *argv[])
|
||||
|
||||
if (!lindberghSharedObjectFound)
|
||||
{
|
||||
log_error("The preload object lindbergh.so was not found in this directory.");
|
||||
return EXIT_FAILURE;
|
||||
FILE *file = fopen(PRELOAD_FILE_FLATPAK, "r");
|
||||
if (file)
|
||||
{
|
||||
fclose(file);
|
||||
isFlatpak = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
log_error("The preload object lindbergh.so was not found in this directory.");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
// Build up the command to start the game
|
||||
|
||||
int testMode = 0;
|
||||
int gdb = 0;
|
||||
int zink = 0;
|
||||
int forceGame = 0;
|
||||
int segaboot = 0;
|
||||
char extConfigPath[PATH_MAX] = {0};
|
||||
@@ -417,6 +432,13 @@ int main(int argc, char *argv[])
|
||||
gdb = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strcmp(argv[i], "--zink") == 0)
|
||||
{
|
||||
zink = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strcmp(argv[i], "-c") == 0 || strcmp(argv[i], "--config") == 0)
|
||||
{
|
||||
if (i+1 >= argc)
|
||||
@@ -432,6 +454,9 @@ int main(int argc, char *argv[])
|
||||
forceGame = 1;
|
||||
}
|
||||
|
||||
// Ensure environment variables are set correctly
|
||||
setEnvironmentVariables(isFlatpak, zink);
|
||||
|
||||
char command[128] = {0};
|
||||
strcpy(command, "./");
|
||||
if (forceGame)
|
||||
|
||||
@@ -1432,16 +1432,30 @@ int parseCgcArgs(const char *input, const char ***compilerArgs, const char **out
|
||||
|
||||
void loadLibCg()
|
||||
{
|
||||
int isFlatpak = 0;
|
||||
void *handle = dlopen("./libCg.so", RTLD_NOW);
|
||||
if (!handle)
|
||||
{
|
||||
fprintf(stderr, "Error: Unable to load library libCg.so %s\n", dlerror());
|
||||
fprintf(stderr, "Error: libCg.so version 2.0 is needed to compile the shaders in the game's folder.\n");
|
||||
exit(1);
|
||||
handle = dlopen("/app/lib32/libCg2.so", RTLD_NOW);
|
||||
if (!handle)
|
||||
{
|
||||
fprintf(stderr, "Error: Unable to load library libCg.so %s\n", dlerror());
|
||||
fprintf(stderr, "Error: libCg.so version 2.0 is needed to compile the shaders in the game's folder.\n");
|
||||
exit(1);
|
||||
}
|
||||
else
|
||||
{
|
||||
isFlatpak = 1;
|
||||
}
|
||||
}
|
||||
|
||||
char libCgVersion[9];
|
||||
FILE *libF = fopen("./libCg.so", "r");
|
||||
FILE *libF;
|
||||
if (isFlatpak)
|
||||
libF = fopen("/app/lib32/libCg2.so", "r");
|
||||
else
|
||||
libF = fopen("./libCg.so", "r");
|
||||
|
||||
fseek(libF, 0x226d84, SEEK_SET);
|
||||
fread(libCgVersion, 9, 1, libF);
|
||||
fclose(libF);
|
||||
|
||||
@@ -702,14 +702,14 @@ static int stbi__sse2_available()
|
||||
|
||||
static int stbi__sse2_available()
|
||||
{
|
||||
#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 // GCC 4.8 or later
|
||||
//#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 // GCC 4.8 or later
|
||||
// GCC 4.8+ has a nice way to do this
|
||||
return __builtin_cpu_supports("sse2");
|
||||
#else
|
||||
//return __builtin_cpu_supports("sse2");
|
||||
//#else
|
||||
// portable way to do this, preferably without using GCC inline ASM?
|
||||
// just bail for now.
|
||||
return 0;
|
||||
#endif
|
||||
//#endif
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user