Ignore:
Timestamp:
Mar 17, 2008, 2:53:51 AM (10 years ago)
Author:
Sam Hocevar
Message:
  • Create a VolumeWindow? class with most of the volume_window stuff and moved it to src/ui/volumewindow.cpp.
Location:
abuse/trunk/src/ui
Files:
1 added
1 copied

Legend:

Unmodified
Added
Removed
  • abuse/trunk/src/ui/volumewindow.hpp

    r115 r118  
    1010#include "config.h"
    1111
    12 #include <math.h>
    13 
    1412#include "dev.hpp"
    1513
    16 #include "menu.hpp"
    17 #include "lisp.hpp"
    18 #include "game.hpp"
    19 #include "timing.hpp"
    20 #include "game.hpp"
    21 #include "id.hpp"
    22 #include "pmenu.hpp"
    23 #include "gui.hpp"
    24 #include "property.hpp"
    25 #include "clisp.hpp"
    26 #include "gamma.hpp"
    27 #include "dprint.hpp"
    28 #include "demo.hpp"
    29 #include "loadgame.hpp"
    30 #include "scroller.hpp"
    31 #include "netcfg.hpp"
    32 #include "sock.hpp"
     14class VolumeWindow : public jwindow
     15{
     16private:
     17    int slider, u_u, u_d, u_ua, u_da, d_u, d_d, d_ua, d_da;
     18    int bg;
    3319
    34 extern net_protocol *prot;
    35 jwindow *volume_window=NULL;
     20public:
     21    VolumeWindow();
    3622
    37 //percent is 0..256
    38 void tint_area(int x1, int y1, int x2, int y2, int r_to, int g_to, int b_to, int percent)
    39 {
    40   int x,y;
    41   short cx1,cy1,cx2,cy2;
    42   screen->get_clip(cx1,cy1,cx2,cy2);
    43   if (x1<cx1) x1=cx1;
    44   if (y1<cy1) y1=cy1;
    45   if (x2>cx2) x2=cx2;
    46   if (y2>cy2) y2=cy2;
    47   if (x2<x1 || y2<y1) return ;
     23    virtual void redraw();
    4824
    49   percent=256-percent;
     25    void draw_music_vol();
     26    void draw_sfx_vol();
     27    void draw_vol(int x1, int y1, int x2, int y2, int t,
     28                  int max, int c1, int c2);
     29};
    5030
    51   screen->lock();
    52   for (y=y1;y<=y2;y++)
    53   {
    54     uint8_t *sl=screen->scan_line(y)+x1;
    55     for (x=x1;x<=x2;x++,sl++)
    56     {
    57       uint8_t *paddr=(uint8_t *)pal->addr()+(*sl)*3;
    58       uint8_t r=((*(paddr++))-r_to)*percent/256+r_to;
    59       uint8_t g=((*(paddr++))-g_to)*percent/256+g_to;
    60       uint8_t b=((*(paddr++))-b_to)*percent/256+b_to;
    61       *sl=color_table->lookup_color((r)>>3,(g)>>3,(b)>>3);
    62     }
    63   }
    64   screen->add_dirty(x1,y1,x2,y2); 
    65   screen->unlock();
    66 }
    67 
    68 void darken_area(int x1, int y1, int x2, int y2, int amount)
    69 {
    70   int x,y;
    71   short cx1,cy1,cx2,cy2;
    72   screen->get_clip(cx1,cy1,cx2,cy2);
    73   if (x1<cx1) x1=cx1;
    74   if (y1<cy1) y1=cy1;
    75   if (x2>cx2) x2=cx2;
    76   if (y2>cy2) y2=cy2;
    77   if (x2<x1 || y2<y1) return ;
    78 
    79   screen->lock();
    80   for (y=y1;y<=y2;y++)
    81   {
    82     uint8_t *sl=screen->scan_line(y)+x1;
    83     for (x=x1;x<=x2;x++,sl++)
    84     {
    85       uint8_t *paddr=(uint8_t *)pal->addr()+(*sl)*3;
    86       uint8_t r=(*(paddr++))*amount/256;
    87       uint8_t g=(*(paddr++))*amount/256;
    88       uint8_t b=(*(paddr++))*amount/256;
    89       *sl=color_table->lookup_color((r)>>3,(g)>>3,(b)>>3);
    90     }
    91   }
    92   screen->add_dirty(x1,y1,x2,y2);
    93   screen->unlock();
    94 }
    95 
    96 void dark_widget(int x1, int y1, int x2, int y2, int br, int dr, int amount)
    97 {
    98   screen->add_dirty(x1,y1,x2,y2);
    99   screen->line(x1,y1,x1,y2,br);
    100   screen->line(x1+1,y1,x2,y1,br);
    101   screen->line(x2,y1+1,x2,y2,dr);
    102   screen->line(x1+1,y2,x2,y2,dr);
    103   darken_area(x1+1,y1+1,x2-1,y2-1,amount); 
    104 }
    105 
    106 char *men_str(void *arg)
    107 {
    108   switch (item_type(arg))
    109   {
    110     case L_STRING :
    111     { return lstring_value(arg); } break;
    112     case L_CONS_CELL :
    113     { return lstring_value(CAR(arg)); } break;
    114     default :
    115     {
    116       lprint(arg);
    117       printf(" is not a valid menu option\n");
    118       exit(0);
    119     }
    120   }
    121   return NULL;
    122 }
    123 
    124 int menu(void *args, JCFont *font)             // reurns -1 on esc
    125 {
    126   main_menu();
    127   char *title=NULL;
    128   if (!NILP(CAR(args)))
    129     title=lstring_value(CAR(args));
    130   Cell *def=lcar(lcdr(lcdr(args)));
    131   args=CAR(CDR(args));
    132 
    133   int options=list_length(args);
    134   int mh=(font->height()+1)*options+10,maxw=0;
    135 
    136   Cell *c=(Cell *)args;
    137   for (;!NILP(c);c=CDR(c))
    138   {
    139     if( strlen(men_str(CAR(c))) > (unsigned)maxw)
    140       maxw = strlen(men_str(CAR(c)));
    141   }
    142  
    143   int mw=(font->width())*maxw+20;
    144   int mx=screen->width()/2-mw/2,
    145       my=screen->height()/2-mh/2;
    146  
    147 
    148   screen->add_dirty(mx,my,mx+mw-1,my+mh-1);
    149 
    150   if (title)
    151   {
    152     int tl=strlen(title)*font->width();
    153     int tx=screen->width()/2-tl/2;
    154     dark_widget(tx-2,my-font->height()-4,tx+tl+2,my-2,wm->medium_color(),wm->dark_color(),180);
    155     font->put_string(screen,tx+1,my-font->height()-2,title,wm->bright_color());
    156   }
    157  
    158   dark_widget(mx,my,mx+mw-1,my+mh-1,wm->medium_color(),wm->dark_color(),200);
    159 
    160 
    161   int y=my+5;
    162   for (c=(Cell *)args;!NILP(c);c=CDR(c))
    163   {
    164     char *ms=men_str(CAR(c));
    165     font->put_string(screen,mx+10+1,y+1,ms,wm->black());
    166     font->put_string(screen,mx+10,y,ms,wm->bright_color());
    167     y+=font->height()+1;
    168   }
    169 
    170   wm->flush_screen();
    171   event ev;
    172   int choice=0,done=0;
    173   int bh=font->height()+3;
    174   image *save=new image(mw-2,bh);
    175   int color=128,cdir=50;
    176  
    177   time_marker *last_color_time=NULL;
    178   if (!NILP(def))
    179     choice=lnumber_value(def);
    180   do
    181   {
    182     wm->flush_screen();
    183     if (wm->event_waiting())
    184     {
    185       wm->get_event(ev);
    186       if (ev.type==EV_KEY)
    187       {
    188         switch (ev.key)
    189         {
    190           case JK_ESC :
    191           { choice=-1; done=1; } break;
    192           case JK_ENTER :
    193           { done=1; } break;
    194           case JK_DOWN :
    195           { if (choice<options-1)
    196             choice++;
    197           else choice=0;
    198           } break;
    199           case JK_UP :
    200           {
    201             if (choice>0)
    202             choice--;
    203             else choice=options-1;
    204           } break;                   
    205         }
    206       } else if (ev.type==EV_MOUSE_BUTTON && ev.mouse_button)
    207       {
    208         if (ev.mouse_move.x>mx && ev.mouse_move.x<mx+mw && ev.mouse_move.y>my &&
    209             ev.mouse_move.y<my+mh)
    210         {
    211           int msel=(ev.mouse_move.y-my)/(font->height()+1);
    212           if (msel>=options) msel=options-1;
    213           if (msel==choice)                    // clicked on already selected item, return it
    214             done=1;
    215           else choice=msel;                    // selects an item
    216         }
    217       }
    218     }
    219 
    220     time_marker cur_time;
    221     if (!last_color_time || (int)(cur_time.diff_time(last_color_time)*1000)>120)
    222     {       
    223       if (last_color_time)
    224         delete last_color_time;
    225       last_color_time=new time_marker;
    226 
    227       int by1=(font->height()+1)*choice+my+5-2;
    228       int by2=by1+bh-1;
    229 
    230       screen->put_part(save,0,0,mx+1,by1,mx+mw-2,by2);
    231       tint_area(mx+1,by1,mx+mw-2,by2,63,63,63,color);
    232 
    233       char *cur=men_str(nth(choice,args));
    234       font->put_string(screen,mx+10+1,by1+3,cur,wm->black());
    235       font->put_string(screen,mx+10,by1+2,cur,wm->bright_color());
    236       screen->rectangle(mx+1,by1,mx+mw-2,by2,wm->bright_color());
    237 
    238       color+=cdir;
    239 
    240       if (color<12 || color>256)
    241       {
    242         cdir=-cdir;
    243         color+=cdir;
    244       }
    245       wm->flush_screen();
    246       save->put_image(screen,mx+1,by1);
    247     } else milli_wait(10);
    248 
    249   } while (!done);
    250   if (last_color_time)
    251     delete last_color_time;
    252   delete save;
    253   the_game->draw(the_game->state==SCENE_STATE);
    254 
    255   if (choice!=-1)
    256   {
    257     void *val=nth(choice,args);
    258     if (item_type(val)==L_CONS_CELL)   // is there another value that the user want us to return?
    259       return lnumber_value(lcdr(val)); 
    260   }
    261   return choice;
    262 }
    263 
    264 
    265 static void draw_vol(image *screen, int x1, int y1, int x2, int y2, int t, int max, int c1, int c2, int slider)
    266 {
    267   int dx=x1+t*(x2-x1)/max;
    268   if (t!=0)
    269   {
    270     cash.img(slider)->put_image(screen,x1,y1);   
    271 //    screen->bar(x1,y1,dx,y2,c1);
    272   }
    273   else dx--;
    274 
    275   if (dx<x2)
    276     screen->bar(dx+1,y1,x2,y2,c2);
    277 }
    278 
    279 static void draw_sfx_vol(int slider)
    280 {
    281   draw_vol(volume_window->screen,6,16,34,22,sfx_volume,127,pal->find_closest(200,75,19),
    282            pal->find_closest(40,0,0),slider);
    283 }
    284 
    285 static void draw_music_vol(int slider)
    286 {
    287   draw_vol(volume_window->screen,6,61,34,67,music_volume,127,pal->find_closest(255,0,0),
    288            pal->find_closest(40,0,0),slider);
    289 }
    290 
    291 static void create_volume_window()
    292 {
    293 /*  int vx=0,vy=wm->font()->height()*2,scroller_height=130,bh=wm->font()->height()+5;
    294 
    295   volume_window=wm->new_window(prop->getd("volume_x",xres/2-20),
    296                                prop->getd("volume_y",yres/2-50),
    297                                -1,
    298                                -1,
    299                                new scroller(vx,vy,LOWER_SFX,0,scroller_height,0,127,
    300                                new scroller(vx+30,vy,LOWER_MUSIC,0,scroller_height,0,127,NULL)),symbol_str("VOLUME"));
    301   event ev;
    302   int done=0;
    303   do
    304   {
    305     wm->flush_screen();
    306     wm->get_event(ev);
    307     if (ev.type==EV_CLOSE_WINDOW && ev.window==volume_window) done=1;   
    308   } while (!done);
    309   wm->close_window(volume_window);
    310   volume_window=NULL; */
    311 
    312 
    313   char const *ff = "art/frame.spe";
    314   int t=SPEC_IMAGE;
    315   int u_u=cash.reg(ff,"u_u",t,1),
    316       u_d=cash.reg(ff,"u_u",t,1),
    317       u_ua=cash.reg(ff,"u_ua",t,1),
    318       u_da=cash.reg(ff,"u_da",t,1),
    319 
    320       d_u=cash.reg(ff,"d_u",t,1),
    321       d_d=cash.reg(ff,"d_u",t,1),
    322       d_ua=cash.reg(ff,"d_ua",t,1),
    323       d_da=cash.reg(ff,"d_da",t,1),
    324       slider=cash.reg(ff,"volume_slide",t,1);
    325  
    326   volume_window=wm->new_window(prop->getd("volume_x",xres/2-20),
    327                                prop->getd("volume_y",yres/2-50),
    328                                39, 101,
    329                              new ico_button(10,27,ID_SFX_DOWN,d_u,d_d,d_ua,d_da,
    330                              new ico_button(21,27,ID_SFX_UP,u_u,u_d,u_ua,u_da,
    331                              new info_field(15,42,0,symbol_str("SFXv"),
    332 
    333                              new ico_button(10,72,ID_MUSIC_DOWN,d_u,d_d,d_ua,d_da,
    334                              new ico_button(21,72,ID_MUSIC_UP,u_u,u_d,u_ua,u_da,
    335                              new info_field(10,86,0,symbol_str("MUSICv"),
    336                                             NULL)))))));
    337 
    338   cash.img(cash.reg(ff,"vcontrol",t,1))->put_image(volume_window->screen,0,0);
    339   draw_music_vol(slider);
    340   draw_sfx_vol(slider);
    341   volume_window->inm->redraw();
    342   wm->grab_focus(volume_window);
    343   wm->flush_screen();
    344 
    345   volume_window->inm->allow_no_selections();
    346   volume_window->inm->clear_current();
    347 
    348   event ev;
    349   do
    350   {
    351     do { wm->get_event(ev); } while (ev.type==EV_MOUSE_MOVE && wm->event_waiting());
    352     wm->flush_screen();
    353     if (ev.type==EV_MESSAGE)
    354     {
    355       switch (ev.message.id)
    356       {
    357         case ID_SFX_UP :
    358         { if (volume_window)
    359           {
    360             sfx_volume+=16;
    361             if (sfx_volume>127) sfx_volume=127;
    362             draw_sfx_vol(slider);
    363             char const *s = "sfx/ambtech1.wav";
    364             if (sound_avail&SFX_INITIALIZED)
    365               cash.sfx(cash.reg(s,s,SPEC_EXTERN_SFX,1))->play(sfx_volume);
    366           }
    367         } break;
    368         case ID_SFX_DOWN :
    369         { if (volume_window)
    370           {
    371             sfx_volume-=16;
    372             if (sfx_volume<0) sfx_volume=0;
    373             draw_sfx_vol(slider);
    374             char const *s = "sfx/ambtech1.wav";
    375             if (sound_avail&SFX_INITIALIZED)
    376               cash.sfx(cash.reg(s,s,SPEC_EXTERN_SFX,1))->play(sfx_volume);
    377           }
    378         } break;
    379 
    380         case ID_MUSIC_UP :
    381         { if (volume_window)
    382           {
    383             music_volume+=16;
    384             if (music_volume>127) music_volume=127;
    385             draw_music_vol(slider);
    386             if (current_song) current_song->set_volume(music_volume);
    387           }
    388         } break;
    389         case ID_MUSIC_DOWN :
    390         { if (volume_window)
    391           {
    392             music_volume-=16;
    393             if (music_volume<0) music_volume=0;
    394             draw_music_vol(slider);
    395             if (current_song) current_song->set_volume(music_volume);
    396           }
    397         } break;
    398       }
    399     } else if (ev.type==EV_CLOSE_WINDOW || (ev.type==EV_KEY && ev.key==JK_ESC))
    400     {
    401       wm->close_window(volume_window);
    402       volume_window=NULL;
    403     }
    404   } while (volume_window);
    405 }
    406 
    407 
    408 void save_difficulty()
    409 {
    410   FILE *fp=open_FILE("hardness.lsp","wb");
    411   if (!fp)
    412     dprintf("Unable to write to file hardness.lsp\n");
    413   else
    414   {
    415     fprintf(fp,"(setf difficulty '");
    416     if (DEFINEDP(symbol_value(l_difficulty)))
    417     {
    418       if (symbol_value(l_difficulty)==l_extreme)
    419         fprintf(fp,"extreme)\n");
    420       else if (symbol_value(l_difficulty)==l_hard)
    421         fprintf(fp,"hard)\n");
    422       else if (symbol_value(l_difficulty)==l_easy)
    423         fprintf(fp,"easy)\n");
    424       else
    425         fprintf(fp,"medium)\n");
    426     } else
    427        fprintf(fp,"medium)\n");
    428     fclose(fp);
    429   }
    430 }
    431 
    432 void fade_out(int steps);
    433 void fade_in(image *im, int steps);
    434 
    435 
    436 void show_sell(int abortable)
    437 {
    438   void *ss=make_find_symbol("sell_screens");
    439   if (!DEFINEDP(symbol_value(ss)))
    440   {
    441     int sp=current_space;
    442     current_space=PERM_SPACE;
    443 //    char *prog="((\"art/help.spe\" . \"sell2\")(\"art/help.spe\" . \"sell4\")(\"art/help.spe\" . \"sell3\")(\"art/endgame.spe\" . \"credit\"))";
    444 //    char *prog="((\"art/endgame.spe\" . \"credit\") (\"art/help.spe\" . \"sell6\"))";
    445     char const *prog="((\"art/endgame.spe\" . \"credit\"))";
    446     set_symbol_value(ss,compile(prog));
    447     current_space=sp;
    448   }
    449 
    450   if (DEFINEDP(symbol_value(ss)))
    451   {
    452     image blank(2,2); blank.clear();
    453     wm->set_mouse_shape(blank.copy(),0,0);      // don't show mouse
    454 
    455     ss=symbol_value(ss);
    456     int quit=0;
    457     while (ss && !quit)
    458     {
    459       int im=cash.reg_object("art/help.spe",CAR(ss),SPEC_IMAGE,1);
    460       fade_in(cash.img(im),16);
    461 
    462       event ev;
    463       do
    464       { wm->flush_screen();
    465         wm->get_event(ev);
    466       } while (ev.type!=EV_KEY);
    467       if (ev.key==JK_ESC && abortable)
    468         quit=1;
    469       fade_out(16);
    470       ss=CDR(ss);
    471     }
    472     wm->set_mouse_shape(cash.img(c_normal)->copy(),1,1);
    473   }
    474 }
    475 
    476 
    477 void menu_handler(event &ev, input_manager *inm)
    478 {
    479   switch (ev.type)
    480   {
    481     case EV_MESSAGE :
    482     {
    483       switch (ev.message.id)
    484       {
    485         case ID_LIGHT_OFF :
    486         if (!volume_window)
    487         {
    488           gamma_correct(pal,1);
    489         } break;
    490         case ID_RETURN :
    491         if (!volume_window)
    492         {
    493           the_game->set_state(RUN_STATE);
    494         } break;
    495         case ID_START_GAME :
    496         if (!volume_window)
    497         {       
    498           the_game->load_level(level_file);
    499           the_game->set_state(RUN_STATE);
    500           view *v;
    501           for (v=player_list;v;v=v->next)
    502             if (v->focus)
    503               v->reset_player();
    504            
    505         } break;
    506 
    507    
    508         case ID_LOAD_PLAYER_GAME :
    509         if (!volume_window)
    510         {
    511           int got_level=load_game(0,symbol_str("LOAD"));
    512           the_game->reset_keymap();
    513           if (got_level)
    514           {
    515             char name[255];
    516             sprintf(name,"%ssave%04d.spe", get_save_filename_prefix(), got_level);
    517 
    518             the_game->load_level(name);
    519             the_game->set_state(RUN_STATE);         
    520           }
    521         } break;
    522 
    523 
    524         case ID_VOLUME :
    525         if (!volume_window)
    526         { create_volume_window(); } break;
    527 
    528         case ID_MEDIUM :
    529         {
    530           set_symbol_value(l_difficulty,l_medium);
    531           save_difficulty();
    532         } break;
    533         case ID_HARD :
    534         {
    535           set_symbol_value(l_difficulty,l_hard);
    536           save_difficulty();
    537         } break;
    538         case ID_EXTREME :
    539         {
    540           set_symbol_value(l_difficulty,l_extreme);
    541           save_difficulty();
    542         } break;
    543         case ID_EASY :
    544         {
    545           set_symbol_value(l_difficulty,l_easy);
    546           save_difficulty();
    547         } break;
    548 
    549         case ID_NETWORKING :
    550         {
    551           if (!volume_window)
    552           {
    553             net_configuration *cfg=new net_configuration;
    554             if (cfg->input())
    555             {
    556               if (main_net_cfg) delete main_net_cfg;
    557               main_net_cfg=cfg;
    558             } else delete cfg;
    559             the_game->draw(0);
    560             inm->redraw();
    561           }
    562         } break;
    563                      
    564         case ID_SHOW_SELL :
    565         if (!volume_window)
    566         {
    567           show_sell(1);
    568           screen->clear();
    569           if (title_screen>=0)
    570           {
    571             image *tit=cash.img(title_screen);
    572               tit->put_image(screen,screen->width()/2-tit->width()/2,
    573                                               screen->height()/2-tit->height()/2);
    574           }
    575           inm->redraw();
    576           fade_in(NULL,8);
    577           wm->flush_screen();
    578 
    579         } break;
    580       } break;
    581     } break;
    582     case EV_CLOSE_WINDOW :
    583     {
    584       if (ev.window==volume_window)
    585       { wm->close_window(volume_window); volume_window=NULL; }
    586     } break;
    587   }
    588 }
    589 
    590 void *current_demo=NULL;
    591 
    592 static ico_button *load_icon(int num, int id, int x, int y, int &h, ifield *next, char const *key)
    593 {
    594   char name[20];
    595   char const *base = "newi";
    596   int a,b,c;
    597   sprintf(name,"%s%04d.pcx",base,num*3+1);
    598   a=cash.reg("art/icons.spe",name,SPEC_IMAGE,1);
    599 
    600   sprintf(name,"%s%04d.pcx",base,num*3+2);
    601   b=cash.reg("art/icons.spe",name,SPEC_IMAGE,1);
    602 
    603   sprintf(name,"%s%04d.pcx",base,num*3+3);
    604   c=cash.reg("art/icons.spe",name,SPEC_IMAGE,1);
    605 
    606   h=cash.img(a)->height();
    607 
    608   return new ico_button(x,y,id,b,b,a,c,next,-1,key);
    609 }
    610 
    611 ico_button *make_default_buttons(int x,int &y, ico_button *append_list)
    612 {
    613   int h;
    614   int diff_on;
    615 
    616   if (DEFINEDP(symbol_value(l_difficulty)))
    617   {
    618     if (symbol_value(l_difficulty)==l_extreme)
    619       diff_on=3;
    620     else if (symbol_value(l_difficulty)==l_hard)
    621       diff_on=2;
    622     else if (symbol_value(l_difficulty)==l_easy)
    623       diff_on=0;
    624     else
    625       diff_on=1;
    626   } else  diff_on=3;
    627 
    628  
    629   ico_button *start=load_icon(0,ID_START_GAME,x,y,h,NULL,"ic_start");                         y+=h;
    630 
    631   ico_switch_button *set=NULL;
    632   if (!main_net_cfg || (main_net_cfg->state!=net_configuration::SERVER && main_net_cfg->state!=net_configuration::CLIENT))
    633   {
    634     set=new ico_switch_button(x,y,ID_NULL,diff_on,
    635                                                  load_icon(3,ID_EASY,x,y,h,
    636                                                  load_icon(8,ID_MEDIUM,x,y,h,
    637                                                  load_icon(9,ID_HARD,x,y,h,
    638                                                  load_icon(10,ID_EXTREME,x,y,h,NULL,"ic_extreme"),
    639                                                   "ic_hard"),"ic_medium"),"ic_easy"),NULL);         y+=h;
    640 
    641   }
    642 
    643   ico_button *color=load_icon(4,ID_LIGHT_OFF,x,y,h,NULL,"ic_gamma");                          y+=h; 
    644   ico_button *volume=load_icon(5,ID_VOLUME,x,y,h,NULL,"ic_volume");                            y+=h;
    645   ico_button *sell=NULL;
    646 
    647   if (prot)
    648   {
    649     sell=load_icon(11,ID_NETWORKING,x,y,h,NULL,"ic_networking");
    650     y+=h; 
    651   } else
    652   {
    653     sell=load_icon(2,ID_SHOW_SELL,x,y,h,NULL,"ic_sell");                           
    654     y+=h; 
    655   }
    656   ico_button *quit=load_icon(6,ID_QUIT,x,y,h,NULL,"ic_quit");                                y+=h;
    657 
    658   if (set)
    659   {
    660     start->next=set;
    661     set->next=color;
    662   }
    663   else start->next=color;
    664 
    665 
    666   color->next=volume; 
    667   if (sell)
    668   {
    669     volume->next=sell; 
    670     sell->next=quit;
    671   } else volume->next=quit;
    672 
    673   ico_button *list=append_list;
    674 
    675   if (append_list)
    676   {
    677     while (append_list->next)
    678       append_list=(ico_button *)append_list->next;
    679     append_list->next=start;
    680   } else list=start;
    681  
    682   return list; 
    683 }
    684 
    685 
    686 ico_button *make_conditional_buttons(int x,int &y)
    687 
    688   ico_button *start_list=NULL;
    689   int h;
    690   if (current_level)       // should we include a return icon?
    691   {
    692     start_list=load_icon(7,ID_RETURN,x,y,h,NULL,"ic_return");                       y+=h;
    693   }
    694    
    695  
    696   ico_button *load;
    697   if (show_load_icon())
    698   { load= load_icon(1,ID_LOAD_PLAYER_GAME,x,y,h,NULL,"ic_load");                     y+=h;}
    699   else load=NULL;
    700 
    701   if (start_list) start_list->next=load;
    702   else start_list=load;
    703 
    704   return start_list;   
    705 }
    706 
    707 void main_menu()
    708 {
    709         int y=yres/2-100;
    710         ico_button *list=make_conditional_buttons(xres-33,y);
    711         list=make_default_buttons(xres-33,y,list);
    712 
    713         input_manager *inm=new input_manager(screen,list);
    714         inm->allow_no_selections();
    715         inm->clear_current();
    716 
    717         screen->add_dirty(0,0,319,199);
    718 
    719         event ev;
    720 
    721         int stop_menu=0;
    722         time_marker start;
    723         wm->flush_screen();
    724         do
    725         {
    726                 time_marker new_time;
    727 
    728                 if (wm->event_waiting())
    729                 {
    730                         do
    731                         {
    732                                 wm->get_event(ev);
    733                         } while (ev.type==EV_MOUSE_MOVE && wm->event_waiting());
    734                         inm->handle_event(ev,NULL);
    735                         if (ev.type==EV_KEY && ev.key==JK_ESC)
    736                                 wm->push_event(new event(ID_QUIT,NULL));
    737 
    738                         menu_handler(ev,inm);
    739                         start.get_time();
    740 
    741                         wm->flush_screen();
    742                 }
    743                 else
    744                 {
    745                         // ECS - Added so that main menu doesn't grab 100% of CPU
    746                         milli_wait(30);
    747                 }
    748 
    749                 if (new_time.diff_time(&start)>10)
    750                 {
    751                         if (volume_window)
    752                                 start.get_time();
    753                         else
    754                         {
    755                                 if (!current_demo)
    756                                 {
    757                                         void *d=make_find_symbol("demos");
    758                                         if (DEFINEDP(symbol_value(d)))
    759                                                 current_demo=symbol_value(d);
    760                                 }
    761                                 if (current_demo)
    762                                 {
    763                                         demo_man.set_state(demo_manager::PLAYING,lstring_value(CAR(current_demo)));
    764                                         stop_menu=1;
    765                                         current_demo=CDR(current_demo);
    766                                 }
    767                         }
    768                 }
    769 
    770                 if (volume_window) stop_menu=0;  // can't exit with volume window open
    771                 else if (main_net_cfg && main_net_cfg->restart_state()) stop_menu=1;
    772                 else if (the_game->state==RUN_STATE) stop_menu=1;
    773                 else if (ev.type==EV_MESSAGE)
    774                 {
    775                         if (ev.message.id==ID_START_GAME || ev.message.id==ID_RETURN)
    776                                 stop_menu=1;
    777                         else if (ev.message.id==ID_QUIT)
    778                         {
    779                                 if (confirm_quit())
    780                                         stop_menu=1;
    781                                 else
    782                                 {
    783                                         ev.type=EV_SPURIOUS;
    784                                         start.get_time();
    785                                 }
    786                         }
    787                 }
    788         } while (!stop_menu);
    789 
    790         delete inm;
    791 
    792         if (ev.type==EV_MESSAGE && ev.message.id==ID_QUIT)   // propogate the quit message
    793                 the_game->end_session();
    794 }
    795 
    796 
Note: See TracChangeset for help on using the changeset viewer.