diff -uBNr jumpnbump-1.50/globals.pre jumpnbump-1.50-new/globals.pre
--- jumpnbump-1.50/globals.pre	2004-06-16 21:16:13.000000000 +0200
+++ jumpnbump-1.50-new/globals.pre	2004-07-02 05:36:36.000000000 +0200
@@ -197,6 +197,7 @@
 		} pobs[NUM_POBS];
 	} page_info[2];
 	void *pob_backbuf[2];
+	int joys[4];
 } main_info_t;
 
 typedef struct {
@@ -289,6 +290,7 @@
 unsigned char *dat_open(char *file_name);
 int dat_filelen(char *file_name);
 void write_calib_data(void);
+void parse_joy_nums(char *joy_nums);
 
 
 /* input.c */
diff -uBNr jumpnbump-1.50/main.c jumpnbump-1.50-new/main.c
--- jumpnbump-1.50/main.c	2004-06-16 21:03:39.000000000 +0200
+++ jumpnbump-1.50-new/main.c	2004-07-02 06:40:16.000000000 +0200
@@ -2926,6 +2926,7 @@
 	int c1 = 0, c2 = 0;
 	int load_flag = 0;
 	int force2, force3;
+	int i;
 	sfx_data fly;
 	int player_anim_data[] = {
 		1, 0, 0, 0x7fff, 0, 0, 0, 0, 0, 0,
@@ -2953,6 +2954,11 @@
 
 	memset(&main_info, 0, sizeof(main_info));
 
+#ifdef USE_SDL
+	for (i=0; i<4; i++)
+		main_info.joys[i] = i;
+#endif
+
 	strcpy(datfile_name, DATA_PATH);
 
 	force2 = force3 = 0;
@@ -2974,6 +2980,8 @@
 #ifdef USE_SDL
 			else if (stricmp(argv[c1], "-fullscreen") == 0)
 				fs_toggle();
+			else if (stricmp(argv[c1], "-joys") == 0)
+				parse_joy_nums(argv[c1 +1]);
 #endif
 			else if (stricmp(argv[c1], "-scaleup") == 0)
 				set_scaling(1);
@@ -3035,7 +3043,10 @@
 #endif
 				printf("  -player num              set main player to num (0-3). Needed for networking\n");
 				printf("  -fireworks               screensaver mode\n");
+#ifdef USE_SDL
 				printf("  -fullscreen              run in fullscreen mode\n");
+				printf("  -joys n[,m[,o[,p]]]      use Joystick n,m,o,p for Player 1,2,3,4 (def 0,1,2,3)\n");
+#endif
 				printf("  -nosound                 play without sound\n");
 				printf("  -nogore                  play without blood\n");
 				printf("  -noflies                 disable flies\n");
@@ -3537,3 +3548,30 @@
 	fclose(handle);
 
 }
+
+void parse_joy_nums(char *joy_nums)
+{
+	int i,j=0,joy_num,k;
+	char *remaining, tmp[BUFSIZ]={0};
+	remaining=joy_nums;
+	if (remaining == NULL)
+		return;
+	while (strlen(remaining)>0 && strspn(remaining,"0123456789")>0 && j<4)
+	{
+		i = strspn(remaining,"0123456789");
+		strncpy(tmp, remaining, i<BUFSIZ-1 ? i : BUFSIZ-1);
+		joy_num=atoi(tmp);
+		for (k=0; k<4; k++)
+		{
+			if (main_info.joys[k] == joy_num)
+			{
+				main_info.joys[k]=main_info.joys[j];
+				break;
+			}
+		}
+		main_info.joys[j]=joy_num;
+		j++;
+		remaining += i+1;
+	}
+	return;
+}
diff -uBNr jumpnbump-1.50/sdl/input.c jumpnbump-1.50-new/sdl/input.c
--- jumpnbump-1.50/sdl/input.c	2003-03-21 15:40:11.000000000 +0100
+++ jumpnbump-1.50-new/sdl/input.c	2004-07-02 06:35:47.000000000 +0200
@@ -44,43 +44,43 @@
 	int tmp;
 
 	if (client_player_num < 0) {
-		tmp = (key_pressed(KEY_PL1_LEFT) == 1) || JOY_LEFT(3);
+		tmp = (key_pressed(KEY_PL1_LEFT) == 1) || JOY_LEFT(0);
 		if (tmp != player[0].action_left)
 			tellServerPlayerMoved(0, MOVEMENT_LEFT, tmp);
-		tmp = (key_pressed(KEY_PL1_RIGHT) == 1) || JOY_RIGHT(3);
+		tmp = (key_pressed(KEY_PL1_RIGHT) == 1) || JOY_RIGHT(0);
 		if (tmp != player[0].action_right)
 			tellServerPlayerMoved(0, MOVEMENT_RIGHT, tmp);
-		tmp = (key_pressed(KEY_PL1_JUMP) == 1) || JOY_JUMP(3);
+		tmp = (key_pressed(KEY_PL1_JUMP) == 1) || JOY_JUMP(0);
 		if (tmp != player[0].action_up)
 			tellServerPlayerMoved(0, MOVEMENT_UP, tmp);
 
-		tmp = (key_pressed(KEY_PL2_LEFT) == 1) || JOY_LEFT(2);
+		tmp = (key_pressed(KEY_PL2_LEFT) == 1) || JOY_LEFT(1);
 		if (tmp != player[1].action_left)
 			tellServerPlayerMoved(1, MOVEMENT_LEFT, tmp);
-		tmp = (key_pressed(KEY_PL2_RIGHT) == 1) || JOY_RIGHT(2);
+		tmp = (key_pressed(KEY_PL2_RIGHT) == 1) || JOY_RIGHT(1);
 		if (tmp != player[1].action_right)
 			tellServerPlayerMoved(1, MOVEMENT_RIGHT, tmp);
-		tmp = (key_pressed(KEY_PL2_JUMP) == 1) || JOY_JUMP(2);
+		tmp = (key_pressed(KEY_PL2_JUMP) == 1) || JOY_JUMP(1);
 		if (tmp != player[1].action_up)
 			tellServerPlayerMoved(1, MOVEMENT_UP, tmp);
 
-		tmp = (key_pressed(KEY_PL3_LEFT) == 1) || JOY_LEFT(1);
+		tmp = (key_pressed(KEY_PL3_LEFT) == 1) || JOY_LEFT(2);
 		if (tmp != player[2].action_left)
 			tellServerPlayerMoved(2, MOVEMENT_LEFT, tmp);
-		tmp = (key_pressed(KEY_PL3_RIGHT) == 1) || JOY_RIGHT(1);
+		tmp = (key_pressed(KEY_PL3_RIGHT) == 1) || JOY_RIGHT(2);
 		if (tmp != player[2].action_right)
 			tellServerPlayerMoved(2, MOVEMENT_RIGHT, tmp);
-		tmp = (key_pressed(KEY_PL3_JUMP) == 1) || JOY_JUMP(1);
+		tmp = (key_pressed(KEY_PL3_JUMP) == 1) || JOY_JUMP(2);
 		if (tmp != player[2].action_up)
 			tellServerPlayerMoved(2, MOVEMENT_UP, tmp);
 
-		tmp = (key_pressed(KEY_PL4_LEFT) == 1) || JOY_LEFT(0);
+		tmp = (key_pressed(KEY_PL4_LEFT) == 1) || JOY_LEFT(3);
 		if (tmp != player[3].action_left)
 		tellServerPlayerMoved(3, MOVEMENT_LEFT, tmp);
-		tmp = (key_pressed(KEY_PL4_RIGHT) == 1) || JOY_RIGHT(0);
+		tmp = (key_pressed(KEY_PL4_RIGHT) == 1) || JOY_RIGHT(3);
 		if (tmp != player[3].action_right)
 		tellServerPlayerMoved(3, MOVEMENT_RIGHT, tmp);
-		tmp = (key_pressed(KEY_PL4_JUMP) == 1) || JOY_JUMP(0);
+		tmp = (key_pressed(KEY_PL4_JUMP) == 1) || JOY_JUMP(3);
 		if (tmp != player[3].action_up)
 		tellServerPlayerMoved(3, MOVEMENT_UP, tmp);
 	} else {
@@ -101,8 +101,9 @@
 	int i;
 
 	num_joys = SDL_NumJoysticks();
-	for(i = 0; i < 4 && i < num_joys; ++i)
-		joys[i] = SDL_JoystickOpen(i);
+	for(i = 0; i < 4; ++i)
+		if(main_info.joys[i] < num_joys)
+			joys[i] = SDL_JoystickOpen(main_info.joys[i]);
 
 	main_info.mouse_enabled = 0;
 	main_info.joy_enabled = 0;
