diff --git a/ChangeLog b/ChangeLog index b64ba2e..757af9c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,19 @@ -$Id: ChangeLog,v 1.76 2004/06/16 00:41:27 stpohle Exp $ +$Id: ChangeLog,v 1.77 2004/09/12 20:54:24 stpohle Exp $ + +* NEED TO FIX: Server starts the game soo fast that the + client's ignore the gamestat for a running game. + Check if all players are ready. + +* FINISH TEAM MODE. + +* NEED TO FIX: Network Version Error. There is no + possible Escape. + +- fixed: Single Player Menu there was no ESC key working + +- fixed: Player Selection Screen (single player) + ESC key wasn't working and also closing the program + haven't worked. Version 0.11.3 diff --git a/TODO b/TODO index 8340c45..3761f86 100644 --- a/TODO +++ b/TODO @@ -1,18 +1,4 @@ -$Id: TODO,v 1.42 2004/08/08 23:18:45 stpohle Exp $ +$Id: TODO,v 1.43 2004/09/12 20:54:24 stpohle Exp $ -************************************************************** -* All Todo entry are to make at the WebPage: * -* http://sourceforge.net/tracker/?group_id=79449&atid=556632 * -* So i can drop this file soon. * -************************************************************** -- better configuration for home made map files - -- more specials - -- network joining menu - Add: information about the playernames and the point list. - -- we need some more sound for picking up items. - -- ranking system, done by the bomberclonemserv +EMPTY FILE... diff --git a/configure.in b/configure.in index 7be412f..358ec61 100644 --- a/configure.in +++ b/configure.in @@ -5,7 +5,7 @@ dnl Please disable it in the Anjuta project configuration AC_INIT(configure.in) AC_CANONICAL_TARGET -AM_INIT_AUTOMAKE(bomberclone, 0.11.4) +AM_INIT_AUTOMAKE(bomberclone, 0.11.4test) AM_CONFIG_HEADER(config.h) diff --git a/include/basic.h b/include/basic.h index c03bd2e..7e858af 100644 --- a/include/basic.h +++ b/include/basic.h @@ -1,4 +1,4 @@ -/* $Id: basic.h,v 1.24 2004/08/30 20:01:29 stpohle Exp $ */ +/* $Id: basic.h,v 1.25 2004/09/12 20:54:24 stpohle Exp $ */ /* basic types which we need everywhere */ #ifndef _BC_BASIC_H_ @@ -36,6 +36,7 @@ #define SPEEDMUL 1.2 #define MAX_PLAYERS 8 +#define MAX_TEAMS 4 #define MAX_BOMBS 12 #define MAX_RANGE 10 #define MAX_SPEED 0.4 @@ -96,7 +97,8 @@ enum _backgound { // to load some diffrent logos.. enum _gametype { GT_bomberman = 0, - GT_deathmatch + GT_deathmatch, + GT_team }; diff --git a/include/bomberclone.h b/include/bomberclone.h index cb5a2f4..70e06f4 100644 --- a/include/bomberclone.h +++ b/include/bomberclone.h @@ -1,4 +1,4 @@ -/* $Id: bomberclone.h,v 1.27 2004/06/15 15:04:37 stpohle Exp $ */ +/* $Id: bomberclone.h,v 1.28 2004/09/12 20:54:24 stpohle Exp $ */ /* bomberclone.h */ #ifndef _BOMBERCLONE_H_ @@ -155,7 +155,7 @@ extern void d_bitprint (int bits, int nr); extern void d_fatal (char *fmt,...); extern void debug_ingameinfo(); extern void d_printsdlrect (char *text, SDL_Rect *rect); - +extern void d_teamdetail (char *head); // special.c extern void special_use (int p_nr); diff --git a/include/packets.h b/include/packets.h index d098657..ae0e4cb 100644 --- a/include/packets.h +++ b/include/packets.h @@ -1,4 +1,4 @@ -/* $Id: packets.h,v 1.24 2004/05/20 16:55:30 stpohle Exp $ +/* $Id: packets.h,v 1.25 2004/09/12 20:54:24 stpohle Exp $ * network packets.. */ #ifndef _PACKETS_H_ @@ -167,6 +167,7 @@ struct pkg_playerid { signed char gfx_nr; // number of the graphic signed char state; signed char netflags; // network flags + signed char team_nr; // team number Sint16 points; Sint16 wins; }; @@ -178,6 +179,7 @@ struct pkg_playerdata { Sint16 points; // points Sint16 wins; // how many times we win signed char gfx_nr; // the gfx number we want to use + signed char team_nr; // teamnumber of the player _point pos; unsigned char bombs_n; unsigned char range; @@ -358,7 +360,7 @@ extern void do_dropitems (struct pkg_dropitem *di_pkg, _net_addr *addr); extern void do_respawn (struct pkg_respawn *r_pkg, _net_addr *addr); extern void send_pkg (struct pkg *packet, _net_addr *addr); -extern void send_playerid (_net_addr *addr, char *name, char *pladdr, char *plport, int p_nr, int gfx_nr, signed char netflags); +extern void send_playerid (_net_addr *addr, char *name, char *pladdr, char *plport, int p_nr, int gfx_nr, int team_nr, signed char netflags); extern void send_servermode (_net_addr *addr, int pl_nr); extern void send_joingame (_net_addr * addr, char *name, int flags); extern void send_error (_net_addr *addr, char *text); diff --git a/include/player.h b/include/player.h index deb4c61..2e8b9cf 100644 --- a/include/player.h +++ b/include/player.h @@ -1,4 +1,4 @@ -/* $Id: player.h,v 1.2 2004/05/20 16:55:30 stpohle Exp $ +/* $Id: player.h,v 1.3 2004/09/12 20:54:24 stpohle Exp $ * playerinclude file */ @@ -99,18 +99,28 @@ struct { _special special; // special the player has char name[LEN_PLAYERNAME]; // name oder name[0] == 0 + int team_nr; // number of the team we are in or -1 unsigned char state; // status of the player signed char in_nr; // number of the connected player entry int points; // points int wins; // wins signed char dead_by; // player who killed this player - + _net_player net; // holds all important network data } typedef _player; + +struct __team { + _player *players[MAX_PLAYERS]; + char name[LEN_PLAYERNAME]; + int active; +} typedef _team; + + // everything what is declared in players.c extern _player *players; +extern _team *teams; extern void dead_playerani (); extern void draw_player (_player * player); @@ -139,6 +149,8 @@ extern void player_delete (int pl_nr); extern void player2_join (); extern void player2_add (int pl_nr); +extern void team_update (); + // for the playerinput handling extern void playerinput_loop (int pl_nr); @@ -147,5 +159,8 @@ extern inline void playerinput_keyb_read (int pk_offset, int pl_nr); /* playermenu.c */ extern void playermenu (); -extern void playermenu_selgfx (int pl_nr); +extern int playermenu_selgfx (int pl_nr); + +extern void teammenu (); + #endif diff --git a/src/configuration.c b/src/configuration.c index 52185fe..5dfda89 100644 --- a/src/configuration.c +++ b/src/configuration.c @@ -1,4 +1,4 @@ -/* $Id: configuration.c,v 1.62 2004/06/13 23:34:10 stpohle Exp $ +/* $Id: configuration.c,v 1.63 2004/09/12 20:54:24 stpohle Exp $ * configuration */ #include @@ -19,15 +19,21 @@ config_init (int argc, char **argv) { SDL_Surface *icon_img; char text[255], icon[255]; - int i; + int i, j; srand (((int) time (NULL))); // initialize randomgenerator for (i = 0; i < MAX_PLAYERS; i++) { players[i].gfx = NULL; /* we will select them in the wait_for_players loop */ players[i].gfx_nr = -1; /* and even now in the singleplayer menu */ + players[i].team_nr = -1; /* delete team assignment */ } - + for (i = 0; i < MAX_TEAMS; i++) { + sprintf (teams[i].name, "Team %d", i+1); + for (j = 0; j < MAX_PLAYERS; j++) + teams[i].players[j] = NULL; + } + stonelist_del (); chat.oldscreen = NULL; chat.active = 0; diff --git a/src/debug.c b/src/debug.c index 807fca5..1d63b39 100644 --- a/src/debug.c +++ b/src/debug.c @@ -44,6 +44,27 @@ void d_playerdetail (char *head) { }; +void d_teamdetail (char *head) { + int p; + char name[MAX_TEAMS][LEN_PLAYERNAME]; + + d_printf ("---------------> %s\n", head); + d_printf ("Teams: | %-10s | %-10s | %-10s | %-10s | Players\n", teams[0].name,teams[1].name,teams[2].name,teams[3].name); + for (p = 0; p < MAX_PLAYERS; p++) { + if (teams[0].players[p] == NULL) name[0][0] = 0; + else strncpy (name[0], teams[0].players[p]->name, LEN_PLAYERNAME); + if (teams[1].players[p] == NULL) name[1][0] = 0; + else strncpy (name[1], teams[1].players[p]->name, LEN_PLAYERNAME); + if (teams[2].players[p] == NULL) name[2][0] = 0; + else strncpy (name[2], teams[2].players[p]->name, LEN_PLAYERNAME); + if (teams[3].players[p] == NULL) name[3][0] = 0; + else strncpy (name[3], teams[3].players[p]->name, LEN_PLAYERNAME); + + d_printf (" | %-10s | %-10s | %-10s | %-10s | %-10s Team:%d\n", name[0], name[1], name[2], name[3], players[p].name, players[p].team_nr); + } +}; + + void d_bitprint (int bits, int nr) { int i; diff --git a/src/gfx.c b/src/gfx.c index 880d9ea..7ea25e6 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -1,4 +1,4 @@ -/* $Id: gfx.c,v 1.35 2004/05/20 16:55:30 stpohle Exp $ */ +/* $Id: gfx.c,v 1.36 2004/09/12 20:54:24 stpohle Exp $ */ /* gfx.c */ #include "bomberclone.h" @@ -186,8 +186,13 @@ gfx_loaddata () sprintf (filename, "%s/gfx/logo.png", bman.datapath); tmpimage = IMG_Load (filename); if (tmpimage == NULL) { - printf ("Can't load image: %s\n", SDL_GetError ()); - exit (1); + sprintf (bman.datapath, "../data"); + sprintf (filename, "%s/gfx/logo.png", bman.datapath); + tmpimage = IMG_Load (filename); + if (tmpimage == NULL) { + printf ("Can't load image: %s\n", SDL_GetError ()); + exit (1); + } } } tmpimage1 = scale_image (tmpimage, gfx.res.x, gfx.res.y); diff --git a/src/main.c b/src/main.c index 23134bb..4edc3c0 100644 --- a/src/main.c +++ b/src/main.c @@ -1,4 +1,4 @@ -/* $Id: main.c,v 1.26 2004/05/25 22:22:29 stpohle Exp $ */ +/* $Id: main.c,v 1.27 2004/09/12 20:54:24 stpohle Exp $ */ #include "basic.h" #include "bomberclone.h" @@ -9,7 +9,8 @@ #include "single.h" _bomberclone bman; // Holds GameData -_player *players; // holds all Playerdata +_player *players; // holds all Playerdata +_team *teams; // team stuff Uint32 timestamp; // timestamp float timefactor = 0.0f; /* factor for the time time of the last loop @@ -24,6 +25,7 @@ main (int argc, char **argv) _menu *menu; players = malloc (sizeof (_player) * MAX_PLAYERS); + teams = malloc (sizeof (_team) * MAX_TEAMS); gfxengine_init (); if (SDL_Init (SDL_INIT_VIDEO| SDL_INIT_NOPARACHUTE) != 0) { @@ -36,7 +38,7 @@ main (int argc, char **argv) config_init (argc, argv); while (menuselect != -1 && bman.state != GS_quit) { - menu = menu_new ("Bomberclone", 400, 230); + menu = menu_new ("Bomberclone", 400, 250); // y=230 menu_create_button (menu, "Single Game", -1, 70, 200, 0); menu_create_button (menu, "Multiplayer Game", -1, 100, 200, 1); menu_create_button (menu, "Options", -1, 130, 200, 2); diff --git a/src/mapmenu.c b/src/mapmenu.c index 7430426..8fa74de 100644 --- a/src/mapmenu.c +++ b/src/mapmenu.c @@ -1,4 +1,4 @@ -/* $Id: mapmenu.c,v 1.23 2004/05/20 16:55:30 stpohle Exp $ */ +/* $Id: mapmenu.c,v 1.24 2004/09/12 20:54:24 stpohle Exp $ */ /* map/tileset selection menu */ #include "bomberclone.h" @@ -128,6 +128,7 @@ mapmenu () case (16): /* Game Settings */ mapgamesetting (); + break; } /* map type */ @@ -323,11 +324,12 @@ void mapgamesetting () { _charlist gametype [] = { {"Bomberman", NULL}, {"Deathmatch", NULL}, + {"Teammode", NULL} }; _charlist *gametype_sel = &gametype[bman.gametype]; _menu *menu; - charlist_fillarraypointer (gametype, 2); + charlist_fillarraypointer (gametype, 3); while (menuselect != -1 && bman.state != GS_quit) { menu = menu_new ("Game Options", 420, 400); @@ -343,7 +345,7 @@ void mapgamesetting () { menu_create_label (menu, "Game Parameter", 25, 180, 1, COLOR_brown); menu_create_entry (menu, "Bomb Time:", 25, 220, 200, &bman.bomb_tickingtime, 1200, MENU_entryfloat, 5); menu_create_label (menu, "Gametype", 25, 250, 0, COLOR_brown); - menu_create_list (menu, "GameType", 25, 280, 150, 50, gametype, &gametype_sel, 6); + menu_create_list (menu, "GameType", 25, 280, 150, 60, gametype, &gametype_sel, 6); menu_create_bool (menu, "Drop Items", 200, 280, 150, &bman.dropitemsondeath, 7); menu_create_button (menu, "Ok", -1, 380, 150, 0); diff --git a/src/menu.c b/src/menu.c index acbaeb9..c2d1323 100644 --- a/src/menu.c +++ b/src/menu.c @@ -1,4 +1,4 @@ -/* $Id: menu.c,v 1.45 2004/06/15 15:04:37 stpohle Exp $ +/* $Id: menu.c,v 1.46 2004/09/12 20:54:24 stpohle Exp $ * Menuhandling */ #include "basic.h" @@ -446,7 +446,7 @@ menu_event_loop (_menu * menu, SDL_Event * event, int eventstate) case (SDL_QUIT): bman.state = GS_quit; done = 1; - return 1; + return -1; break; case (SDL_KEYDOWN): /* focus next element */ if (menu->oldkey == 0 && event->key.keysym.sym == SDLK_TAB) { diff --git a/src/network.c b/src/network.c index 91edd04..276744e 100644 --- a/src/network.c +++ b/src/network.c @@ -1,4 +1,4 @@ -/* $Id: network.c,v 1.63 2004/05/20 16:55:30 stpohle Exp $ */ +/* $Id: network.c,v 1.64 2004/09/12 20:54:24 stpohle Exp $ */ /* network routines. */ @@ -422,7 +422,7 @@ net_change_playerid (int pl_nr, unsigned char senddata) if (!PS_IS_aiplayer (players[i].state) && players[i].net.addr.host[0] != 0) send_playerid (&players[i].net.addr, players[pl_nr].name, players[pl_nr].net.addr.host, players[pl_nr].net.addr.port, - pl_nr, players[pl_nr].gfx_nr, players[pl_nr].net.flags); + pl_nr, players[pl_nr].gfx_nr, players[pl_nr].team_nr, players[pl_nr].net.flags); } else { /* @@ -431,7 +431,7 @@ net_change_playerid (int pl_nr, unsigned char senddata) if ((pl_nr == bman.p_nr || (IS_LPLAYER2 && pl_nr == bman.p2_nr)) && senddata) send_playerid (&players[bman.p_servnr].net.addr, players[pl_nr].name, players[pl_nr].net.addr.host, players[pl_nr].net.addr.port, - pl_nr, players[pl_nr].gfx_nr, players[pl_nr].net.flags); + pl_nr, players[pl_nr].gfx_nr, players[pl_nr].team_nr, players[pl_nr].net.flags); } player_set_gfx (&players[pl_nr], players[pl_nr].gfx_nr); @@ -762,7 +762,7 @@ net_send_players () for (i = 0; i < MAX_PLAYERS; i++) send_playerid (&players[j].net.addr, players[i].name, players[i].net.addr.host, players[i].net.addr.port, i, - players[i].gfx_nr, players[i].net.flags); + players[i].gfx_nr, players[i].team_nr, players[i].net.flags); }; diff --git a/src/packets.c b/src/packets.c index 0c458c5..c2218d7 100644 --- a/src/packets.c +++ b/src/packets.c @@ -143,6 +143,7 @@ do_joingame (struct pkg_joingame *p_jg, _net_addr * addr) d_printf (" Player Added : Nr:[%d] Name:%10s\n", i, p_jg->name); pl->points = 0; pl->wins = 0; + pl->team_nr = -1; } strncpy (pl->name, p_jg->name, LEN_PLAYERNAME); player_set_gfx (pl, -1); @@ -173,7 +174,7 @@ do_joingame (struct pkg_joingame *p_jg, _net_addr * addr) if (NET_CANSEND(i)) send_playerid (&players[i].net.addr, pl->name, pl->net.addr.host, pl->net.addr.port, pl->net.addr.pl_nr, pl->gfx_nr, - pl->net.flags); + pl->team_nr, pl->net.flags); } else if (GS_WAITRUNNING) { @@ -240,7 +241,7 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr) */ if (GT_MP_PTPM && p_id->pl_nr == -1) { for (i = 0; i < MAX_PLAYERS; i++) - send_playerid (addr, players[i].name, players[i].net.addr.host, players[i].net.addr.port, i, players[i].gfx_nr, players[i].net.flags); + send_playerid (addr, players[i].name, players[i].net.addr.host, players[i].net.addr.port, i, players[i].gfx_nr, players[i].team_nr, players[i].net.flags); } /* * check if we have to update someones data @@ -279,6 +280,7 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr) if (GT_MP_PTPS) { pl->points = NTOH16 (p_id->points); pl->wins = NTOH16 (p_id->wins); + pl->team_nr = p_id->team_nr; } /* Send all connected players the new PlayerID */ @@ -293,7 +295,7 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr) void send_playerid (_net_addr * addr, char *name, char *pladdr, char *plport, - int pl_nr, int gfx_nr, signed char netflags) + int pl_nr, int gfx_nr, int team_nr, signed char netflags) { struct pkg_playerid p_id; int vmi, @@ -330,11 +332,13 @@ send_playerid (_net_addr * addr, char *name, char *pladdr, char *plport, p_id.points = HTON16 (players[pl_nr].points); p_id.wins = HTON16 (players[pl_nr].wins); p_id.state = players[pl_nr].state; + p_id.team_nr = team_nr; } else { p_id.points = 0; p_id.wins = 0; p_id.state = 0; + p_id.team_nr = -1; } send_pkg ((struct pkg *) &p_id, addr); @@ -376,7 +380,7 @@ do_servermode (struct pkg_servermode *s_mod, _net_addr * addr) } /* send playerid with p_nr -1 so we get the whole playerlist */ - send_playerid (addr, NULL, NULL, NULL, -1, -1, 0); + send_playerid (addr, NULL, NULL, NULL, -1, -1, -1, 0); } /* the server changed */ diff --git a/src/player.c b/src/player.c index 8230286..3eee60b 100644 --- a/src/player.c +++ b/src/player.c @@ -1,4 +1,4 @@ -/* $Id: player.c,v 1.85 2004/06/08 22:35:26 stpohle Exp $ +/* $Id: player.c,v 1.86 2004/09/12 20:54:25 stpohle Exp $ * player.c - everything what have to do with the player */ #include @@ -1062,5 +1062,26 @@ void player2_add (int pl_nr) { players[pl_nr].gfx = NULL; players[pl_nr].points = 0; players[pl_nr].wins = 0; + players[pl_nr].team_nr = 0; d_printf ("player2_add: Local Player Added with pl_nr: %d\n", pl_nr); }; + + +/* + * set the teams[] witht he current player data + */ +void team_update () { + int cnt[MAX_TEAMS] = { 0,0,0,0 }; + int pl; + + for (pl = 0; pl < MAX_PLAYERS; pl++) { + if (PS_IS_used (players[pl].state) && players[pl].team_nr >= 0) { + teams[players[pl].team_nr].players[cnt[players[pl].team_nr]] = &players[pl]; + cnt[players[pl].team_nr]++; + } + } + for (pl = 0; pl < MAX_TEAMS; pl++) for (;cnt[pl] < MAX_PLAYERS; cnt[pl]++) + teams[pl].players[cnt[pl]] = NULL; + + // d_teamdetail ("Teaminformation"); +} diff --git a/src/playermenu.c b/src/playermenu.c index d475502..4013b07 100644 --- a/src/playermenu.c +++ b/src/playermenu.c @@ -1,4 +1,4 @@ -/* $Id: playermenu.c,v 1.2 2004/05/20 16:55:30 stpohle Exp $ +/* $Id: playermenu.c,v 1.3 2004/09/12 20:54:25 stpohle Exp $ * */ @@ -149,7 +149,7 @@ void playermenu () { _menuitem *list_PlayerList; _charlist playerlist[MAX_PLAYERS + 1]; _charlist *playerlist_sel = &playerlist[0]; - int i, menuselect = 0, done = 0, eventstate, pl_nr; + int i, done = 0, eventstate, pl_nr; SDL_Event event; for (i = 0; i < MAX_PLAYERS; i++) @@ -200,6 +200,7 @@ void playermenu () { if (bman.sock != -1) network_loop (); + menu_draw (menu); done = menu_event_loop (menu, &event, eventstate); /* * check if one of the buttons was pressed @@ -241,7 +242,7 @@ void playermenu () { } s_calctimesync (); - } while ((done == 0 || menu->focus->id != 1) && done != -1 && menuselect != -1 && menuselect != 1); + } while ((done == 0 || menu->focus->id != 1) && done != -1); if (menu->focus->id == 1 && done == 1) { /* @@ -258,7 +259,7 @@ void playermenu () { /* * draw a small menu where the player has to select his gfx */ -void playermenu_selgfx (int pl_nr) { +int playermenu_selgfx (int pl_nr) { _menu *menu; int selgfx, eventstate; SDL_Event event; @@ -266,7 +267,7 @@ void playermenu_selgfx (int pl_nr) { int done = 0; if (pl_nr < 0 || pl_nr >= MAX_PLAYERS) - return; + return -1; selgfx = players[pl_nr].gfx_nr; if (selgfx < 0) @@ -298,7 +299,7 @@ void playermenu_selgfx (int pl_nr) { bman.state = GS_quit; done = 1; menu_delete (menu); - return; + return -1; break; case (SDL_KEYDOWN): /* @@ -332,7 +333,7 @@ void playermenu_selgfx (int pl_nr) { */ else if (event.key.keysym.sym == SDLK_ESCAPE) { selgfx = -1; - done = 1; + done = 2; break; } /* @@ -356,4 +357,249 @@ void playermenu_selgfx (int pl_nr) { }; menu_delete (menu); player_set_gfx (&players[pl_nr], selgfx); + if (done == 2) + return -1; + + return 0; +}; + + +/* + * teammenu: Teamplay menuselection + * Show and edit all teams and the players. + */ +struct __teammenu { + struct { + _charlist names[MAX_PLAYERS]; + _charlist *select; + _menuitem *item; + _menuitem *label; + } teamp, freep; + + _menuitem *teamlist; + _charlist teamnames[MAX_TEAMS]; + _charlist *teamsel; +}; + +static void teammenu_update (_menu *menu, struct __teammenu *tm); +static int inline teammenu_get_selteam (_menu *menu, struct __teammenu *tm); +static void teammenu_set_selteam (_menu *menu, struct __teammenu *tm, int teamnr); +static void teammenu_player2team (_menu *menu, struct __teammenu *tm); +static void teammenu_team2player (_menu *menu, struct __teammenu *tm); + + +void teammenu () { + _menu *menu; + struct __teammenu tm; + + int done, eventstate, menu_id = 0, last_id = 0, last_selteam = -1; + SDL_Event event; + + single_create_ai (7); // for debug only + + menu = menu_new ("Team Details", 400, 350); + + menu_create_text (menu, "help1", 10, 70, (250/font[0].size.x), 5, COLOR_gray, "Move the players from one team into the other by selecting them with ENTER."); + menu_create_button (menu, "Close", -1, 325, 150, 0); + + /* reset all teamlist data and create element */ + tm.teamsel = NULL; + tm.teamnames[0].text[0] = 0; + tm.teamnames[0].next = NULL; + + tm.teamlist = menu_create_list (menu, "Teamlist", 250, 70, 150, 80, tm.teamnames, &tm.teamsel, ++menu_id); + + /* reset all player data and create element*/ + tm.teamp.names[0].text[0] = 0; + tm.teamp.names[0].next = NULL; + tm.teamp.select = &tm.teamp.names[0];; + tm.freep.names[0].text[0] = 0; + tm.freep.names[0].next = NULL; + tm.freep.select = &tm.freep.names[0];; + + tm.freep.label = menu_create_label (menu, "Free Players", 40, 160, 0, COLOR_yellow); + tm.freep.item = menu_create_list (menu, "freeplayer", 30, 180, 150, 120, tm.freep.names, &tm.freep.select, ++menu_id); + tm.teamp.label = menu_create_label (menu, teams[0].name, 250, 160, 0, COLOR_yellow); + tm.teamp.item = menu_create_list (menu, "teamplayer", 240, 180, 150, 120, tm.teamp.names, &tm.teamp.select, ++menu_id); + + + /* prepare everything for the menu_loop */ + menu_focus_id (menu, 1); + menu->looprunning = 1; + menu_draw (menu); + + teammenu_set_selteam (menu, &tm, 0); + teammenu_update (menu, &tm); + + /* the menu loop */ + do { + gfx_blitdraw (); + eventstate = SDL_PollEvent (&event); + if (bman.sock != -1) + network_loop (); + + menu_draw (menu); + done = menu_event_loop (menu, &event, eventstate); + /* + * check if one of the buttons was pressed + */ + if (last_id != menu->focus->id || last_selteam != teammenu_get_selteam(menu, &tm)) { + teammenu_update (menu, &tm); + } + + if (done == 1 && menu->focus->id == tm.freep.item->id) { // freeplayer selected + teammenu_player2team (menu, &tm); + teammenu_update (menu, &tm); + done = 0; + } + + if (done == 1 && menu->focus->id == tm.teamp.item->id) { // teamplayer selected + teammenu_team2player (menu, &tm); + teammenu_update (menu, &tm); + done = 0; + } + + if (done == 1 && menu->focus->id == tm.teamlist->id) { + menu_focus_id (menu, tm.freep.item->id); + teammenu_update (menu, &tm); + done = 0; + } + + s_calctimesync (); + last_id = menu->focus->id; + } while ((done == 0 || menu->focus->id != 0) && done != -1); + menu_delete (menu); +} + + +/* + * add the current selected playxer to the free players + */ +static void teammenu_team2player (_menu *menu, struct __teammenu *tm) { + int sel_team = teammenu_get_selteam (menu,tm); + int sel_teampl = tm->teamp.select - tm->teamp.names; + + if (sel_team < 0 || sel_team >= MAX_TEAMS || sel_teampl < 0 || sel_teampl >= MAX_PLAYERS) + return; + if (teams[sel_team].players[sel_teampl] == NULL) + return; + + teams[sel_team].players[sel_teampl]->team_nr = -1; + team_update (); +}; + + +/* + * add the current selected player to the current team + */ +static void teammenu_player2team (_menu *menu, struct __teammenu *tm) { + int sel_player = tm->freep.select - tm->freep.names; + int sel_team = teammenu_get_selteam (menu,tm); + int pl; + + // d_printf ("teammenu_player2team: sel_player=%d, sel_team=%d\n", sel_player, sel_team); + + if (sel_team < 0 || sel_team >= MAX_TEAMS || sel_player < 0 || sel_player >= MAX_PLAYERS) + return; + + /* get the player */ + pl = 0; + while (pl < MAX_PLAYERS && (sel_player > 0 || players[pl].team_nr != -1)) { + if (players[pl].team_nr == -1) sel_player--; + pl++; + } + // d_printf ("teammenu_player2team: sel_player=%d, sel_team=%d, pl=\n", sel_player, sel_team, pl); + + if (pl < MAX_PLAYERS && sel_player == 0 && players[pl].team_nr == -1) + players[pl].team_nr = sel_team; + + team_update (); +} + +/* + * update all elements on the screen + * clean the player lists for the team and free players + */ +static void teammenu_update (_menu *menu, struct __teammenu *tm) { + int pl, cnt_team, cnt_free; + + // d_printf ("teammenu_update\n"); + + /* + * teamnames + */ + tm->teamnames[0].text[0] = 0; + tm->teamnames[0].next = NULL; + for (pl = 0; pl < MAX_TEAMS; pl++) { + if (pl > 0) + tm->teamnames[pl-1].next = &tm->teamnames[pl]; + tm->teamnames[pl].next = NULL; + strncpy (tm->teamnames[pl].text, teams[pl].name, LEN_CHARENTRY); + } + + strncpy (tm->teamp.label->label, tm->teamsel->text, MENU_TITLELEN); + + /* + * playernames + */ + tm->freep.names[0].next = NULL; + tm->freep.names[0].text[0] = 0; + tm->teamp.names[0].next = NULL; + tm->teamp.names[0].text[0] = 0; + for (pl = 0, cnt_team = 0, cnt_free = 0; pl < MAX_PLAYERS; pl++) { + if (PS_IS_used (players[pl].state) && (players[pl].team_nr == -1 || players[pl].team_nr == teammenu_get_selteam (menu, tm))) { + _charlist *cl; + int *cnt; + + /* select the right list with the right counter */ + if (players[pl].team_nr == -1) { + cl = tm->freep.names; + cnt = &cnt_free; + } + else { + cl = tm->teamp.names; + cnt = &cnt_team; + } + + /* set the data */ + if (*cnt > 0) + cl[(*cnt)-1].next = &cl[*cnt]; + strncpy (cl[*cnt].text, players[pl].name, LEN_CHARENTRY); + cl[*cnt].next = NULL; + (*cnt)++; + } + } + + /* send update */ + tm->freep.item->changed = 1; + tm->freep.label->changed = 1; + menu_draw_menuitem (tm->freep.item); + menu_draw_menuitem (tm->freep.label); + tm->teamp.item->changed = 1; + tm->teamp.label->changed = 1; + menu_draw_menuitem (tm->teamp.item); + menu_draw_menuitem (tm->teamp.label); + tm->teamlist->changed = 1; + menu_draw_menuitem (tm->teamlist); +} + + +/* + * get the current teamnumber + */ +static inline int teammenu_get_selteam (_menu *menu, struct __teammenu *tm) { + return (tm->teamsel - tm->teamnames); +}; + + +/* + * set the current teamnumber + */ +static void teammenu_set_selteam (_menu *menu, struct __teammenu *tm, int teamnr) { + if (teamnr < 0 ) teamnr = 0; + else if (teamnr >= MAX_TEAMS) teamnr = MAX_TEAMS-1; + + tm->teamsel = &tm->teamnames[teamnr]; + tm->teamlist->changed = 1; + menu_draw_menuitem (tm->teamlist); }; diff --git a/src/single.c b/src/single.c index 2f4f881..b3978ac 100644 --- a/src/single.c +++ b/src/single.c @@ -1,4 +1,4 @@ -/* $Id: single.c,v 1.67 2004/06/15 15:04:37 stpohle Exp $ */ +/* $Id: single.c,v 1.68 2004/09/12 20:54:25 stpohle Exp $ */ /* single player */ #include "basic.h" @@ -571,6 +571,9 @@ single_create_ai (int num_players) MW_IS_GFX_SELECT (gfx_sel, i); } while (i != -1); player_set_gfx (pl, gfx_sel); + pl->wins = 0; + pl->points = 0; + pl->team_nr = -1; } if (pl == NULL) @@ -615,20 +618,23 @@ single_playergame (int second_player, int ai_players) strncpy (players[bman.p_nr].name, bman.playername, LEN_PLAYERNAME); gfx_load_players (32, 32); do { - playermenu_selgfx (bman.p_nr); - } while (players[bman.p_nr].gfx_nr == -1); - + done = playermenu_selgfx (bman.p_nr); + } while (players[bman.p_nr].gfx_nr == -1 && done != -1); + players[bman.p_nr].state = PSF_used + PSF_alife + PSF_playing; strncpy (players[bman.p_nr].name, bman.playername, LEN_PLAYERNAME); - if (second_player) { + if (done != -1 && second_player) { player2_join (); do { - playermenu_selgfx (bman.p2_nr); - } while (players[bman.p2_nr].gfx_nr == -1); + done = playermenu_selgfx (bman.p2_nr); + } while (players[bman.p2_nr].gfx_nr == -1 && done != -1); } gfx_free_players (); + if (done == -1) + return; + single_create_ai (ai_players); bman.state = GS_ready; @@ -782,15 +788,16 @@ single_menu () gfx_blitdraw (); eventstate = SDL_PollEvent (&event); - + + menu_draw (menu); done = menu_event_loop (menu, &event, eventstate); - - if (done && menu->focus->id == 7) { + + if (done > 0 && menu->focus->id == 7) { done = 0; mapmenu (); } - if (done && menu->focus->id == 3) + if (done > 0 && menu->focus->id == 3) done = 0; s_calctimesync ();