added joystick support and a message to the network game..

origin
stpohle 17 years ago
parent ee25d3e404
commit 619c1b3f49

@ -1,10 +1,19 @@
$Id: ChangeLog,v 1.125 2008/04/04 10:50:49 stpohle Exp $ $Id: ChangeLog,v 1.126 2008/07/27 11:24:32 stpohle Exp $
CVS Version CVS Version
=========== ===========
4.4.2008 27.7.2008
- Added Warning if a game get startet with only one player selected
Patch send in by: Carles Pina i Estany
- Added Joystick support - Patch send in by: Patrick Kirsch
Chenges i made to the patch: I open only once the joystick device.
Since after the patch the joystick got opened a few times without
closing it again. The setupmenu will display now the number of the
button which is selected for the function.
4.4.2008
- Fixed BUG found by Lars Poeschel - Fixed BUG found by Lars Poeschel
One player could join without problems and if a second player joined One player could join without problems and if a second player joined
this network game, the server crashed in do_contest() accessing this network game, the server crashed in do_contest() accessing

@ -1,4 +1,4 @@
/* $Id: bomberclone.h,v 1.35 2006/08/19 23:41:47 stpohle Exp $ */ /* $Id: bomberclone.h,v 1.36 2008/07/27 11:24:37 stpohle Exp $ */
/* bomberclone.h */ /* bomberclone.h */
#ifndef _BOMBERCLONE_H_ #ifndef _BOMBERCLONE_H_
@ -152,6 +152,7 @@ extern int config_write();
extern void ReadPrgArgs (int argc, char **argv); extern void ReadPrgArgs (int argc, char **argv);
extern void ReadPrgArgs_Jump (int argc, char **argv); extern void ReadPrgArgs_Jump (int argc, char **argv);
extern int check_version (int ma, int mi, int su, char *ver); extern int check_version (int ma, int mi, int su, char *ver);
void joypad_config ();
// debug.c // debug.c
extern void d_in_pl_detail (char *head); extern void d_in_pl_detail (char *head);

@ -35,7 +35,13 @@ struct {
int keycode [BCK_max]; // keycode int keycode [BCK_max]; // keycode
} typedef BCGameKeys; } typedef BCGameKeys;
struct {
int drop;
int special;
} typedef BCGameJoystick;
extern BCGameKeys keyb_gamekeys; extern BCGameKeys keyb_gamekeys;
extern BCGameJoystick joy_keys[2];
extern void keyb_config (); extern void keyb_config ();
extern void keyb_config_reset (); extern void keyb_config_reset ();

@ -1,4 +1,4 @@
/* $Id: configuration.c,v 1.82 2007/12/07 22:06:57 stpohle Exp $ /* $Id: configuration.c,v 1.83 2008/07/27 11:24:37 stpohle Exp $
* configuration */ * configuration */
#include <SDL.h> #include <SDL.h>
@ -441,6 +441,17 @@ config_read ()
keyb_gamekeys.keycode[BCK_pause] = atoi (value); keyb_gamekeys.keycode[BCK_pause] = atoi (value);
if (!strcmp (keyword, "key_fullscreen")) if (!strcmp (keyword, "key_fullscreen"))
keyb_gamekeys.keycode[BCK_fullscreen] = atoi (value); keyb_gamekeys.keycode[BCK_fullscreen] = atoi (value);
/*
* joypad config
*/
if (!strcmp (keyword, "joy_1_drop"))
joy_keys[0].drop = atoi (value);
if (!strcmp (keyword, "joy_1_special"))
joy_keys[0].special = atoi (value);
if (!strcmp (keyword, "joy_2_drop"))
joy_keys[1].drop = atoi (value);
if (!strcmp (keyword, "joy_2_special"))
joy_keys[1].special = atoi (value);
} }
fclose (config); fclose (config);
return 0; return 0;
@ -530,6 +541,13 @@ config_write ()
fprintf (config, "key_mapmenu=%d\n", keyb_gamekeys.keycode[BCK_mapmenu]); fprintf (config, "key_mapmenu=%d\n", keyb_gamekeys.keycode[BCK_mapmenu]);
fprintf (config, "key_pause=%d\n", keyb_gamekeys.keycode[BCK_pause]); fprintf (config, "key_pause=%d\n", keyb_gamekeys.keycode[BCK_pause]);
fprintf (config, "key_playermenu=%d\n", keyb_gamekeys.keycode[BCK_playermenu]); fprintf (config, "key_playermenu=%d\n", keyb_gamekeys.keycode[BCK_playermenu]);
/*
* joypad config
*/
fprintf (config, "joy_1_drop=%d\n", joy_keys[0].drop);
fprintf (config, "joy_1_special=%d\n", joy_keys[0].special);
fprintf (config, "joy_2_drop=%d\n", joy_keys[1].drop);
fprintf (config, "joy_2_special=%d\n", joy_keys[1].special);
fclose (config); fclose (config);
return 0; return 0;
@ -631,8 +649,9 @@ config_menu ()
menu = menu_new ("Configuration", 400, 300); menu = menu_new ("Configuration", 400, 300);
menu_create_label (menu, "General Option", -1, 50, 1, COLOR_brown); menu_create_label (menu, "General Option", -1, 50, 1, COLOR_brown);
menu_create_button (menu, "Playernames", 25, 85, 150, 1); menu_create_button (menu, "Playernames", 25, 85, 150, 1);
menu_create_button (menu, "Keyboard", 225, 85, 150, 2); menu_create_button (menu, "Keyboard", 250, 85, 150, 2);
menu_create_button (menu, "Video Setup", -1, 120, 200, 3); menu_create_button (menu, "Joypad", 25, 120, 150, 4);
menu_create_button (menu, "Video Setup", 250, 120, 150, 3);
menu_create_label (menu, "Sound", 25, 154, 0, COLOR_brown); menu_create_label (menu, "Sound", 25, 154, 0, COLOR_brown);
menu_create_bool (menu, "ON", 100, 150, 50, &snd.playsound, 4); menu_create_bool (menu, "ON", 100, 150, 50, &snd.playsound, 4);
menu_create_label (menu, "Music", 250, 154, 0, COLOR_brown); menu_create_label (menu, "Music", 250, 154, 0, COLOR_brown);
@ -666,6 +685,10 @@ config_menu ()
case (3): // Screen Options case (3): // Screen Options
config_video (); config_video ();
break; break;
case (4): // joypad Options
joypad_config ();
break;
} }
} }
config_write (); config_write ();

@ -1,4 +1,4 @@
/* $Id: game.c,v 1.118 2007/01/12 22:42:31 stpohle Exp $ /* $Id: game.c,v 1.119 2008/07/27 11:24:37 stpohle Exp $
game.c - procedures for the game. */ game.c - procedures for the game. */
#include <string.h> #include <string.h>
@ -233,6 +233,11 @@ game_loop ()
if (GT_MP) if (GT_MP)
net_game_fillsockaddr (); net_game_fillsockaddr ();
if ( SDL_InitSubSystem ( SDL_INIT_JOYSTICK ) < 0 )
{
fprintf ( stderr, "Unable to initialize Joystick: %s\n", SDL_GetError() );
}
printf ( "%i joysticks found\n", SDL_NumJoysticks () );
menu = NULL; menu = NULL;
bman.updatestatusbar = 1; // force an update bman.updatestatusbar = 1; // force an update
@ -257,6 +262,7 @@ game_loop ()
} }
while (!done && (bman.state == GS_running || bman.state == GS_ready)) { while (!done && (bman.state == GS_running || bman.state == GS_ready)) {
SDL_JoystickUpdate ();
if ((eventstate = SDL_PollEvent (&event)) != 0) if ((eventstate = SDL_PollEvent (&event)) != 0)
switch (event.type) { switch (event.type) {
case (SDL_QUIT): case (SDL_QUIT):

@ -1,4 +1,4 @@
/* $Id: keyb.c,v 1.6 2005/08/07 17:46:21 stpohle Exp $ /* $Id: keyb.c,v 1.7 2008/07/27 11:24:37 stpohle Exp $
* keyb.c * keyb.c
*/ */
@ -7,8 +7,11 @@
#include "ogcache-client.h" #include "ogcache-client.h"
#include "menu.h" #include "menu.h"
#include "keyb.h" #include "keyb.h"
#include "SDL.h"
BCGameKeys keyb_gamekeys; BCGameKeys keyb_gamekeys;
BCGameJoystick joy_keys[2];
SDL_Joystick *joy[2];
/* /*
* Translation table for the keycodes * Translation table for the keycodes
@ -76,6 +79,11 @@ void keyb_config_reset () {
keyb_gamekeys.keycode[BCK_pause] = SDLK_F4; keyb_gamekeys.keycode[BCK_pause] = SDLK_F4;
keyb_gamekeys.keycode[BCK_fullscreen] = SDLK_F8; keyb_gamekeys.keycode[BCK_fullscreen] = SDLK_F8;
keyb_gamekeys.keycode[BCK_esc] = SDLK_ESCAPE; keyb_gamekeys.keycode[BCK_esc] = SDLK_ESCAPE;
joy_keys[0].drop = 0;
joy_keys[0].special = 1;
joy_keys[1].drop = 0;
joy_keys[1].special = 1;
}; };
@ -119,9 +127,9 @@ void keyb_config_createkeymenu (_menu *menu, int key, int x, int y, int menu_nr)
int key_id; int key_id;
char keyname [32]; char keyname [32];
char keytext [50]; char keytext [50];
for (key_id = key; key_id >= BCPK_max && key_id < BCPK_max * 3; key_id = key_id - BCPK_max); for (key_id = key; key_id >= BCPK_max && key_id < BCPK_max * 3; key_id = key_id - BCPK_max);
switch (key_id) { switch (key_id) {
case (BCPK_up): case (BCPK_up):
strcpy (keyname, "Up"); strcpy (keyname, "Up");
@ -166,6 +174,70 @@ void keyb_config_createkeymenu (_menu *menu, int key, int x, int y, int menu_nr)
menu_create_button (menu, keytext, x + 70, y, 100, menu_nr + key); menu_create_button (menu, keytext, x + 70, y, 100, menu_nr + key);
} }
/*
* select a new key for the function,
*/
void keyb_config_joypad (int key) {
unsigned int n = 0;
SDL_Event event;
Uint8 *keys;
int keypressed = 0, done = 0, eventstate = 0, reorder = 0, i, j;
if (joy[0] == NULL || key < 0 || key >= BCK_max) return;
SDL_JoystickUpdate ();
menu_displaytext ("Joypad Config", "Please press the new key\nfor this function.");
keys = SDL_GetKeyState (NULL);
if (keys[SDLK_RETURN] || keys[SDLK_ESCAPE])
keypressed = 1;
timestamp = SDL_GetTicks (); // needed for time sync.
while (!reorder && !done && bman.state != GS_quit) {
/* do the network loop if we have to */
if (bman.sock > 0) {
network_loop ();
if (bman.notifygamemaster)
reorder = ogc_loop ();
else
reorder = 0;
}
// eventstate = s_fetchevent (&event);
SDL_JoystickEventState ( SDL_QUERY ); // js
SDL_JoystickUpdate ();
for ( j = 0; j < 2; j++)
for ( i=0; i < SDL_JoystickNumButtons ( joy[j] ); ++i ) {
n = SDL_JoystickGetButton ( joy[j], i );
// 2 .. bomb
/* Sadly every other controller enumberates different */
if (n != 0) {
printf("keyb keyb_config_joypad: JS %d: %d \n", j, i);
if (key == BCPK_drop || key == BCPK_drop + BCPK_max + BCPK_max)
joy_keys[j].drop = i;
if (key == BCPK_special || key == BCPK_special + BCPK_max + BCPK_max)
joy_keys[j].special = i;
eventstate = 1;
done = 1;
}
}
if (eventstate >= 1) {
switch (event.type) {
case (SDL_QUIT):
bman.state = GS_quit;
done = 1;
break;
}
}
s_calctimesync ();
}
};
/* /*
* select a new key for the function, * select a new key for the function,
@ -224,6 +296,54 @@ void keyb_config_readkey (int key) {
keyb_gamekeys.keycode[key] = newkey; keyb_gamekeys.keycode[key] = newkey;
}; };
/*
* joypad configuration screen
*/
void joypad_config () {
int menuselect = 1;
_menu *menu;
do {
menu = menu_new ("Joypad Config", 420, 400);
if ( joy[0] != NULL ) {
char text[32];
menu_create_label (menu, "Player 1 Joypad", 20, 105, 1, COLOR_yellow);
// keyb_config_createkeymenu (menu, BCPK_max + BCPK_drop, 25, 250, 10);
menu_create_label (menu, "Drop", 25, 250 + 2, 0, COLOR_brown);
sprintf (text, "%d", joy_keys[0].drop);
menu_create_button (menu, text, 25 + 70, 250, 100, 10 + BCPK_drop);
// keyb_config_createkeymenu (menu, BCPK_max + BCPK_special, 25, 280, 10);
menu_create_label (menu, "Special", 25, 280 + 2, 0, COLOR_brown);
sprintf (text, "%d", joy_keys[0].special);
menu_create_button (menu, text, 25 + 70, 280, 100, 10 + BCPK_special);
}
if ( joy[1] != NULL ) {
char text[32];
menu_create_label (menu, "Player 2 Joypad", 210, 105, 1, COLOR_yellow);
// keyb_config_createkeymenu (menu, BCPK_max + BCPK_max + BCPK_drop, 225, 250, 10);
menu_create_label (menu, "Drop", 225, 250 + 2, 0, COLOR_brown);
sprintf (text, "%d", joy_keys[1].drop);
menu_create_button (menu, text, 225 + 70, 250, 100, 10 + BCPK_max + BCPK_max + BCPK_drop);
// keyb_config_createkeymenu (menu, BCPK_max + BCPK_max + BCPK_special, 225, 280, 10);
menu_create_label (menu, "Special", 225, 280 + 2, 0, COLOR_brown);
sprintf (text, "%d", joy_keys[1].special);
menu_create_button (menu, text, 225 + 70, 280, 100, 10 + BCPK_max + BCPK_max + BCPK_special);
}
menu_create_button (menu, "OK", 250, 330, 150, 1);
menu_focus_id (menu, menuselect);
menuselect = menu_loop (menu);
menu_delete (menu);
if (menuselect >= 10 && menuselect < 10+BCK_max)
keyb_config_joypad (menuselect - 10);
} while (menuselect != 1 && menuselect != -1);
};
/* /*
* keyboard configuration screen * keyboard configuration screen
@ -282,6 +402,11 @@ void keyb_config () {
*/ */
void keyb_init () { void keyb_init () {
memset (keyb_gamekeys.state, 0, sizeof (Uint8) * BCK_max); memset (keyb_gamekeys.state, 0, sizeof (Uint8) * BCK_max);
joy[0] = joy[1] = NULL;
joy[0] = SDL_JoystickOpen (0);
if (joy[0])
joy[1] = SDL_JoystickOpen (1);
}; };
@ -289,14 +414,54 @@ void keyb_init () {
* read all keys and set the keyb_gamekeys * read all keys and set the keyb_gamekeys
*/ */
void keyb_loop (SDL_Event *event) { void keyb_loop (SDL_Event *event) {
int i; int j, i, offset = 0;
Uint8 *keys = SDL_GetKeyState (NULL); Uint8 *keys = SDL_GetKeyState (NULL);
if (joy[0]) {
SDL_JoystickEventState ( SDL_QUERY ); // js
SDL_JoystickUpdate ();
}
/* copy the state into the old state */ /* copy the state into the old state */
memcpy (keyb_gamekeys.old, keyb_gamekeys.state, sizeof (Uint8) * BCK_max); memcpy (keyb_gamekeys.old, keyb_gamekeys.state, sizeof (Uint8) * BCK_max);
memset (keyb_gamekeys.state, 0, sizeof (Uint8) * BCK_max); memset (keyb_gamekeys.state, 0, sizeof (Uint8) * BCK_max);
for (j = 0; j < 2; j++) {
if (joy[j]) {
for ( i=0; i < SDL_JoystickNumButtons (joy[j]); ++i ) {
unsigned int n = SDL_JoystickGetButton (joy[j], i);
/* Sadly every other controller enumberates different */
if (n != 0 && i == joy_keys[j].drop)
keyb_gamekeys.state[offset + BCPK_drop] |= 1;
if (n != 0 && i == joy_keys[j].special)
keyb_gamekeys.state[offset + BCPK_special] |= 1;
}
for ( i=0; i < SDL_JoystickNumAxes ( joy[j] ); ++i ) {
signed short a = SDL_JoystickGetAxis ( joy[j], i );
/*
X -> Axis 0
Y -> Axis 1
There are only the values -32786 .. 32768 available
*/
if ( i == 0 && a < (-16000) ) {
keyb_gamekeys.state[offset + BCPK_left] |= 1;
}
if (i == 0 && a > 16000 ) {
keyb_gamekeys.state[offset + BCPK_right] |= 1;
}
if ( i == 1 && a < -16000 ) {
keyb_gamekeys.state[offset + BCPK_up] |= 1;
}
if (i == 1 && a > 16000 ) {
keyb_gamekeys.state[offset + BCPK_down] |= 1;
}
}
}
offset = BCPK_max + BCPK_max;
}
/* read the new state of the pressed keys */ /* read the new state of the pressed keys */
for (i = 0; i < BCK_max; i++) { for (i = 0; i < BCK_max; i++) {
if (keyb_gamekeys.keycode[i] >= 'A' && keyb_gamekeys.keycode[i] <= 'Z') { if (keyb_gamekeys.keycode[i] >= 'A' && keyb_gamekeys.keycode[i] <= 'Z') {

@ -1,4 +1,4 @@
/* $Id: main.c,v 1.36 2007/02/17 08:27:41 stpohle Exp $ */ /* $Id: main.c,v 1.37 2008/07/27 11:24:37 stpohle Exp $ */
#include "basic.h" #include "basic.h"
#include "bomberclone.h" #include "bomberclone.h"
@ -6,6 +6,7 @@
#include "gfx.h" #include "gfx.h"
#include "menu.h" #include "menu.h"
#include "player.h" #include "player.h"
#include "keyb.h"
#include "single.h" #include "single.h"
_bomberclone bman; // Holds GameData _bomberclone bman; // Holds GameData
@ -40,10 +41,12 @@ main (int argc, char **argv)
return (1); return (1);
} }
SDL_InitSubSystem ( SDL_INIT_JOYSTICK );
SDL_EnableUNICODE(1); SDL_EnableUNICODE(1);
config_init (argc, argv); config_init (argc, argv);
keyb_init ();
while (menuselect != -1 && bman.state != GS_quit) { while (menuselect != -1 && bman.state != GS_quit) {
menu = menu_new ("Bomberclone", 400, 250); menu = menu_new ("Bomberclone", 400, 250);

@ -1,4 +1,4 @@
/* $Id: multiwait.c,v 1.59 2006/08/19 23:41:47 stpohle Exp $ /* $Id: multiwait.c,v 1.60 2008/07/27 11:24:37 stpohle Exp $
multiwait.c - this manages only the network screen where multiwait.c - this manages only the network screen where
everyone have to select it's players and where even the basic chat is inside everyone have to select it's players and where even the basic chat is inside
*/ */
@ -85,6 +85,11 @@ static void mw_keys_loop () {
bman.updatestatusbar = 1; // force an update bman.updatestatusbar = 1; // force an update
} }
if (GT_MP_PTPM && mw_check_players () < 2 && keyb_gamekeys.state[BCK_pause] && !keyb_gamekeys.old[BCK_pause]) {
font_gfxdraw (20,20,"There are not enough configured players", 0, COLOR_brown, 0x1000);
font_gfxdraw (20,40,"(each player needs to press Ctrl to select the role)", 0, COLOR_brown, 0x1000);
}
if (keyb_gamekeys.state[BCK_fullscreen] && !keyb_gamekeys.old[BCK_fullscreen]) { if (keyb_gamekeys.state[BCK_fullscreen] && !keyb_gamekeys.old[BCK_fullscreen]) {
/* Switch Fullscreen */ /* Switch Fullscreen */
SDL_WM_ToggleFullScreen(gfx.screen); SDL_WM_ToggleFullScreen(gfx.screen);

Loading…
Cancel
Save