diff --git a/include/menu.h b/include/menu.h index 9530396..bc58ef8 100644 --- a/include/menu.h +++ b/include/menu.h @@ -1,4 +1,4 @@ -/* $Id: menu.h,v 1.10 2004/05/20 16:55:30 stpohle Exp $ +/* $Id: menu.h,v 1.11 2004/06/08 22:35:20 stpohle Exp $ * GUI for menuhandling */ @@ -83,6 +83,7 @@ extern void menu_draw (_menu *menu); extern void menu_draw_border (_menu *menu); extern void menu_draw_background (_menu *menu, SDL_Rect *dest); extern inline void menu_draw_menuitem (_menuitem *m); +extern void menu_del_menuitem (_menuitem *m); extern void menu_reload (_menu *menu); extern inline void menu_reload_menuitem (_menuitem *m); extern void menu_focus_next (_menu *menu); diff --git a/include/single.h b/include/single.h index 877342e..aeb3d3e 100644 --- a/include/single.h +++ b/include/single.h @@ -1,11 +1,11 @@ -/* $Id: single.h,v 1.2 2004/05/20 16:55:30 stpohle Exp $ +/* $Id: single.h,v 1.3 2004/06/08 22:35:24 stpohle Exp $ * single player */ // single.c extern void single_game_new (); extern void single_create_ai (int num_players); extern void single_loop(); -extern void single_playergame (); +extern void single_playergame (int second_player, int ai_players); extern void single_menu (); extern int single_select_player (); extern int ai_choosedir (int dir, int nearbomb, int oldpos); diff --git a/src/menu.c b/src/menu.c index d705c3c..7621ea6 100644 --- a/src/menu.c +++ b/src/menu.c @@ -1,4 +1,4 @@ -/* $Id: menu.c,v 1.43 2004/05/20 16:55:30 stpohle Exp $ +/* $Id: menu.c,v 1.44 2004/06/08 22:35:26 stpohle Exp $ * Menuhandling */ #include "basic.h" @@ -246,6 +246,16 @@ menu_draw_menuitem (_menuitem * m) }; +/* delete the menuitem from the list, mark it as not used */ +void menu_del_menuitem (_menuitem *m) { + m->type = MENU_none; + m->id = -1; + m->changed = 0; + m->ptrdata = NULL; + m->list = NULL; +}; + + /* reload all variables into all menuelements */ void menu_reload (_menu * menu) diff --git a/src/player.c b/src/player.c index 83cdd4e..8230286 100644 --- a/src/player.c +++ b/src/player.c @@ -1,4 +1,4 @@ -/* $Id: player.c,v 1.84 2004/05/20 16:55:30 stpohle Exp $ +/* $Id: player.c,v 1.85 2004/06/08 22:35:26 stpohle Exp $ * player.c - everything what have to do with the player */ #include @@ -1043,7 +1043,7 @@ void player2_join () { send_joingame (&players[bman.p_servnr].net.addr, bman.player2name, flags); } else { /* single mode */ - for (i = 0; !PS_IS_used (players[i].state) && i < MAX_PLAYERS; i++); + for (i = 0; PS_IS_used (players[i].state) && i < MAX_PLAYERS; i++); if (i < MAX_PLAYERS) { /* free player found */ player2_add (i); } diff --git a/src/single.c b/src/single.c index 75a1674..ed38965 100644 --- a/src/single.c +++ b/src/single.c @@ -1,4 +1,4 @@ -/* $Id: single.c,v 1.63 2004/05/20 16:55:30 stpohle Exp $ */ +/* $Id: single.c,v 1.64 2004/06/08 22:35:26 stpohle Exp $ */ /* single player */ #include "basic.h" @@ -7,6 +7,8 @@ #include "player.h" #include "single.h" + +/* start a single player game and prepare everything for the game */ void single_game_new () { @@ -577,9 +579,13 @@ single_create_ai (int num_players) }; -/* single player game win/point screen */ +/* single player game win/point screen + * 1. setup all player data + * 2. setup second local player and ai players + * 3. setup all other game related data + */ void -single_playergame () +single_playergame (int second_player, int ai_players) { int p, done = 0; @@ -605,13 +611,18 @@ single_playergame () strncpy (players[bman.p_nr].name, bman.playername, LEN_PLAYERNAME); gfx_load_players (32, 32); playermenu_selgfx (bman.p_nr); - gfx_free_players (); if (players[bman.p_nr].gfx_nr == -1) return; - players[bman.p_nr].state = PSF_used + PSF_alife + PSF_playing; strncpy (players[bman.p_nr].name, bman.playername, LEN_PLAYERNAME); - single_create_ai (bman.ai_players); + + if (second_player) { + player2_join (); + playermenu_selgfx (bman.p2_nr); + } + gfx_free_players (); + + single_create_ai (ai_players); bman.state = GS_ready; while (!done && bman.state != GS_quit && bman.state != GS_startup) { @@ -695,18 +706,23 @@ single_loop () }; -/* singleplayer menĂ¼ with some options you can make */ - void +/* singleplayer menĂ¼ with some options you can make */ +void single_menu () { - int menuselect = 0, - i, - p, - done = 0; + int i, + p, + eventstate = 0, + done = 0, + second_playerold = 0, + second_player = 0; _charlist nrplayerlist[MAX_PLAYERS + 1]; _charlist *selnrplayer = &nrplayerlist[bman.ai_players]; _menu *menu; - + _menuitem *pl2name = NULL; + _menuitem *aiplayer = NULL; + SDL_Event event; + /* fill in the nrplayerlist */ if (debug) p = 0; @@ -720,42 +736,62 @@ single_menu () nrplayerlist[i].next = NULL; p++; } + + menu = menu_new ("Single Game", 380,240); + + menu_create_text (menu, "numpl", 20, 50, 12, 2, COLOR_yellow, "Number of\nAI Players"); + aiplayer = menu_create_list (menu, "AI Players", 40, 90, 50, 100, nrplayerlist, &selnrplayer, 3); + + menu_create_entry (menu,"Player 1:",150, 50, 230, &bman.playername, LEN_PLAYERNAME, MENU_entrytext, 4); - while (!done && bman.state != GS_quit) { - menu = menu_new ("Single Player", 300, 250); - menu_create_label (menu, "Number Of AI Players", -1, 55, 0, COLOR_brown); - menu_create_list (menu, "Players", -1, 80, 70, 70, nrplayerlist, &selnrplayer, 1); - menu_create_button (menu, "Map Setting", -1, 180, 150, 2); - menu_create_button (menu, "OK", -1, 220, 150, 0); - menuselect = menu_loop (menu); - menu_delete (menu); - - /* read the current number of AI Players */ - bman.ai_players = (selnrplayer - &nrplayerlist[0]); - if (!debug) - bman.ai_players++; - if (bman.ai_players > MAX_PLAYERS) { - d_fatal ("single_menu: bman.ai_players selection out of range (%d)\n", bman.ai_players); - bman.ai_players = 5; - } + menu_create_bool (menu, "Use Second Player", 160, 90, 210, &second_player, 5); - switch (menuselect) { - case (0): // Start Game - single_playergame (); - break; - case (2): // Map Options - mapmenu (); - break; - case (-1): - done = 1; - break; - } - draw_logo (); - SDL_Flip (gfx.screen); - } + menu_create_button (menu, "Map Options", 180, 160, 150, 6); + + menu_create_button (menu, "Main Menu", 30, 220, 150, 1); + menu_create_button (menu, "Start", 220, 220, 150, 2); + + menu_focus_id (menu, 2); + menu->looprunning = 1; + menu_draw (menu); + + do { + /* create or destroy second playername menuentry */ + if (second_player != second_playerold) { + if (pl2name != NULL && !second_player) { + menu_del_menuitem (pl2name); + pl2name = NULL; + } + if (pl2name == NULL && second_player) + pl2name = menu_create_entry (menu,"Player 2:",150,120, 230, &bman.player2name, LEN_PLAYERNAME, MENU_entrytext, 4); + + second_playerold = second_player; + aiplayer->changed = 1; + menu_draw (menu); + } + + gfx_blitdraw (); + eventstate = SDL_PollEvent (&event); + + done = menu_event_loop (menu, &event, eventstate); + + if (done && menu->focus->id == 6) { + done = 0; + mapmenu (); + } + + s_calctimesync (); + } while (!done); + + if (menu->focus->id == 2) + single_playergame (second_player, bman.ai_players); + + menu_delete (menu); }; + + /* single player selection return value the gfx of the player or -1 for escape */ int