#include "bomber.h" #include "menu.h" #include "draw.h" #include "gfx.h" #include "utils.h" #include "sound.h" #include "network.h" #include "announce.h" #include "game.h" GameOptions configopts = { 2, 1, 0, 2 }; /* Generic menu */ typedef enum { MENU_ANY = -1, MENU_MAIN = 0, MENU_CONFIG = 2, MENU_JOIN = 3 } menuname; #define MENU_SELECT(x) ((menuname) (-x-1)) static int menuhistory[32]={0}; static char menustring[1024]; static char *menuput,*menuitems[40],*menutitle; static int menunum, menuexit; static int menudelta; static void drawmenu(int selected) { int i,j; int tx,ty; clear(); j=strlen(menutitle)*bigfontxsize; drawbigstring((IXSIZE-j) >> 1,20,menutitle); ty=((IYSIZE-(bigfontysize*menunum))>>1)-(IYSIZE>>3); for(i=0;i> 1; if(i==selected) { greyrect(0,ty-1,tx-5,bigfontysize); greyrect(tx+j+3,ty-1,IXSIZE-(tx+j+3),bigfontysize); } drawbigstring(tx,ty,menuitems[i]); ty+=bigfontyspace; } } static int domenu(menuname whichmenu, int (*pause)(void)) { char redraw; int selected; int mcount=0; if(whichmenu>=0) selected=menuhistory[whichmenu]; else selected=-whichmenu-1; if (!pause) pause=mypause; redraw=1; clearspritelist(); while(!exitflag) { if(redraw) { drawmenu(selected); redraw=0; } if (!pause()) return -1; scaninput(); ++mcount; clearsprites(); clearspritelist(); addsprite(IXSIZE/2-50-20,IYSIZE-80,walking[2]+(30+mcount%15)); addsprite(IXSIZE/2+50-20,IYSIZE-80,walking[3]+(30+(mcount+7)%15)); plotsprites(); copyup(); if(anydown()) playsound(3); while(anydown()) { switch(takedown()) { case MYLEFT: menudelta=-1; return selected; case MYRIGHT: case ' ': case 13: menudelta=1; return selected; case 'k': case MYUP: if (selected) --selected; else selected=menunum-1; if (whichmenu>=0) menuhistory[whichmenu]=selected; redraw=1; break; case 'j': case MYDOWN: ++selected; if (selected==menunum) selected=0; if (whichmenu>=0) menuhistory[whichmenu]=selected; redraw=1; break; case 0x1b: if (MENU_MAIN == whichmenu && menuexit != selected) { selected = menuexit; redraw = 1; break; } menudelta = 1; return menuexit; } } } menudelta = 0; return menuexit; } static void menustart() { menunum=-1; menuput=menustring; *menuput=0; menuexit = 0; } static void additem_s(char *item, int len) { if (len < 0 || (menustring+sizeof(menustring)-menuput <= len)) return; if(menunum<0) menutitle=menuput; else menuitems[menunum]=menuput; ++menunum; memcpy(menuput,item,len+1); menuput += len+1; } static void additem(char *item,...) { char output[256]; va_list ap; int len; va_start(ap, item); len = vsnprintf(output,sizeof(output),item,ap); if (len >= 256) len = 255; /* truncated string */ additem_s(output, len); } static void addexit(char *item,...) { char output[256]; va_list ap; int len; va_start(ap, item); len = vsnprintf(output,sizeof(output),item,ap); if (len >= 256) len = 255; /* truncated string */ menuexit = menunum; additem_s(output, len); } /* end generic menu */ /* game menues */ static const char *densities[]={"PACKED","HIGH","MEDIUM","LOW"}; static const char *generosities[]={"LOW","MEDIUM","HIGH","RIDICULOUS"}; static const char *dis_en_abled[]={"DISABLED","ENABLED"}; static void config_menu(void) { int sel; while (!exitflag) { menustart(); additem("GAME OPTIONS"); additem("RETURN TO MAIN MENU"); additem("DENSITY: %s",densities[configopts.density]); additem("GENEROSITY: %s",generosities[configopts.generosity]); additem("INITIAL FLAME LENGTH: %d",configopts.flames+1); additem("INITIAL NUMBER OF BOMBS: %d",configopts.bombs+1); additem("SOUND: %s", dis_en_abled[sound_enabled]); sel=domenu(MENU_CONFIG, NULL); switch (sel) { case 0: return; case 1: configopts.density+=menudelta; configopts.density&=3; break; case 2: configopts.generosity+=menudelta; configopts.generosity&=3; break; case 3: configopts.flames+=menudelta; configopts.flames&=7; break; case 4: configopts.bombs+=menudelta; configopts.bombs&=7; break; case 5: sound_enabled = 1 - sound_enabled; break; } } } static void draw_host_game(void) { int i; char *name; char temp[64]; #define M3X (IXSIZE/3) #define M3Y (IYSIZE/4) clear(); centerbig(20,"HOST NETWORK GAME"); drawbigstring(M3X,M3Y,"SLOT NAME"); for(i=0;i