1 /* Catacomb Armageddon Source Code
\r
2 * Copyright (C) 1993-2014 Flat Rock Software
\r
4 * This program is free software; you can redistribute it and/or modify
\r
5 * it under the terms of the GNU General Public License as published by
\r
6 * the Free Software Foundation; either version 2 of the License, or
\r
7 * (at your option) any later version.
\r
9 * This program is distributed in the hope that it will be useful,
\r
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
12 * GNU General Public License for more details.
\r
14 * You should have received a copy of the GNU General Public License along
\r
15 * with this program; if not, write to the Free Software Foundation, Inc.,
\r
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
\r
26 =============================================================================
\r
30 =============================================================================
\r
33 #define DEBUG_OVERHEAD 0
\r
36 #define VIEWTILEX 20
\r
37 #define VIEWTILEY (VIEWHEIGHT/16)
\r
40 =============================================================================
\r
44 =============================================================================
\r
49 =============================================================================
\r
53 =============================================================================
\r
57 boolean autofire=false;
\r
60 enum {mapview,tilemapview,actoratview,visview,mapseg2,lastview} viewtype;
\r
62 void ViewMap (void);
\r
64 //===========================================================================
\r
75 void PicturePause (void)
\r
80 source = displayofs+panadjust;
\r
82 // VW_ColorBorder (15);
\r
83 VW_SetLineWidth (40);
\r
86 if (source<0x10000l-200*64)
\r
89 // copy top line first
\r
92 VW_ScreenToScreen (source+y*64,y*40,40,1);
\r
97 // copy bottom line first
\r
99 for (y=199;y>=0;y--)
\r
100 VW_ScreenToScreen (source+y*64,y*40,40,1);
\r
113 //===========================================================================
\r
115 //===========================================================================
\r
138 int DebugKeys (void)
\r
143 #if DEBUG_KEYS_AVAILABLE
\r
144 if (Keyboard[sc_R])
\r
146 CenterWindow (12,2);
\r
148 US_PrintCentered ("Rapid-Fire OFF");
\r
150 US_PrintCentered ("Rapid-Fire ON");
\r
158 #if DEBUG_KEYS_AVAILABLE
\r
159 if (Keyboard[sc_A])
\r
162 unsigned org_tile,org_mapon,msgnum;
\r
163 boolean newmsg=true,newlevel=false;
\r
165 VW_FixRefreshBuffer ();
\r
166 CenterWindow (16,3);
\r
168 US_CPrint("Message Test");
\r
172 msgnum = (org_tile = *(mapsegs[0]+farmapylookup[player->tiley]+player->tilex))-NAMESTART;
\r
177 if (Keyboard[sc_Escape])
\r
179 while (Keyboard[sc_Escape]);
\r
183 // Move to previous message
\r
185 if (Keyboard[sc_UpArrow])
\r
194 // Move to next message
\r
196 if (Keyboard[sc_DownArrow])
\r
205 // Move to previous level
\r
207 if (Keyboard[sc_LeftArrow])
\r
211 MM_SetPurge(&grsegs[LEVEL1TEXT+mapon],3);
\r
217 // Move to next level
\r
219 if (Keyboard[sc_RightArrow])
\r
221 if (mapon < LASTMAP-1)
\r
223 MM_SetPurge(&grsegs[LEVEL1TEXT+mapon],3);
\r
229 // Load new level text
\r
233 CA_CacheGrChunk(LEVEL1TEXT+mapon);
\r
239 // Display new message text
\r
243 *(mapsegs[0]+farmapylookup[player->tiley]+player->tilex) = msgnum+NAMESTART;
\r
245 strcpy(levelstr,"Level: ");
\r
246 itoa(mapon,levelstr+strlen(levelstr),10);
\r
247 strcat(levelstr," Msg: ");
\r
248 itoa(msgnum,levelstr+strlen(levelstr),10);
\r
249 DisplaySMsg(levelstr,NULL);
\r
252 if (Keyboard[sc_UpArrow] || Keyboard[sc_DownArrow] || Keyboard[sc_LeftArrow] || Keyboard[sc_RightArrow])
\r
259 MM_SetPurge(&grsegs[LEVEL1TEXT+mapon],3);
\r
261 CA_CacheGrChunk(LEVEL1TEXT+mapon);
\r
263 *(mapsegs[0]+farmapylookup[player->tiley]+player->tilex) = org_tile;
\r
269 if (Keyboard[sc_V])
\r
271 displayofs = bufferofs = screenloc[screenpage];
\r
272 CenterWindow (16,4);
\r
273 US_CPrint("\n"GAMENAME);
\r
274 US_CPrint(VERSION);
\r
275 US_CPrint(REVISION);
\r
281 if (Keyboard[sc_Q]) // Q = Insta-Quit!
\r
282 Quit("Insta-Quit!");
\r
284 if (Keyboard[sc_Z]) // Z = freeze Time
\r
287 FreezeTime = 1; // Allow refresh to dec to zero..
\r
297 // if (Keyboard[sc_E])
\r
298 // FaceDoor((player->x>>16l)+1,(player->y>>16l));
\r
302 if (Keyboard[sc_B]) // B = border color
\r
304 CenterWindow(24,3);
\r
306 US_Print(" Border color (0-15):");
\r
308 esc = !US_LineInput (px,py,str,NULL,true,2,0);
\r
311 level = atoi (str);
\r
312 if (level>=0 && level<=15)
\r
313 VW_ColorBorder (level);
\r
320 #if 1//DEBUG_KEYS_AVAILABLE
\r
321 if (Keyboard[sc_O])
\r
323 extern unsigned objectcount,latchmemavail;
\r
324 unsigned unused,total;
\r
326 CenterWindow (30,13);
\r
327 US_Print ("Objects: ");
\r
328 US_PrintUnsigned (objectcount);
\r
330 US_Print("\n\nTics: ");
\r
331 US_PrintUnsigned (tics);
\r
332 US_Print(" Real Tics: ");
\r
333 US_PrintUnsigned(realtics);
\r
335 US_Print ("\n\n Total Available: ");
\r
336 US_PrintUnsigned (mminfo.mainmem/1024);
\r
337 US_Print ("k\n Mem In Use: ");
\r
338 unused=MM_UnusedMemory()/1024;
\r
339 US_PrintUnsigned (unused);
\r
340 US_Print ("k\n Mem After Purge: ");
\r
341 total=MM_TotalFree()/1024;
\r
342 US_PrintUnsigned (total);
\r
344 US_PrintUnsigned (total-unused);
\r
346 US_Print (")\n\nLatch Mem Free: ");
\r
347 US_PrintUnsigned (latchmemavail);
\r
357 extern unsigned *groundcolor,debug_gnd;
\r
359 groundcolor = &debug_gnd;
\r
360 debug_gnd += 0x0101;
\r
361 if (debug_gnd == 0x1010)
\r
368 extern unsigned *skycolor,debug_sky;
\r
370 skycolor = &debug_sky;
\r
371 debug_sky += 0x0101;
\r
372 if (debug_sky == 0x1010)
\r
378 colordelay -= realtics;
\r
383 if (Keyboard[sc_C]) // C = count objects
\r
390 if (Keyboard[sc_D]) // D = start / end demo record
\r
392 if (DemoMode == demo_Off)
\r
393 StartDemoRecord ();
\r
394 else if (DemoMode == demo_Record)
\r
397 playstate = ex_completed;
\r
404 if (Keyboard[sc_E]) // E = quit level
\r
408 playstate = ex_warped;
\r
414 if (Keyboard[sc_F]) // F = facing spot
\r
416 CenterWindow (12,4);
\r
418 US_PrintUnsigned (player->x);
\r
420 US_PrintUnsigned (player->y);
\r
422 US_PrintUnsigned (player->angle);
\r
429 if (Keyboard[sc_G]) // G = god mode
\r
431 CenterWindow (12,2);
\r
433 US_PrintCentered ("God mode OFF");
\r
435 US_PrintCentered ("God mode ON");
\r
443 if (Keyboard[sc_H]) // H = hurt self
\r
449 if (Keyboard[sc_I]) // I = item cheat
\r
451 extern boolean redraw_gems;
\r
453 CenterWindow (12,3);
\r
454 US_PrintCentered ("Free items!");
\r
461 // if (!gamestate.keys[i])
\r
463 gamestate.gems[i] = GEM_DELAY_TIME;
\r
465 gamestate.gems[4] = GEM_DELAY_TIME;
\r
466 redraw_gems = true;
\r
467 ///////// for (i=0;i<8;i++)
\r
468 ///////// GiveScroll (i,false);
\r
475 if (Keyboard[sc_Z]) // O is used elsewhere...
\r
483 if (Keyboard[sc_P]) // P = pause with no screen disruptioon
\r
491 if (Keyboard[sc_S]) // S = slow motion
\r
494 CenterWindow (18,3);
\r
496 US_PrintCentered ("Slow motion ON");
\r
498 US_PrintCentered ("Slow motion OFF");
\r
506 if (Keyboard[sc_V]) // V = extra VBLs
\r
508 CenterWindow(30,3);
\r
510 US_Print(" Add how many extra VBLs(0-8):");
\r
512 esc = !US_LineInput (px,py,str,NULL,true,2,0);
\r
515 level = atoi (str);
\r
516 if (level>=0 && level<=8)
\r
523 if (Keyboard[sc_W]) // W = warp to level
\r
525 CenterWindow(26,3);
\r
527 US_Print(" Warp to which level(0-16):");
\r
529 esc = !US_LineInput (px,py,str,NULL,true,2,0);
\r
532 level = atoi (str);
\r
533 if (level>=0 && level<=LASTMAP-1)
\r
535 gamestate.mapon = level;
\r
536 playstate = ex_warped;
\r
544 if (Keyboard[sc_X]) // X = item cheat
\r
546 CenterWindow (12,3);
\r
547 US_PrintCentered ("Extra stuff!");
\r
560 //////// if (LastScan >= sc_1 && LastScan <= sc_8) // free scrolls
\r
562 //////// GiveScroll (LastScan-sc_1,false);
\r
563 //////// IN_ClearKeysDown ();
\r
573 =====================
\r
577 =====================
\r
580 void LatchDrawChar (unsigned x, unsigned y, unsigned picnum)
\r
582 unsigned source, dest;
\r
584 dest = bufferofs + ylookup[y]+x;
\r
585 source = latchpics[0]+picnum*8;
\r
590 asm mov bx,[linewidth]
\r
593 asm mov ax,[screenseg]
\r
597 asm mov si,[source]
\r
617 asm mov ds,ax // restore turbo's data segment
\r
627 =====================
\r
631 =====================
\r
634 void LatchDrawTile (unsigned x, unsigned y, unsigned picnum)
\r
636 unsigned source, dest;
\r
638 dest = bufferofs + ylookup[y]+x;
\r
639 source = tileoffsets[picnum];
\r
644 asm mov bx,[linewidth]
\r
647 asm mov ax,[screenseg]
\r
651 asm mov si,[source]
\r
664 asm mov ds,ax // restore turbo's data segment
\r
673 ===================
\r
677 ===================
\r
680 void OverheadRefresh (void)
\r
682 unsigned x,y,endx,endy,sx,sy;
\r
686 if (++screenpage == 3)
\r
689 bufferofs = screenloc[screenpage];
\r
691 endx = maporgx+VIEWTILEX;
\r
692 endy = maporgy+VIEWTILEY;
\r
694 for (y=maporgy;y<endy;y++)
\r
695 for (x=maporgx;x<endx;x++)
\r
697 sx = (x-maporgx)*2;
\r
698 sy = (y-maporgy)*16;
\r
703 tile = *(mapsegs[0]+farmapylookup[y]+x);
\r
707 tile = tilemap[x][y];
\r
711 tile = (unsigned)actorat[x][y];
\r
715 tile = spotvis[x][y];
\r
719 tile = *(mapsegs[2]+farmapylookup[y]+x);
\r
721 tile = *(mapsegs[0]+farmapylookup[y]+x);
\r
726 if (tile<NUMTILE16)
\r
727 LatchDrawTile(sx,sy,tile);
\r
730 LatchDrawChar(sx,sy,NUMBERCHARS+((tile&0xf000)>>12));
\r
731 LatchDrawChar(sx+1,sy,NUMBERCHARS+((tile&0x0f00)>>8));
\r
732 LatchDrawChar(sx,sy+8,NUMBERCHARS+((tile&0x00f0)>>4));
\r
733 LatchDrawChar(sx+1,sy+8,NUMBERCHARS+(tile&0x000f));
\r
737 VW_SetScreen (bufferofs,0);
\r
738 displayofs = bufferofs;
\r
743 ===================
\r
747 ===================
\r
750 void ViewMap (void)
\r
752 boolean button0held;
\r
754 viewtype = actoratview;
\r
755 button0held = false;
\r
758 maporgx = player->tilex - VIEWTILEX/2;
\r
761 maporgy = player->tiley - VIEWTILEY/2;
\r
768 // let user pan around
\r
770 IN_ReadControl(0,&control);
\r
771 if (control.xaxis == -1 && maporgx>0)
\r
773 if (control.xaxis == 1 && maporgx<mapwidth-VIEWTILEX)
\r
775 if (control.yaxis == -1 && maporgy>0)
\r
777 if (control.yaxis == 1 && maporgy<mapheight-VIEWTILEY)
\r
780 if (control.button0 && !button0held)
\r
782 button0held = true;
\r
784 if (viewtype==lastview)
\r
785 viewtype = mapview;
\r
787 if (!control.button0)
\r
788 button0held = false;
\r
791 OverheadRefresh ();
\r
793 } while (!Keyboard[sc_Escape]);
\r
795 IN_ClearKeysDown ();
\r