team menu added, network prepared for teammode. little menuhandling fixes in single player game and gfx selection

origin
stpohle 21 years ago
parent 546811c439
commit 140b270a54

@ -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

18
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...

@ -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)

@ -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
};

@ -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);

@ -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);

@ -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

@ -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 <SDL.h>
@ -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;

@ -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;

@ -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);

@ -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);

@ -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);

@ -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) {

@ -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);
};

@ -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 */

@ -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 <SDL.h>
@ -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");
}

@ -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);
};

@ -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 ();

Loading…
Cancel
Save