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

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