diff -ruN dgen-sdl-1.23/rc.cpp dgen-sdl-1.23-new/rc.cpp --- dgen-sdl-1.23/rc.cpp 2001-07-03 03:59:39.000000000 +0800 +++ dgen-sdl-1.23-new/rc.cpp 2003-06-27 19:09:55.000000000 +0800 @@ -166,6 +166,7 @@ /* Define all the external RC variables */ #include "rc-vars.h" +/* long js_map_button[2][16] = { { MD_A_MASK, MD_C_MASK, MD_A_MASK, @@ -180,6 +181,7 @@ MD_MODE_MASK, 0, 0, 0, 0, 0, 0 } }; +*/ /* Parse a keysym. * If the string matches one of the strings in the keysym table above, @@ -236,6 +238,7 @@ // Made GCC happy about unused things when we don't want a joystick. :) [PKH] // Cheesy hack to set joystick mappings from the RC file. [PKH] +/* static long jsmap(const char *value) { if(!strcasecmp(value, "mode")) snprintf((char*)value, 2, "%c", 'm'); @@ -278,6 +281,41 @@ return(0); } } +*/ + +/** + Jedi change the joystick axis/button mapping format in RC file. + I'v try my best to fit joy-event with long return value. +*/ + +static long joyaxisval (const char *value) +{ + JoyAxisValue jav; + int j,a,v; + + if (sscanf (value, "j%da%d(%d)", &j, &a, &v) != 3) { + return -1; + } else { + jav.jae.which = j; + jav.jae.axis = a; + jav.jae.value = v; + return jav.lv; + } +} + +static long joybtnval (const char *value) +{ + JoyButtonValue jbv; + int j,b; + + if (sscanf (value, "j%db%d", &j, &b) != 2) { + return -1; + } else { + jbv.jbe.which = j; + jbv.jbe.button = b; + return jbv.lv; + } +} /* Parse the CTV type. As new CTV filters get submitted expect this to grow ;) * Current values are: @@ -366,6 +404,31 @@ { "int_opengl_width", number, &dgen_opengl_width }, { "int_opengl_height", number, &dgen_opengl_height }, { "bool_joystick", boolean, &dgen_joystick }, + { "joy_pad1_up", joyaxisval, &(joypad1_up.lv)}, + { "joy_pad1_down", joyaxisval, &(joypad1_down.lv)}, + { "joy_pad1_left", joyaxisval, &(joypad1_left.lv)}, + { "joy_pad1_right", joyaxisval, &(joypad1_right.lv)}, + { "joy_pad1_a", joybtnval, &(joypad1_a.lv)}, + { "joy_pad1_b", joybtnval, &(joypad1_b.lv)}, + { "joy_pad1_c", joybtnval, &(joypad1_c.lv)}, + { "joy_pad1_x", joybtnval, &(joypad1_x.lv)}, + { "joy_pad1_y", joybtnval, &(joypad1_y.lv)}, + { "joy_pad1_z", joybtnval, &(joypad1_z.lv)}, + { "joy_pad1_mode", joybtnval, &(joypad1_mode.lv)}, + { "joy_pad1_start", joybtnval, &(joypad1_start.lv)}, + { "joy_pad2_up", joyaxisval, &(joypad2_up.lv)}, + { "joy_pad2_down", joyaxisval, &(joypad2_down.lv)}, + { "joy_pad2_left", joyaxisval, &(joypad2_left.lv)}, + { "joy_pad2_right", joyaxisval, &(joypad2_right.lv)}, + { "joy_pad2_a", joybtnval, &(joypad2_a.lv)}, + { "joy_pad2_b", joybtnval, &(joypad2_b.lv)}, + { "joy_pad2_c", joybtnval, &(joypad2_c.lv)}, + { "joy_pad2_x", joybtnval, &(joypad2_x.lv)}, + { "joy_pad2_y", joybtnval, &(joypad2_y.lv)}, + { "joy_pad2_z", joybtnval, &(joypad2_z.lv)}, + { "joy_pad2_mode", joybtnval, &(joypad2_mode.lv)}, + { "joy_pad2_start", joybtnval, &(joypad2_start.lv)}, +/* { "joypad1_b0", jsmap, &js_map_button[0][0] }, { "joypad1_b1", jsmap, &js_map_button[0][1] }, { "joypad1_b2", jsmap, &js_map_button[0][2] }, @@ -398,6 +461,7 @@ { "joypad2_b13", jsmap, &js_map_button[1][13] }, { "joypad2_b14", jsmap, &js_map_button[1][14] }, { "joypad2_b15", jsmap, &js_map_button[1][15] }, +*/ { NULL, NULL, NULL } // Terminator }; @@ -444,7 +508,7 @@ do { if(!strcasecmp(s->fieldname, field)) { - int potential; + long potential; potential = (*(s->parser))(value); /* If we got a bad value, discard and warn user */ if(potential == -1) diff -ruN dgen-sdl-1.23/rc-vars.h dgen-sdl-1.23-new/rc-vars.h --- dgen-sdl-1.23/rc-vars.h 2001-07-03 03:20:30.000000000 +0800 +++ dgen-sdl-1.23-new/rc-vars.h 2003-06-27 19:09:59.000000000 +0800 @@ -10,8 +10,12 @@ // Otherwise, we just declare them as externs #ifdef IS_MAIN_CPP #define RCVAR(name, def) long name = def +#define RCJAV(name, which, axis, value) JoyAxisValue name = {which, axis, value} +#define RCJBV(name, which, button) JoyButtonValue name = {which, button} #else #define RCVAR(name, def) extern long name +#define RCJAV(name, which, axis, value) extern JoyAxisValue name +#define RCJBV(name, which, button) extern JoyButtonValue name #endif RCVAR(pad1_up, PDK_UP); @@ -84,4 +88,53 @@ RCVAR(dgen_opengl_width, 640); RCVAR(dgen_opengl_height, 480); +typedef struct { + char which; + char axis; + signed short value; +} JoyAxisEvent; + +typedef union { + JoyAxisEvent jae; + long lv; +} JoyAxisValue; + +RCJAV(joypad1_up, 0, 1, -1); +RCJAV(joypad1_down, 0, 1, 1); +RCJAV(joypad1_left, 0, 0, -1); +RCJAV(joypad1_right, 0, 0, 1); + +RCJAV(joypad2_up, 1, 1, -1); +RCJAV(joypad2_down, 1, 1, 1); +RCJAV(joypad2_left, 1, 0, -1); +RCJAV(joypad2_right, 1,0,1); + +typedef struct { + char which; + char button; +} JoyButtonEvent; + +typedef union { + JoyButtonEvent jbe; + long lv; +} JoyButtonValue; + +RCJBV(joypad1_a, 0, 0); +RCJBV(joypad1_b, 0, 1); +RCJBV(joypad1_c, 0, 2); +RCJBV(joypad1_x, 0, 3); +RCJBV(joypad1_y, 0, 4); +RCJBV(joypad1_z, 0, 5); +RCJBV(joypad1_mode, 0, 6); +RCJBV(joypad1_start, 0, 7); + +RCJBV(joypad2_a, 1, 0); +RCJBV(joypad2_b, 1, 1); +RCJBV(joypad2_c, 1, 2); +RCJBV(joypad2_x, 1, 3); +RCJBV(joypad2_y, 1, 4); +RCJBV(joypad2_z, 1, 5); +RCJBV(joypad2_mode, 1, 6); +RCJBV(joypad2_start, 1, 7); + #endif // __RC_VARS_H__ diff -ruN dgen-sdl-1.23/sample.dgenrc dgen-sdl-1.23-new/sample.dgenrc --- dgen-sdl-1.23/sample.dgenrc 2001-07-03 03:18:14.000000000 +0800 +++ dgen-sdl-1.23-new/sample.dgenrc 2003-06-27 19:09:51.000000000 +0800 @@ -36,6 +36,42 @@ key_pad1_mode = backspace key_pad1_start = return +# There are the new format joypad controls defination +# Joystick axis defination: +# j0a3(-16384) +# | | || +# | | |+- joystick axis event filter value (from 1 to 32767). +# | | +-- axis heading (positive/negative). +# | +---- axis index (from 0 to 255). +# +------ joystick index (from 0 to 255). + +# About the joystick axis event filter value: + +# Usually, the joystick device has noise signals on axis buttons. The noise +# signals will disturb your normal play.To avoid this fucking story, you must +# set a value to the filter. Then if the absolute value of a event is not +# bigger than the filter, the engine will leave along this event.The value +# range you could set is from 1 to 32767. + +# Joystick button defination +# j0b3 +# | | +# | +- button index (from 0 to 255). +# +--- joystick index (from 0 to 255). + +joy_pad1_up = j0a1(-16384) +joy_pad1_down = j0a1(+16384) +joy_pad1_left = j0a0(-16384) +joy_pad1_right = j0a0(+16384) +joy_pad1_a = j0b3 +joy_pad1_b = j0b0 +joy_pad1_c = j0b1 +joy_pad1_x = j0b2 +joy_pad1_y = j0b6 +joy_pad1_z = j0b7 +joy_pad1_mode =j0b9 +joy_pad1_start = j0b8 + # The same for pad 2 # Yes, I KNOW the default player 2 keys are awful. Pick your own! key_pad2_up = kp_up @@ -51,6 +87,19 @@ key_pad2_mode = kp_plus key_pad2_start = kp_enter +joy_pad2_up = j0a3(-16384) +joy_pad2_down = j0a3(+16384) +joy_pad2_left = j0a2(-16384) +joy_pad2_right = j0a2(+16384) +joy_pad2_a = j0b13 +joy_pad2_b = j0b10 +joy_pad2_c = j0b11 +joy_pad2_x = j0b12 +joy_pad2_y = j0b16 +joy_pad2_z = j0b17 +joy_pad2_mode =j0b19 +joy_pad2_start = j0b18 + # Fix checksum, needed by some games with Game Genie codes key_fix_checksum = f1 diff -ruN dgen-sdl-1.23/sdl/sdl.cpp dgen-sdl-1.23-new/sdl/sdl.cpp --- dgen-sdl-1.23/sdl/sdl.cpp 2001-07-03 05:36:49.000000000 +0800 +++ dgen-sdl-1.23-new/sdl/sdl.cpp 2003-06-27 19:10:10.000000000 +0800 @@ -749,6 +749,25 @@ return 1; } +// JoyAxisEnent check, return 1 when it was the just event we expected +// and -1 means joystick-CENTER event, 0 means not match. +int jaeq (SDL_JoyAxisEvent sjae, JoyAxisValue jav) +{ + if (sjae.which == jav.jae.which + && sjae.axis == jav.jae.axis + && (sjae.value^jav.jae.value) >= 0) { + return abs(sjae.value) >= abs(jav.jae.value) ? 1 : -1; + } else { + return 0; + } +} + +int jbeq (SDL_JoyButtonEvent sjbe, JoyButtonValue jbv) +{ + return (sjbe.which == jbv.jbe.which + && sjbe.button == jbv.jbe.button); +} + // The massive event handler! // I know this is an ugly beast, but please don't be discouraged. If you need // help, don't be afraid to ask me how something works. Basically, just handle @@ -772,6 +791,26 @@ { #if SDL_JOYSTICK_SUPPORT case SDL_JOYAXISMOTION: + int baxis; + if ((baxis=jaeq(event.jaxis, joypad1_up)) != 0) { + baxis>0 ? (megad.pad[0] &= ~0x01,megad.pad[0] |= 0x02) : megad.pad[0] |= 0x3; + } else if ((baxis=jaeq(event.jaxis, joypad1_down)) != 0) { + baxis>0 ? (megad.pad[0] |= 0x01,megad.pad[0] &= ~0x02) : megad.pad[0] |= 0x3; + } else if ((baxis=jaeq(event.jaxis, joypad1_left)) != 0) { + baxis>0 ? (megad.pad[0] &= ~0x04,megad.pad[0] |= 0x08) : megad.pad[0] |= 0xC; + } else if ((baxis=jaeq(event.jaxis, joypad1_right)) != 0) { + baxis>0 ? (megad.pad[0] |= 0x04,megad.pad[0] &= ~0x08) : megad.pad[0] |= 0xC; + } else if ((baxis=jaeq(event.jaxis, joypad2_up)) != 0) { + baxis>0 ? (megad.pad[1] &= ~0x01,megad.pad[1] |= 0x02) : megad.pad[1] |= 0x3; + } else if ((baxis=jaeq(event.jaxis, joypad2_down)) != 0) { + baxis>0 ? (megad.pad[1] |= 0x01,megad.pad[1] &= ~0x02) : megad.pad[1] |= 0x3; + } else if ((baxis=jaeq(event.jaxis, joypad2_left)) != 0) { + baxis>0 ? (megad.pad[1] &= ~0x04,megad.pad[1] |= 0x08) : megad.pad[1] |= 0xC; + } else if ((baxis=jaeq(event.jaxis, joypad2_right)) != 0) { + baxis>0 ? (megad.pad[1] |= 0x04,megad.pad[1] &= ~0x08) : megad.pad[1] |= 0xC; + } + break; +/* // x-axis if(event.jaxis.axis == 0) { @@ -809,18 +848,91 @@ break; } break; +*/ case SDL_JOYBUTTONDOWN: + if (jbeq(event.jbutton, joypad1_a)) { + megad.pad[0] &= ~0x1000; + } else if (jbeq(event.jbutton, joypad1_b)) { + megad.pad[0] &= ~0x10; + } else if (jbeq(event.jbutton, joypad1_c)) { + megad.pad[0] &= ~0x20; + } else if (jbeq(event.jbutton, joypad1_x)) { + megad.pad[0] &= ~0x40000; + } else if (jbeq(event.jbutton, joypad1_y)) { + megad.pad[0] &= ~0x20000; + } else if (jbeq(event.jbutton, joypad1_z)) { + megad.pad[0] &= ~0x10000; + } else if (jbeq(event.jbutton, joypad1_mode)) { + megad.pad[0] &= ~0x80000; + } else if (jbeq(event.jbutton, joypad1_start)) { + megad.pad[0] &= ~0x2000; + } else if (jbeq(event.jbutton, joypad2_a)) { + megad.pad[1] &= ~0x1000; + } else if (jbeq(event.jbutton, joypad2_b)) { + megad.pad[1] &= ~0x10; + } else if (jbeq(event.jbutton, joypad2_c)) { + megad.pad[1] &= ~0x20; + } else if (jbeq(event.jbutton, joypad2_x)) { + megad.pad[1] &= ~0x40000; + } else if (jbeq(event.jbutton, joypad2_y)) { + megad.pad[1] &= ~0x20000; + } else if (jbeq(event.jbutton, joypad2_z)) { + megad.pad[1] &= ~0x10000; + } else if (jbeq(event.jbutton, joypad2_mode)) { + megad.pad[1] &= ~0x80000; + } else if (jbeq(event.jbutton, joypad2_start)) { + megad.pad[1] &= ~0x2000; + } + break; +/* // Ignore more than 16 buttons (a reasonable limit :) if(event.jbutton.button > 15) break; megad.pad[event.jbutton.which] &= ~js_map_button[event.jbutton.which] [event.jbutton.button]; break; +*/ case SDL_JOYBUTTONUP: + if (jbeq(event.jbutton, joypad1_a)) { + megad.pad[0] |= 0x1000; + } else if (jbeq(event.jbutton, joypad1_b)) { + megad.pad[0] |= 0x10; + } else if (jbeq(event.jbutton, joypad1_c)) { + megad.pad[0] |= 0x20; + } else if (jbeq(event.jbutton, joypad1_x)) { + megad.pad[0] |= 0x40000; + } else if (jbeq(event.jbutton, joypad1_y)) { + megad.pad[0] |= 0x20000; + } else if (jbeq(event.jbutton, joypad1_z)) { + megad.pad[0] |= 0x10000; + } else if (jbeq(event.jbutton, joypad1_mode)) { + megad.pad[0] |= 0x80000; + } else if (jbeq(event.jbutton, joypad1_start)) { + megad.pad[0] |= 0x2000; + } else if (jbeq(event.jbutton, joypad2_a)) { + megad.pad[1] |= 0x1000; + } else if (jbeq(event.jbutton, joypad2_b)) { + megad.pad[1] |= 0x10; + } else if (jbeq(event.jbutton, joypad2_c)) { + megad.pad[1] |= 0x20; + } else if (jbeq(event.jbutton, joypad2_x)) { + megad.pad[1] |= 0x40000; + } else if (jbeq(event.jbutton, joypad2_y)) { + megad.pad[1] |= 0x20000; + } else if (jbeq(event.jbutton, joypad2_z)) { + megad.pad[1] |= 0x10000; + } else if (jbeq(event.jbutton, joypad2_mode)) { + megad.pad[1] |= 0x80000; + } else if (jbeq(event.jbutton, joypad2_start)) { + megad.pad[1] |= 0x2000; + } + break; +/* // Ignore more than 16 buttons (a reasonable limit :) if(event.jbutton.button > 15) break; megad.pad[event.jbutton.which] |= js_map_button[event.jbutton.which] [event.jbutton.button]; break; +*/ #endif // SDL_JOYSTICK_SUPPORT case SDL_KEYDOWN: ksym = event.key.keysym.sym;