31 int A8_nextframe(void);
34 void FX_trans1(int t);
35 extern unsigned char fx_scr1[64000],fx_scr2[64000];
41 extern int hit_xv,hit_yv;
43 extern vgapal std_pal;
46 extern int sw_secrets;
54 extern map_block_t blk;
56 extern byte clrmap[256*12];
58 void V_maptoscr(int,int,int,int,void *);
64 byte _2pl=0,g_dm=0,g_st=GS_TITLE,g_exit=0,g_map=1,_warp=0,g_music[8]="MENU";
68 int dm_pnum,dm_pl1p,dm_pl2p;
71 static void *telepsnd;
72 static void *scrnh[3];
77 int lt_time,lt_type,lt_side,lt_ypos,lt_force;
80 int g_trans=0,g_transt;
82 static void set_trans(int st) {
84 case GS_ENDANIM: case GS_END2ANIM: case GS_DARKEN:
85 case GS_BVIDEO: case GS_EVIDEO: case GS_END3ANIM:
89 case GS_ENDANIM: case GS_END2ANIM: case GS_DARKEN:
90 case GS_BVIDEO: case GS_EVIDEO: case GS_END3ANIM:
97 static void chk_exit(void) {
98 static char msg[]={'П'^85,'о'^85,'ж'^85,'а'^85,'л'^85,'у'^85,'й'^85,'с'^85,
100 'п'^85,'е'^85,'р'^85,'е'^85,'у'^85,'с'^85,'т'^85,'а'^85,'н'^85,'о'^85,
101 'в'^85,'и'^85,'т'^85,'е'^85,' '^85,'и'^85,'г'^85,'р'^85,'у'^85,0};
104 for(i=0;msg[i];++i) msg[i]^=85;
109 void G_savegame(int h) {
110 write(h,&_2pl,1);write(h,&g_dm,1);write(h,&g_exit,1);write(h,&g_map,1);
111 write(h,&g_time,4);write(h,&dm_pl1p,4);write(h,&dm_pl2p,4);
112 write(h,&dm_pnum,4);write(h,dm_pos,dm_pnum*sizeof(pos_t));
117 void G_loadgame(int h) {
118 read(h,&_2pl,1);read(h,&g_dm,1);read(h,&g_exit,1);read(h,&g_map,1);
119 read(h,&g_time,4);read(h,&dm_pl1p,4);read(h,&dm_pl2p,4);
120 read(h,&dm_pnum,4);read(h,dm_pos,dm_pnum*sizeof(pos_t));
122 read(h,g_music,8);F_loadmus(g_music);
134 void load_game(int n) {
139 V_setscr((g_trans)?fx_scr2:scrbuf);V_setrect(0,320,0,200);
140 V_clr(0,320,0,200,0);
141 if(_2pl) {w_o=0;Z_clrst();w_o=100;Z_clrst();}
142 else {w_o=50;Z_clrst();}
143 // V_copytoscr(0,320,0,200);
146 if(_2pl) pl2.drawst=0xFF;
148 BM_clear(BM_PLR1|BM_PLR2|BM_MONSTER);
149 BM_mark(&pl1.o,BM_PLR1);
150 if(_2pl) BM_mark(&pl2.o,BM_PLR2);
159 sprintf(s,"MAP%02u",(word)g_map);
162 V_setscr((g_trans)?fx_scr2:scrbuf);V_setrect(0,320,0,200);
163 V_clr(0,320,0,200,0);
164 if(_2pl) {w_o=0;Z_clrst();w_o=100;Z_clrst();}
165 else {w_o=50;Z_clrst();}
166 // V_copytoscr(0,320,0,200);
169 if(_2pl) pl2.drawst=0xFF;
171 itm_rtime=(g_dm)?1092:0;
172 p_immortal=0;PL_JUMP=10;
176 if(!_2pl) pl1.lives=3;
178 BM_clear(BM_PLR1|BM_PLR2|BM_MONSTER);
179 BM_mark(&pl1.o,BM_PLR1);
180 if(_2pl) BM_mark(&pl2.o,BM_PLR2);
185 #define GGAS_TOTAL (MN__LAST-MN_DEMON+16+10)
191 logo("G_init: настройка ресурсов игры ");
192 logo_gas(5,GGAS_TOTAL);
193 telepsnd=Z_getsnd("TELEPT");
194 scrnh[0]=M_lock(F_getresid("TITLEPIC"));
195 scrnh[1]=M_lock(F_getresid("INTERPIC"));
196 scrnh[2]=M_lock(F_getresid("ENDPIC"));
197 cd_scr=M_lock(F_getresid("CD1PIC"));
199 sprintf(s,"LTN%c",i+'1');
201 ltn[i][j]=Z_getspr(s,j,0,NULL);
203 ltnsnd[0]=Z_getsnd("THUND1");
204 ltnsnd[1]=Z_getsnd("THUND2");
214 logo_gas(GGAS_TOTAL,GGAS_TOTAL);
222 int G_beg_video(void) {
224 case 3: return A8_start("FALL");
225 case 4: return A8_start("KORIDOR");
226 case 5: return A8_start("SKULL");
227 case 6: return A8_start("TORCHES");
228 case 7: return A8_start("CACO");
229 case 8: return A8_start("DARTS");
230 case 9: return A8_start("FISH");
231 case 10: return A8_start("TRAP");
232 case 11: return A8_start("JAIL");
233 case 12: return A8_start("MMON1");
234 case 13: return A8_start("TOWER");
235 case 14: return A8_start("SAPOG");
236 case 15: return A8_start("SWITCH");
237 case 16: return A8_start("ACCEL");
238 case 17: return A8_start("MEAT");
239 case 18: return A8_start("LEGION");
240 case 19: return A8_start("CLOUDS");
241 // case : return A8_start("");
246 int G_end_video(void) {
248 case 1: return A8_start("TRUBA");
249 case 10: return A8_start("GOTCHA");
250 // case : return A8_start("");
255 static byte transdraw=0;
262 V_setscr(NULL);memcpy(fx_scr1,scra,64000);
263 V_setscr(fx_scr2);transdraw=1;G_draw();transdraw=0;
266 FX_trans1(g_transt*2);
267 V_copytoscr(0,320,0,200);
273 if(g_st==GS_BVIDEO || g_st==GS_EVIDEO) {
275 if(!A8_nextframe() || lastkey==1) {
276 if(lastkey==1) lastkey=0;
279 if(g_st==GS_BVIDEO) G_start();
282 V_copytoscr(0,320,0,200);
285 }else if(g_st==GS_ENDANIM || g_st==GS_END2ANIM || g_st==GS_END3ANIM) {
287 if(!A8_nextframe()) {
289 case GS_ENDANIM: g_st=GS_DARKEN;break;
290 case GS_END2ANIM: g_st=GS_END3ANIM;A8_start("KONEC");break;
291 case GS_END3ANIM: g_st=GS_ENDSCR;lastkey=0;break;
294 V_copytoscr(0,320,0,200);
297 }else if(g_st==GS_DARKEN) {
298 // if(++g_sttm>=105) {
299 // V_setscr(NULL);V_clr(0,320,0,200,0);V_setscr(scrbuf);
301 g_st=GS_END2ANIM;A8_start("CREDITS");
303 // if(g_sttm>64) return;
304 // VP_tocolor(std_pal,0,0,0,64,g_sttm);VP_setall(pal_tmp);
309 case GS_TITLE: case GS_ENDSCR:
313 if(keys[0x39] || keys[0x1C] || keys[0x9C]) {
317 if(keys[0x39] || keys[0x1C] || keys[0x9C])
318 if(!G_beg_video()) G_start(); else {
319 g_st=GS_BVIDEO;F_freemus();
325 if(lt_time>LT_DELAY || lt_force) {
326 if(!(rand()&31) || lt_force) {
332 Z_sound(ltnsnd[rand()&1],128);
337 pl1.hit=0;pl1.hito=-3;
338 if(_2pl) {pl2.hit=0;pl2.hito=-3;}
345 PL_hit(&pl1,1,0,HIT_SOME);
346 if(_2pl) PL_hit(&pl2,1,0,HIT_SOME);
348 if(PL_isdead(&pl1)) chk_exit();
349 }else if(PL_isdead(&pl1) && PL_isdead(&pl2)) chk_exit();
356 if(pcnt) {PL_act(&pl1);PL_act(&pl2);}
357 else {PL_act(&pl2);PL_act(&pl1);}
361 if(fld_need_remap) BM_remapfld();
362 BM_clear(BM_PLR1|BM_PLR2|BM_MONSTER);
363 BM_mark(&pl1.o,BM_PLR1);
364 if(_2pl) BM_mark(&pl2.o,BM_PLR2);
371 PL_damage(&pl1);PL_damage(&pl2);
372 if(!(pl1.f&PLF_PNSND) && pl1.pain) PL_cry(&pl1);
373 if(!(pl2.f&PLF_PNSND) && pl2.pain) PL_cry(&pl2);
374 if((pl1.pain-=5) < 0) {pl1.pain=0;pl1.f&=(0xFFFF-PLF_PNSND);}
375 if((pl2.pain-=5) < 0) {pl2.pain=0;pl2.f&=(0xFFFF-PLF_PNSND);}
378 if(!(pl1.f&PLF_PNSND) && pl1.pain) PL_cry(&pl1);
379 if((pl1.pain-=5) < 0) {pl1.pain=0;pl1.f&=(0xFFFF-PLF_PNSND);}
389 case 19: g_st=GS_ENDANIM;A8_start("FINAL");break;
390 case 31: case 32: g_map=16;set_trans(GS_INTER);break;
391 default: ++g_map;set_trans(GS_INTER);break;
395 F_loadmus("INTERMUS");
396 }else {F_loadmus("КОНЕЦ");if(mus_vol>0) mus_vol=128;}
398 }else if(g_exit==2) {
400 case 31: g_map=32;set_trans(GS_INTER);break;
401 case 32: g_map=16;set_trans(GS_INTER);break;
402 default: g_map=31;set_trans(GS_INTER);break;
405 F_loadmus("INTERMUS");
409 if(g_dm && g_time>10920) {set_trans(GS_INTER);}
413 static void drawview(player_t *p) {
414 if(p->looky<-50) p->looky=-50;
415 else if(p->looky>50) p->looky=50;
416 w_x=p->o.x;w_y=p->o.y-12+p->looky;W_draw();PL_drawst(p);
419 static int get_pu_st(int t) {
420 if(t>=PL_FLASH) return 1;
421 if((t/9)&1) return 0;
425 static void pl_info(player_t *p,int y) {
428 t=p->kills*10920/g_time;
429 Z_gotoxy(25,y);Z_printbf("УБИЛ");
430 Z_gotoxy(25,y+15);Z_printbf("УБИЙСТВ В МИНУТУ");
431 Z_gotoxy(25,y+30);Z_printbf("НАШЕЛ СЕКРЕТОВ %u ИЗ %u",p->secrets,sw_secrets);
432 Z_gotoxy(255,y);Z_printbf("%u",p->kills);
433 Z_gotoxy(255,y+15);Z_printbf("%u.%u",t/10,t%10);
440 if(g_trans && !transdraw) return;
442 case GS_ENDANIM: case GS_END2ANIM: case GS_DARKEN:
443 case GS_BVIDEO: case GS_EVIDEO: case GS_END3ANIM:
449 V_clr(0,320,0,200,0);V_pic(0,0,scrnh[2]);
453 Z_gotoxy(60,20);Z_printbf("УРОВЕНЬ ПРОЙДЕН");
454 Z_calc_time(g_time,&hr,&mn,&sc);
455 Z_gotoxy(115,40);Z_printbf("ЗА %u:%02u:%02u",hr,mn,sc);
458 Z_gotoxy(80,h);Z_printbf("ПЕРВЫЙ ИГРОК");
459 Z_gotoxy(80,h+70);Z_printbf("ВТОРОЙ ИГРОК");
463 if(_2pl) pl_info(&pl2,h+70);
469 V_copytoscr(0,320,0,200);
473 w_o=0;drawview(&pl1);
474 w_o=100;drawview(&pl2);
476 w_o=50;drawview(&pl1);
480 pl1.drawst=pl2.drawst=0;
481 V_copytoscr(0,320,0,200);
484 if(pl1.invl) h=get_pu_st(pl1.invl)*6;
485 else if(pl1.pain<15) h=0;
486 else if(pl1.pain<35) h=1;
487 else if(pl1.pain<55) h=2;
488 else if(pl1.pain<75) h=3;
489 else if(pl1.pain<95) h=4;
491 if(h) V_maptoscr(0,200,(_2pl)?1:51,98,clrmap+h*256);
492 else V_copytoscr(0,200,(_2pl)?1:51,98);
493 if(pl1.drawst) V_copytoscr(200,120,(_2pl)?0:50,100);
496 if(pl2.invl) h=get_pu_st(pl2.invl)*6;
497 else if(pl2.pain<15) h=0;
498 else if(pl2.pain<35) h=1;
499 else if(pl2.pain<55) h=2;
500 else if(pl2.pain<75) h=3;
501 else if(pl2.pain<95) h=4;
503 if(h) V_maptoscr(0,200,101,98,clrmap+h*256);
504 else V_copytoscr(0,200,101,98);
505 if(pl2.drawst) V_copytoscr(200,120,100,100);
510 void G_respawn_player(player_t *p) {
514 if(p==&pl1) i=dm_pl1p^=1;
516 p->o.x=dm_pos[i].x;p->o.y=dm_pos[i].y;p->d=dm_pos[i].d;
517 FX_tfog(dm_pos[i].x,dm_pos[i].y);Z_sound(telepsnd,128);
520 do{i=random(dm_pnum);}while(i==dm_pl1p || i==dm_pl2p);
521 p->o.x=dm_pos[i].x;p->o.y=dm_pos[i].y;p->d=dm_pos[i].d;
522 if(p==&pl1) dm_pl1p=i; else dm_pl2p=i;
523 FX_tfog(dm_pos[i].x,dm_pos[i].y);Z_sound(telepsnd,128);