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)
|
||||
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;
|
||||
char * (sdl_patch_names[PATCH_MAX_NUM]) = { NULL }; // and so on
|
||||
|
||||
int autoFireMaxCount = 1;
|
||||
|
||||
#define REWIND_NUM 8
|
||||
#define REWIND_SIZE 400000
|
||||
#define SYSMSG_BUFFER_SIZE 1024
|
||||
|
@ -287,6 +289,7 @@ struct option sdlOptions[] = {
|
|||
{ "throttle", required_argument, 0, 'T' },
|
||||
{ "verbose", required_argument, 0, 'v' },
|
||||
{ "cheat", required_argument, 0, 1000 },
|
||||
{ "autofire", required_argument, 0, 1001 },
|
||||
{ NULL, no_argument, NULL, 0 }
|
||||
};
|
||||
|
||||
|
@ -793,6 +796,10 @@ void sdlReadPreferences(FILE *f)
|
|||
sdlSaveKeysSwitch = sdlFromHex(value);
|
||||
} else if(!strcmp(key, "openGLscale")) {
|
||||
sdlOpenglScale = sdlFromHex(value);
|
||||
} else if(!strcmp(key, "autoFireMaxCount")) {
|
||||
autoFireMaxCount = sdlFromDec(value);
|
||||
if(autoFireMaxCount < 1)
|
||||
autoFireMaxCount = 1;
|
||||
} else {
|
||||
fprintf(stderr, "Unknown configuration key %s\n", key);
|
||||
}
|
||||
|
@ -1901,6 +1908,12 @@ int main(int argc, char **argv)
|
|||
sdlPreparedCheatCodes[sdlPreparedCheats++] = cpy;
|
||||
}
|
||||
break;
|
||||
case 1001:
|
||||
// --autofire
|
||||
autoFireMaxCount = sdlFromDec(optarg);
|
||||
if (autoFireMaxCount < 1)
|
||||
autoFireMaxCount = 1;
|
||||
break;
|
||||
case 'b':
|
||||
useBios = true;
|
||||
if(optarg == NULL) {
|
||||
|
|
|
@ -53,6 +53,8 @@ static EPad sdlDefaultJoypad = PAD_MAIN;
|
|||
|
||||
static int autoFire = 0;
|
||||
static bool autoFireToggle = false;
|
||||
static int autoFireCountdown = 0;
|
||||
extern int autoFireMaxCount;
|
||||
|
||||
static uint32_t joypad[5][SDLBUTTONS_NUM] = {
|
||||
{ 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);
|
||||
if(autoFireToggle)
|
||||
res |= realAutoFire;
|
||||
if (autoFireCountdown <= 0) {
|
||||
autoFireToggle = !autoFireToggle;
|
||||
autoFireCountdown = autoFireMaxCount;
|
||||
} else {
|
||||
autoFireCountdown--;
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
|
|
Loading…
Reference in New Issue