1 /* Catacomb 3-D 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
25 =============================================================================
\r
29 =============================================================================
\r
32 #define VIEWTILEX 20
\r
33 #define VIEWTILEY (VIEWHEIGHT/16)
\r
36 =============================================================================
\r
40 =============================================================================
\r
45 =============================================================================
\r
49 =============================================================================
\r
55 enum {mapview,tilemapview,actoratview,visview} viewtype;
\r
57 void ViewMap (void);
\r
59 //===========================================================================
\r
71 void DebugMemory (void)
\r
74 char scratch[80],str[10];
\r
76 spritetype _seg *block;
\r
78 VW_FixRefreshBuffer ();
\r
79 US_CenterWindow (16,7);
\r
83 for (i=0;i<NUMCHUNKS;i++)
\r
87 strcpy (scratch,"Chunk:");
\r
89 strcat (scratch,str);
\r
90 strcat (scratch,"\n");
\r
91 write (debughandle,scratch,strlen(scratch));
\r
97 US_CPrint ("Memory Usage");
\r
98 US_CPrint ("------------");
\r
99 US_Print ("Total :");
\r
100 US_PrintUnsigned (mminfo.mainmem/1024);
\r
101 US_Print ("k\nFree :");
\r
102 US_PrintUnsigned (MM_UnusedMemory()/1024);
\r
103 US_Print ("k\nWith purge:");
\r
104 US_PrintUnsigned (MM_TotalFree()/1024);
\r
110 //===========================================================================
\r
120 void PicturePause (void)
\r
125 source = displayofs+panadjust;
\r
127 VW_ColorBorder (15);
\r
128 VW_SetLineWidth (40);
\r
129 VW_SetScreen (0,0);
\r
131 if (source<0x10000l-200*64)
\r
134 // copy top line first
\r
136 for (y=0;y<200;y++)
\r
137 VW_ScreenToScreen (source+y*64,y*40,40,1);
\r
142 // copy bottom line first
\r
144 for (y=199;y>=0;y--)
\r
145 VW_ScreenToScreen (source+y*64,y*40,40,1);
\r
157 //===========================================================================
\r
167 void ShapeTest (void)
\r
173 //===========================================================================
\r
196 int DebugKeys (void)
\r
201 if (Keyboard[sc_B]) // B = border color
\r
203 CenterWindow(24,3);
\r
205 US_Print(" Border color (0-15):");
\r
207 esc = !US_LineInput (px,py,str,NULL,true,2,0);
\r
210 level = atoi (str);
\r
211 if (level>=0 && level<=15)
\r
212 VW_ColorBorder (level);
\r
219 if (Keyboard[sc_C]) // C = count objects
\r
226 if (Keyboard[sc_D]) // D = start / end demo record
\r
228 if (DemoMode == demo_Off)
\r
229 StartDemoRecord ();
\r
230 else if (DemoMode == demo_Record)
\r
233 playstate = ex_completed;
\r
240 if (Keyboard[sc_E]) // E = quit level
\r
244 playstate = ex_warped;
\r
248 if (Keyboard[sc_F]) // F = facing spot
\r
250 CenterWindow (12,4);
\r
252 US_PrintUnsigned (player->x);
\r
254 US_PrintUnsigned (player->y);
\r
256 US_PrintUnsigned (player->angle);
\r
262 if (Keyboard[sc_G]) // G = god mode
\r
264 CenterWindow (12,2);
\r
266 US_PrintCentered ("God mode OFF");
\r
268 US_PrintCentered ("God mode ON");
\r
274 if (Keyboard[sc_H]) // H = hurt self
\r
278 else if (Keyboard[sc_I]) // I = item cheat
\r
280 CenterWindow (12,3);
\r
281 US_PrintCentered ("Free items!");
\r
288 if (!gamestate.keys[i])
\r
292 GiveScroll (i,false);
\r
297 else if (Keyboard[sc_M]) // M = memory info
\r
302 else if (Keyboard[sc_O]) // O = overhead
\r
307 else if (Keyboard[sc_P]) // P = pause with no screen disruptioon
\r
312 else if (Keyboard[sc_S]) // S = slow motion
\r
315 CenterWindow (18,3);
\r
317 US_PrintCentered ("Slow motion ON");
\r
319 US_PrintCentered ("Slow motion OFF");
\r
324 else if (Keyboard[sc_S]) // T = shape test
\r
329 else if (Keyboard[sc_V]) // V = extra VBLs
\r
331 CenterWindow(30,3);
\r
333 US_Print(" Add how many extra VBLs(0-8):");
\r
335 esc = !US_LineInput (px,py,str,NULL,true,2,0);
\r
338 level = atoi (str);
\r
339 if (level>=0 && level<=8)
\r
344 else if (Keyboard[sc_W]) // W = warp to level
\r
346 CenterWindow(26,3);
\r
348 US_Print(" Warp to which level(1-21):");
\r
350 esc = !US_LineInput (px,py,str,NULL,true,2,0);
\r
353 level = atoi (str);
\r
354 if (level>0 && level<21)
\r
356 gamestate.mapon = level-1;
\r
357 playstate = ex_warped;
\r
362 else if (Keyboard[sc_X]) // X = item cheat
\r
364 CenterWindow (12,3);
\r
365 US_PrintCentered ("Extra stuff!");
\r
376 else if (Keyboard[sc_Z]) // Z = game over
\r
380 else if (LastScan >= sc_1 && LastScan <= sc_8) // free scrolls
\r
382 GiveScroll (LastScan-sc_1,false);
\r
383 IN_ClearKeysDown ();
\r
391 =====================
\r
395 =====================
\r
398 void LatchDrawChar (unsigned x, unsigned y, unsigned picnum)
\r
400 unsigned source, dest;
\r
402 dest = bufferofs + ylookup[y]+x;
\r
403 source = latchpics[0]+picnum*8;
\r
408 asm mov bx,[linewidth]
\r
411 asm mov ax,[screenseg]
\r
415 asm mov si,[source]
\r
435 asm mov ds,ax // restore turbo's data segment
\r
442 =====================
\r
446 =====================
\r
449 void LatchDrawTile (unsigned x, unsigned y, unsigned picnum)
\r
451 unsigned source, dest;
\r
453 dest = bufferofs + ylookup[y]+x;
\r
454 source = tileoffsets[picnum];
\r
459 asm mov bx,[linewidth]
\r
462 asm mov ax,[screenseg]
\r
466 asm mov si,[source]
\r
479 asm mov ds,ax // restore turbo's data segment
\r
486 ===================
\r
490 ===================
\r
493 void OverheadRefresh (void)
\r
495 unsigned x,y,endx,endy,sx,sy;
\r
499 if (++screenpage == 3)
\r
502 bufferofs = screenloc[screenpage];
\r
504 endx = maporgx+VIEWTILEX;
\r
505 endy = maporgy+VIEWTILEY;
\r
507 for (y=maporgy;y<endy;y++)
\r
508 for (x=maporgx;x<endx;x++)
\r
510 sx = (x-maporgx)*2;
\r
511 sy = (y-maporgy)*16;
\r
516 tile = *(mapsegs[0]+farmapylookup[y]+x);
\r
520 tile = tilemap[x][y];
\r
524 tile = (unsigned)actorat[x][y];
\r
528 tile = spotvis[x][y];
\r
533 if (tile<NUMTILE16)
\r
534 LatchDrawTile(sx,sy,tile);
\r
537 LatchDrawChar(sx,sy,NUMBERCHARS+((tile&0xf000)>>12));
\r
538 LatchDrawChar(sx+1,sy,NUMBERCHARS+((tile&0x0f00)>>8));
\r
539 LatchDrawChar(sx,sy+8,NUMBERCHARS+((tile&0x00f0)>>4));
\r
540 LatchDrawChar(sx+1,sy+8,NUMBERCHARS+(tile&0x000f));
\r
544 VW_SetScreen (bufferofs,0);
\r
545 displayofs = bufferofs;
\r
550 ===================
\r
554 ===================
\r
557 void ViewMap (void)
\r
559 boolean button0held;
\r
561 viewtype = actoratview;
\r
562 button0held = false;
\r
565 maporgx = player->tilex - VIEWTILEX/2;
\r
568 maporgy = player->tiley - VIEWTILEY/2;
\r
575 // let user pan around
\r
577 IN_ReadControl(0,&c);
\r
578 if (c.xaxis == -1 && maporgx>0)
\r
580 if (c.xaxis == 1 && maporgx<mapwidth-VIEWTILEX)
\r
582 if (c.yaxis == -1 && maporgy>0)
\r
584 if (c.yaxis == 1 && maporgy<mapheight-VIEWTILEY)
\r
587 if (c.button0 && !button0held)
\r
589 button0held = true;
\r
591 if (viewtype>visview)
\r
592 viewtype = mapview;
\r
595 button0held = false;
\r
598 OverheadRefresh ();
\r
600 } while (!Keyboard[sc_Escape]);
\r
602 IN_ClearKeysDown ();
\r