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
48 enum{HIT100
,ARMOR
,JUMP
,WPNS
,IMMORTAL
,SPEED
,OPEN
,EXIT
};
50 static byte panim
[] = "BBDDAACCDDAABBDDAACCDDAABBDDAACCDDAAEEEEEFEFEFEFEFEFEFEFEFEFEEEEE";
54 byte pcolortab
[PCOLORN
] = {
55 0x18, 0x20, 0x40, 0x58, 0x60, 0x70, 0x80, 0xB0, 0xC0, 0xD0
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
};
70 static int qsnd
[QSND_NUM
];
73 static char *main_txt
[]={
74 "NEW GAME","LOAD GAME","SAVE GAME","OPTIONS","EXIT"
76 "RESTART","VOLUME","BRIGHTNESS","MUSIC","FULLSCREEN:"
78 "ONE PLAYER","TWO PLAYERS"
80 "COOPERATIVE","DEATHMATCH"
89 static byte main_typ
[]={
90 NEWGAME
,LOADGAME
,SAVEGAME
,OPTIONS
,QUITGAME
96 ENDGAME
,VOLUME
,GAMMA
,MUSIC
,INTERP
108 LOAD
,LOAD
,LOAD
,LOAD
,LOAD
,LOAD
,LOAD
110 SAVE
,SAVE
,SAVE
,SAVE
,SAVE
,SAVE
,SAVE
114 MENU
,5,0,80,"MENU",main_txt
,main_typ
116 MENU
,5,0,75,"OPTIONS",opt_txt
,opt_typ
118 MENU
,2,0,90,"NEW GAME",ngplr_txt
,ngplr_typ
120 MENU
,2,0,90,"GAME TYPE",ngdm_txt
,ngdm_typ
122 MENU
,2,0,40,"VOLUME",vol_txt
,vol_typ
124 MENU
,2,0,90,"COLOR",plcolor_txt
,plcolor_typ
126 MENU
,1,0,85,"BRIGHTNESS",gamma_txt
,gamma_typ
128 MENU
,7,0,85,"LOAD GAME",NULL
,load_typ
130 MENU
,7,0,85,"SAVE GAME",NULL
,save_typ
132 MSG
,0,0,0,"ARE YOU SURE?",NULL
,quit_typ
134 MSG
,0,0,0,"ARE YOU SURE?",NULL
,quit_typ
136 MSG
,0,0,0,"ARE YOU SURE?",NULL
,quit_typ
138 MSG
,0,0,0,"RESTART LEVEL?",NULL
,endgm_typ
141 static menu_t
*qmsg
[3]={&quit1_msg
,&quit2_msg
,&quit3_msg
};
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
=NULL
;
154 static void GMV_stop (void) {
156 if(voc_ch
) {S_stop(voc_ch
);voc_ch
=0;}
161 void GMV_say (char *nm
) {
166 if((r
=F_findres(nm
))==-1) return;
167 if(!(p
=malloc((len
=F_getreslen(r
))+16))) return;
168 p
->len
=len
;p
->rate
=11000;
171 F_loadres(r
,p
+1,0,len
);
172 for(d
=(byte
*)(p
+1);len
;--len
,++d
) *d
^=128;
174 voc_ch
=S_play(voc
,-1,1024,255);
177 static void GM_set (menu_t
*m
) {
180 //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);
181 //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();}
182 //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();}
183 //pl1.drawst=pl2.drawst=0xFF;V_setrect(0,SCRW,0,SCRH);//V_setrect(0,320,0,200);
190 if(memcmp(cbuf
+32-5,"IDDQD",5)==0) {
191 PL_hit(&pl1
,400,0,HIT_SOME
);
192 if(_2pl
) PL_hit(&pl2
,400,0,HIT_SOME
);
194 }else if(memcmp(cbuf
+32-4,"TANK",4)==0) {
195 pl1
.life
=pl1
.armor
=200;pl1
.drawst
|=PL_DRAWARMOR
|PL_DRAWLIFE
;
196 if(_2pl
) {pl2
.life
=pl2
.armor
=200;pl2
.drawst
|=PL_DRAWARMOR
|PL_DRAWLIFE
;}
197 }else if(memcmp(cbuf
+32-8,"BULLFROG",8)==0) {
198 PL_JUMP
=(PL_JUMP
==10)?20:10;
199 }else if(memcmp(cbuf
+32-8,"FORMULA1",8)==0) {
200 PL_RUN
=(PL_RUN
==8)?24:8;
201 }else if(memcmp(cbuf
+32-5,"RAMBO",5)==0) {
202 pl1
.ammo
=pl1
.shel
=pl1
.rock
=pl1
.cell
=pl1
.fuel
=30000;
203 pl1
.wpns
=0x7FF;pl1
.drawst
|=PL_DRAWWPN
|PL_DRAWKEYS
;
206 pl2
.ammo
=pl2
.shel
=pl2
.rock
=pl2
.cell
=pl1
.fuel
=30000;
207 pl2
.wpns
=0x7FF;pl2
.drawst
|=PL_DRAWWPN
|PL_DRAWKEYS
;
210 }else if(memcmp(cbuf
+32-5,"UJHTW",5)==0) {
211 p_immortal
=!p_immortal
;
212 }else if(memcmp(cbuf
+32-9,",TKSQJHTK",9)==0) {
214 }else if(memcmp(cbuf
+32-6,"CBVCBV",6)==0) {
216 }else if(memcmp(cbuf
+32-7,"GOODBYE",7)==0) {
218 }else if(memcmp(cbuf
+32-9,"GJITKYF",7)==0) {
219 if(cbuf
[30]>='0' && cbuf
[30]<='9' && cbuf
[31]>='0' && cbuf
[31]<='9') {
220 g_map
=(cbuf
[30]=='0')?0:(cbuf
[30]-'0')*10;
221 g_map
+=(cbuf
[31]=='0')?0:(cbuf
[31]-'0');
229 static void GM_command (int c
) {
234 R_toggle_fullscreen();
241 S_startmusic(music_time
*2);
246 GM_set(&ngplr_mnu
);break;
249 GM_set(&ngdm_mnu
);break;
254 if(c
==COOP
) GMV_say("_COOP");
255 else if(c
==DM
) GMV_say("_DM");
256 if(c
!=PLR1
) {GM_set(&plcolor_mnu
);break;}
260 g_map
=(_warp
)?_warp
:1;
263 pl1
.color
=pcolortab
[p1color
];
264 pl2
.color
=pcolortab
[p2color
];
265 }else pl1
.color
=0x70;
270 GM_set(&opt_mnu
);break;
273 F_getsavnames();GM_set(&load_mnu
);break;
275 if(g_st
!=GS_GAME
) break;
277 F_getsavnames();GM_set(&save_mnu
);break;
279 input
=1;memcpy(ibuf
,savname
[save_mnu
.cur
],24);icur
=strlen(ibuf
);
282 if(!savok
[load_mnu
.cur
]) break;
283 load_game(load_mnu
.cur
);
287 GM_set(&vol_mnu
);break;
290 GM_set(&gamma_mnu
);break;
292 GMV_say((rand()&1)?"_EXIT1":"_EXIT2");
293 GM_set(qmsg
[myrand(3)]);break;
295 if(g_st
!=GS_GAME
) break;
297 GM_set(&endgm_msg
);break;
302 c
=Z_sound(M_lock(qsnd
[myrand(QSND_NUM
)]),256);//for(c=(Z_sound(M_lock(qsnd[random2(QSND_NUM)]),256)+9)<<16,timer=0;timer<c;);
307 PL_reset();G_start();
310 if(--p1color
<0) p1color
=PCOLORN
-1; break;
312 if(++p1color
>=PCOLORN
) p1color
=0; break;
314 if(--p2color
<0) p2color
=PCOLORN
-1; break;
316 if(++p2color
>=PCOLORN
) p2color
=0; break;
318 S_volume(snd_vol
-8);break;
320 S_volume(snd_vol
+8);break;
322 S_volumemusic(mus_vol
-8);break;
324 S_volumemusic(mus_vol
+8);break;
326 R_setgamma(R_getgamma() - 1);
329 R_setgamma(R_getgamma() + 1);
349 //{KEY_UNDERSCORE, '_'},
380 static byte
get_keychar (int keysym
) {
382 while (keychar
[i
].keysym
) {
383 if (keychar
[i
].keysym
== keysym
) return keychar
[i
].ch
;
389 static void shot (void) {
394 char *e = getenv("HOME");
396 sprintf(&fn[strlen(fn)],"/.doom2d-rembo",num);
397 mkdir(fn, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
398 sprintf(&fn[strlen(fn)],"/shot%04d.bmp",num);
400 sprintf(fn,"shot%04d.bmp",num);
402 SDL_SaveBMP(screen, fn);
410 if(mnu
==&plcolor_mnu
) {
411 if(*(++panimp
)==0) panimp
=panim
;
414 if(movsndt
>0) --movsndt
; else movsndt
=0;
415 if(g_st
==GS_TITLE
) if(!mnu
) if(lastkey
) {
416 GM_set(&main_mnu
);Z_sound(msnd3
,128);
424 F_savegame(save_mnu
.cur
, ibuf
);
441 c
= get_keychar(lastkey
);
477 if (mnu
== NULL
&& g_st
== GS_GAME
) {
493 GM_command(QUITGAME
);
498 if (mnu
!= NULL
&& mnu
->type
== MENU
) {
501 mnu
->cur
= mnu
->n
- 1;
510 if (mnu
!= NULL
&& mnu
->type
== MENU
) {
512 if (mnu
->cur
>= mnu
->n
) {
523 if (mnu
!= NULL
&& mnu
->type
== MENU
&& mnu
->t
[mnu
->cur
] >= SVOLM
) {
524 GM_command(mnu
->t
[mnu
->cur
] + (lastkey
== KEY_LEFT
|| lastkey
== KEY_KP_4
));
527 movsndt
= Z_sound(lastkey
== KEY_LEFT
|| lastkey
== KEY_KP_4
? msnd5
: msnd6
, 255);
534 if (mnu
!= NULL
&& mnu
->type
== MENU
) {
535 if (mnu
->t
[mnu
->cur
] >= PL1CM
) {
539 } else if (mnu
->t
[mnu
->cur
] < SVOLM
) {
541 GM_command(mnu
->t
[mnu
->cur
]);
546 if (mnu
!= NULL
&& mnu
->type
== MSG
) {
548 GM_command(mnu
->t
[0]);
552 if (mnu
!= NULL
&& mnu
->type
== MSG
) {
554 GM_command(mnu
->t
[1]);
565 lastkey
= KEY_UNKNOWN
;
569 void G_keyf (int key
, int down
) {
573 if (!_2pl
|| cheat
) {
574 for (i
= 0; i
< 31; ++i
) {
575 cbuf
[i
] = cbuf
[i
+ 1];
577 cbuf
[31] = get_keychar(key
);
582 void GM_init (void) {
585 static char nm
[QSND_NUM
][6]={
586 "CYBSIT","KNTDTH","MNPAIN","PEPAIN","SLOP","MANSIT","BOSPN","VILACT",
587 "PLFALL","BGACT","BGDTH2","POPAIN","SGTATK","VILDTH"
592 for(i
=0;i
<QSND_NUM
;++i
) {
594 qsnd
[i
]=F_getresid(s
);
597 csnd1
=Z_getsnd("HAHA1");
598 csnd2
=Z_getsnd("RADIO");
599 msnd1
=Z_getsnd("PSTOP");
600 msnd2
=Z_getsnd("PISTOL");
601 msnd3
=Z_getsnd("SWTCHN");
602 msnd4
=Z_getsnd("SWTCHX");
603 msnd5
=Z_getsnd("SUDI");
604 msnd6
=Z_getsnd("TUDI");