Compare commits

...
11 Commits
Author SHA1 Message Date
dkeruza cc500aa7ef Merge pull request #62 from nadenislamarre/evdev-keys
evdev: add technical input values
2025-03-08 16:00:54 -05:00
dkeruza cafd6276c3 Workaround 6 2025-02-27 16:26:25 -05:00
dkeruza a2dbf1cbda Workaround 5 2025-02-27 15:43:56 -05:00
dkeruza 74d61985ec Workaround 4 2025-02-27 15:41:17 -05:00
dkeruza 4d0996b905 Workaround 3 2025-02-27 15:29:33 -05:00
dkeruza 52cb3eaf6b Workaround 2 2025-02-27 14:42:30 -05:00
dkeruza 8b6604efc5 Workaround - Ups2 2025-02-27 00:13:27 -05:00
dkeruza 7b426f0d11 Workaround - Ups 2025-02-27 00:11:06 -05:00
Nicolas Adenis-Lamarre 1f20a51aba evdev: add abs to key mapping
Signed-off-by: Nicolas Adenis-Lamarre <nicolas.adenis.lamarre@gmail.com>
2025-02-01 10:24:22 +01:00
Nicolas Adenis-Lamarre 8347b61468 evdev: add shake special event
Signed-off-by: Nicolas Adenis-Lamarre <nicolas.adenis.lamarre@gmail.com>
2025-01-27 21:47:52 +01:00
Nicolas Adenis-Lamarre 3642e2392b evdev: add technical input values
Signed-off-by: Nicolas Adenis-Lamarre <nicolas.adenis.lamarre@gmail.com>
2025-01-24 22:35:38 +01:00
7 changed files with 189 additions and 34 deletions
+9 -8
View File
@@ -1,7 +1,8 @@
CC = gcc -m32 -pthread CC ?= gcc
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 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
LD = g++ -m32 CXX ?= g++
LDFLAGS = -Wl,-z,defs -rdynamic -static-libgcc -lc -ldl -lGL -lglut -lX11 -lSDL2 -lm -lpthread -shared -nostdlib -lasound -L./src/libxdiff -lxdiff 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 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 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) 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) libxdiff.a: $(XDIFF_OBJS)
mkdir -p $(BUILD) mkdir -p $(BUILD)
ar rcs src/libxdiff/libxdiff.a $(XDIFF_OBJS) ar rcs src/libxdiff/libxdiff.a $(XDIFF_OBJS)
src/libxdiff/xdiff/%.o: src/libxdiff/xdiff/%.c 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) lindbergh.so: $(OBJS)
mkdir -p $(BUILD) mkdir -p $(BUILD)
@@ -37,10 +38,10 @@ libsegaapi.so: src/libsegaapi/libsegaapi.o
$(CC) -m32 -O0 -g src/libsegaapi/libsegaapi.c -lFAudio -L/app/lib32 -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 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: 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.1
ln -s -f libposixtime.so $(BUILD)/libposixtime.so.2.4 ln -s -f libposixtime.so $(BUILD)/libposixtime.so.2.4
+2
View File
@@ -1339,6 +1339,8 @@ int readConfig(FILE *configFile, EmulatorConfig *config)
strncpy(config->arcadeInputs.player1_button_9, getNextToken(NULL, " ", &saveptr), INPUT_STRING_LENGTH - 1); strncpy(config->arcadeInputs.player1_button_9, getNextToken(NULL, " ", &saveptr), INPUT_STRING_LENGTH - 1);
else if (strcmp(command, "PLAYER_1_BUTTON_10") == 0) else if (strcmp(command, "PLAYER_1_BUTTON_10") == 0)
strncpy(config->arcadeInputs.player1_button_10, getNextToken(NULL, " ", &saveptr), INPUT_STRING_LENGTH - 1); 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 // Player 2 controls
else if (strcmp(command, "PLAYER_2_BUTTON_START") == 0) else if (strcmp(command, "PLAYER_2_BUTTON_START") == 0)
+1
View File
@@ -183,6 +183,7 @@ typedef struct {
char player1_button_8[INPUT_STRING_LENGTH]; char player1_button_8[INPUT_STRING_LENGTH];
char player1_button_9[INPUT_STRING_LENGTH]; char player1_button_9[INPUT_STRING_LENGTH];
char player1_button_10[INPUT_STRING_LENGTH]; char player1_button_10[INPUT_STRING_LENGTH];
char player1_coin[INPUT_STRING_LENGTH];
// Player 2 controls // Player 2 controls
char player2_button_start[INPUT_STRING_LENGTH]; char player2_button_start[INPUT_STRING_LENGTH];
+138 -20
View File
@@ -41,6 +41,7 @@ ArcadeInput arcadeInputs[] = {{"TEST_BUTTON", 0, BUTTON_TEST, 1},
{"PLAYER_1_BUTTON_8", 1, BUTTON_8, 1}, {"PLAYER_1_BUTTON_8", 1, BUTTON_8, 1},
{"PLAYER_1_BUTTON_9", 1, BUTTON_9, 1}, {"PLAYER_1_BUTTON_9", 1, BUTTON_9, 1},
{"PLAYER_1_BUTTON_10", 1, BUTTON_10, 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_START", 2, BUTTON_START, 1},
{"PLAYER_2_BUTTON_SERVICE", 2, BUTTON_SERVICE, 1}, {"PLAYER_2_BUTTON_SERVICE", 2, BUTTON_SERVICE, 1},
@@ -920,14 +921,18 @@ static ControllerStatus listControllers(Controllers *controllers)
strcat(controllerInput->inputName, "_"); strcat(controllerInput->inputName, "_");
strcat(controllerInput->inputName, codename(EV_KEY, code)); strcat(controllerInput->inputName, codename(EV_KEY, code));
normaliseName(controllerInput->inputName); 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])) if (test_bit(EV_ABS, bit[0]))
{ {
ioctl(controller, EVIOCGBIT(EV_ABS, KEY_MAX), bit[EV_ABS]); ioctl(controller, EVIOCGBIT(EV_ABS, ABS_MAX), bit[EV_ABS]);
for (int code = 0; code < KEY_MAX; code++) for (int code = 0; code < ABS_MAX; code++)
{ {
if (test_bit(code, bit[EV_ABS])) if (test_bit(code, bit[EV_ABS]))
{ {
@@ -941,6 +946,12 @@ static ControllerStatus listControllers(Controllers *controllers)
strcat(controllerInput->inputName, "_"); strcat(controllerInput->inputName, "_");
strcat(controllerInput->inputName, codename(EV_ABS, code)); strcat(controllerInput->inputName, codename(EV_ABS, code));
normaliseName(controllerInput->inputName); 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 = ControllerInput *minControllerInput =
&controllers->controller[i].inputs[controllers->controller[i].inputCount++]; &controllers->controller[i].inputs[controllers->controller[i].inputCount++];
@@ -949,6 +960,12 @@ static ControllerStatus listControllers(Controllers *controllers)
minControllerInput->specialFunction = ANALOGUE_TO_DIGITAL_MIN; minControllerInput->specialFunction = ANALOGUE_TO_DIGITAL_MIN;
strcpy(minControllerInput->inputName, controllerInput->inputName); strcpy(minControllerInput->inputName, controllerInput->inputName);
strcat(minControllerInput->inputName, "_MIN"); 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 = ControllerInput *maxControllerInput =
&controllers->controller[i].inputs[controllers->controller[i].inputCount++]; &controllers->controller[i].inputs[controllers->controller[i].inputCount++];
@@ -957,6 +974,23 @@ static ControllerStatus listControllers(Controllers *controllers)
maxControllerInput->specialFunction = ANALOGUE_TO_DIGITAL_MAX; maxControllerInput->specialFunction = ANALOGUE_TO_DIGITAL_MAX;
strcpy(maxControllerInput->inputName, controllerInput->inputName); strcpy(maxControllerInput->inputName, controllerInput->inputName);
strcat(maxControllerInput->inputName, "_MAX"); 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; struct input_absinfo absoluteFeatures;
ioctl(controller, EVIOCGABS(code), &absoluteFeatures); ioctl(controller, EVIOCGABS(code), &absoluteFeatures);
@@ -1048,8 +1082,13 @@ void *controllerThread(void *_args)
continue; continue;
} }
setSwitch(args->controller->keyTriggers[event.code].player, if(args->controller->keyTriggers[event.code].isCoin == 1) {
args->controller->keyTriggers[event.code].channel, event.value == 0 ? 0 : 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; break;
@@ -1059,31 +1098,67 @@ void *controllerThread(void *_args)
((double)event.value - (double)args->controller->absMin[event.code]) / ((double)event.value - (double)args->controller->absMin[event.code]) /
((double)args->controller->absMax[event.code] - (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) if (args->controller->absTriggers[event.code].enabled)
{ {
int channel = args->controller->absTriggers[event.code].channel; 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; 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; scaled = 0.5;
if (scaled > analogue_deadzones[channel].end_min) if (scaled > analogue_deadzones[channel].end_min)
scaled = 1.0; 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) if(event.value <= ((args->controller->absMin[event.code] + args->controller->absMax[event.code]) / 2)) {
{ if (args->controller->absTriggers[event.code].minEnabled)
setSwitch(args->controller->absTriggers[event.code].minPlayer, {
args->controller->absTriggers[event.code].minChannel, scaled < 0.2); 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) if(event.value >= ((args->controller->absMin[event.code] + args->controller->absMax[event.code]) / 2)) {
{ if (args->controller->absTriggers[event.code].maxEnabled)
setSwitch(args->controller->absTriggers[event.code].maxPlayer, {
args->controller->absTriggers[event.code].maxChannel, scaled > 0.8); 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; break;
@@ -1106,6 +1181,8 @@ char *getMapping(char *mapping)
// Test button // Test button
if (strcmp(mapping, config->arcadeInputs.test) == 0) if (strcmp(mapping, config->arcadeInputs.test) == 0)
return "TEST_BUTTON"; return "TEST_BUTTON";
if (strcmp(mapping, config->arcadeInputs.player1_coin) == 0)
return "PLAYER_1_COIN";
// Player 1 controls // Player 1 controls
if (strcmp(mapping, config->arcadeInputs.player1_button_start) == 0) 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].enabled = 0;
controllers->controller[i].absTriggers[j].minEnabled = 0; controllers->controller[i].absTriggers[j].minEnabled = 0;
controllers->controller[i].absTriggers[j].maxEnabled = 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++) for (int j = 0; j < KEY_MAX; j++)
{ {
controllers->controller[i].keyTriggers[j].enabled = 0; controllers->controller[i].keyTriggers[j].enabled = 0;
controllers->controller[i].keyTriggers[j].isAnalogue = 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++) for (int j = 0; j < controllers->controller[i].inputCount; j++)
{ {
char *mapping = getMapping(controllers->controller[i].inputs[j].inputName); char *mapping = getMapping(controllers->controller[i].inputs[j].inputName);
if (mapping == NULL) int negabs = 0;
continue;
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}; ArcadeInput input = {0};
ControllerStatus status = getArcadeInputByName(mapping, &input); ControllerStatus status = getArcadeInputByName(mapping, &input);
@@ -1269,6 +1362,9 @@ ControllerStatus startControllerThreads(Controllers *controllers)
input.name); input.name);
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].player = controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].player =
input.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; break;
@@ -1281,6 +1377,9 @@ ControllerStatus startControllerThreads(Controllers *controllers)
input.name); input.name);
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].maxPlayer = controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].maxPlayer =
input.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; break;
@@ -1293,6 +1392,21 @@ ControllerStatus startControllerThreads(Controllers *controllers)
input.name); input.name);
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].minPlayer = controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].minPlayer =
input.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;
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; break;
@@ -1314,6 +1428,10 @@ ControllerStatus startControllerThreads(Controllers *controllers)
if (strstr(input.name, "ANALOGUE") != NULL) if (strstr(input.name, "ANALOGUE") != NULL)
controllers->controller[i].keyTriggers[controllers->controller[i].inputs[j].evCode].isAnalogue = 1; 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; break;
+13 -1
View File
@@ -31,6 +31,15 @@ typedef struct
int maxEnabled; int maxEnabled;
int isAnalogue; int isAnalogue;
int isNeg; // reversed axis
char shakeName[SIZE];
int shakeChannel;
int shakeEnabled;
int shakePlayer;
double shakePreviousScaled;
int isCoin;
} ArcadeInput; } ArcadeInput;
typedef enum typedef enum
@@ -43,12 +52,15 @@ typedef enum {
NO_SPECIAL_FUNCTION = 0, NO_SPECIAL_FUNCTION = 0,
ANALOGUE_TO_DIGITAL_MAX, ANALOGUE_TO_DIGITAL_MAX,
ANALOGUE_TO_DIGITAL_MIN, ANALOGUE_TO_DIGITAL_MIN,
DIGITAL_TO_ANALOGUE DIGITAL_TO_ANALOGUE,
ANALOGUE_SHAKE
} SpecialFunction; } SpecialFunction;
typedef struct typedef struct
{ {
char inputName[SIZE]; char inputName[SIZE];
char inputTechName[SIZE];
char inputTechNegName[SIZE];
int evType; int evType;
int evCode; int evCode;
SpecialFunction specialFunction; SpecialFunction specialFunction;
+15 -4
View File
@@ -233,7 +233,7 @@ void testModePath(char *name)
* Makes sure the environment variables are set correctly * Makes sure the environment variables are set correctly
* to run the game. * to run the game.
*/ */
void setEnvironmentVariables(int isFlatpak) void setEnvironmentVariables(int isFlatpak, int zink)
{ {
// Ensure the library path is set correctly // Ensure the library path is set correctly
char libraryPath[128] = {0}; char libraryPath[128] = {0};
@@ -254,6 +254,9 @@ void setEnvironmentVariables(int isFlatpak)
setenv(LD_PRELOAD, PRELOAD_FILE_NAME, 1); setenv(LD_PRELOAD, PRELOAD_FILE_NAME, 1);
else else
setenv(LD_PRELOAD, PRELOAD_FILE_FLATPAK, 1); setenv(LD_PRELOAD, PRELOAD_FILE_FLATPAK, 1);
if(zink)
setenv("MESA_LOADER_DRIVER_OVERRIDE", "zink", 1);
} }
/** /**
@@ -400,13 +403,11 @@ int main(int argc, char *argv[])
} }
} }
// Ensure environment variables are set correctly
setEnvironmentVariables(isFlatpak);
// Build up the command to start the game // Build up the command to start the game
int testMode = 0; int testMode = 0;
int gdb = 0; int gdb = 0;
int zink = 0;
int forceGame = 0; int forceGame = 0;
int segaboot = 0; int segaboot = 0;
char extConfigPath[PATH_MAX] = {0}; char extConfigPath[PATH_MAX] = {0};
@@ -431,6 +432,13 @@ int main(int argc, char *argv[])
gdb = 1; gdb = 1;
continue; continue;
} }
if (strcmp(argv[i], "--zink") == 0)
{
zink = 1;
continue;
}
if (strcmp(argv[i], "-c") == 0 || strcmp(argv[i], "--config") == 0) if (strcmp(argv[i], "-c") == 0 || strcmp(argv[i], "--config") == 0)
{ {
if (i+1 >= argc) if (i+1 >= argc)
@@ -446,6 +454,9 @@ int main(int argc, char *argv[])
forceGame = 1; forceGame = 1;
} }
// Ensure environment variables are set correctly
setEnvironmentVariables(isFlatpak, zink);
char command[128] = {0}; char command[128] = {0};
strcpy(command, "./"); strcpy(command, "./");
if (forceGame) if (forceGame)
+11 -1
View File
@@ -1432,6 +1432,7 @@ int parseCgcArgs(const char *input, const char ***compilerArgs, const char **out
void loadLibCg() void loadLibCg()
{ {
int isFlatpak = 0;
void *handle = dlopen("./libCg.so", RTLD_NOW); void *handle = dlopen("./libCg.so", RTLD_NOW);
if (!handle) if (!handle)
{ {
@@ -1442,10 +1443,19 @@ void loadLibCg()
fprintf(stderr, "Error: libCg.so version 2.0 is needed to compile the shaders in the game's folder.\n"); fprintf(stderr, "Error: libCg.so version 2.0 is needed to compile the shaders in the game's folder.\n");
exit(1); exit(1);
} }
else
{
isFlatpak = 1;
}
} }
char libCgVersion[9]; 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); fseek(libF, 0x226d84, SEEK_SET);
fread(libCgVersion, 9, 1, libF); fread(libCgVersion, 9, 1, libF);
fclose(libF); fclose(libF);