SDL: new option to slow down autofire (needed for it to work with some games)
This commit is contained in:
parent
f1047fc358
commit
e217204271
|
@ -164,4 +164,14 @@ which means:
|
||||||
circle button)
|
circle button)
|
||||||
So when I press and hold this button on my gamepad, VBA-M rewards me with autofire on A *on that pad only*.
|
So when I press and hold this button on my gamepad, VBA-M rewards me with autofire on A *on that pad only*.
|
||||||
|
|
||||||
|
[2008-11-21] new autofire configuration:
|
||||||
|
commandline argument: --autofire NNN
|
||||||
|
configfile attribute: autoFireMaxCount=NNN
|
||||||
|
default value: NNN=1 (does exactly the same thing as without this new feature)
|
||||||
|
This controls the "length" of each press (and depress). It is measured in vba-m cycles
|
||||||
|
(so --autofire 30 means something like "press once every second" - don't forget that
|
||||||
|
the button is not just "virtually pressed" but also "virtually non-pressed" in between).
|
||||||
|
This is needed for some games that apparently check whether the button isn't pressed
|
||||||
|
faster than a human could do it.
|
||||||
|
For example, autofire doesn't work in Mother 3 with --autofire 1 or 2, but it works with 5.
|
||||||
|
|
||||||
|
|
|
@ -190,6 +190,8 @@ static int sdlSoundToggledOff = 0;
|
||||||
int sdl_patch_num = 0;
|
int sdl_patch_num = 0;
|
||||||
char * (sdl_patch_names[PATCH_MAX_NUM]) = { NULL }; // and so on
|
char * (sdl_patch_names[PATCH_MAX_NUM]) = { NULL }; // and so on
|
||||||
|
|
||||||
|
int autoFireMaxCount = 1;
|
||||||
|
|
||||||
#define REWIND_NUM 8
|
#define REWIND_NUM 8
|
||||||
#define REWIND_SIZE 400000
|
#define REWIND_SIZE 400000
|
||||||
#define SYSMSG_BUFFER_SIZE 1024
|
#define SYSMSG_BUFFER_SIZE 1024
|
||||||
|
@ -287,6 +289,7 @@ struct option sdlOptions[] = {
|
||||||
{ "throttle", required_argument, 0, 'T' },
|
{ "throttle", required_argument, 0, 'T' },
|
||||||
{ "verbose", required_argument, 0, 'v' },
|
{ "verbose", required_argument, 0, 'v' },
|
||||||
{ "cheat", required_argument, 0, 1000 },
|
{ "cheat", required_argument, 0, 1000 },
|
||||||
|
{ "autofire", required_argument, 0, 1001 },
|
||||||
{ NULL, no_argument, NULL, 0 }
|
{ NULL, no_argument, NULL, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -793,6 +796,10 @@ void sdlReadPreferences(FILE *f)
|
||||||
sdlSaveKeysSwitch = sdlFromHex(value);
|
sdlSaveKeysSwitch = sdlFromHex(value);
|
||||||
} else if(!strcmp(key, "openGLscale")) {
|
} else if(!strcmp(key, "openGLscale")) {
|
||||||
sdlOpenglScale = sdlFromHex(value);
|
sdlOpenglScale = sdlFromHex(value);
|
||||||
|
} else if(!strcmp(key, "autoFireMaxCount")) {
|
||||||
|
autoFireMaxCount = sdlFromDec(value);
|
||||||
|
if(autoFireMaxCount < 1)
|
||||||
|
autoFireMaxCount = 1;
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "Unknown configuration key %s\n", key);
|
fprintf(stderr, "Unknown configuration key %s\n", key);
|
||||||
}
|
}
|
||||||
|
@ -1901,6 +1908,12 @@ int main(int argc, char **argv)
|
||||||
sdlPreparedCheatCodes[sdlPreparedCheats++] = cpy;
|
sdlPreparedCheatCodes[sdlPreparedCheats++] = cpy;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 1001:
|
||||||
|
// --autofire
|
||||||
|
autoFireMaxCount = sdlFromDec(optarg);
|
||||||
|
if (autoFireMaxCount < 1)
|
||||||
|
autoFireMaxCount = 1;
|
||||||
|
break;
|
||||||
case 'b':
|
case 'b':
|
||||||
useBios = true;
|
useBios = true;
|
||||||
if(optarg == NULL) {
|
if(optarg == NULL) {
|
||||||
|
|
|
@ -53,6 +53,8 @@ static EPad sdlDefaultJoypad = PAD_MAIN;
|
||||||
|
|
||||||
static int autoFire = 0;
|
static int autoFire = 0;
|
||||||
static bool autoFireToggle = false;
|
static bool autoFireToggle = false;
|
||||||
|
static int autoFireCountdown = 0;
|
||||||
|
extern int autoFireMaxCount;
|
||||||
|
|
||||||
static uint32_t joypad[5][SDLBUTTONS_NUM] = {
|
static uint32_t joypad[5][SDLBUTTONS_NUM] = {
|
||||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
@ -533,7 +535,12 @@ uint32_t inputReadJoypad(int which)
|
||||||
res &= (~realAutoFire);
|
res &= (~realAutoFire);
|
||||||
if(autoFireToggle)
|
if(autoFireToggle)
|
||||||
res |= realAutoFire;
|
res |= realAutoFire;
|
||||||
autoFireToggle = !autoFireToggle;
|
if (autoFireCountdown <= 0) {
|
||||||
|
autoFireToggle = !autoFireToggle;
|
||||||
|
autoFireCountdown = autoFireMaxCount;
|
||||||
|
} else {
|
||||||
|
autoFireCountdown--;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
|
|
Loading…
Reference in New Issue