source: abuse/trunk/src/menu.cpp @ 56

Last change on this file since 56 was 56, checked in by Sam Hocevar, 11 years ago
  • Add licensing terms to most C / C++ files (Ref #5).
File size: 18.9 KB
Line 
1/*
2 *  Abuse - dark 2D side-scrolling platform game
3 *  Copyright (c) 1995 Crack dot Com
4 *
5 *  This software was released into the Public Domain. As with most public
6 *  domain software, no warranty is made or implied by Crack dot Com or
7 *  Jonathan Clark.
8 */
9
10#include "config.h"
11
12#include <math.h>
13
14#include "menu.hpp"
15#include "lisp.hpp"
16#include "game.hpp"
17#include "timing.hpp"
18#include "game.hpp"
19#include "id.hpp"
20#include "pmenu.hpp"
21#include "gui.hpp"
22#include "property.hpp"
23#include "dev.hpp"
24#include "clisp.hpp"
25#include "gamma.hpp"
26#include "dprint.hpp"
27#include "demo.hpp"
28#include "loadgame.hpp"
29#include "scroller.hpp"
30#include "netcfg.hpp"
31#include "sock.hpp"
32
33extern net_protocol *prot;
34jwindow *volume_window=NULL;
35extern int confirm_quit();
36extern int registered;
37
38//percent is 0..256
39void tint_area(int x1, int y1, int x2, int y2, int r_to, int g_to, int b_to, int percent)
40{
41  int x,y;
42  short cx1,cy1,cx2,cy2;
43  screen->get_clip(cx1,cy1,cx2,cy2);
44  if (x1<cx1) x1=cx1;
45  if (y1<cy1) y1=cy1;
46  if (x2>cx2) x2=cx2;
47  if (y2>cy2) y2=cy2;
48  if (x2<x1 || y2<y1) return ;
49
50  percent=256-percent;
51
52  for (y=y1;y<=y2;y++)
53  {
54    unsigned char *sl=screen->scan_line(y)+x1;
55    for (x=x1;x<=x2;x++,sl++)
56    {
57      unsigned char *paddr=(unsigned char *)pal->addr()+(*sl)*3;
58      unsigned char r=((*(paddr++))-r_to)*percent/256+r_to;
59      unsigned char g=((*(paddr++))-g_to)*percent/256+g_to;
60      unsigned char 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}
66
67void darken_area(int x1, int y1, int x2, int y2, int amount)
68{
69  int x,y;
70  short cx1,cy1,cx2,cy2;
71  screen->get_clip(cx1,cy1,cx2,cy2);
72  if (x1<cx1) x1=cx1;
73  if (y1<cy1) y1=cy1;
74  if (x2>cx2) x2=cx2;
75  if (y2>cy2) y2=cy2;
76  if (x2<x1 || y2<y1) return ;
77
78  for (y=y1;y<=y2;y++)
79  {
80    unsigned char *sl=screen->scan_line(y)+x1;
81    for (x=x1;x<=x2;x++,sl++)
82    {
83      unsigned char *paddr=(unsigned char *)pal->addr()+(*sl)*3;
84      unsigned char r=(*(paddr++))*amount/256;
85      unsigned char g=(*(paddr++))*amount/256;
86      unsigned char b=(*(paddr++))*amount/256;
87      *sl=color_table->lookup_color((r)>>3,(g)>>3,(b)>>3);
88    }
89  }
90  screen->add_dirty(x1,y1,x2,y2);
91}
92
93void dark_wiget(int x1, int y1, int x2, int y2, int br, int dr, int amount)
94{
95  screen->add_dirty(x1,y1,x2,y2);
96  screen->line(x1,y1,x1,y2,br);
97  screen->line(x1+1,y1,x2,y1,br);
98  screen->line(x2,y1+1,x2,y2,dr);
99  screen->line(x1+1,y2,x2,y2,dr);
100  darken_area(x1+1,y1+1,x2-1,y2-1,amount); 
101}
102
103char *men_str(void *arg)
104{
105  switch (item_type(arg))
106  {
107    case L_STRING :
108    { return lstring_value(arg); } break;
109    case L_CONS_CELL :
110    { return lstring_value(CAR(arg)); } break;
111    default :
112    {
113      lprint(arg);
114      printf(" is not a valid menu option\n");
115      exit(0);
116    }
117  }
118  return NULL;
119}
120
121void main_menu();
122
123int menu(void *args, JCFont *font)             // reurns -1 on esc
124{
125  main_menu();
126  char *title=NULL;
127  if (!NILP(CAR(args)))
128    title=lstring_value(CAR(args));
129  Cell *def=lcar(lcdr(lcdr(args)));
130  args=CAR(CDR(args));
131
132  int options=list_length(args);
133  int mh=(font->height()+1)*options+10,maxw=0;
134
135  Cell *c=(Cell *)args;
136  for (;!NILP(c);c=CDR(c))
137  {
138    if( strlen(men_str(CAR(c))) > (unsigned)maxw)
139      maxw = strlen(men_str(CAR(c)));
140  }
141 
142  int mw=(font->width())*maxw+20;
143  int mx=screen->width()/2-mw/2,
144      my=screen->height()/2-mh/2;
145 
146
147  screen->add_dirty(mx,my,mx+mw-1,my+mh-1);
148
149  if (title)
150  {
151    int tl=strlen(title)*font->width();
152    int tx=screen->width()/2-tl/2;
153    dark_wiget(tx-2,my-font->height()-4,tx+tl+2,my-2,eh->medium_color(),eh->dark_color(),180);
154    font->put_string(screen,tx+1,my-font->height()-2,title,eh->bright_color());
155  }
156 
157  dark_wiget(mx,my,mx+mw-1,my+mh-1,eh->medium_color(),eh->dark_color(),200);
158
159
160  int y=my+5;
161  for (c=(Cell *)args;!NILP(c);c=CDR(c))
162  {
163    char *ms=men_str(CAR(c));
164    font->put_string(screen,mx+10+1,y+1,ms,eh->black());
165    font->put_string(screen,mx+10,y,ms,eh->bright_color());
166    y+=font->height()+1;
167  }
168
169  eh->flush_screen();
170  event ev;
171  int choice=0,done=0;
172  int bh=font->height()+3;
173  image *save=new image(mw-2,bh);
174  int color=128,cdir=50;
175 
176  time_marker *last_color_time=NULL;
177  if (!NILP(def))
178    choice=lnumber_value(def);
179  do
180  {
181    eh->flush_screen();
182    if (eh->event_waiting())
183    {
184      eh->get_event(ev);
185      if (ev.type==EV_KEY)
186      {
187        switch (ev.key)
188        {
189          case JK_ESC :
190          { choice=-1; done=1; } break;
191          case JK_ENTER :
192          { done=1; } break;
193          case JK_DOWN :
194          { if (choice<options-1)
195            choice++;
196          else choice=0;
197          } break;
198          case JK_UP :
199          {
200            if (choice>0)
201            choice--;
202            else choice=options-1;
203          } break;                   
204        }
205      } else if (ev.type==EV_MOUSE_BUTTON && ev.mouse_button)
206      {
207        if (ev.mouse_move.x>mx && ev.mouse_move.x<mx+mw && ev.mouse_move.y>my &&
208            ev.mouse_move.y<my+mh)
209        {
210          int msel=(ev.mouse_move.y-my)/(font->height()+1);
211          if (msel>=options) msel=options-1;
212          if (msel==choice)                    // clicked on already selected item, return it
213            done=1;
214          else choice=msel;                    // selects an item
215        }
216      }
217    }
218
219    time_marker cur_time;
220    if (!last_color_time || (int)(cur_time.diff_time(last_color_time)*1000)>120)
221    {       
222      if (last_color_time)
223        delete last_color_time;
224      last_color_time=new time_marker;
225
226      int by1=(font->height()+1)*choice+my+5-2;
227      int by2=by1+bh-1;
228
229      screen->put_part(save,0,0,mx+1,by1,mx+mw-2,by2);
230      tint_area(mx+1,by1,mx+mw-2,by2,63,63,63,color);
231
232      char *cur=men_str(nth(choice,args));
233      font->put_string(screen,mx+10+1,by1+3,cur,eh->black());
234      font->put_string(screen,mx+10,by1+2,cur,eh->bright_color());
235      screen->rectangle(mx+1,by1,mx+mw-2,by2,eh->bright_color());
236
237      color+=cdir;
238
239      if (color<12 || color>256)
240      {
241        cdir=-cdir;
242        color+=cdir;
243      }
244      eh->flush_screen();
245      save->put_image(screen,mx+1,by1);
246    } else milli_wait(10);
247
248  } while (!done);
249  if (last_color_time)
250    delete last_color_time;
251  delete save;
252  the_game->draw(the_game->state==SCENE_STATE);
253
254  if (choice!=-1)
255  {
256    void *val=nth(choice,args);
257    if (item_type(val)==L_CONS_CELL)   // is there another value that the user want us to return?
258      return lnumber_value(lcdr(val)); 
259  }
260  return choice;
261}
262
263
264static void draw_vol(image *screen, int x1, int y1, int x2, int y2, int t, int max, int c1, int c2, int slider)
265{
266  int dx=x1+t*(x2-x1)/max;
267  if (t!=0)
268  {
269    cash.img(slider)->put_image(screen,x1,y1);   
270//    screen->bar(x1,y1,dx,y2,c1);
271  }
272  else dx--;
273
274  if (dx<x2)
275    screen->bar(dx+1,y1,x2,y2,c2);
276}
277
278static void draw_sfx_vol(int slider)
279{
280  draw_vol(volume_window->screen,6,16,34,22,sfx_volume,127,pal->find_closest(200,75,19),
281           pal->find_closest(40,0,0),slider);
282}
283
284static void draw_music_vol(int slider)
285{
286  draw_vol(volume_window->screen,6,61,34,67,music_volume,127,pal->find_closest(255,0,0),
287           pal->find_closest(40,0,0),slider);
288}
289
290static void create_volume_window()
291{
292/*  int vx=WINDOW_FRAME_LEFT,vy=WINDOW_FRAME_TOP+eh->font()->height()*2,scroller_height=130,bh=eh->font()->height()+5;
293
294  volume_window=eh->new_window(prop->getd("volume_x",xres/2-20),
295                               prop->getd("volume_y",yres/2-50),
296                               -1,
297                               -1,
298                               new scroller(vx,vy,LOWER_SFX,0,scroller_height,0,127,
299                               new scroller(vx+30,vy,LOWER_MUSIC,0,scroller_height,0,127,NULL)),symbol_str("VOLUME"));
300  event ev;
301  int done=0;
302  do
303  {
304    eh->flush_screen();
305    eh->get_event(ev);
306    if (ev.type==EV_CLOSE_WINDOW && ev.window==volume_window) done=1;   
307  } while (!done);
308  eh->close_window(volume_window);
309  volume_window=NULL; */
310
311
312  char const *ff = "art/frame.spe";
313  int t=SPEC_IMAGE;
314  int u_u=cash.reg(ff,"u_u",t,1),
315      u_d=cash.reg(ff,"u_u",t,1),
316      u_ua=cash.reg(ff,"u_ua",t,1),
317      u_da=cash.reg(ff,"u_da",t,1),
318
319      d_u=cash.reg(ff,"d_u",t,1),
320      d_d=cash.reg(ff,"d_u",t,1),
321      d_ua=cash.reg(ff,"d_ua",t,1),
322      d_da=cash.reg(ff,"d_da",t,1),
323      slider=cash.reg(ff,"volume_slide",t,1);
324 
325  volume_window=eh->new_window(prop->getd("volume_x",xres/2-20),
326                               prop->getd("volume_y",yres/2-50),
327                               41-WINDOW_FRAME_LEFT-WINDOW_FRAME_RIGHT-2,
328                               101-WINDOW_FRAME_TOP-WINDOW_FRAME_BOTTOM,
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  eh->grab_focus(volume_window);
343  eh->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 { eh->get_event(ev); } while (ev.type==EV_MOUSE_MOVE && eh->event_waiting());
352    eh->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      eh->close_window(volume_window);
402      volume_window=NULL;
403    }
404  } while (volume_window);
405}
406
407
408void 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
432void fade_out(int steps);
433void fade_in(image *im, int steps);
434
435
436void 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    eh->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      { eh->flush_screen();
465        eh->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    eh->set_mouse_shape(cash.img(c_normal)->copy(),1,1);
473  }
474}
475
476
477void 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          eh->flush_screen();
578
579        } break;
580      } break;
581    } break;
582    case EV_CLOSE_WINDOW :
583    {
584      if (ev.window==volume_window)
585      { eh->close_window(volume_window); volume_window=NULL; }
586    } break;
587  }
588}
589
590void *current_demo=NULL;
591
592static 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
611ico_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 (registered && 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
686ico_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
707void 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,eh,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        eh->flush_screen();
724        do
725        {
726                time_marker new_time;
727
728                if (eh->event_waiting())
729                {
730                        do
731                        {
732                                eh->get_event(ev);
733                        } while (ev.type==EV_MOUSE_MOVE && eh->event_waiting());
734                        inm->handle_event(ev,NULL,eh);
735                        if (ev.type==EV_KEY && ev.key==JK_ESC)
736                                eh->push_event(new event(ID_QUIT,NULL));
737
738                        menu_handler(ev,inm);
739                        start.get_time();
740
741                        eh->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 TracBrowser for help on using the repository browser.