From 472412873864a40768c31331b9ecc1c0acc154ea Mon Sep 17 00:00:00 2001 From: stpohle Date: Sun, 26 Sep 2004 02:28:05 +0000 Subject: [PATCH] Single Player much more fixed. Teamwork will work next. --- include/basic.h | 4 +- include/bomberclone.h | 5 +- include/gfx.h | 4 +- include/player.h | 3 +- src/debug.c | 2 +- src/game.c | 239 ++++++++++++++++++++++++++++-------------- src/gfx.c | 14 +-- src/gfxpixelimage.c | 26 +++-- src/help.c | 84 ++++----------- src/main.c | 4 +- src/menuimages.c | 12 ++- src/playermenu.c | 52 ++++++++- src/single.c | 22 +++- src/tileset.c | 4 +- 14 files changed, 302 insertions(+), 173 deletions(-) diff --git a/include/basic.h b/include/basic.h index 91165d9..4ff50fe 100644 --- a/include/basic.h +++ b/include/basic.h @@ -1,4 +1,4 @@ -/* $Id: basic.h,v 1.26 2004/09/25 10:57:50 stpohle Exp $ */ +/* $Id: basic.h,v 1.27 2004/09/26 02:28:05 stpohle Exp $ */ /* basic types which we need everywhere */ #ifndef _BC_BASIC_H_ @@ -35,7 +35,7 @@ #define START_SPEED 0.07 #define SPEEDMUL 1.2 -#define MAX_PLAYERS 8 +#define MAX_PLAYERS 16 #define MAX_TEAMS 4 #define MAX_BOMBS 12 #define MAX_RANGE 10 diff --git a/include/bomberclone.h b/include/bomberclone.h index 70e06f4..b0dd01f 100644 --- a/include/bomberclone.h +++ b/include/bomberclone.h @@ -1,4 +1,4 @@ -/* $Id: bomberclone.h,v 1.28 2004/09/12 20:54:24 stpohle Exp $ */ +/* $Id: bomberclone.h,v 1.29 2004/09/26 02:28:05 stpohle Exp $ */ /* bomberclone.h */ #ifndef _BOMBERCLONE_H_ @@ -118,6 +118,7 @@ extern void game_loop (); extern void game_end (); extern void game_start(); extern void game_showresult (); +extern int game_check_endgame (); extern void game_menu_create (); extern void game_menu_loop (SDL_Event *event, int eventstate); @@ -173,6 +174,6 @@ extern void tileset_free (); // help -extern void help (); +extern void help (int showpage); #endif diff --git a/include/gfx.h b/include/gfx.h index f5115d3..4949074 100644 --- a/include/gfx.h +++ b/include/gfx.h @@ -1,4 +1,4 @@ -/* $Id: gfx.h,v 1.7 2004/09/25 10:57:50 stpohle Exp $ */ +/* $Id: gfx.h,v 1.8 2004/09/26 02:28:05 stpohle Exp $ */ #ifndef _GFX_H_ #define _GFX_H_ @@ -10,10 +10,10 @@ #define GFX_PLAYERIMGSIZE_Y 128 #define GFX_SMALLPLAYERIMGSIZE_X 12 #define GFX_MENUPLAYERIMGSIZE_X 32 +#define GFX_MENUFIELDIMGSIZE 24 #include "basic.h" - struct __gfxblit { SDL_Rect srcr; SDL_Surface *srci; diff --git a/include/player.h b/include/player.h index aada76e..a6d67e6 100644 --- a/include/player.h +++ b/include/player.h @@ -1,4 +1,4 @@ -/* $Id: player.h,v 1.4 2004/09/23 14:06:45 stpohle Exp $ +/* $Id: player.h,v 1.5 2004/09/26 02:28:05 stpohle Exp $ * playerinclude file */ @@ -115,6 +115,7 @@ struct __team { _player *players[MAX_PLAYERS]; char name[LEN_PLAYERNAME]; int active; + int wins; } typedef _team; diff --git a/src/debug.c b/src/debug.c index 1d63b39..8c9eae5 100644 --- a/src/debug.c +++ b/src/debug.c @@ -106,6 +106,6 @@ void debug_ingameinfo() { } font_gfxdraw (0, gfx.res.y-font[0].size.y*2, text, 0, 0, (map.size.y*256)+10); - sprintf (text, "Move: %d | %d", players[bman.p_nr].m, players[bman.p2_nr].m); + sprintf (text, "Pl_nr: %d TO: %3.2f", bman.players_nr, bman.timeout); font_gfxdraw (350, gfx.res.y-font[0].size.y, text, 0, 0, (map.size.y*256)+10); }; diff --git a/src/game.c b/src/game.c index 4f74722..dbafbc3 100644 --- a/src/game.c +++ b/src/game.c @@ -1,4 +1,4 @@ -/* $Id: game.c,v 1.92 2004/09/25 11:16:14 stpohle Exp $ +/* $Id: game.c,v 1.93 2004/09/26 02:28:06 stpohle Exp $ game.c - procedures for the game. */ #include @@ -46,8 +46,6 @@ game_draw_info () dest.w = gfx.res.x; gfx_blitupdaterectadd (&dest); - bman.players_nr = 0; - /* In Multiplayer mode draw Player names and count the players who are still alife. */ for (x = 0, j = 0, i = 0; i < MAX_PLAYERS; i++) @@ -72,9 +70,8 @@ game_draw_info () else col = 3; } - else { // players is alife + else { // player is alife col = 0; - bman.players_nr++; } font_draw (x, j, scrtext, 0, col); @@ -94,13 +91,13 @@ game_draw_info () sprintf (text, "Speed: %1.1f", players[bman.p_nr].speed*10); font_draw (x, 32, text, 0, 0); if (players[bman.p_nr].special.type != 0) { + col = players[bman.p_nr].special.type + FT_sp_trigger - 1; dest.x = x - 32; dest.y = 16; - dest.w = gfx.menu_field[players[bman.p_nr].special.type - 1]->w; - dest.h = gfx.menu_field[players[bman.p_nr].special.type - 1]->h; - - SDL_BlitSurface (gfx.menu_field[players[bman.p_nr].special.type - 1], NULL, - gfx.screen, &dest); + dest.w = gfx.menu_field[col]->w; + dest.h = gfx.menu_field[col]->h; + + SDL_BlitSurface (gfx.menu_field[col], NULL, gfx.screen, &dest); } if (bman.state == GS_ready && GT_MP_PTPM) @@ -206,7 +203,7 @@ void game_loop () { SDL_Event event; - int done = 0, i, eventstate; + int done = 0, eventstate; gfx_blitupdaterectclear (); @@ -271,16 +268,8 @@ game_loop () /* check if there is only one player left and the game is in multiplayer mode and if there the last dieing animation is done */ - for (i = 0; (i < MAX_PLAYERS && (!PS_IS_used (players[i].state) - || PS_IS_aiplayer (players[i].state) - || (PS_IS_used (players[i].state) && !PS_IS_alife (players[i].state)))); i++); - if (i == MAX_PLAYERS) /* only AI Players alife, make sure the game is going to an end */ - bman.players_nr = 1; - if (((bman.players_nr < 2 - && (GT_MP || (GT_SP && bman.ai_players > 0))) - || (GT_SP && bman.ai_players == 0 && bman.players_nr < 1)) - && bman.timeout >= 0.0 && (bman.gametype == GT_bomberman || map.state != MS_normal)) - bman.timeout = 0.0f; + if (game_check_endgame () && bman.timeout >= 0.0f) + bman.timeout = 0.0f; if ((GT_SP || GT_MP_PTPM) && bman.timeout < -GAME_OVERTIMEOUT) { d_printf ("GAME: Game Over\n"); @@ -312,6 +301,59 @@ game_loop () }; +/* + * check if we only one player left or only ai players are left. + * check also if we there is only one team alife + */ +int game_check_endgame () { + int res = 0; + + if (bman.gametype == GT_team) { + /* + * Team Mode Calculation + */ + int t_nr; // teamnumber + int p_nr; // playernumber + int h_team = 0; // how many human teams are alife + int h_team_last = -1; // last human team which was alife + _player *p; + + for (t_nr = 0; t_nr < MAX_TEAMS; t_nr++) + for (p_nr = 0; p_nr < MAX_PLAYERS; p_nr++) { + if (teams[t_nr].players[p_nr] != NULL) { + p = teams[t_nr].players[p_nr]; + if (PS_IS_used (p->state) && PS_IS_alife (p->state) && (!PS_IS_aiplayer (p->state)) && h_team_last != t_nr) { + h_team++; + h_team_last = t_nr; + } + } + } + + if (h_team_last < 1) + res = 1; + } + else if (bman.gametype == GT_bomberman) { + int p_nr; // playernumber + int h_alife = 0; // human players who are alife + int alife = 0; // ai players who are alife + _player *p; + + for (p = &players[0], p_nr = 0; p_nr < MAX_PLAYERS; p_nr++, p++) { + if (PS_IS_used (p->state) && PS_IS_alife (p->state)) { + alife++; + if (!PS_IS_aiplayer (p->state)) + h_alife++; + } + } + + if ((h_alife < 1) || (alife < 2)) + res = 1; + } + + return res; +}; + + /* check which player won and free all unnneded data */ void game_end () @@ -415,41 +457,111 @@ game_start () }; -/* show result of the game */ +/* + * Show results of the game + * show the diffrent screens one for players and one for teams + */ +/* Teamplay */ +static void game_showresultteam () { + +} + + +#define SHOWRESULT_WIDTH 150 +#define SHOWRESULT_HEIGHT 80 +/* Bomberman/Deathmatch Version Play */ +static void game_showresultnormal () { + char text[255]; + int i, p, x, y, pl_cnt = 0, + pl_x, pl_y, // player in a row/col + dx, dy, // distance + sx, sy, px; // start view and position + + SDL_Rect dest, src; + _player *pl[MAX_PLAYERS]; + + + /* Sort the playerlist */ + for (p = 0, pl_cnt = 0; p < MAX_PLAYERS; p++) + if (PS_IS_used (players[p].state)) { + pl[pl_cnt] = &players[p]; + i = pl_cnt; + + while (i > 0 && pl[i-1]->wins < players[p].wins) { + pl[i] = pl[i-1]; + i--; + pl[i] = &players[p]; + } + pl_cnt++; + } + + /* calc the best view and start point */ + pl_x = 0; + do { + pl_x++; + pl_y = ceil ((float)(((float) pl_cnt) / ((float)pl_x))); + dy = (gfx.res.y - 100) / pl_y; + } while (dy < SHOWRESULT_HEIGHT); + dx = (gfx.res.x - 40) / pl_x; + + x = sx = 20 + (dx - SHOWRESULT_WIDTH)/2; + y = sy = 60 + (dy - SHOWRESULT_HEIGHT)/2; + px = 0; + + d_printf ("game_showresultnormal: pl_x:%d, pl_y:%d, dx:%d, dy:%d\n", pl_x, pl_y, dx, dy); + + /* draw the playerlist */ + for (i = 1, p = 0; p < pl_cnt; p++) { + if (PS_IS_used (pl[p]->state)) { + if (PS_IS_alife (pl[p]->state)) { + font_drawbold (x + GFX_MENUPLAYERIMGSIZE_X, y - 10, pl[p]->name, 0, COLOR_brown, 1); + font_draw (x + GFX_MENUPLAYERIMGSIZE_X, y - 10, pl[p]->name, 0, COLOR_yellow); + } + else + font_draw (x + GFX_MENUPLAYERIMGSIZE_X, y - 10, pl[p]->name, 0, COLOR_gray); + + sprintf (text, "%3d (%3d)", pl[p]->wins, pl[p]->points); + font_draw (x + GFX_MENUPLAYERIMGSIZE_X, y + 6, text, 0, 0); + + dest.x = x; + dest.y = y - 16; + src.w = dest.w = pl[p]->gfx->menu_image->w; + src.h = dest.h = pl[p]->gfx->menu_image->h; + src.x = 0; + src.y = 0; + gfx_blit (pl[p]->gfx->menu_image, &src, gfx.screen, &dest, 1); + + /* setup the new position */ + y += (dy / pl_x); + x += dx; + px++; + if (px >= pl_x) { + px = 0; + x = sx; + } + } + } +} +#undef SHOWRESULT_HEIGHT +#undef SHOWRESULT_WIDTH + + void game_showresult () { - SDL_Rect dest, - src; char text[255]; SDL_Event event; Uint8 *keys; - int done = 0, keypressed = 0, x, y, i, p; + int done = 0, keypressed = 0, x, y; - menu_displaytext ("Loading..", "Please Wait"); - dest.x = dest.y = 0; - dest.w = gfx.res.x; - dest.h = gfx.res.y; - + gfx_blitdraw (); + draw_logo (); + strcpy (text, "Game Result"); x = (gfx.res.x - (font[2].size.x * strlen (text)) - 64) / 2; y = 0; font_drawbold (x, y, text, 2, 6, 2); font_draw (x, y, text, 2, 5); y += font[2].size.x; - - for (i = 0, p = 0; p < MAX_PLAYERS; p++) - if (PS_IS_alife (players[p].state)) - i++; - - if (i == 1) - strcpy (text, "Game Over"); - else - strcpy (text, "Draw Game"); - - x = (gfx.res.x - (font[2].size.x * strlen (text)) - 64) / 2; - font_drawbold (x, y, text, 2, 6, 2); - font_draw (x, y, text, 2, 5); - y += font[2].size.x + 8; strcpy (text, "[CTRL],[RETURN] or [STRG] for another game"); x = (gfx.res.x - (font[1].size.x * strlen (text)) - 64) / 2; @@ -460,41 +572,12 @@ void game_showresult () { x = (gfx.res.x - (font[1].size.x * strlen (text)) - 64) / 2; font_drawbold (x, gfx.res.y - font[0].size.y - 2, text, 0, COLOR_brown, 1); font_draw (x, gfx.res.y - font[0].size.y - 2, text, 0, COLOR_yellow); - - for (i = 1, p = 0; p < MAX_PLAYERS; p++) { - if (PS_IS_used (players[p].state)) { - if (!i) { - i = 1; - x = (gfx.res.x / 2) + 16; - } - else if (i) { - i = 0; - y = y + 80; - x = 16; - } - - if (PS_IS_alife (players[p].state)) { - font_drawbold (x + 80, y + 4, players[p].name, 0, COLOR_brown, 1); - font_draw (x + 80, y + 4, players[p].name, 0, COLOR_yellow); - } - else - font_draw (x + 80, y + 4, players[p].name, 0, COLOR_gray); - sprintf (text, "%3d", players[p].wins); - font_draw (x + 80 + (LEN_PLAYERNAME+2) * font[0].size.x, y + 4, text, 0, 0); - sprintf (text, "%3d", players[p].points); - font_draw (x + 80 + (LEN_PLAYERNAME+5) * font[0].size.x, y + 4, text, 0, 0); - - dest.x = x; - dest.y = y - 32; - src.w = dest.w = players[p].gfx->menu_image->w; - src.h = dest.h = players[p].gfx->menu_image->h; - src.x = 0; - src.y = 0; - gfx_blit (players[p].gfx->menu_image, &src, gfx.screen, &dest, 1); - } - } - + if (bman.gametype == GT_team) + game_showresultteam (); + else + game_showresultnormal (); + gfx_blitdraw (); SDL_Flip (gfx.screen); diff --git a/src/gfx.c b/src/gfx.c index 0850da0..0077f80 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -1,4 +1,4 @@ -/* $Id: gfx.c,v 1.37 2004/09/25 10:57:51 stpohle Exp $ */ +/* $Id: gfx.c,v 1.38 2004/09/26 02:28:06 stpohle Exp $ */ /* gfx.c */ #include "bomberclone.h" @@ -371,7 +371,7 @@ static void gfx_load_fieldtype_menu () { tmpimg = gfx_copyfrom (orgimg, &rect); SDL_FreeSurface (orgimg); - orgimg = scale_image (tmpimg, GFX_IMGSIZE/2, GFX_IMGSIZE/2); + orgimg = scale_image (tmpimg, GFX_MENUFIELDIMGSIZE, GFX_MENUFIELDIMGSIZE); SDL_FreeSurface (tmpimg); background = SDL_DisplayFormat (orgimg); SDL_FreeSurface (orgimg); @@ -388,7 +388,7 @@ static void gfx_load_fieldtype_menu () { tmpimg = gfx_copyfrom (orgimg, &rect); SDL_FreeSurface (orgimg); - orgimg = scale_image (tmpimg, GFX_IMGSIZE/2, GFX_IMGSIZE/2); + orgimg = scale_image (tmpimg, GFX_MENUFIELDIMGSIZE, GFX_MENUFIELDIMGSIZE); SDL_FreeSurface (tmpimg); background = SDL_DisplayFormat (orgimg); SDL_FreeSurface (orgimg); @@ -405,7 +405,7 @@ static void gfx_load_fieldtype_menu () { tmpimg = gfx_copyfrom (orgimg, &rect); SDL_FreeSurface (orgimg); - orgimg = scale_image (tmpimg, GFX_IMGSIZE/2, GFX_IMGSIZE/2); + orgimg = scale_image (tmpimg, GFX_MENUFIELDIMGSIZE, GFX_MENUFIELDIMGSIZE); SDL_FreeSurface (tmpimg); background = SDL_DisplayFormat (orgimg); SDL_FreeSurface (orgimg); @@ -422,7 +422,7 @@ static void gfx_load_fieldtype_menu () { tmpimg = gfx_copyfrom (orgimg, &rect); SDL_FreeSurface (orgimg); - orgimg = scale_image (tmpimg, GFX_IMGSIZE/2, GFX_IMGSIZE/2); + orgimg = scale_image (tmpimg, GFX_MENUFIELDIMGSIZE, GFX_MENUFIELDIMGSIZE); SDL_FreeSurface (tmpimg); background = SDL_DisplayFormat (orgimg); SDL_FreeSurface (orgimg); @@ -431,7 +431,7 @@ static void gfx_load_fieldtype_menu () { /* * load fieldgfx for the menu */ - gfx.menu_field[ft] = gfx_copyfrom (background, &rect); + gfx.menu_field[ft] = gfx_copyfrom (background, NULL); sprintf (filename, "%s/tileset/default/%s.png", bman.datapath, ft_filenames[ft]); orgimg = IMG_Load (filename); @@ -442,7 +442,7 @@ static void gfx_load_fieldtype_menu () { tmpimg = gfx_copyfrom (orgimg, &rect); SDL_FreeSurface (orgimg); - orgimg = scale_image (tmpimg, GFX_IMGSIZE/2, GFX_IMGSIZE/2); + orgimg = scale_image (tmpimg, GFX_MENUFIELDIMGSIZE, GFX_MENUFIELDIMGSIZE); SDL_FreeSurface (tmpimg); getRGBpixel (orgimg, 0, 0, &r, &g, &b); SDL_SetColorKey (orgimg, SDL_SRCCOLORKEY, SDL_MapRGB (orgimg->format, r, g, b)); diff --git a/src/gfxpixelimage.c b/src/gfxpixelimage.c index 982fd72..e99eb64 100644 --- a/src/gfxpixelimage.c +++ b/src/gfxpixelimage.c @@ -1,4 +1,4 @@ -/* $Id: gfxpixelimage.c,v 1.11 2004/09/25 10:57:51 stpohle Exp $ */ +/* $Id: gfxpixelimage.c,v 1.12 2004/09/26 02:28:06 stpohle Exp $ */ /* gfx pixel manipulation and image manipulation */ #include "bomberclone.h" @@ -486,19 +486,31 @@ gfx_quater_image (SDL_Surface * org1, SDL_Surface * org2, SDL_Surface * org3, SD /* * part of a surface from one to another with the same format + * if rect = NULL, copy the whole image */ -SDL_Surface *gfx_copyfrom (SDL_Surface *img, SDL_Rect *wnd) { +SDL_Surface *gfx_copyfrom (SDL_Surface *img, SDL_Rect *rect) { SDL_Surface *res; - SDL_Rect dest; + SDL_Rect src, dest; + + if (rect == NULL) { + src.x = 0; + src.y = 0; + src.h = img->h; + src.w = img->w; + } + else + src = *rect; + res = - SDL_CreateRGBSurface (SDL_HWSURFACE, wnd->w, wnd->h, img->format->BitsPerPixel, + SDL_CreateRGBSurface (SDL_HWSURFACE, src.w, src.h, img->format->BitsPerPixel, img->format->Rmask, img->format->Gmask, img->format->Bmask, img->format->Amask); + dest.x = 0; dest.y = 0; - dest.w = wnd->w; - dest.h = wnd->h; - SDL_BlitSurface (img, wnd, res, &dest); + dest.w = src.w; + dest.h = src.h; + SDL_BlitSurface (img, &src, res, &dest); return res; }; diff --git a/src/help.c b/src/help.c index 15f01c4..08ae184 100644 --- a/src/help.c +++ b/src/help.c @@ -1,4 +1,4 @@ -/* $Id: help.c,v 1.12 2004/08/30 20:48:36 stpohle Exp $ +/* $Id: help.c,v 1.13 2004/09/26 02:28:06 stpohle Exp $ * Display complex help text and information screen about the game */ @@ -18,16 +18,19 @@ enum _help_page { }; -void help () { - int page = 0, menuselect = 2, y = 0; +/* + * show the manual pages + */ +void help (int showpage) { + int page = showpage, menuselect = 2, y = 0; char title[255]; - SDL_Rect rect; _menu *menu; menu_displaytext ("Please Wait", "Loading GFX Data"); - tileset_load ("default", 32, 32); - gfx_load_players (gfx.block.x, gfx.block.y); + if (page < 0 || page >= HP_max) + page = 0; + while (menuselect != -1 && menuselect != 1 && bman.state != GS_quit) { if (page == HP_howto0) { sprintf (title, "How To Play (%d/%d)", page + 1, HP_max); @@ -42,11 +45,7 @@ void help () { "running faster than your opponent and you have many bombs, you can catch " "him within lots of bombs and he has no chance to escape."); - rect.x = 0; - rect.y = 15*gfx.players[0].ani.h; - rect.w = gfx.players[0].ani.w; - rect.h = gfx.players[0].ani.h; - menu_create_image (menu, "img", 450, 255, 0, gfx.players[0].ani.image, &rect); + menu_create_image (menu, "img", 450, 255, 0, gfx.players[0].menu_image, NULL); menu_create_text (menu, "help", 5, 255, 45, 10, COLOR_brown, "You will get points for every player you have killed. " @@ -59,11 +58,6 @@ void help () { y = 50; - rect.x = rect.y = 0; - rect.w = gfx.block.x; - rect.h = gfx.block.y; - - menu_create_text (menu, "help", 5, y, 53, 10, COLOR_brown, "In the game you will find some diffend kind of powerups. " "There are the powerups who give you more power for the whole game " @@ -73,20 +67,17 @@ void help () { menu_create_label (menu, "Permanent Powerups", -1, y, 2, COLOR_yellow); y += (5 + font[2].size.y); - menu_create_image (menu, "pwback", 5, y, 0, gfx.powerup[0].image, &rect); - menu_create_image (menu, "bomb", 5, y, 1, gfx.field[FT_bomb].image, &rect); + menu_create_image (menu, "bomb", 5, y, 0, gfx.menu_field[FT_bomb], NULL); menu_create_text (menu, "help", 55, y, 45, 10, COLOR_brown, "Give you another bomb to drop. Maximum number of bombs is %d.", MAX_BOMBS); y += 40; - menu_create_image (menu, "pwback", 5, y, 0, gfx.powerup[0].image, &rect); - menu_create_image (menu, "fire", 5, y, 1, gfx.field[FT_fire].image, &rect); + menu_create_image (menu, "fire", 5, y, 1, gfx.menu_field[FT_fire], NULL); menu_create_text (menu, "help", 55, y, 45, 10, COLOR_brown, "The range of your bombs will be increased. Maximum range is %d.", MAX_RANGE); y += 40; - menu_create_image (menu, "pwback", 5, y, 0, gfx.powerup[0].image, &rect); - menu_create_image (menu, "shoe", 5, y, 1, gfx.field[FT_shoe].image, &rect); + menu_create_image (menu, "shoe", 5, y, 1, gfx.menu_field[FT_shoe], NULL); menu_create_text (menu, "help", 55, y, 45, 10, COLOR_brown, "This will make your player run faster. The maximum speed will be %1.2f.", MAX_SPEED); y += 40; @@ -104,47 +95,37 @@ void help () { y = 45; - rect.x = rect.y = 0; - rect.w = gfx.block.x; - rect.h = gfx.block.y; - menu_create_label (menu, "Special Powerups", -1, y, 2, COLOR_yellow); y += (5 + font[2].size.y); - menu_create_image (menu, "pwback", 5, y, 0, gfx.powerup[2].image, &rect); - menu_create_image (menu, "kick", 5, y, 1, gfx.field[FT_sp_kick].image, &rect); + menu_create_image (menu, "kick", 5, y, 1, gfx.menu_field[FT_sp_kick], NULL); menu_create_text (menu, "help", 55, y, 48, 10, COLOR_brown, "Allowes you to kick some bombs around the level. This will hold " "just a short time of %d seconds. The maximum distance you can " "kick the bombs is %d fields.", SPECIAL_KICK_TIME, SPECIAL_KICK_MAXDIST); y += 70; - menu_create_image (menu, "pwback", 5, y, 0, gfx.powerup[2].image, &rect); - menu_create_image (menu, "push", 5, y, 1, gfx.field[FT_sp_push].image, &rect); + menu_create_image (menu, "push", 5, y, 1, gfx.menu_field[FT_sp_push], NULL); menu_create_text (menu, "help", 55, y, 48, 10, COLOR_brown, "Push bombs one field, as long as nothing is behind this bomb."); y += 40; - menu_create_image (menu, "pwback", 5, y, 0, gfx.powerup[2].image, &rect); - menu_create_image (menu, "droprow", 5, y, 1, gfx.field[FT_sp_row].image, &rect); + menu_create_image (menu, "droprow", 5, y, 1, gfx.menu_field[FT_sp_row], NULL); menu_create_text (menu, "help", 55, y, 48, 10, COLOR_brown, "You can drop a row of that many bombs you have still left to drop."); y += 40; - menu_create_image (menu, "pwback", 5, y, 0, gfx.powerup[2].image, &rect); - menu_create_image (menu, "dropliquid", 5, y, 1, gfx.field[FT_sp_liquid].image, &rect); + menu_create_image (menu, "dropliquid", 5, y, 1, gfx.menu_field[FT_sp_liquid], NULL); menu_create_text (menu, "help", 55, y, 48, 10, COLOR_brown, "The bomb you push now won't stop moving untill they explode."); y += 40; - menu_create_image (menu, "pwback", 5, y, 0, gfx.powerup[2].image, &rect); - menu_create_image (menu, "dropliquid", 5, y, 1, gfx.field[FT_sp_moved].image, &rect); + menu_create_image (menu, "dropliquid", 5, y, 1, gfx.menu_field[FT_sp_moved], NULL); menu_create_text (menu, "help", 55, y, 45, 10, COLOR_brown, "The bomb you push will stop moving on the next border or bomb."); y += 40; - menu_create_image (menu, "pwback", 5, y, 0, gfx.powerup[2].image, &rect); - menu_create_image (menu, "dropltrigger", 5, y, 1, gfx.field[FT_sp_trigger].image, &rect); + menu_create_image (menu, "dropltrigger", 5, y, 1, gfx.menu_field[FT_sp_trigger], NULL); menu_create_text (menu, "help", 55, y, 45, 10, COLOR_brown, "You will be able to drop triggered bombs. Use " "the special key to let all your bombs explode. " @@ -157,10 +138,6 @@ void help () { y = 45; - rect.x = rect.y = 0; - rect.w = gfx.block.x; - rect.h = gfx.block.y; - menu_create_label (menu, "Death Item", -1, y, 2, COLOR_yellow); y += (5 + font[2].size.y); @@ -172,8 +149,7 @@ void help () { "get all the illnesses you have too.", ILL_TIMEOUT); y += 110; - menu_create_image (menu, "pwback", 12, y+8, 0, gfx.powerup[1].image, &rect); - menu_create_image (menu, "pwdeath", 12, y+8, 1, gfx.field[FT_death].image, &rect); + menu_create_image (menu, "pwdeath", 12, y+8, 1, gfx.menu_field[FT_death], NULL); menu_create_text (menu, "help", 55, y, 45, 10, COLOR_brown, "This will make your player ill. We have at the moment %d diffrent " "types of illnesses for you to collect. To make the game more", PI_max); @@ -190,11 +166,7 @@ void help () { menu_create_label (menu, "During a Game", -1, y, 2, COLOR_yellow); y += font[2].size.y; - rect.x = 3*gfx.players[7].ani.w; - rect.y = 10*gfx.players[7].ani.h; - rect.h = gfx.players[7].ani.h; - rect.w = gfx.players[7].ani.w; - menu_create_image (menu, "img", 450, 100, 0, gfx.players[7].ani.image, &rect); + menu_create_image (menu, "img", 450, 100, 0, gfx.players[7].menu_image, NULL); menu_create_text (menu, "help", 5, y, 53, 10, COLOR_brown, "Arrow Keys - Moving of the Player\n" @@ -223,11 +195,7 @@ void help () { sprintf (title, "About BomberClone (%d/%d)", page + 1, HP_max); menu = menu_new (title, 500, 400); - rect.x = 1*gfx.players[4].ani.w; - rect.y = 5*gfx.players[4].ani.h; - rect.h = gfx.players[4].ani.h; - rect.w = gfx.players[4].ani.w; - menu_create_image (menu, "img", 15, 60, 0, gfx.players[4].ani.image, &rect); + menu_create_image (menu, "img", 15, 60, 0, gfx.players[4].menu_image, NULL); menu_create_text (menu, "help", 75, 50, 45, 10, COLOR_brown, "If you have any problems or questions with the game you can send your questions " "to the mailinglist or directly to me. Bugfixes should be send to the SourceForge " @@ -246,11 +214,7 @@ void help () { sprintf (title, "People (%d/%d)", page + 1, HP_max); menu = menu_new (title, 500, 400); - rect.x = 3*gfx.players[6].ani.w; - rect.y = 10*gfx.players[6].ani.h; - rect.h = gfx.players[6].ani.h; - rect.w = gfx.players[6].ani.w; - menu_create_image (menu, "img", 250, 100, 0, gfx.players[6].ani.image, &rect); + menu_create_image (menu, "img", 250, 100, 0, gfx.players[6].menu_image, NULL); y = 50; menu_create_label (menu, "Coding:", 5, y, 2, COLOR_yellow); @@ -301,6 +265,4 @@ void help () { page++; menu_delete (menu); } - gfx_free_players (); - tileset_free (); }; diff --git a/src/main.c b/src/main.c index df34a6f..c008fd2 100644 --- a/src/main.c +++ b/src/main.c @@ -1,4 +1,4 @@ -/* $Id: main.c,v 1.28 2004/09/25 10:57:51 stpohle Exp $ */ +/* $Id: main.c,v 1.29 2004/09/26 02:28:06 stpohle Exp $ */ #include "basic.h" #include "bomberclone.h" @@ -57,7 +57,7 @@ main (int argc, char **argv) config_menu (); break; case (3) : // Manual - help (); + help (0); break; case (4) : // Quit bman.state = GS_quit; diff --git a/src/menuimages.c b/src/menuimages.c index 8648fd4..6e6e83f 100644 --- a/src/menuimages.c +++ b/src/menuimages.c @@ -1,4 +1,4 @@ -/* $Id: menuimages.c,v 1.2 2004/05/20 16:55:30 stpohle Exp $ +/* $Id: menuimages.c,v 1.3 2004/09/26 02:28:06 stpohle Exp $ * Menuhandling: labels */ #include "basic.h" @@ -48,7 +48,15 @@ _menuitem *menu_create_image (_menu *menu, char *name, int x, int y, int layer, menuitems->pos.w = layer; menuitems->type = MENU_image; menuitems->ptrdata = (char *) img; - menuitems->rect = *rect; + + if (rect == NULL) { + menuitems->rect.x = 0; + menuitems->rect.y = 0; + menuitems->rect.w = img->w; + menuitems->rect.h = img->h; + } else + menuitems->rect = *rect; + strncpy (menuitems->label, name, MENU_TITLELEN); return menuitems; diff --git a/src/playermenu.c b/src/playermenu.c index 40433cc..552df22 100644 --- a/src/playermenu.c +++ b/src/playermenu.c @@ -1,4 +1,4 @@ -/* $Id: playermenu.c,v 1.7 2004/09/25 10:57:51 stpohle Exp $ +/* $Id: playermenu.c,v 1.8 2004/09/26 02:28:06 stpohle Exp $ * */ @@ -17,6 +17,8 @@ */ // static int playermenu_gfxaviable (int gfx); static void playermenu_selgfx_drawplayer (int selgfx, _menu *menu); +static void teammenu_ai_choosegfx (); + #define PLAYERMENU_GFXSEL_Y 130 @@ -471,6 +473,8 @@ void teammenu () { last_id = menu->focus->id; } while ((done == 0 || menu->focus->id != 0) && done != -1); menu_delete (menu); + + teammenu_ai_choosegfx (); } @@ -605,3 +609,49 @@ static void teammenu_set_selteam (_menu *menu, struct __teammenu *tm, int teamnr tm->teamlist->changed = 1; menu_draw_menuitem (tm->teamlist); }; + + + +/* + * the ai player will choose diffrent gfx for every + * team another gfx, but not one which is selected by + * human player. + */ +static void teammenu_ai_choosegfx () { + struct _team_tmpdata_ { +// int ai_player; +// int hu_player; + int ai_gfx; + } teamdat[MAX_TEAMS]; + + int tm_nr; + int pl_nr; + int i, used; + _player *pl; + + /* find a ai player gfx for every team */ + for (i = 0, tm_nr = 0; (i < gfx.player_gfx_count && tm_nr < MAX_TEAMS); i++) { + used = 0; + for (pl_nr = 0; pl_nr < MAX_PLAYERS; pl_nr++) { + if ((!PS_IS_aiplayer(players[pl_nr].state)) + && (PS_IS_used (players[pl_nr].state)) + && i == players[pl_nr].gfx_nr) + used = 1; + } + if (!used && tm_nr < MAX_TEAMS) { + teamdat[tm_nr].ai_gfx = i; + tm_nr++; + } + } + + /* + * give all ai players in the teams the right gfx + */ + for (tm_nr = 0; tm_nr < MAX_TEAMS; tm_nr++) for (pl_nr = 0; pl_nr < MAX_PLAYERS; pl_nr++) { + pl = teams[tm_nr].players[pl_nr]; + if (pl) { + if (PS_IS_used(pl->state) && PS_IS_aiplayer(pl->state)) + player_set_gfx (pl, teamdat[tm_nr].ai_gfx); + } + } +}; diff --git a/src/single.c b/src/single.c index f8ababa..18aa55a 100644 --- a/src/single.c +++ b/src/single.c @@ -1,4 +1,4 @@ -/* $Id: single.c,v 1.71 2004/09/25 10:57:51 stpohle Exp $ */ +/* $Id: single.c,v 1.72 2004/09/26 02:28:06 stpohle Exp $ */ /* single player */ #include "basic.h" @@ -559,6 +559,7 @@ single_create_ai (int num_players) { int p, count, + try, gfx_sel, i = 0; _player *pl; @@ -573,10 +574,12 @@ single_create_ai (int num_players) pl->net.flags = NETF_firewall; sprintf (pl->net.addr.host, "localhost"); sprintf (pl->net.addr.port, "11000"); + try = 0; do { - gfx_sel = s_random (MAX_PLAYERS); + gfx_sel = s_random (gfx.player_gfx_count); MW_IS_GFX_SELECT (gfx_sel, i); - } while (i != -1); + try++; + } while (try < 100 && i != -1); player_set_gfx (pl, gfx_sel); pl->wins = 0; pl->points = 0; @@ -641,6 +644,10 @@ single_playergame (int second_player, int ai_players) return; single_create_ai (ai_players); + + if (bman.gametype == GT_team) + teammenu (); + bman.state = GS_ready; while (!done && bman.state != GS_quit && bman.state != GS_startup) { @@ -771,8 +778,8 @@ single_menu () menu_create_bool (menu, "Use Second Player", 160, 90, 210, &second_player, 5); - menu_create_button (menu, "Map Options", 180, 160, 150, 7); - + menu_create_button (menu, "Game Options", 180, 130, 150, 6); + menu_create_button (menu, "Map Options", 180, 170, 150, 7); menu_create_button (menu, "Main Menu", 30, 220, 150, 1); menu_create_button (menu, "Start", 220, 220, 150, 2); @@ -799,6 +806,11 @@ single_menu () done = menu_event_loop (menu, &event, eventstate); + if (done > 0 && menu->focus->id == 6) { + done = 0; + mapgamesetting (); + } + if (done > 0 && menu->focus->id == 7) { done = 0; mapmenu (); diff --git a/src/tileset.c b/src/tileset.c index eb2006d..629c4d3 100644 --- a/src/tileset.c +++ b/src/tileset.c @@ -1,4 +1,4 @@ -/* $Id: tileset.c,v 1.15 2004/09/25 10:57:51 stpohle Exp $ */ +/* $Id: tileset.c,v 1.16 2004/09/26 02:28:07 stpohle Exp $ */ /* load and select tilesets */ #include "bomberclone.h" @@ -11,8 +11,8 @@ const char *ft_filenames[] = { "block", "tunnel" , "pwdeath", - "pwbomb", "pwfire", + "pwbomb", "pwshoe", NULL, "sptrigger",