DEADSOFTWARE

sound: fix voices in menu
[flatwaifu.git] / src / menu.c
1 /*
2 Copyright (C) Prikol Software 1996-1997
3 Copyright (C) Aleksey Volynskov 1996-1997
4 Copyright (C) <ARembo@gmail.com> 2011
6 This file is part of the Doom2D:Rembo project.
8 Doom2D:Rembo is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License version 2 as
10 published by the Free Software Foundation.
12 Doom2D:Rembo is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, see <http://www.gnu.org/licenses/> or
19 write to the Free Software Foundation, Inc.,
20 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21 */
23 #include "glob.h"
24 #include <stdio.h>
25 #include <string.h>
26 #include <stdlib.h>
27 #include "files.h"
28 #include "memory.h"
29 #include "error.h"
30 #include "sound.h"
31 #include "view.h"
32 #include "player.h"
33 #include "switch.h"
34 #include "menu.h"
35 #include "misc.h"
36 #include "render.h"
37 #include "config.h"
38 #include "game.h"
39 #include "player.h"
40 #include "sound.h"
41 #include "music.h"
42 #include "input.h"
44 #include <sys/stat.h>
46 #define QSND_NUM 14
48 enum{HIT100,ARMOR,JUMP,WPNS,IMMORTAL,SPEED,OPEN,EXIT};
50 static byte panim[] = "BBDDAACCDDAABBDDAACCDDAABBDDAACCDDAAEEEEEFEFEFEFEFEFEFEFEFEFEEEEE";
51 byte *panimp = panim;
52 byte _warp;
54 byte pcolortab[PCOLORN] = {
55 0x18, 0x20, 0x40, 0x58, 0x60, 0x70, 0x80, 0xB0, 0xC0, 0xD0
56 };
57 int p1color = 5;
58 int p2color = 4;
60 char ibuf[24];
61 byte input=0;
62 static int icur;
64 enum{MENU,MSG};
65 enum{CANCEL,NEWGAME,LOADGAME,SAVEGAME,OPTIONS,QUITGAME,QUIT,ENDGAME,ENDGM,
66 PLR1,PLR2,COOP,DM,VOLUME,GAMMA,LOAD,SAVE,PLCOLOR,PLCEND,MUSIC,INTERP,
67 SVOLM,SVOLP,MVOLM,MVOLP,GAMMAM,GAMMAP,PL1CM,PL1CP,PL2CM,PL2CP};
69 #ifndef DEMO
70 static int qsnd[QSND_NUM];
71 #endif
73 static char *main_txt[]={
74 "NEW GAME","LOAD GAME","SAVE GAME","OPTIONS","EXIT"
75 },*opt_txt[]={
76 "RESTART","VOLUME","BRIGHTNESS","MUSIC","FULLSCREEN:"
77 },*ngplr_txt[]={
78 "ONE PLAYER","TWO PLAYERS"
79 },*ngdm_txt[]={
80 "COOPERATIVE","DEATHMATCH"
81 },*vol_txt[]={
82 "SOUND","MUSIC"
83 },*plcolor_txt[]={
84 "FIRST","SECOND"
85 },*gamma_txt[]={
86 ""
87 };
89 static byte main_typ[]={
90 NEWGAME,LOADGAME,SAVEGAME,OPTIONS,QUITGAME
91 },ngplr_typ[]={
92 PLR1,PLR2
93 },ngdm_typ[]={
94 COOP,DM
95 },opt_typ[]={
96 ENDGAME,VOLUME,GAMMA,MUSIC,INTERP
97 },quit_typ[]={
98 QUIT,CANCEL
99 },endgm_typ[]={
100 ENDGM,CANCEL
101 },vol_typ[]={
102 SVOLM,MVOLM
103 },plcolor_typ[]={
104 PL1CM,PL2CM
105 },gamma_typ[]={
106 GAMMAM
107 },load_typ[]={
108 LOAD,LOAD,LOAD,LOAD,LOAD,LOAD,LOAD
109 },save_typ[]={
110 SAVE,SAVE,SAVE,SAVE,SAVE,SAVE,SAVE
111 };
113 menu_t main_mnu={
114 MENU,5,0,80,"MENU",main_txt,main_typ
115 },opt_mnu={
116 MENU,5,0,75,"OPTIONS",opt_txt,opt_typ
117 },ngplr_mnu={
118 MENU,2,0,90,"NEW GAME",ngplr_txt,ngplr_typ
119 },ngdm_mnu={
120 MENU,2,0,90,"GAME TYPE",ngdm_txt,ngdm_typ
121 },vol_mnu={
122 MENU,2,0,40,"VOLUME",vol_txt,vol_typ
123 },plcolor_mnu={
124 MENU,2,0,90,"COLOR",plcolor_txt,plcolor_typ
125 },gamma_mnu={
126 MENU,1,0,85,"BRIGHTNESS",gamma_txt,gamma_typ
127 },load_mnu={
128 MENU,7,0,85,"LOAD GAME",NULL,load_typ
129 },save_mnu={
130 MENU,7,0,85,"SAVE GAME",NULL,save_typ
131 },quit1_msg={
132 MSG,0,0,0,"ARE YOU SURE?",NULL,quit_typ
133 },quit2_msg={
134 MSG,0,0,0,"ARE YOU SURE?",NULL,quit_typ
135 },quit3_msg={
136 MSG,0,0,0,"ARE YOU SURE?",NULL,quit_typ
137 },endgm_msg={
138 MSG,0,0,0,"RESTART LEVEL?",NULL,endgm_typ
139 };
141 static menu_t *qmsg[3]={&quit1_msg,&quit2_msg,&quit3_msg};
143 menu_t *mnu=NULL;
144 byte gm_redraw=0;
146 short lastkey=0;
147 static void *csnd1,*csnd2,*msnd1,*msnd2,*msnd3,*msnd4,*msnd5,*msnd6;
148 static int movsndt=0;
149 static byte cbuf[32];
151 static snd_t *voc;
152 static int voc_ch;
154 static void GMV_stop (void) {
155 if (voc != NULL) {
156 if (voc_ch) {
157 S_stop(voc_ch);
158 voc_ch = 0;
160 S_free(voc);
161 voc = NULL;
165 void GMV_say (const char nm[8]) {
166 snd_t *snd = S_load(nm);
167 if (snd) {
168 GMV_stop();
169 voc = S_load(nm);
170 voc_ch = S_play(voc, 0, 255);
174 static void GM_set (menu_t *m) {
175 mnu=m;gm_redraw=1;
176 if(g_st==GS_GAME) {
177 //V_setrect(0,SCRW,0,SCRH);V_clr(0,SCRW,0,SCRH,0);//V_setrect(0,320,0,200);V_clr(0,320,0,200,0);
178 //if(_2pl) {V_setrect(SCRW-120,120,0,SCRH);w_o=0;Z_clrst();w_o=SCRH/2;Z_clrst();}//if(_2pl) {V_setrect(200,120,0,200);w_o=0;Z_clrst();w_o=100;Z_clrst();}
179 //else {V_setrect(SCRW-120,120,0,SCRH);w_o=0;Z_clrst();}//else {V_setrect(200,120,50,100);w_o=50;Z_clrst();}
180 //pl1.drawst=pl2.drawst=0xFF;V_setrect(0,SCRW,0,SCRH);//V_setrect(0,320,0,200);
184 void G_code (void) {
185 void *s;
186 s=csnd2;
187 if(memcmp(cbuf+32-5,"IDDQD",5)==0) {
188 PL_hit(&pl1,400,0,HIT_SOME);
189 if(_2pl) PL_hit(&pl2,400,0,HIT_SOME);
190 s=csnd1;
191 }else if(memcmp(cbuf+32-4,"TANK",4)==0) {
192 pl1.life=pl1.armor=200;pl1.drawst|=PL_DRAWARMOR|PL_DRAWLIFE;
193 if(_2pl) {pl2.life=pl2.armor=200;pl2.drawst|=PL_DRAWARMOR|PL_DRAWLIFE;}
194 }else if(memcmp(cbuf+32-8,"BULLFROG",8)==0) {
195 PL_JUMP=(PL_JUMP==10)?20:10;
196 }else if(memcmp(cbuf+32-8,"FORMULA1",8)==0) {
197 PL_RUN=(PL_RUN==8)?24:8;
198 }else if(memcmp(cbuf+32-5,"RAMBO",5)==0) {
199 pl1.ammo=pl1.shel=pl1.rock=pl1.cell=pl1.fuel=30000;
200 pl1.wpns=0x7FF;pl1.drawst|=PL_DRAWWPN|PL_DRAWKEYS;
201 pl1.keys=0x70;
202 if(_2pl) {
203 pl2.ammo=pl2.shel=pl2.rock=pl2.cell=pl1.fuel=30000;
204 pl2.wpns=0x7FF;pl2.drawst|=PL_DRAWWPN|PL_DRAWKEYS;
205 pl2.keys=0x70;
207 }else if(memcmp(cbuf+32-5,"UJHTW",5)==0) {
208 p_immortal=!p_immortal;
209 }else if(memcmp(cbuf+32-9,",TKSQJHTK",9)==0) {
210 p_fly=!p_fly;
211 }else if(memcmp(cbuf+32-6,"CBVCBV",6)==0) {
212 SW_cheat_open();
213 }else if(memcmp(cbuf+32-7,"GOODBYE",7)==0) {
214 g_exit=1;
215 }else if(memcmp(cbuf+32-9,"GJITKYF",7)==0) {
216 if(cbuf[30]>='0' && cbuf[30]<='9' && cbuf[31]>='0' && cbuf[31]<='9') {
217 g_map=(cbuf[30]=='0')?0:(cbuf[30]-'0')*10;
218 g_map+=(cbuf[31]=='0')?0:(cbuf[31]-'0');
219 G_start();
221 }else return;
222 memset(cbuf,0,32);
223 Z_sound(s,128);
226 static void GM_command (int c) {
227 switch(c) {
228 case CANCEL:
229 GM_set(NULL);break;
230 case INTERP:
231 R_toggle_fullscreen();
232 GM_set(mnu);
233 break;
234 case MUSIC:
235 F_freemus();
236 F_nextmus(g_music);
237 F_loadmus(g_music);
238 S_startmusic(music_time*2);
239 GM_set(mnu);
240 break;
241 case NEWGAME:
242 GMV_say("_NEWGAME");
243 GM_set(&ngplr_mnu);break;
244 case PLR2:
245 GMV_say("_2PLAYER");
246 GM_set(&ngdm_mnu);break;
247 case PLR1:
248 GMV_say("_1PLAYER");
249 ngdm_mnu.cur=0;
250 case COOP: case DM:
251 if(c==COOP) GMV_say("_COOP");
252 else if(c==DM) GMV_say("_DM");
253 if(c!=PLR1) {GM_set(&plcolor_mnu);break;}
254 case PLCEND:
255 _2pl=ngplr_mnu.cur;
256 g_dm=ngdm_mnu.cur;
257 g_map=(_warp)?_warp:1;
258 PL_reset();
259 if(_2pl) {
260 pl1.color=pcolortab[p1color];
261 pl2.color=pcolortab[p2color];
262 }else pl1.color=0x70;
263 G_start();
264 GM_set(NULL);break;
265 case OPTIONS:
266 GMV_say("_RAZNOE");
267 GM_set(&opt_mnu);break;
268 case LOADGAME:
269 GMV_say("_OLDGAME");
270 F_getsavnames();GM_set(&load_mnu);break;
271 case SAVEGAME:
272 if(g_st!=GS_GAME) break;
273 GMV_say("_SAVEGAM");
274 F_getsavnames();GM_set(&save_mnu);break;
275 case SAVE:
276 input=1;memcpy(ibuf,savname[save_mnu.cur],24);icur=strlen(ibuf);
277 GM_set(mnu);break;
278 case LOAD:
279 if(!savok[load_mnu.cur]) break;
280 load_game(load_mnu.cur);
281 GM_set(NULL);break;
282 case VOLUME:
283 GMV_say("_VOLUME");
284 GM_set(&vol_mnu);break;
285 case GAMMA:
286 GMV_say("_GAMMA");
287 GM_set(&gamma_mnu);break;
288 case QUITGAME:
289 GMV_say((rand()&1)?"_EXIT1":"_EXIT2");
290 GM_set(qmsg[myrand(3)]);break;
291 case ENDGAME:
292 if(g_st!=GS_GAME) break;
293 GMV_say("_RESTART");
294 GM_set(&endgm_msg);break;
295 case QUIT:
296 F_freemus();
297 GMV_stop();
298 #ifndef DEMO
299 c = Z_sound(S_get(qsnd[myrand(QSND_NUM)]), 255);
300 S_wait();
301 #endif
302 ERR_quit();break;
303 case ENDGM:
304 PL_reset();G_start();
305 GM_set(NULL);break;
306 case PL1CM:
307 if(--p1color<0) p1color=PCOLORN-1; break;
308 case PL1CP:
309 if(++p1color>=PCOLORN) p1color=0; break;
310 case PL2CM:
311 if(--p2color<0) p2color=PCOLORN-1; break;
312 case PL2CP:
313 if(++p2color>=PCOLORN) p2color=0; break;
314 case SVOLM:
315 S_volume(snd_vol-8);break;
316 case SVOLP:
317 S_volume(snd_vol+8);break;
318 case MVOLM:
319 S_volumemusic(mus_vol-8);break;
320 case MVOLP:
321 S_volumemusic(mus_vol+8);break;
322 case GAMMAM:
323 R_setgamma(R_getgamma() - 1);
324 break;
325 case GAMMAP:
326 R_setgamma(R_getgamma() + 1);
327 break;
331 struct {
332 int keysym;
333 byte ch;
334 } keychar[] = {
335 {KEY_SPACE, ' '},
336 {KEY_0, '0'},
337 {KEY_1, '1'},
338 {KEY_2, '2'},
339 {KEY_3, '3'},
340 {KEY_4, '4'},
341 {KEY_5, '5'},
342 {KEY_6, '6'},
343 {KEY_7, '7'},
344 {KEY_8, '8'},
345 {KEY_9, '9'},
346 //{KEY_UNDERSCORE, '_'},
347 {KEY_A, 'A'},
348 {KEY_B, 'B'},
349 {KEY_C, 'C'},
350 {KEY_D, 'D'},
351 {KEY_E, 'E'},
352 {KEY_F, 'F'},
353 {KEY_G, 'G'},
354 {KEY_H, 'H'},
355 {KEY_I, 'I'},
356 {KEY_J, 'J'},
357 {KEY_K, 'K'},
358 {KEY_L, 'L'},
359 {KEY_M, 'M'},
360 {KEY_N, 'N'},
361 {KEY_O, 'O'},
362 {KEY_P, 'P'},
363 {KEY_Q, 'Q'},
364 {KEY_R, 'R'},
365 {KEY_S, 'S'},
366 {KEY_T, 'T'},
367 {KEY_U, 'U'},
368 {KEY_V, 'V'},
369 {KEY_W, 'W'},
370 {KEY_X, 'X'},
371 {KEY_Y, 'Y'},
372 {KEY_Z, 'Z'},
373 {KEY_COMMA,','},
374 {0}
375 };
377 static byte get_keychar (int keysym) {
378 int i = 0;
379 while (keychar[i].keysym) {
380 if (keychar[i].keysym == keysym) return keychar[i].ch;
381 i++;
383 return 0;
386 static void shot (void) {
387 /*
388 static int num=1;
389 char fn[100];//...
390 #ifndef WIN32
391 char *e = getenv("HOME");
392 strncpy(fn, e, 60);
393 sprintf(&fn[strlen(fn)],"/.doom2d-rembo",num);
394 mkdir(fn, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
395 sprintf(&fn[strlen(fn)],"/shot%04d.bmp",num);
396 #else
397 sprintf(fn,"shot%04d.bmp",num);
398 #endif
399 SDL_SaveBMP(screen, fn);
400 ++num;
401 */
404 int GM_act (void) {
405 byte c;
407 if(mnu==&plcolor_mnu) {
408 if(*(++panimp)==0) panimp=panim;
409 GM_set(mnu);
411 if(movsndt>0) --movsndt; else movsndt=0;
412 if(g_st==GS_TITLE) if(!mnu) if(lastkey) {
413 GM_set(&main_mnu);Z_sound(msnd3,128);
414 lastkey=0;
415 return 1;
417 if (input) {
418 switch (lastkey) {
419 case KEY_RETURN:
420 case KEY_KP_ENTER:
421 F_savegame(save_mnu.cur, ibuf);
422 input = 0;
423 GM_set(NULL);
424 break;
425 case KEY_ESCAPE:
426 input = 0;
427 GM_set(mnu);
428 break;
429 case KEY_BACKSPACE:
430 if (icur) {
431 icur -= 1;
432 ibuf[icur] = 0;
433 GM_set(mnu);
435 break;
436 default:
437 if (icur < 23) {
438 c = get_keychar(lastkey);
439 if (c != 0) {
440 ibuf[icur] = c;
441 icur += 1;
442 ibuf[icur] = 0;
443 GM_set(mnu);
446 break;
448 } else {
449 switch (lastkey) {
450 case KEY_ESCAPE:
451 if (mnu == NULL) {
452 GM_set(&main_mnu);
453 Z_sound(msnd3, 128);
454 } else {
455 GM_set(NULL);
456 Z_sound(msnd4, 128);
458 break;
459 case KEY_F5:
460 if (mnu == NULL) {
461 Z_sound(msnd3, 128);
462 GMV_say("_GAMMA");
463 GM_set(&gamma_mnu);
465 break;
466 case KEY_F4:
467 if (mnu == NULL) {
468 Z_sound(msnd3, 128);
469 GMV_say("_VOLUME");
470 GM_set(&vol_mnu);
472 break;
473 case KEY_F2:
474 if (mnu == NULL && g_st == GS_GAME) {
475 Z_sound(msnd3, 128);
476 F_getsavnames();
477 GM_set(&save_mnu);
479 break;
480 case KEY_F3:
481 if (mnu == NULL) {
482 Z_sound(msnd3, 128);
483 F_getsavnames();
484 GM_set(&load_mnu);
486 break;
487 case KEY_F10:
488 if (mnu == NULL) {
489 Z_sound(msnd3, 128);
490 GM_command(QUITGAME);
492 break;
493 case KEY_UP:
494 case KEY_KP_8:
495 if (mnu != NULL && mnu->type == MENU) {
496 mnu->cur -= 1;
497 if (mnu->cur < 0) {
498 mnu->cur = mnu->n - 1;
500 GM_set(mnu);
501 Z_sound(msnd1, 128);
503 break;
504 case KEY_DOWN:
505 case KEY_KP_5:
506 case KEY_KP_2:
507 if (mnu != NULL && mnu->type == MENU) {
508 mnu->cur += 1;
509 if (mnu->cur >= mnu->n) {
510 mnu->cur = 0;
512 GM_set(mnu);
513 Z_sound(msnd1, 128);
515 break;
516 case KEY_LEFT:
517 case KEY_RIGHT:
518 case KEY_KP_4:
519 case KEY_KP_6:
520 if (mnu != NULL && mnu->type == MENU && mnu->t[mnu->cur] >= SVOLM) {
521 GM_command(mnu->t[mnu->cur] + (lastkey == KEY_LEFT || lastkey == KEY_KP_4));
522 GM_set(mnu);
523 if (!movsndt) {
524 movsndt = Z_sound(lastkey == KEY_LEFT || lastkey == KEY_KP_4 ? msnd5 : msnd6, 255);
527 break;
528 case KEY_RETURN:
529 case KEY_SPACE:
530 case KEY_KP_ENTER:
531 if (mnu != NULL && mnu->type == MENU) {
532 if (mnu->t[mnu->cur] >= PL1CM) {
533 Z_sound(msnd2, 128);
534 GM_command(PLCEND);
535 break;
536 } else if (mnu->t[mnu->cur] < SVOLM) {
537 Z_sound(msnd2,128);
538 GM_command(mnu->t[mnu->cur]);
541 break;
542 case KEY_Y:
543 if (mnu != NULL && mnu->type == MSG) {
544 Z_sound(msnd3, 128);
545 GM_command(mnu->t[0]);
547 break;
548 case KEY_N:
549 if (mnu != NULL && mnu->type == MSG) {
550 Z_sound(msnd4, 128);
551 GM_command(mnu->t[1]);
553 break;
554 case KEY_F1:
555 if (shot_vga) {
556 shot();
557 Z_sound(msnd4, 128);
559 break;
562 lastkey = KEY_UNKNOWN;
563 return mnu ? 1 : 0;
566 void G_keyf (int key, int down) {
567 int i;
568 if (down) {
569 lastkey = key;
570 if (!_2pl || cheat) {
571 for (i = 0; i < 31; ++i) {
572 cbuf[i] = cbuf[i + 1];
574 cbuf[31] = get_keychar(key);
579 void GM_init (void) {
580 #ifndef DEMO
581 int i;
582 static char nm[QSND_NUM][6]={
583 "CYBSIT","KNTDTH","MNPAIN","PEPAIN","SLOP","MANSIT","BOSPN","VILACT",
584 "PLFALL","BGACT","BGDTH2","POPAIN","SGTATK","VILDTH"
585 };
586 char s[8];
588 s[0]='D';s[1]='S';
589 for(i=0;i<QSND_NUM;++i) {
590 memcpy(s+2,nm[i],6);
591 qsnd[i]=F_getresid(s);
593 #endif
594 csnd1=Z_getsnd("HAHA1");
595 csnd2=Z_getsnd("RADIO");
596 msnd1=Z_getsnd("PSTOP");
597 msnd2=Z_getsnd("PISTOL");
598 msnd3=Z_getsnd("SWTCHN");
599 msnd4=Z_getsnd("SWTCHX");
600 msnd5=Z_getsnd("SUDI");
601 msnd6=Z_getsnd("TUDI");
602 F_loadmus("MENU");
603 S_startmusic(0);