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

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